From 741a870f0f029eaca1f3823f0d4eeb7c605bbfdb Mon Sep 17 00:00:00 2001 From: OhMyGuus Date: Tue, 11 May 2021 01:04:50 +0200 Subject: [PATCH] Mod detection & new among us ver --- package.json | 2 +- src/common/AmongUsState.ts | 2 + src/common/ObsOverlay.ts | 1 + src/common/PublicLobby.ts | 6 ++ src/main/GameReader.ts | 52 +++++++++---- src/main/index.ts | 1 - src/main/memoryjs.d.ts | 3 + src/main/offsetStore.ts | 5 +- src/renderer/Avatar.tsx | 36 +++++---- src/renderer/Overlay.tsx | 1 + src/renderer/Voice.tsx | 8 +- src/renderer/cosmetics.ts | 151 +++++++++++++++---------------------- yarn.lock | 89 +++++++++++++--------- 13 files changed, 197 insertions(+), 160 deletions(-) diff --git a/package.json b/package.json index 18ca2bb0f..64299c49d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bettercrewlink", - "version": "2.6.1", + "version": "2.6.3", "license": "GPL-3.0-or-later", "description": "Free, open, Among Us proximity voice chat", "repository": { diff --git a/src/common/AmongUsState.ts b/src/common/AmongUsState.ts index 435d9968a..b0f604707 100644 --- a/src/common/AmongUsState.ts +++ b/src/common/AmongUsState.ts @@ -17,6 +17,7 @@ export interface AmongUsState { closedDoors: number[]; currentServer: string; maxPlayers: number; + mod: string; } export interface Player { @@ -80,4 +81,5 @@ export interface VoiceState { localIsAlive: boolean; muted: boolean; deafened: boolean; + mod: string; } diff --git a/src/common/ObsOverlay.ts b/src/common/ObsOverlay.ts index 91e51d5ad..865338fb0 100644 --- a/src/common/ObsOverlay.ts +++ b/src/common/ObsOverlay.ts @@ -27,4 +27,5 @@ export interface ObsVoiceState { otherDead: ClientBoolMap; localTalking: boolean; localIsAlive: boolean; + mod: string; } diff --git a/src/common/PublicLobby.ts b/src/common/PublicLobby.ts index 6947f5c28..5d0a6ed7a 100644 --- a/src/common/PublicLobby.ts +++ b/src/common/PublicLobby.ts @@ -1,6 +1,7 @@ export interface AmongusMod { id: string; label: string; + dllStartsWith?: string } @@ -13,18 +14,23 @@ export const modList: AmongusMod[] = [ { id: 'TOWN_OF_US', label: 'Town of Us', + dllStartsWith: 'TownOfUs' }, { id: 'TOWN_OF_IMPOSTORS', label: 'Town of Impostors', + dllStartsWith: 'TownOfImpostors' + }, { id: 'THE_OTHER_ROLES', label: 'The Other Roles', + dllStartsWith: 'TheOtherRoles' }, { id: 'EXTRA_ROLES', label: 'Extra Roles', + dllStartsWith: 'ExtraRoles' }, { id: 'OTHER', diff --git a/src/main/GameReader.ts b/src/main/GameReader.ts index 0b9fc4e3e..16e5728b6 100644 --- a/src/main/GameReader.ts +++ b/src/main/GameReader.ts @@ -11,6 +11,7 @@ import { virtualAllocEx, writeBuffer, writeMemory, + getProcessPath, } from 'memoryjs'; import Struct from 'structron'; import { IpcOverlayMessages, IpcRendererMessages } from '../common/ipc-messages'; @@ -22,6 +23,9 @@ import { GenerateAvatars, numberToColorHex } from './avatarGenerator'; import { RainbowColorId } from '../renderer/cosmetics'; import { TempFixOffsets, TempFixOffsets2 } from './offsetStore'; import { platform } from 'os'; +import fs from 'fs'; +import path from 'path'; +import { AmongusMod, modList } from '../common/PublicLobby'; interface ValueType { read(buffer: BufferSource, offset: number): T; @@ -52,6 +56,7 @@ export default class GameReader { lastPlayerPtr = 0; shouldReadLobby = false; is_64bit = false; + is_linux = false; oldGameState = GameState.UNKNOWN; lastState: AmongUsState = {} as AmongUsState; amongUs: ProcessObject | null = null; @@ -63,6 +68,14 @@ export default class GameReader { currentServer = ''; disableWriting = false; pid = -1; + loadedMod = modList[0]; + gamePath = ''; + + constructor(sendIPC: Electron.WebContents['send']) { + this.is_linux = platform() === 'linux'; + this.sendIPC = sendIPC; + } + checkProcessOpen(): void { const processesOpen = getProcesses().filter((p) => p.szExeFile === 'Among Us.exe'); let error = ''; @@ -73,6 +86,8 @@ export default class GameReader { this.pid = processOpen.th32ProcessID; this.amongUs = openProcess(processOpen.th32ProcessID); this.gameAssembly = findModule('GameAssembly.dll', this.amongUs.th32ProcessID); + this.gamePath = getProcessPath(this.amongUs.handle); + this.loadedMod = this.getInstalledMods(this.gamePath); this.initializeoffsets(); this.sendIPC(IpcRendererMessages.NOTIFY_GAME_OPENED, true); break; @@ -97,6 +112,25 @@ export default class GameReader { } return; } + + getInstalledMods(filePath: string): AmongusMod { + const pathLower = filePath.toLowerCase(); + if (pathLower.includes('epic') || pathLower.includes('?\\volume') || this.is_linux) { + return modList[0]; + } else { + let dir = path.dirname(filePath); + let loadedWinHttp = fs.existsSync(path.join(dir, 'winhttp.dll')); + if (!loadedWinHttp) { + return modList[0]; + } + for (const file of fs.readdirSync(path.join(dir, 'BepInEx\\plugins'))) { + let mod = modList.find((o) => o.dllStartsWith && file.includes(o.dllStartsWith)); + if (mod) return mod; + } + return modList[0]; + } + } + checkProcessDelay = 0; loop(): string | null { if (this.checkProcessDelay-- <= 0) { @@ -337,6 +371,7 @@ export default class GameReader { lightRadius, lightRadiusChanged: lightRadius != this.lastState?.lightRadius, map, + mod: this.loadedMod.id, closedDoors, currentServer: this.currentServer, maxPlayers, @@ -355,10 +390,6 @@ export default class GameReader { return null; } - constructor(sendIPC: Electron.WebContents['send']) { - this.sendIPC = sendIPC; - } - initializeoffsets(): void { console.log('INITIALIZEOFFSETS???'); this.is_64bit = this.isX64Version(); @@ -457,14 +488,7 @@ export default class GameReader { } initializeWrites(): void { - if ( - this.isX64Version() || - !this.offsets || - !this.amongUs || - !this.gameAssembly || - this.disableWriting || - platform() === 'linux' - ) { + if (this.is_64bit || !this.offsets || !this.amongUs || !this.gameAssembly || this.disableWriting || this.is_linux) { //not supported atm return; } @@ -858,7 +882,9 @@ export default class GameReader { let x = this.readMemory('float', data.objectPtr, positionOffsets[0]); let y = this.readMemory('float', data.objectPtr, positionOffsets[1]); const isDummy = this.readMemory('boolean', data.objectPtr, this.offsets.player.isDummy); - + if (isDummy) { + console.log('ISDUMMY!!!!@!@!'); + } let bugged = false; if (x === undefined || y === undefined || data.disconnected != 0 || data.color > 40) { x = 9999; diff --git a/src/main/index.ts b/src/main/index.ts index 01d47e8cd..e970a218e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -322,7 +322,6 @@ if (!gotTheLock) { }); ipcMain.on('update-app', () => { - app.relaunch(); autoUpdater.quitAndInstall(); }); diff --git a/src/main/memoryjs.d.ts b/src/main/memoryjs.d.ts index 7e2d5e865..ab1268662 100644 --- a/src/main/memoryjs.d.ts +++ b/src/main/memoryjs.d.ts @@ -71,6 +71,9 @@ declare module 'memoryjs' { export function readBuffer(handle: number, address: number, size: number, callback?: Callback): Buffer; + export function getProcessPath(handle: number): string; + + export function writeMemory(handle: number, address: number, value: T, dataType: DataType): void; export function writeBuffer(handle: number, address: number, buffer: Buffer): void; diff --git a/src/main/offsetStore.ts b/src/main/offsetStore.ts index d0586043b..ebbb23156 100644 --- a/src/main/offsetStore.ts +++ b/src/main/offsetStore.ts @@ -310,8 +310,7 @@ export default { addressOffset: 0, }, gameData: { - sig: - '8B 0D ? ? ? ? 8B F0 83 C4 10 8B 49 5C 8B 01 85 C0 0F 84 ? ? ? ? 6A 00 FF 75 F4 50 E8 ? ? ? ? 83 C4 0C 89 45 E8 85 C0', + sig: '8B 0D ? ? ? ? 8B F0 83 C4 10 8B 49 5C 8B 01', patternOffset: 2, addressOffset: 0, }, @@ -332,7 +331,7 @@ export default { addressOffset: 0, }, playerControl: { - sig: '8B 0D ? ? ? ? 83 C4 04 8B 41 5C 8B 00 85 C0 74 2B C6 40 30 00', + sig: '8B 0D ? ? ? ? 83 C4 04 8B 41 5C 8B 00 85 C0 74 2B', patternOffset: 2, addressOffset: 0, }, diff --git a/src/renderer/Avatar.tsx b/src/renderer/Avatar.tsx index e10aadc79..260d64032 100644 --- a/src/renderer/Avatar.tsx +++ b/src/renderer/Avatar.tsx @@ -1,6 +1,6 @@ import React, { useRef } from 'react'; import { Player } from '../common/AmongUsState'; -import { backLayerHats, hatOffsets, getCosmetic, redAlive, cosmeticType } from './cosmetics'; +import { backLayerHats, getCosmetic, redAlive, cosmeticType, getHatDementions, HatDementions } from './cosmetics'; import makeStyles from '@material-ui/core/styles/makeStyles'; import MicOff from '@material-ui/icons/MicOff'; import VolumeOff from '@material-ui/icons/VolumeOff'; @@ -64,6 +64,7 @@ export interface CanvasProps { overflow: boolean; usingRadio: boolean | undefined; onClick?: () => void; + mod: string; } export interface AvatarProps { @@ -82,6 +83,7 @@ export interface AvatarProps { overflow?: boolean; isUsingRadio?: boolean; onConfigChange?: () => void; + mod: string; } const Avatar: React.FC = function ({ @@ -100,6 +102,7 @@ const Avatar: React.FC = function ({ lookLeft = false, overflow = false, onConfigChange, + mod, }: AvatarProps) { const classes = useStyles(); let icon; @@ -134,6 +137,7 @@ const Avatar: React.FC = function ({ size={size} overflow={overflow} usingRadio={isUsingRadio} + mod={mod} /> ); @@ -202,7 +206,7 @@ const Avatar: React.FC = function ({ interface UseCanvasStylesParams { backLayerHat: boolean; isAlive: boolean; - hatY: string; + hatDementions: HatDementions; lookLeft: boolean; size: number; borderColor: string; @@ -217,10 +221,11 @@ const useCanvasStyles = makeStyles(() => ({ zIndex: 2, }, hat: { - width: '105%', + width: ({ hatDementions }: UseCanvasStylesParams) => hatDementions.width, position: 'absolute', - top: ({ hatY }: UseCanvasStylesParams) => `calc(22% + ${hatY})`, - left: ({ size, paddingLeft }: UseCanvasStylesParams) => Math.max(2, size / 40) / 2 + paddingLeft, + top: ({ hatDementions }: UseCanvasStylesParams) => `calc(22% + ${hatDementions.top})`, + left: ({ size, paddingLeft, hatDementions }: UseCanvasStylesParams) => + `calc(${hatDementions.left} + ${Math.max(2, size / 40) / 2 + paddingLeft}px)`, //`calc(${hatDementions.left} + ${Math.max(2, size / 40) / 2 + paddingLeft})` , zIndex: ({ backLayerHat }: UseCanvasStylesParams) => (backLayerHat ? 1 : 4), display: ({ isAlive }: UseCanvasStylesParams) => (isAlive ? 'block' : 'none'), }, @@ -268,25 +273,27 @@ function Canvas({ overflow, usingRadio, onClick, + mod, }: CanvasProps) { const hatImg = useRef(null); const skinImg = useRef(null); const image = useRef(null); - const hatY = hatOffsets[hat] || '-33%'; + const hatDementions = getHatDementions(hat, 'TOWN_OF_US'); const classes = useCanvasStyles({ backLayerHat: backLayerHats.has(hat), isAlive, - hatY, + hatDementions: hatDementions, lookLeft, size, borderColor, paddingLeft: -7, }); -//@ts-ignore + //@ts-ignore const onerror = (e: any) => { - e.target.onError = null; - e.target.src = ''; + console.log("ONERROR: ", e.target.src) + e.target.src = undefined; + e.target.style.display='none' }; return ( <> @@ -313,7 +320,7 @@ function Canvas({ /> )} {!overflow && ( = ({ lookLeft={!(positionParse === 'left' || positionParse === 'bottom_left')} overflow={isOnSide && !showName} showHat={true} + mod={voiceState.mod} /> {showName && ( diff --git a/src/renderer/Voice.tsx b/src/renderer/Voice.tsx index 98b1c7821..141721b6c 100644 --- a/src/renderer/Voice.tsx +++ b/src/renderer/Voice.tsx @@ -595,6 +595,7 @@ const Voice: React.FC = function ({ t, error: initialError }: VoiceP otherDead, localTalking: talking, localIsAlive: !myPlayer?.isDead, + mod: gameState.mod, }; connectionStuff.current.overlaySocket?.emit('signal', { to: settings.obsSecret, @@ -648,8 +649,10 @@ const Voice: React.FC = function ({ t, error: initialError }: VoiceP max_players: gameState.maxPlayers, server: gameState.currentServer, language: lobbySettings.publicLobby_language, - mods: lobbySettings.publicLobby_mods, + mods: gameState.mod !== 'NONE' ? gameState.mod : lobbySettings.publicLobby_mods, isPublic: lobbySettings.publicLobby_on && gameState.gameState == GameState.LOBBY, + isPublic2:lobbySettings.publicLobby_on, // TEMP DEBUG + gameState: gameState.gameState, }); }; @@ -1284,6 +1287,7 @@ const Voice: React.FC = function ({ t, error: initialError }: VoiceP impostorRadioClientId: !myPlayer?.isImpostor ? -1 : impostorRadioClientId.current, muted: mutedState, deafened: deafenedState, + mod: gameState.mod, } as VoiceState); }, [ otherTalking, @@ -1323,6 +1327,7 @@ const Voice: React.FC = function ({ t, error: initialError }: VoiceP talking={talking} isAlive={!myPlayer.isDead} size={100} + mod={gameState.mod} /> @@ -1417,6 +1422,7 @@ const Voice: React.FC = function ({ t, error: initialError }: VoiceP onConfigChange={() => { store.set(`playerConfigMap.${player.nameHash}`, playerConfigs[player.nameHash]); }} + mod={gameState.mod} /> ); diff --git a/src/renderer/cosmetics.ts b/src/renderer/cosmetics.ts index 56f45c4db..8073e8eb8 100644 --- a/src/renderer/cosmetics.ts +++ b/src/renderer/cosmetics.ts @@ -166,69 +166,6 @@ import redAliveimg from '../../static/players/red-alive.png'; // @ts-ignore import rainbowBalloon from '../../static/hats/77-rb.png'; // @ts-ignore import rainbowKid from '../../static/hats/90-rb.png'; export const redAlive = redAliveimg; -// // @ts-ignore -// import redAlive from '../../static/players/red-alive.png'; // @ts-ignore -// import blueAlive from '../../static/players/blue-alive.png'; // @ts-ignore -// import greenAlive from '../../static/players/green-alive.png'; // @ts-ignore -// import pinkAlive from '../../static/players/pink-alive.png'; // @ts-ignore -// import orangeAlive from '../../static/players/orange-alive.png'; // @ts-ignore -// import yellowAlive from '../../static/players/yellow-alive.png'; // @ts-ignore -// import blackAlive from '../../static/players/black-alive.png'; // @ts-ignore -// import whiteAlive from '../../static/players/white-alive.png'; // @ts-ignore -// import purpleAlive from '../../static/players/purple-alive.png'; // @ts-ignore -// import brownAlive from '../../static/players/brown-alive.png'; // @ts-ignore -// import cyanAlive from '../../static/players/cyan-alive.png'; // @ts-ignore -// import limeAlive from '../../static/players/lime-alive.png'; - -// // @ts-ignore -// import redDead from '../../static/players/red-dead.png'; // @ts-ignore -// import blueDead from '../../static/players/blue-dead.png'; // @ts-ignore -// import greenDead from '../../static/players/green-dead.png'; // @ts-ignore -// import pinkDead from '../../static/players/pink-dead.png'; // @ts-ignore -// import orangeDead from '../../static/players/orange-dead.png'; // @ts-ignore -// import yellowDead from '../../static/players/yellow-dead.png'; // @ts-ignore -// import blackDead from '../../static/players/black-dead.png'; // @ts-ignore -// import whiteDead from '../../static/players/white-dead.png'; // @ts-ignore -// import purpleDead from '../../static/players/purple-dead.png'; // @ts-ignore -// import brownDead from '../../static/players/brown-dead.png'; // @ts-ignore -// import cyanDead from '../../static/players/cyan-dead.png'; // @ts-ignore -// import limeDead from '../../static/players/lime-dead.png'; - -// export interface PlayerImageColors { -// alive: string[]; -// dead: string[]; -// } - -// export const players: PlayerImageColors = { -// alive: [ -// redAlive, -// blueAlive, -// greenAlive, -// pinkAlive, -// orangeAlive, -// yellowAlive, -// blackAlive, -// whiteAlive, -// purpleAlive, -// brownAlive, -// cyanAlive, -// limeAlive, -// ], -// dead: [ -// redDead, -// blueDead, -// greenDead, -// pinkDead, -// orangeDead, -// yellowDead, -// blackDead, -// whiteDead, -// purpleDead, -// brownDead, -// cyanDead, -// limeDead, -// ], -// }; export const skins = [ skin1, @@ -263,33 +200,6 @@ export const hatOffsets: { [key in number]: string | undefined } = { export const backLayerHats = new Set([39, 4, 6, 15, 29, 42, 75, 85, 102, 105, 106, 104, 103]); const coloredHatsIds = new Set([77, 90]); -// export const coloredHats: { [key in string]: string | undefined } = { -// 77_0: hat77_0, -// 77_1: hat77_1, -// 77_2: hat77_2, -// 77_3: hat77_3, -// 77_4: hat77_4, -// 77_5: hat77_5, -// 77_6: hat77_6, -// 77_7: hat77_7, -// 77_8: hat77_8, -// 77_9: hat77_9, -// 77_10: hat77_10, -// 77_11: hat77_11, - -// 90_0: hat90_0, -// 90_1: hat90_1, -// 90_2: hat90_2, -// 90_3: hat90_3, -// 90_4: hat90_4, -// 90_5: hat90_5, -// 90_6: hat90_6, -// 90_7: hat90_7, -// 90_8: hat90_8, -// 90_9: hat90_9, -// 90_10: hat90_10, -// 90_11: hat90_11, -// }; const hats = [ undefined, @@ -415,8 +325,64 @@ export enum cosmeticType { skin, } +var modHats: { + [mod: string]: { + defaultWidth: string; + defaultTop: string; + defaultLeft: string; + hats: { + [id: number]: { + image: string; + top: string | undefined; + width: string | undefined; + left: string | undefined; + multi_color: string | undefined; + }; + }; + }; +} = {}; + +var requestingModHats = false; +const MODHATS_BASE = 'https://raw.githubusercontent.com/OhMyGuus/BetterCrewlink-ModHats/master'; +function getModHat(color: number, id = -1, mod: string) { + if (!requestingModHats) { + requestingModHats = true; + fetch(`${MODHATS_BASE}/hats.json`) + .then((response) => response.json()) + .then((data) => (modHats = data)); + return undefined; + } + const hat = modHats[mod]?.hats[id]?.image; + const multiColor = modHats[mod]?.hats[id]?.multi_color? `${color}_` : ''; + return hat ? `${MODHATS_BASE}/${mod}/${multiColor}${hat}` : hats[id] ? hats[id] : undefined; +} + +export interface HatDementions { + top: string; + left: string; + width: string; +} + +export function getHatDementions(id: number, mod: string): HatDementions { + if (!hats[id] && modHats[mod]) { + const modHatList = modHats[mod]; + let hat = modHats[mod]?.hats[id]; + return { + top: hat?.top || modHatList.defaultTop, + width: hat?.width || modHatList.defaultWidth, + left: hat?.left || modHatList.defaultLeft, + }; + } else { + return { + top: hatOffsets[id] || '-33%', + width: '105%', + left: '0%', + }; + } +} + export const RainbowColorId = -99234; -export function getCosmetic(color: number, isAlive: boolean, type: cosmeticType, id = -1) : string { +export function getCosmetic(color: number, isAlive: boolean, type: cosmeticType, id = -1, mod: string = 'NONE'): string { if (type === cosmeticType.base || (type === cosmeticType.hat && coloredHatsIds.has(id))) { if (color === RainbowColorId) { if (type === cosmeticType.base) { @@ -428,6 +394,9 @@ export function getCosmetic(color: number, isAlive: boolean, type: cosmeticType, const folder = type === cosmeticType.base ? (isAlive ? `player` : `ghost`) : id; return `static:///generated/${folder}/${color}.png`; } else { + if (type === cosmeticType.hat && mod !== 'NONE') { + return getModHat(color, id, mod); + } return type === cosmeticType.hat ? hats[id] : skins[id]; } } diff --git a/yarn.lock b/yarn.lock index 379f12eef..79c3a8ad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -238,10 +238,10 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.17": version "7.12.17" @@ -267,7 +267,7 @@ "@babel/traverse" "^7.13.17" "@babel/types" "^7.13.17" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": +"@babel/highlight@^7.10.4": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== @@ -276,6 +276,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.12.13", "@babel/parser@^7.13.16": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" @@ -5051,7 +5060,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -5063,7 +5072,7 @@ glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2: +glob@^7.1.2, glob@^7.1.3: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -5788,9 +5797,9 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== is-binary-path@^1.0.0: version "1.0.1" @@ -5807,11 +5816,11 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" is-buffer@^1.1.5: version "1.1.6" @@ -5831,9 +5840,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887" - integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -5852,9 +5861,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-descriptor@^0.1.0: version "0.1.6" @@ -5951,9 +5960,9 @@ is-npm@^5.0.0: integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== is-number@^3.0.0: version "3.0.0" @@ -6008,7 +6017,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.4, is-regex@^1.1.2: +is-regex@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== @@ -6016,22 +6025,30 @@ is-regex@^1.0.4, is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" +is-regex@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" @@ -6597,8 +6614,8 @@ memory-fs@^0.5.0: readable-stream "^2.0.1" "memoryjs@git://github.com/OhMyGuus/memoryjs": - version "0.0.4" - resolved "git://github.com/OhMyGuus/memoryjs#7b9f7fd672466083244d54c2d93ba5ad5eb63a5f" + version "0.0.6" + resolved "git://github.com/OhMyGuus/memoryjs#8dc07d284202f5e64107a4c2eb44f97cd881434b" dependencies: bindings "^1.5.0" concentrate "^0.2.3" @@ -7104,9 +7121,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.9.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" - integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA== + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== object-is@^1.0.1: version "1.1.5"