diff --git a/config-overrides.js b/config-overrides.js index ed4b747..2650446 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -11,7 +11,16 @@ module.exports = function override(config, env) { buffer: require.resolve('buffer'), stream: require.resolve('stream-browserify'), util: require.resolve("util/"), + zlib: require.resolve("browserify-zlib"), + crypto: require.resolve("crypto-browserify"), + vm: require.resolve("vm-browserify"), }; + config.module.rules.push({ + test: /\.m?js$/, + resolve: { + fullySpecified: false + }, + }); config.plugins.push( new webpack.ProvidePlugin({ process: 'process/browser', diff --git a/package.json b/package.json index 607884d..b9a3a85 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@mui/material": "^5.1.1", "@mui/styles": "^5.1.1", "@mui/x-charts": "^6.18.3", + "@pushprotocol/restapi": "^1.7.25", "@react-spring/web": "^9.7.3", "@tanstack/react-query": "^5.48.0", "@testing-library/jest-dom": "^5.11.4", @@ -51,6 +52,8 @@ "assert": "^2.0.0", "axios": "^1.4.0", "bignumber.js": "^9.1.2", + "browserify-zlib": "^0.2.0", + "crypto-browserify": "^3.12.0", "d3-array": "^3.2.1", "d3-scale": "^4.0.2", "d3-scale-chromatic": "^3.0.0", @@ -63,12 +66,14 @@ "https-browserify": "^1.0.0", "is-ipfs": "^8.0.1", "leaflet": "^1.9.4", + "lodash": "^4.17.21", "numeral": "^2.0.6", "os-browserify": "^0.3.0", "react": "18.3.1", "react-app-rewired": "^2.2.1", "react-dom": "18.3.1", "react-fast-marquee": "^1.6.2", + "react-ga4": "^2.1.0", "react-google-recaptcha-v3": "^1.10.1", "react-leaflet": "^4.2.1", "react-leaflet-cluster": "^2.1.0", @@ -88,6 +93,7 @@ "use-debounce": "^10.0.0", "util": "^0.12.5", "viem": "^2.16.2", + "vm-browserify": "^1.1.2", "wagmi": "^2.10.7", "web-vitals": "^1.0.1", "web3modal": "^1.9.5", diff --git a/src/components/ActionButton.tsx b/src/components/ActionButton.tsx new file mode 100644 index 0000000..d7cbc74 --- /dev/null +++ b/src/components/ActionButton.tsx @@ -0,0 +1,66 @@ +import React from 'react' + +import Button from '@mui/material/Button'; +import CircularProgress from '@mui/material/CircularProgress'; + +interface IActionButton { + id?: string + text: string + size?: 'large' | 'medium' | 'small' + buttonColor?: "primary" | "secondary" | "info" | "inherit" | "success" | "error" | "warning" + textColor?: string + className?: string + component?: "button" | "div" + variant?: "contained" | "text" | "outlined" + disabled?: boolean + onClick?: () => void + showLoadingIcon?: boolean +} + +const getCircularProgressColor = (color: IActionButton["buttonColor"]) => { + if(color === 'primary') { + return '#bdbdbd'; + } + return ""; +} + +const ActionButton = (props: IActionButton) => { + + const { + id, + text, + size = "medium", + buttonColor = 'primary', + textColor, + className = "", + component = "button", + variant = "outlined", + disabled = false, + showLoadingIcon = false, + onClick, + } = props; + + return ( + + ) +} + +export default ActionButton; \ No newline at end of file diff --git a/src/components/FloatingActionButton.tsx b/src/components/FloatingActionButton.tsx index 979b38b..2bac8d6 100644 --- a/src/components/FloatingActionButton.tsx +++ b/src/components/FloatingActionButton.tsx @@ -16,6 +16,7 @@ interface IFloatingActionButton { textColor?: string className?: string component?: "button" | "div" + variant?: "extended" | "circular" disabled?: boolean onClick?: () => void showLoadingIcon?: boolean @@ -40,6 +41,7 @@ const FloatingActionButton = (props: IFloatingActionButton) => { textColor = "white", className = "", component = "button", + variant = "extended", disabled = false, showLoadingIcon = false, onClick, @@ -49,7 +51,7 @@ const FloatingActionButton = (props: IFloatingActionButton) => { onClick && onClick()} size={size} diff --git a/src/components/LeafletMap.tsx b/src/components/LeafletMap.tsx index 4323d19..2211b37 100644 --- a/src/components/LeafletMap.tsx +++ b/src/components/LeafletMap.tsx @@ -16,10 +16,16 @@ import markerIconPropy3D from "../assets/img/map-marker-3d-compressed.png"; import LogoDarkMode from '../assets/svg/propy-logo-house-only.svg' import {Icon} from 'leaflet' +import { + ICollectionEntry, +} from '../utils/constants'; + +import MapOverlaySearchFieldContainer from '../containers/MapOverlaySearchFieldContainer'; import LeafletMapTrackBounds from './LeafletMapTrackBounds'; import { - ILeafletMapMarker + ILeafletMapMarker, + ISelectedPopupConfig, } from '../interfaces'; import { PropsFromRedux } from '../containers/GenericPageContainer'; @@ -40,6 +46,8 @@ interface ILeafletMap { onMarkerSelection?: (marker: ILeafletMapMarker) => void setPopupOpen?: (status: boolean) => void onMapMove?: (center: [number, number]) => void + setSelectedPopupConfig?: (popupConfig: ISelectedPopupConfig) => void + collectionConfigEntry?: ICollectionEntry, } const useStyles = makeStyles((theme: Theme) => @@ -85,6 +93,8 @@ const LeafletMap = memo((props: PropsFromRedux & ILeafletMap) => { popupNode, onMarkerSelection, setPopupOpen, + setSelectedPopupConfig, + collectionConfigEntry, // onMapMove, } = props; @@ -145,6 +155,7 @@ const LeafletMap = memo((props: PropsFromRedux & ILeafletMap) => { zoomDelta={2} zoomSnap={2} > + {collectionConfigEntry && } { if(setPopupOpen) { diff --git a/src/components/LeafletMapTrackBounds.tsx b/src/components/LeafletMapTrackBounds.tsx index 841da4a..86f58d2 100644 --- a/src/components/LeafletMapTrackBounds.tsx +++ b/src/components/LeafletMapTrackBounds.tsx @@ -63,8 +63,6 @@ function LeafletMapTrackBounds(props: ILeafletMapTrackBounds) { mMap.on("zoomend", function () { let coordinates = mMap.getBounds(); let zoom = mMap.getZoom(); - console.log(mMap.getBounds()); - console.log({coordinates: coordinates.toBBoxString(), zoom: mMap.getZoom()}); let boundsRect = coordinates.toBBoxString(); if(zoom >= 10) { debouncedUpdate(boundsRect, zoom); @@ -76,8 +74,6 @@ function LeafletMapTrackBounds(props: ILeafletMapTrackBounds) { mMap.on("moveend", function () { let coordinates = mMap.getBounds(); let zoom = mMap.getZoom(); - console.log(mMap.getBounds()); - console.log({coordinates: coordinates.toBBoxString(), zoom: mMap.getZoom()}); let boundsRect = coordinates.toBBoxString(); if(zoom >= 10) { debouncedUpdate(boundsRect, zoom); diff --git a/src/components/MapOverlaySearchField.tsx b/src/components/MapOverlaySearchField.tsx new file mode 100644 index 0000000..5b528cc --- /dev/null +++ b/src/components/MapOverlaySearchField.tsx @@ -0,0 +1,214 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; + +import TextField from '@mui/material/TextField'; +import Autocomplete from '@mui/material/Autocomplete'; +import CircularProgress from '@mui/material/CircularProgress'; + +import { Theme } from '@mui/material/styles'; +import createStyles from '@mui/styles/createStyles'; +import makeStyles from '@mui/styles/makeStyles'; + +import { latLng } from 'leaflet'; + +import { useMap } from 'react-leaflet'; + +import debounce from 'lodash/debounce'; + +import { + NFTService, +} from '../services/api'; + +import { + ICollectionEntry, +} from '../utils/constants'; + +import { + ISelectedPopupConfig, +} from '../interfaces'; + +import { PropsFromRedux } from '../containers/MapOverlaySearchFieldContainer'; + +interface IMapOverlaySearchField { + collectionConfigEntry: ICollectionEntry, + setSelectedPopupConfig?: (popupConfig: ISelectedPopupConfig) => void + setPopupOpen?: (status: boolean) => void +} + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + root: { + top: '16px', + left: 'calc(50%)', + transform: 'translateX(-50%)', + maxWidth: '550px', + width: '100%', + display: 'flex', + padding: '16px', + zIndex: 900, + position: 'absolute', + alignItems: 'center', + borderRadius: '15px', + flexDirection: 'column', + justifyContent: 'center', + backgroundColor: '#ffffffb0', + }, + mobileRoot: { + top: 'calc(100% - 16px)', + left: 'calc(50%)', + transform: 'translateX(-50%)translateY(-100%)', + maxWidth: '550px', + width: '100%', + display: 'flex', + padding: '16px', + zIndex: 900, + position: 'absolute', + alignItems: 'center', + borderRadius: '15px', + flexDirection: 'column', + justifyContent: 'center', + backgroundColor: '#ffffffb0', + } + }), +); + +interface Option { + id: string | number; + label: string; + longitude: number; + latitude: number; + type: "listing" | "token" | false, + asset_address: string | false; + network: string | false; + token_id: string | false; +} + +export default function MapOverlaySearchField(props: IMapOverlaySearchField & PropsFromRedux) { + + const { + collectionConfigEntry, + setSelectedPopupConfig, + setPopupOpen, + isConsideredMedium, + } = props; + + const parentMap = useMap() + + const classes = useStyles(); + + const [open, setOpen] = useState(false); + const [options, setOptions] = useState([]); + const [inputValue, setInputValue] = useState(''); + const [loading, setLoading] = useState(false); + const [searchFoundNoResults, setSearchFoundNoResults] = useState(false); + + const fetchOptions = useCallback(async (query: string) => { + setLoading(true); + try { + const response = await NFTService.getSearchOptionsWithPostGISPoints( + collectionConfigEntry.network, + collectionConfigEntry.address, + encodeURIComponent(query) + ); + console.log({response}) + let newOptions : any = []; + if(response?.data?.data?.length > 0) { + setSearchFoundNoResults(false); + newOptions = response?.data?.data?.map((entry: any) => ({ + label: entry.metadata?.name, + id: `${entry.metadata.token_id}-${entry.metadata?.name}`, + longitude: entry.metadata.longitude, + latitude: entry.metadata.latitude, + type: 'token', // todo add support for listings + asset_address: entry.asset_address, + network: entry.network_name, + token_id: entry.token_id, + })) + } else { + setSearchFoundNoResults(true); + } + setOptions(newOptions); + } catch (error) { + console.error('Error fetching options:', error); + setSearchFoundNoResults(true); + setOptions([]); + } finally { + setLoading(false); + } + }, [collectionConfigEntry.address, collectionConfigEntry.network]); + + const debouncedFetchOptions = useMemo( + () => debounce(fetchOptions, 300), + [fetchOptions] + ); + + useEffect(() => { + if (inputValue === '') { + setOptions([]); + return undefined; + } + + debouncedFetchOptions(inputValue); + + return () => { + debouncedFetchOptions.cancel(); + }; + }, [inputValue, debouncedFetchOptions]); + + const handleChange = (event: React.SyntheticEvent, newValue: Option | null) => { + if(parentMap && newValue) { + let latLngFlyTo = latLng(newValue.latitude, newValue.longitude); + parentMap.setView(latLngFlyTo, 18, { + animate: true, + }) + if(setSelectedPopupConfig && setPopupOpen) { + setSelectedPopupConfig({ + type: newValue.type, + asset_address: newValue.asset_address, + network: newValue.network, + token_id: newValue.token_id, + }) + } + } + }; + + const getNoOptionsText = () => { + if(searchFoundNoResults) { + return 'No locations found' + } else { + return 'Type to search...' + } + } + + return ( + setOpen(true)} + onClose={() => setOpen(false)} + inputValue={inputValue} + className={isConsideredMedium ? classes.mobileRoot : classes.root} + onInputChange={(event, newInputValue) => setInputValue(newInputValue)} + options={options} + loading={loading} + onChange={handleChange} + noOptionsText={getNoOptionsText()} + forcePopupIcon={false} + isOptionEqualToValue={(option: any, value) => option.label === value.label} + renderInput={(params) => ( + + {loading ? : null} + {params.InputProps.endAdornment} + + ), + }} + /> + )} + /> + ); +} \ No newline at end of file diff --git a/src/components/NavigationTopBar.tsx b/src/components/NavigationTopBar.tsx index 7f6f520..3a61c6e 100644 --- a/src/components/NavigationTopBar.tsx +++ b/src/components/NavigationTopBar.tsx @@ -16,6 +16,7 @@ import LogoLightMode from '../assets/svg/propy-light-mode.svg' import { Web3ModalButtonWagmi } from './Web3ModalButtonWagmi'; import { PropsFromRedux } from '../containers/NavigationTopBarContainer'; +// import PushNotificationZoneContainer from '../containers/PushNotificationZoneContainer'; import LinkWrapper from './LinkWrapper'; @@ -82,6 +83,7 @@ const NavigationTopBar = (props: PropsFromRedux) => {
+ {/* */} {!isConsideredMobile && } {process.env.REACT_ENV === 'local' && { <> {mode === "normal" && { } {mode === "gis" && entry.slug === requiredSlug); }; -interface ISelectedPopupConfig { - type: "listing" | "token" | false, - asset_address: string | false; - network: string | false; - token_id: string | false; -} - interface IFetchedPopupData { type: "listing" | "token" | "unknown", data: INFTRecord | IPropyKeysHomeListingRecord | null, @@ -293,7 +287,7 @@ const PropyKeysMapCardPostGIS = (props: IPropyKeysMapCardProps) => { return ( <> - + { onMarkerSelection={onMarkerSelection} isLoading={isLoading || isFetching} setPopupOpen={setPopupOpen} + setSelectedPopupConfig={setSelectedPopupConfig} + collectionConfigEntry={collectionConfigEntry} popupNode={(memoizedPopupNode && !isFetchingPopupData && !isLoadingPopup && !isFetching) ? memoizedPopupNode : isFetching ? null :
diff --git a/src/components/PushNotificationZone.tsx b/src/components/PushNotificationZone.tsx new file mode 100644 index 0000000..9150380 --- /dev/null +++ b/src/components/PushNotificationZone.tsx @@ -0,0 +1,649 @@ +import React, { useEffect, useState, useMemo } from 'react'; + +import { PushAPI, CONSTANTS } from '@pushprotocol/restapi'; + +import dayjs from 'dayjs'; +import advancedFormat from 'dayjs/plugin/advancedFormat'; + +import { + useEthersSigner +} from '../hooks'; + +import { useAccount } from 'wagmi'; + +import { toast } from 'sonner'; + +import { Theme } from '@mui/material/styles'; +import createStyles from '@mui/styles/createStyles'; +import makeStyles from '@mui/styles/makeStyles'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import InboxIcon from '@mui/icons-material/Inbox'; +import Menu from '@mui/material/Menu'; +import CircularProgress from '@mui/material/CircularProgress'; + +import LinkWrapper from './LinkWrapper'; + +import ActionButton from './ActionButton'; + +import PropyLogo from '../assets/img/propy-house-only.png'; + +import { + PROPY_LIGHT_BLUE, + NETWORK_NAME_TO_ID, +} from '../utils/constants'; + +import { + useUnifiedWriteContract, +} from '../hooks'; + +import { PropsFromRedux } from '../containers/PushNotificationZoneContainer'; + +dayjs.extend(advancedFormat); + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + margin: { + margin: theme.spacing(1), + }, + notificationIndicator: { + height: '10px', + width: '10px', + position: 'absolute', + backgroundColor: PROPY_LIGHT_BLUE, + borderRadius: '50%', + top: '11px', + left: '11px', + }, + acceptButton: { + marginTop: theme.spacing(1), + color: 'white', + width: '100%', + }, + errorText: { + color: 'orangered', + marginTop: theme.spacing(1), + }, + chatProfileEntry: { + display: 'flex', + padding: theme.spacing(1), + borderRadius: '10px', + transition: 'all 0.2s ease-in-out', + '&:hover': { + backgroundColor: '#f3f3f3', + }, + position: 'relative', + width: '100%', + }, + chatProfileNotificationIndicator: { + height: '10px', + width: '10px', + position: 'absolute', + backgroundColor: PROPY_LIGHT_BLUE, + borderRadius: '50%', + top: '10px', + left: '8px', + }, + chatProfilePicContainer: { + width: 40, + minWidth: 40, + height: 40, + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + borderRadius: '50%', + border: '1px solid #d5d5d5', + overflow: 'hidden', + }, + chatProfilePic: { + width: '100%', + height: '100%', + }, + chatProfileEntryTypography: { + display: 'flex', + flexDirection: 'column', + marginLeft: theme.spacing(1.5), + justifyContent: 'center', + width: '100%', + }, + profileTag: { + marginRight: theme.spacing(1.5), + }, + titleRow: { + marginBottom: theme.spacing(1), + display: 'flex', + justifyContent: 'start', + alignItems: 'center', + }, + subtitleRow: { + marginTop: theme.spacing(1), + marginBottom: theme.spacing(0.5), + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + }, + actionRow: { + marginBottom: theme.spacing(1), + display: 'flex', + justifyContent: 'start', + alignItems: 'center', + }, + inboxHeading: { + fontWeight: 'bold', + }, + actionButtonSpacer: { + marginRight: 8 + }, + loadingOverlay: { + position: 'absolute', + width: '100%', + height: '100%', + backgroundColor: '#ffffffbf', + zIndex: 1, + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + } + }), +); + +interface IChatProfile { + profileTag: string; + chatLink: string; + profilePic: string; +} + +const chatProfileConfigs : {[key: string]: IChatProfile} = { + "0x48608159077516aFE77A04ebC0448eC32E6670c1": { + profileTag: "General Propy Support", + chatLink: `https://app.push.org/chat/0x48608159077516aFE77A04ebC0448eC32E6670c1`, + profilePic: PropyLogo, + }, + "0x527C37417d25213868F76127021FeBa80dc85B0E": { + profileTag: "PropyKeys Support", + chatLink: `https://app.push.org/chat/0x527C37417d25213868F76127021FeBa80dc85B0E`, + profilePic: PropyLogo, + } +} + +interface IChannelProfile { + channelTag: string; + profilePic: string; +} + +const channelConfigs : {[key: string]: IChannelProfile} = { + "0x48608159077516aFE77A04ebC0448eC32E6670c1": { + channelTag: "Propy", + profilePic: PropyLogo, + } +} + +let pushUser : any; + +const PushNotificationZone = (props: PropsFromRedux) => { + + let { + setSupportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, + supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, + } = props; + + const classes = useStyles(); + + const [showNotificationZone, setShowNotificationZone] = useState(false); + const [hasPendingSupportRequest, setHasPendingSupportRequest] = useState(false); + const [hasSomeMessages, setHasSomeMessages] = useState(false); + const [forceUpdateCounter, setForceUpdateCounter] = useState(0); + const [anchorEl, setAnchorEl] = React.useState(null); + const [hasUnreadMessage, setHasUnreadMessage] = useState(false); + const [unreadMessageAccounts, setUnreadMessageAccounts] = useState([]); + const [supportAddressToLatestMessageEntry, setSupportAddressToLatestMessageEntry] = useState<{[key: string]: any}>({}); + const [supportChannelAddressToSubscriptionStatus, setSupportChannelAddressToSubscriptionStatus] = useState<{[key: string]: boolean}>({}); + const [supportChannelAddressToLatestNotificationEntries, setSupportChannelAddressToLatestNotificationEntries] = useState<{[key: string]: any[]}>({}); + const [unlockingProfile, setUnlockingProfile] = useState(false); + const [unlockedProfile, setUnlockedProfile] = useState(false); + const [initiatingSupportChatAddresses, setInitiatingSupportChatAddresses] = useState([]); + const [initiatingChannelSubscriptionAddresses, setInitiatingChannelSubscriptionAddresses] = useState([]); + const [loading, setIsLoading] = useState(false); + + const openMenu = Boolean(anchorEl); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + useEffect(() => { + let allMessagesUnlocked = true; + for(let supportAddress of Object.keys(supportAddressToLatestMessageEntry)) { + if(!supportAddressToLatestMessageEntry[supportAddress]?.messageObj?.content) { + allMessagesUnlocked = false; + } + } + if(allMessagesUnlocked) { + setUnlockedProfile(true); + } else { + setUnlockedProfile(false); + } + }, [supportAddressToLatestMessageEntry]) + + const getUnlockMessagesButtonText = () => { + if(unlockingProfile) { + return "Unlocking Messages" + } + if(unlockedProfile) { + return "Unlocked Messages" + } + return "Unlock Messages"; + } + + const handleDismissChatNotification = () => { + if(address) { + let newWalletTimestamp : {[key: string]: {[key: string]: number}} = {}; + for(let propySupportAddress of Object.keys(chatProfileConfigs)) { + newWalletTimestamp[propySupportAddress] = {}; + newWalletTimestamp[propySupportAddress][address] = Math.floor(new Date().getTime() / 1000); + } + setSupportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX(newWalletTimestamp); + } + } + + const handleClose = () => { + setAnchorEl(null); + }; + + const signer = useEthersSigner(); + + const { address } = useAccount(); + + const { capabilities } = useUnifiedWriteContract({}); + + const memoizedCapabilities = useMemo(() => capabilities, [capabilities]); + + const unlockPushProfile = async () => { + try { + if(address) { + setUnlockingProfile(true); + pushUser = await PushAPI.initialize(signer, { + env: CONSTANTS.ENV.PROD, + }) + setUnlockingProfile(false); + setForceUpdateCounter((currentValue) => currentValue + 1); + } + } catch (e) { + console.error({'unlockPushProfile PushAPI.initialize error': e}); + toast.error("Unable to unlock push.org profile"); + } + } + + const initiateChat = async (initChatAddress: string) => { + setInitiatingSupportChatAddresses((currentValues) => [initChatAddress, ...currentValues.filter((currentValue) => currentValue !== initChatAddress)]); + if (!pushUser || !pushUser?.signer) { + pushUser = await PushAPI.initialize(signer, { + env: CONSTANTS.ENV.PROD, + }); + } + await pushUser.chat.send( + initChatAddress, + {content: "Support chat successfully opened!"} + ); + setInitiatingSupportChatAddresses((currentValues) => [...currentValues.filter((currentValue) => currentValue !== initChatAddress)]); + setForceUpdateCounter((currentValue) => currentValue + 1); + } + + const initiateChannelSubscription = async (initChannelAddress: string) => { + setInitiatingChannelSubscriptionAddresses((currentValues) => [initChannelAddress, ...currentValues.filter((currentValue) => currentValue !== initChannelAddress)]); + if (!pushUser || !pushUser?.signer) { + pushUser = await PushAPI.initialize(signer, { + env: CONSTANTS.ENV.PROD, + }); + } + await pushUser.notification.subscribe( + `eip155:${NETWORK_NAME_TO_ID["base"]}:${initChannelAddress}` + ); + setInitiatingChannelSubscriptionAddresses((currentValues) => [...currentValues.filter((currentValue) => currentValue !== initChannelAddress)]); + setForceUpdateCounter((currentValue) => currentValue + 1); + } + + useEffect(() => { + const checkPendingSupportRequest = async () => { + setIsLoading(true); + let shouldShowNotificationZone = true; + let hasSupportMessageRequest = false; + let lastMessageFromSupport = false; + let supportAddressToLatestMessageTimestamp : {[key: string]: number} = {}; + let hasMessages = false; + let unreadMessageStatus = false; + let supportAddressesToLatestMessageEntries = Object.assign({}, supportAddressToLatestMessageEntry); + let supportAddressesToLatestNotificationEntries = Object.assign({}, supportChannelAddressToLatestNotificationEntries); + let latestUnreadMessageAccounts = []; + try { + if(address) { + if (!pushUser || (pushUser?.account !== address)) { + pushUser = await PushAPI.initialize(null, { + env: CONSTANTS.ENV.PROD, + account: address, + }) + } + // TODO ADD PAGINATION ON SUBSCRIPTIONS FOR HEAVY PUSH USERS + const connectedAddressSubscriptions = await pushUser.notification.subscriptions({ + account: address, + }); + for(let propyNotificationChannelAddress of Object.keys(channelConfigs)) { + const isSubscribedToPropyChannel = connectedAddressSubscriptions.find((subscription: {channel: string, user_settings: string}) => subscription.channel === propyNotificationChannelAddress) ? true : false; + const notificationFromPropyChannel = await pushUser.notification.list('INBOX', { + channels: [`eip155:${NETWORK_NAME_TO_ID["base"]}:${propyNotificationChannelAddress}`, `eip155:${NETWORK_NAME_TO_ID["ethereum"]}:${propyNotificationChannelAddress}`], + raw: true, + }); + const notificationFromPropyChannelSpam = await pushUser.notification.list('SPAM', { + channels: [`eip155:${NETWORK_NAME_TO_ID["base"]}:${propyNotificationChannelAddress}`, `eip155:${NETWORK_NAME_TO_ID["ethereum"]}:${propyNotificationChannelAddress}`], + raw: true, + }); + console.log({notificationFromPropyChannel, notificationFromPropyChannelSpam}) + let useNotifications = [...notificationFromPropyChannel, ...notificationFromPropyChannelSpam]; + setSupportChannelAddressToSubscriptionStatus((currentStatuses) => { + let newStatuses = Object.assign({}, currentStatuses); + newStatuses[propyNotificationChannelAddress] = isSubscribedToPropyChannel; + return newStatuses; + }) + if(isSubscribedToPropyChannel && useNotifications?.length > 0) { + supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress] = useNotifications; + } else { + supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress] = []; + } + } + for(let propySupportAddress of Object.keys(chatProfileConfigs)) { + try { + let newLatestMessageTimestamp = 0; + const latestSupportMessages : any = await pushUser.chat.latest(propySupportAddress); + let isSmartWallet = false; + if (memoizedCapabilities && (Object.keys(memoizedCapabilities).length > 0)) { + isSmartWallet = true; + } + if(!isSmartWallet) { + if(latestSupportMessages?.length > 0) { + hasSupportMessageRequest = latestSupportMessages.some((entry: any) => entry?.listType === "REQUESTS" && entry?.fromDID.indexOf(propySupportAddress) > -1); + newLatestMessageTimestamp = Math.floor(latestSupportMessages[0].timestamp / 1000); + shouldShowNotificationZone = true; + if(latestSupportMessages[0]) { + supportAddressesToLatestMessageEntries[propySupportAddress] = latestSupportMessages[0] + } else { + delete supportAddressesToLatestMessageEntries[propySupportAddress]; + } + } else { + if (Object.keys(latestSupportMessages).length > 0) { + supportAddressesToLatestMessageEntries[propySupportAddress] = latestSupportMessages; + } else { + delete supportAddressesToLatestMessageEntries[propySupportAddress]; + } + newLatestMessageTimestamp = Math.floor(latestSupportMessages?.timestamp / 1000); + if (latestSupportMessages?.listType === "REQUESTS" && latestSupportMessages?.fromDID.indexOf(propySupportAddress) > -1) { + hasSupportMessageRequest = true; + shouldShowNotificationZone = true; + } else if (latestSupportMessages?.listType === "CHATS") { + shouldShowNotificationZone = true; + } + } + supportAddressToLatestMessageTimestamp[propySupportAddress] = newLatestMessageTimestamp; + if (Object.keys(latestSupportMessages).length > 0) { + supportAddressesToLatestMessageEntries[propySupportAddress] = latestSupportMessages[0]; + shouldShowNotificationZone = true; + hasMessages = true; + } + } + } catch(e) { + console.error({ + "Support Address": propySupportAddress, + "Support Account": chatProfileConfigs[propySupportAddress].profileTag, + "Error handling latest message state": e, + }) + } + } + } else { + pushUser = undefined; + } + } catch (e) { + console.error({'PushAPI.initialize error': e}) + shouldShowNotificationZone = false; + } finally { + setShowNotificationZone(shouldShowNotificationZone); + setHasPendingSupportRequest(hasSupportMessageRequest); + setHasSomeMessages(hasMessages); + for(let propySupportAddress of Object.keys(chatProfileConfigs)) { + if( + (supportAddressesToLatestMessageEntries[propySupportAddress]?.signature !== supportAddressToLatestMessageEntry[propySupportAddress]?.signature) + || (supportAddressesToLatestMessageEntries[propySupportAddress]?.messageObj?.content && !supportAddressToLatestMessageEntry[propySupportAddress]?.messageObj?.content) + ) { + setSupportAddressToLatestMessageEntry(supportAddressesToLatestMessageEntries); + } + if(supportAddressesToLatestMessageEntries[propySupportAddress]?.fromDID && (supportAddressesToLatestMessageEntries[propySupportAddress]?.fromDID.indexOf(propySupportAddress) > -1)) { + lastMessageFromSupport = true; + } + if(address && supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[propySupportAddress]?.[address]) { + if(lastMessageFromSupport && (supportAddressToLatestMessageTimestamp[propySupportAddress] > supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX[propySupportAddress][address])) { + unreadMessageStatus = true; + latestUnreadMessageAccounts.push(propySupportAddress); + } + } else if(address && !supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[propySupportAddress]?.[address] && lastMessageFromSupport) { + unreadMessageStatus = true; + latestUnreadMessageAccounts.push(propySupportAddress); + } + } + for(let propyNotificationChannelAddress of Object.keys(channelConfigs)) { + if( + ((supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress]?.length > 0 && supportChannelAddressToLatestNotificationEntries[propyNotificationChannelAddress]?.length > 0) && + Math.floor(new Date(supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress][0].timestamp).getTime() / 1000) > Math.floor(new Date(supportChannelAddressToLatestNotificationEntries[propyNotificationChannelAddress][0].timestamp).getTime() / 1000)) + || (supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress]?.length > 0 && (!supportChannelAddressToLatestNotificationEntries[propyNotificationChannelAddress] || supportChannelAddressToLatestNotificationEntries[propyNotificationChannelAddress]?.length === 0)) + ) { + setSupportChannelAddressToLatestNotificationEntries(supportAddressesToLatestNotificationEntries); + } + if(address && supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress]) { + for(let newNotification of supportAddressesToLatestNotificationEntries[propyNotificationChannelAddress]) { + if((Math.floor(new Date(newNotification.timestamp).getTime() / 1000) > supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[propyNotificationChannelAddress]?.[address]) || !supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[propyNotificationChannelAddress]?.[address]) { + unreadMessageStatus = true; + } + } + } + } + setHasUnreadMessage(unreadMessageStatus); + setUnreadMessageAccounts(latestUnreadMessageAccounts); + setIsLoading(false); + } + }; + checkPendingSupportRequest(); + }, [address, forceUpdateCounter, memoizedCapabilities, signer, supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, supportAddressToLatestMessageEntry, supportChannelAddressToLatestNotificationEntries]) + + return ( + <> + {address && showNotificationZone && + <> + + {(hasPendingSupportRequest || hasUnreadMessage) && +
+ } + + + +
+ {loading && +
+ +
+ } +
+ Web3 Wallet Inbox +
+
+ {hasSomeMessages && + unlockPushProfile()} + className={classes.actionButtonSpacer} + size="small" + variant="outlined" + buttonColor="secondary" + showLoadingIcon={unlockingProfile} + disabled={unlockingProfile || unlockedProfile} + text={getUnlockMessagesButtonText()} + /> + } + {(unreadMessageAccounts.length > 0 || hasUnreadMessage) && + handleDismissChatNotification()} + size="small" + variant="outlined" + buttonColor="secondary" + disabled={unreadMessageAccounts.length === 0 && !hasUnreadMessage} + text={"Dismiss Notifications"} + /> + } +
+ {Object.keys(chatProfileConfigs).filter((includeAddress) => supportAddressToLatestMessageEntry[includeAddress])?.length > 0 && +
+ Messages + + + View all + + +
+ } + {/* This block is for active/open chats */} + {Object.keys(chatProfileConfigs).filter((includeAddress) => supportAddressToLatestMessageEntry[includeAddress]).map((chatProfileAddress, index) => ( + +
+ {(unreadMessageAccounts.indexOf(chatProfileAddress) > -1) && +
+ } +
+ {chatProfileConfigs[chatProfileAddress].profileTag} +
+
+
+ {chatProfileConfigs[chatProfileAddress].profileTag} + {dayjs.unix(Math.floor(supportAddressToLatestMessageEntry[chatProfileAddress].timestamp / 1000)).format('hh:mm A MMM-D-YYYY')} +
+ {supportAddressToLatestMessageEntry[chatProfileAddress].messageObj?.content ? supportAddressToLatestMessageEntry[chatProfileAddress].messageObj?.content : "🔒 Locked Message"} +
+
+ + ))} + {Object.keys(channelConfigs).filter((includeAddress) => supportChannelAddressToLatestNotificationEntries[includeAddress]?.length > 0)?.length > 0 && +
+ Notifications + + + View all + + +
+ } + {/* This block is for latest notifications */} + {Object.keys(supportChannelAddressToLatestNotificationEntries).filter((includeAddress) => supportChannelAddressToLatestNotificationEntries[includeAddress].length > 0).map((channelAddress, index) => + <> + { + supportChannelAddressToLatestNotificationEntries[channelAddress] && supportChannelAddressToLatestNotificationEntries[channelAddress].slice(0, 3).map((notificationEntry, notificationIndex) => ( + +
+ {((Math.floor(new Date(notificationEntry.timestamp).getTime() / 1000) > supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[channelAddress]?.[address]) || !supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX?.[channelAddress]?.[address]) && +
+ } +
+ {channelConfigs[channelAddress].channelTag} +
+
+
+ {channelConfigs[channelAddress].channelTag} + {dayjs.unix(Math.floor(notificationEntry?.payload?.data?.epoch)).format('hh:mm A MMM-D-YYYY')} +
+ {notificationEntry?.payload?.data?.amsg ? notificationEntry?.payload?.data?.amsg : "🔒 Locked Message"} +
+
+ + )) + } + + )} + {Object.keys(channelConfigs).filter((includeAddress) => !supportChannelAddressToSubscriptionStatus[includeAddress])?.length > 0 && +
+ Suggested Notification Channels +
+ } + {/* This block is for suggested channels */} + {Object.keys(channelConfigs).filter((includeAddress) => !supportChannelAddressToSubscriptionStatus[includeAddress]).map((channelAddress, index) => ( +
+ {(unreadMessageAccounts.indexOf(channelAddress) > -1) && +
+ } +
+ {channelConfigs[channelAddress].channelTag} +
+
+
+ {channelConfigs[channelAddress].channelTag} + initiateChannelSubscription(channelAddress)} + size="small" + variant="outlined" + buttonColor="primary" + disabled={initiatingChannelSubscriptionAddresses.indexOf(channelAddress) > -1} + text={"Subscribe"} + /> +
+
+
+ ))} + {Object.keys(chatProfileConfigs).filter((includeAddress) => !supportAddressToLatestMessageEntry[includeAddress])?.length > 0 && +
+ Available Support Chats +
+ } + {/* This block is for suggested chats */} + {Object.keys(chatProfileConfigs).filter((includeAddress) => !supportAddressToLatestMessageEntry[includeAddress]).map((chatProfileAddress, index) => ( +
+ {(unreadMessageAccounts.indexOf(chatProfileAddress) > -1) && +
+ } +
+ {chatProfileConfigs[chatProfileAddress].profileTag} +
+
+
+ {chatProfileConfigs[chatProfileAddress].profileTag} + initiateChat(chatProfileAddress)} + size="small" + variant="outlined" + buttonColor="primary" + disabled={initiatingSupportChatAddresses.indexOf(chatProfileAddress) > -1} + text={"Request Support"} + /> +
+
+
+ ))} +
+
+ + } + + ); +} + +export default PushNotificationZone \ No newline at end of file diff --git a/src/containers/MapOverlaySearchFieldContainer.tsx b/src/containers/MapOverlaySearchFieldContainer.tsx new file mode 100644 index 0000000..402f07b --- /dev/null +++ b/src/containers/MapOverlaySearchFieldContainer.tsx @@ -0,0 +1,19 @@ +import { connect, ConnectedProps } from 'react-redux'; + +import MapOverlaySearchField from '../components/MapOverlaySearchField'; + +interface RootState { + isConsideredMobile: boolean + isConsideredMedium: boolean +} + +const mapStateToProps = (state: RootState) => ({ + isConsideredMobile: state.isConsideredMobile, + isConsideredMedium: state.isConsideredMedium, +}) + +const connector = connect(mapStateToProps, {}) + +export type PropsFromRedux = ConnectedProps + +export default connector(MapOverlaySearchField) \ No newline at end of file diff --git a/src/containers/PushNotificationZoneContainer.tsx b/src/containers/PushNotificationZoneContainer.tsx new file mode 100644 index 0000000..80d51a8 --- /dev/null +++ b/src/containers/PushNotificationZoneContainer.tsx @@ -0,0 +1,31 @@ +import { connect, ConnectedProps } from 'react-redux'; + +import { + setSupportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, +} from '../state/actions'; + +import PushNotificationZone from '../components/PushNotificationZone'; + +interface RootState { + isConsideredMobile: boolean + isConsideredMedium: boolean + darkMode: boolean + supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX: {[key: string]: {[key: string]: number}} +} + +const mapStateToProps = (state: RootState) => ({ + isConsideredMobile: state.isConsideredMobile, + isConsideredMedium: state.isConsideredMedium, + darkMode: state.darkMode, + supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX: state.supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, +}) + +const mapDispatchToProps = { + setSupportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, +} + +const connector = connect(mapStateToProps, mapDispatchToProps) + +export type PropsFromRedux = ConnectedProps + +export default connector(PushNotificationZone) \ No newline at end of file diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 8384ca2..437e2a7 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -10,6 +10,7 @@ import useTotalStakingBalancePRO from './useTotalStakingBalancePRO'; import useApproxLeaveAmountFromShareAmount from './useApproxLeaveAmountFromShareAmount'; import useApproxStakerRewardsPending from './useApproxStakerRewardsPending'; import useUnifiedWriteContract from './useUnifiedWriteContract'; +import useEthersSigner from './useEthersSigner'; export { useWindowSize, @@ -24,4 +25,5 @@ export { useApproxLeaveAmountFromShareAmount, useApproxStakerRewardsPending, useUnifiedWriteContract, + useEthersSigner, } \ No newline at end of file diff --git a/src/hooks/useEthersSigner.ts b/src/hooks/useEthersSigner.ts index b3dc50b..83766c7 100644 --- a/src/hooks/useEthersSigner.ts +++ b/src/hooks/useEthersSigner.ts @@ -1,10 +1,10 @@ -import * as React from 'react' -import { useWalletClient } from 'wagmi' import { providers } from 'ethers' - -//@ts-ignore -export function walletClientToSigner(walletClient) { - const { account, chain, transport } = walletClient +import { useMemo } from 'react' +import type { Account, Chain, Client, Transport } from 'viem' +import { Config, useConnectorClient } from 'wagmi' + +export function clientToSigner(client: Client) { + const { account, chain, transport } = client const network = { chainId: chain.id, name: chain.name, @@ -14,12 +14,9 @@ export function walletClientToSigner(walletClient) { const signer = provider.getSigner(account.address) return signer } - -/** Hook to convert a viem Wallet Client to an ethers.js Signer. */ -export function useEthersSigner({ chainId }: { chainId?: number } = {}) { - const { data: walletClient } = useWalletClient({ chainId }) - return React.useMemo( - () => (walletClient ? walletClientToSigner(walletClient) : undefined), - [walletClient], - ) + +/** Hook to convert a Viem Client to an ethers.js Signer. */ +export default function useEthersSigner({ chainId }: { chainId?: number } = {}) { + const { data: client } = useConnectorClient({ chainId }) + return useMemo(() => (client ? clientToSigner(client) : undefined), [client]) } \ No newline at end of file diff --git a/src/hooks/useUnifiedWriteContract.ts b/src/hooks/useUnifiedWriteContract.ts index cd276fe..10782b0 100644 --- a/src/hooks/useUnifiedWriteContract.ts +++ b/src/hooks/useUnifiedWriteContract.ts @@ -216,6 +216,7 @@ export function useUnifiedWriteContract({ isLoading: transactionType === 'traditional' ? isLoadingTraditional : isLoadingAA, txId: transactionType === 'traditional' ? null : txId, txHash: transactionType === 'traditional' ? traditionalData : null, + capabilities, }; } diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 2c416b3..3f492bd 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -21,6 +21,13 @@ export interface IEVMTransactionRecord { value: string; } +export interface ISelectedPopupConfig { + type: "listing" | "token" | false, + asset_address: string | false; + network: string | false; + token_id: string | false; +} + export type L1Networks = 'ethereum' | 'goerli' | 'sepolia' export type L2Networks = 'arbitrum' | 'base' | 'base-sepolia' | 'base-goerli' diff --git a/src/services/api.ts b/src/services/api.ts index c637c37..c56c00e 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -175,6 +175,13 @@ export const NFTService = { } return ApiService.get(`/nft/coordinates-postgis-points/${network}`, `${contractNameOrCollectionNameOrAddress}${queryString}`) }, + async getSearchOptionsWithPostGISPoints( + network: string, + contractNameOrCollectionNameOrAddress: string, + queryString: string + ) : Promise { + return ApiService.get(`/nft/coordinates-postgis-points-via-string-query/${network}`, `${contractNameOrCollectionNameOrAddress}?query=${queryString}`) + }, async getCoordinatesPostGISClusters( network: string, contractNameOrCollectionNameOrAddress: string, diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 277c9ef..6d19c8b 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -42,4 +42,9 @@ export const setPropyKeysMapFilterOptions = (filterOptions: IPropyKeysMapFilterO export const setFullScreenGalleryConfig = (fullScreenGalleryConfig: IFullScreenGalleryConfig) => ({ type: "SET_FULL_SCREEN_GALLERY_CONFIG", fullScreenGalleryConfig: fullScreenGalleryConfig, +}) + +export const setSupportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX = (supportAddressToWalletToTimestamp: {[key: string]: {[key: string]: number}}) => ({ + type: "SET_SUPPORT_ADDRESS_TO_WALLET_ADDRESS_TO_LAST_PUSH_CHAT_DISMISSED_TIMESTAMP_UNIX", + supportAddressToWalletToTimestamp, }) \ No newline at end of file diff --git a/src/state/reducers/index.ts b/src/state/reducers/index.ts index 3439e97..2fd09dc 100644 --- a/src/state/reducers/index.ts +++ b/src/state/reducers/index.ts @@ -7,6 +7,7 @@ import isConsideredMedium from './isConsideredMedium'; import activeNetwork from './activeNetwork'; import propyKeysMapFilterOptions from './propyKeysMapFilterOptions'; import fullScreenGalleryConfig from './fullScreenGalleryConfig'; +import supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX from './supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX'; const rootReducer = combineReducers({ showLeftMenu, @@ -17,6 +18,7 @@ const rootReducer = combineReducers({ activeNetwork, propyKeysMapFilterOptions, fullScreenGalleryConfig, + supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX, }); export default rootReducer; diff --git a/src/state/reducers/supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX.ts b/src/state/reducers/supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX.ts new file mode 100644 index 0000000..a2ca929 --- /dev/null +++ b/src/state/reducers/supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX.ts @@ -0,0 +1,23 @@ +interface ISetWalletToTimstamp { + type: string; + supportAddressToWalletToTimestamp: {[key: string]: {[key: string]: number}} +} + +const supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX = (state = {}, action: ISetWalletToTimstamp) => { + switch (action.type) { + case 'SET_SUPPORT_ADDRESS_TO_WALLET_ADDRESS_TO_LAST_PUSH_CHAT_DISMISSED_TIMESTAMP_UNIX': + const freshStateFromCurrentState = JSON.parse(JSON.stringify(state)); + // Merge the new data into the fresh state + Object.entries(action.supportAddressToWalletToTimestamp).forEach(([supportAddress, walletToTimestamp]) => { + if (!freshStateFromCurrentState[supportAddress]) { + freshStateFromCurrentState[supportAddress] = {}; + } + Object.assign(freshStateFromCurrentState[supportAddress], walletToTimestamp); + }); + return freshStateFromCurrentState; + default: + return state + } +} + +export default supportAddressToWalletAddressToLastPushChatDismissedTimestampUNIX; \ No newline at end of file diff --git a/src/styles/App.scss b/src/styles/App.scss index 0e5ad1d..76f8a6b 100644 --- a/src/styles/App.scss +++ b/src/styles/App.scss @@ -17,6 +17,12 @@ width: 100%; } +.flex-center { + display: flex; + justify-content: center; + align-items: center; +} + .flex-column { display: flex; flex-direction: column; @@ -160,4 +166,12 @@ w3m-modal { .hide-body-overflow { overflow: hidden!important; +} + +.space-between { + justify-content: space-between; +} + +.relative { + position: relative; } \ No newline at end of file diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 41641aa..e81c27a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -278,8 +278,15 @@ export const BRIDGE_SELECTION_TO_ORIGIN_AND_DESTINATION_NETWORK : {[key: string] export const IS_GLOBAL_TOP_BANNER_ENABLED = true; export const GLOBAL_TOP_BANNER_HEIGHT = 28; export const GLOBAL_PAGE_HEIGHT = IS_GLOBAL_TOP_BANNER_ENABLED ? `calc(100vh - ${64 + GLOBAL_TOP_BANNER_HEIGHT}px)` : 'calc(100vh - 64px)'; +export const getGlobalPageHeight = (isConsideredMobile: boolean) => { + if(isConsideredMobile) { + return IS_GLOBAL_TOP_BANNER_ENABLED ? `calc(100vh - ${(64 * 2) + GLOBAL_TOP_BANNER_HEIGHT}px)` : 'calc(100vh - 64px)'; + } + return GLOBAL_PAGE_HEIGHT; +} + -interface ICollectionEntry { +export interface ICollectionEntry { network: string; address: string; slug: string; diff --git a/yarn.lock b/yarn.lock index 29ef866..4cf08df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1577,7 +1577,7 @@ "@ethereumjs/util" "^8.1.0" ethereum-cryptography "^2.0.0" -"@ethereumjs/util@^8.1.0": +"@ethereumjs/util@^8.0.6", "@ethereumjs/util@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== @@ -2300,6 +2300,18 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.13": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -2675,6 +2687,17 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.2.0" +"@livepeer/core@^1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@livepeer/core/-/core-1.9.2.tgz#47b14b4a06ee5249ac3fcd10b119cbe9723ebd8f" + integrity sha512-b97YpsxEDStZs8JHj4MCoMK1SJ80hRLcPOHlQohpZSp/Guvx56j/SNbCTLclmJFWBu5+ddtSpWzCXsr0moI8/g== + dependencies: + cross-fetch "^4.0.0" + ms "^3.0.0-canary.1" + multiformats "9.9.0" + tus-js-client "^3.1.0" + zustand "^4.3.9" + "@metamask/detect-provider@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/detect-provider/-/detect-provider-2.0.0.tgz#4bc2795e5e6f7d8b84b2e845058d2f222c99917d" @@ -2689,6 +2712,18 @@ "@metamask/safe-event-emitter" "^3.0.0" "@metamask/utils" "^5.0.1" +"@metamask/eth-sig-util@^5.0.2": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-5.1.0.tgz#a47f62800ee1917fef976ba67544a0ccd7d1bd6b" + integrity sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ== + dependencies: + "@ethereumjs/util" "^8.0.6" + bn.js "^4.12.0" + ethereum-cryptography "^2.0.0" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + "@metamask/jazzicon@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/jazzicon/-/jazzicon-2.0.0.tgz#5615528e91c0fc5c9d79202d1f0954a7922525a0" @@ -3277,6 +3312,28 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@pushprotocol/restapi@^1.7.25": + version "1.7.25" + resolved "https://registry.yarnpkg.com/@pushprotocol/restapi/-/restapi-1.7.25.tgz#cbdb0e4369581ae1eee15110a5ae4e8caa9987e4" + integrity sha512-GFkGoctHw+bHUV/2Ff0zFc6ZJMFu/7k2L+VhLtkeb16Sh7HBojk7c4ktdiGgRm/kWLjDp1IDFjUXR+PLFziPAA== + dependencies: + "@metamask/eth-sig-util" "^5.0.2" + axios "^0.27.2" + buffer "^6.0.3" + crypto-js "^4.1.1" + immer "^10.0.2" + joi "^17.9.2" + livepeer "^2.5.8" + lru-cache "^10.1.0" + openpgp "^5.5.0" + simple-peer "^9.11.1" + socket.io-client "^4.7.2" + tslib "^2.3.0" + unique-names-generator "^4.7.1" + uuid "^9.0.0" + video-stream-merger "^4.0.1" + viem "^1.20.3" + "@react-leaflet/core@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@react-leaflet/core/-/core-2.1.0.tgz#383acd31259d7c9ae8fb1b02d5e18fe613c2a13d" @@ -3490,6 +3547,23 @@ "@noble/hashes" "~1.4.0" "@scure/base" "~1.1.6" +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -3653,6 +3727,11 @@ "@stablelib/random" "^1.0.2" "@stablelib/wipe" "^1.0.1" +"@stitches/core@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@stitches/core/-/core-1.2.8.tgz#dce3b8fdc764fbc6dbea30c83b73bfb52cf96173" + integrity sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg== + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -5996,6 +6075,25 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1.js@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1.js@^5.0.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -6121,6 +6219,14 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axios@^1.4.0: version "1.6.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" @@ -6376,12 +6482,12 @@ bn.js@4.11.8: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.12.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -6444,7 +6550,7 @@ braces@^3.0.2, braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -brorand@^1.1.0: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -6454,7 +6560,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.2.0: +browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -6466,6 +6572,56 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" + integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.5" + hash-base "~3.0" + inherits "^2.0.4" + parse-asn1 "^5.1.7" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2: version "4.22.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" @@ -6522,7 +6678,7 @@ buffer-fill@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== -buffer-from@^1.0.0, buffer-from@^1.1.1: +buffer-from@^1.0.0, buffer-from@^1.1.1, buffer-from@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== @@ -6983,6 +7139,14 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +combine-errors@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/combine-errors/-/combine-errors-3.0.3.tgz#f4df6740083e5703a3181110c2b10551f003da86" + integrity sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q== + dependencies: + custom-error-instance "2.1.1" + lodash.uniqby "4.5.0" + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -7145,6 +7309,11 @@ core-js@^3.0.0, core-js@^3.19.2: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.35.1.tgz#9c28f8b7ccee482796f8590cc8d15739eaaf980c" integrity sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw== +core-js@^3.31.1: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e" + integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -7182,6 +7351,14 @@ crc-32@^1.2.0: resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -7193,7 +7370,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -7241,7 +7418,24 @@ crossws@^0.2.0, crossws@^0.2.4: resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.2.4.tgz#82a8b518bff1018ab1d21ced9e35ffbe1681ad03" integrity sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg== -crypto-js@^4.2.0: +crypto-browserify@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-js@^4.1.1, crypto-js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== @@ -7477,6 +7671,11 @@ csstype@^3.0.2, csstype@^3.1.2, csstype@^3.1.3: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +custom-error-instance@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/custom-error-instance/-/custom-error-instance-2.1.1.tgz#3cf6391487a6629a6247eb0ca0ce00081b7e361a" + integrity sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg== + d3-array@2, d3-array@^2.3.0: version "2.12.1" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" @@ -7827,6 +8026,14 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destr@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" @@ -7890,6 +8097,15 @@ diff-sequences@^29.6.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dijkstrajs@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" @@ -8114,6 +8330,19 @@ elliptic@6.5.4, elliptic@^6.5.2: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.3, elliptic@^6.5.5: + version "6.5.7" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" + integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + elliptic@^6.5.4: version "6.5.5" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" @@ -9037,7 +9266,7 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.3: +ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -9070,7 +9299,7 @@ events@3.3.0, events@^3.0.0, events@^3.2.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -9382,6 +9611,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.4: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.14.9: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -9551,6 +9785,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-browser-rtc@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" + integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -9830,6 +10069,14 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-base@~3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -9863,6 +10110,11 @@ hey-listen@^1.0.8: resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== +hls.js@^1.4.12: + version "1.5.15" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.5.15.tgz#dbceb45492dcbdce9659e0d43cffa6c5cebaefb7" + integrity sha512-6cD7xN6bycBHaXz2WyPIaHn/iXFizE5au2yvY5q9aC4wfihxAr16C9fUy4nxh2a3wOw0fEgLRa9dN6wsYjlpNg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -10112,6 +10364,11 @@ immediate@^3.2.3: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== +immer@^10.0.2: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + immer@^9.0.7: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -11241,6 +11498,22 @@ jiti@^1.21.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== +joi@^17.9.2: + version "17.13.3" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-base64@^3.7.2: + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -11736,6 +12009,20 @@ lit@3.1.0: lit-element "^4.0.0" lit-html "^3.1.0" +livepeer@^2.5.8: + version "2.9.2" + resolved "https://registry.yarnpkg.com/livepeer/-/livepeer-2.9.2.tgz#12a6080a875401ea630cc3367a44c8f392fe1a23" + integrity sha512-bkFLjw/+wFFNI5TT9z2Fa1yNEByGxBtkA1IoEWHytvkJtA2ifoiT676sZYpy+D+nZp1XdLEBdvudkDwM/SlPhg== + dependencies: + "@livepeer/core" "^1.9.2" + "@stitches/core" "^1.2.8" + core-js "^3.31.1" + cross-fetch "^4.0.0" + hls.js "^1.4.12" + ms "^3.0.0-canary.1" + tus-js-client "^3.1.0" + zustand "^4.3.9" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -11782,6 +12069,43 @@ lodash-es@^4.17.21: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash._baseiteratee@~4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz#34a9b5543572727c3db2e78edae3c0e9e66bd102" + integrity sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ== + dependencies: + lodash._stringtopath "~4.8.0" + +lodash._basetostring@~4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz#9327c9dc5158866b7fa4b9d42f4638e5766dd9df" + integrity sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw== + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + integrity sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A== + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + integrity sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA== + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== + +lodash._stringtopath@~4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz#941bcf0e64266e5fc1d66fed0a6959544c576824" + integrity sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ== + dependencies: + lodash._basetostring "~4.12.0" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -11812,11 +12136,24 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== +lodash.uniqby@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz#a3a17bbf62eeb6240f491846e97c1c4e2a5e1e21" + integrity sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ== + dependencies: + lodash._baseiteratee "~4.7.0" + lodash._baseuniq "~4.6.0" + lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -11843,7 +12180,7 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.2.0: +lru-cache@^10.1.0, lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -12043,6 +12380,14 @@ micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -12191,6 +12536,11 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@^3.0.0-canary.1: + version "3.0.0-canary.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80" + integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g== + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -12199,6 +12549,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +multiformats@9.9.0, multiformats@^9.4.2: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + multiformats@^11.0.0: version "11.0.2" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" @@ -12214,11 +12569,6 @@ multiformats@^13.0.0: resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.0.1.tgz#c0622affa5171189eacd57c06f977195ca7acb08" integrity sha512-bt3R5iXe2O8xpp3wkmQhC73b/lC4S2ihU8Dndwcsysqbydqb8N+bpP116qMcClZ17g58iSIwtXUTcg2zT4sniA== -multiformats@^9.4.2: - version "9.9.0" - resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" - integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== - mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -12563,6 +12913,13 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openpgp@^5.5.0: + version "5.11.2" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.11.2.tgz#2c035a26b13feb3b0bb5180718ec91c8e65cc686" + integrity sha512-f8dJFVLwdkvPvW3VPFs6q9Vs2+HNhdvwls7a/MIFcQUB+XiQzRe7alfa3RtwfGJU7oUDDMAWPZ0nYsHa23Az+A== + dependencies: + asn1.js "^5.0.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -12645,6 +13002,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -12660,6 +13022,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" + integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== + dependencies: + asn1.js "^4.10.1" + browserify-aes "^1.2.0" + evp_bytestokey "^1.0.3" + hash-base "~3.0" + pbkdf2 "^3.1.2" + safe-buffer "^5.2.1" + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -12764,7 +13138,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17: +pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -13573,6 +13947,15 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.6.0, object-assign "^4.1.1" react-is "^16.13.1" +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + property-expr@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8" @@ -13606,6 +13989,18 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -13717,7 +14112,7 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -queue-microtask@^1.2.2: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -13739,13 +14134,21 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -13851,6 +14254,11 @@ react-fast-marquee@^1.6.2: resolved "https://registry.yarnpkg.com/react-fast-marquee/-/react-fast-marquee-1.6.3.tgz#a1f3a0ce3b298c395766d19051aa8fa3af9f1a1c" integrity sha512-oEISmNElv6lua/4i4uPYIteUKDxU0hAKKjH/tY2icje4GCns1rX6pIrkwVhjX0FMCIepUVqeyCchvqkiO/s2vw== +react-ga4@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-ga4/-/react-ga4-2.1.0.tgz#56601f59d95c08466ebd6edfbf8dede55c4678f9" + integrity sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ== + react-google-recaptcha-v3@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/react-google-recaptcha-v3/-/react-google-recaptcha-v3-1.10.1.tgz#5b125bc0dec123206431860e8800e188fc735aff" @@ -14051,7 +14459,7 @@ readable-stream@^1.0.33: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.9, readable-stream@^2.3.3: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -14348,6 +14756,11 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -14434,7 +14847,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -14786,6 +15199,19 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-peer@^9.11.1: + version "9.11.1" + resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.1.tgz#9814d5723f821b778b7fb011bdefcbd1e788e6cc" + integrity sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw== + dependencies: + buffer "^6.0.3" + debug "^4.3.2" + err-code "^3.0.1" + get-browser-rtc "^1.1.0" + queue-microtask "^1.2.3" + randombytes "^2.1.0" + readable-stream "^3.6.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -14809,7 +15235,7 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -socket.io-client@^4.5.1: +socket.io-client@^4.5.1, socket.io-client@^4.7.2: version "4.7.5" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== @@ -15620,6 +16046,11 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -15634,11 +16065,34 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tus-js-client@^3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/tus-js-client/-/tus-js-client-3.1.3.tgz#bac62c14c770ba71492072179b55292baa19a074" + integrity sha512-n9k6rI/nPOuP2TaqPG6Ogz3a3V1cSH9en7N0VH4gh95jmG8JA58TJzLms2lBfb7aKVb3fdUunqYEG3WnQnZRvQ== + dependencies: + buffer-from "^1.1.2" + combine-errors "^3.0.3" + is-stream "^2.0.0" + js-base64 "^3.7.2" + lodash.throttle "^4.1.1" + proper-lockfile "^4.1.2" + url-parse "^1.5.7" + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -15856,6 +16310,11 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unique-names-generator@^4.7.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/unique-names-generator/-/unique-names-generator-4.7.1.tgz#966407b12ba97f618928f77322cfac8c80df5597" + integrity sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow== + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -15947,7 +16406,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.5.3: +url-parse@^1.5.3, url-parse@^1.5.7: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -15973,6 +16432,11 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + utf-8-validate@^5.0.2: version "5.0.10" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" @@ -16031,7 +16495,7 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.1: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -16072,7 +16536,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -viem@^1.0.0, viem@^1.1.4, viem@^1.16.6: +video-stream-merger@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/video-stream-merger/-/video-stream-merger-4.0.1.tgz#b0061251bd211121d1256ccf9e2be9477e59d5cb" + integrity sha512-VazYSr8tk6S/zkOq5jpR/ryy1HnGxm5XCw+d2Ejpqy1m6d71oZpyFG82dUkgAo7dg/lk3k4TqvJPtuRUtR8URA== + +viem@^1.0.0, viem@^1.1.4, viem@^1.16.6, viem@^1.20.3: version "1.21.4" resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== @@ -16100,6 +16569,11 @@ viem@^2.16.2: isows "1.0.4" ws "8.17.1" +vm-browserify@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + vue@>=3: version "3.4.15" resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.15.tgz#91f979844ffca9239dff622ba4c79c5d5524b88c" @@ -16954,3 +17428,10 @@ zustand@4.4.1: integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== dependencies: use-sync-external-store "1.2.0" + +zustand@^4.3.9: + version "4.5.5" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.5.tgz#f8c713041543715ec81a2adda0610e1dc82d4ad1" + integrity sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q== + dependencies: + use-sync-external-store "1.2.2"