{"id":"4SyaU5Y4en","url":"https://pastebin.ca/4SyaU5Y4en","raw_url":"https://raw.anybin.ca/4SyaU5Y4en","visibility":"public","access":"public","created_at":1793638520832,"expires_at":1794243320832,"fetch_limit":null,"fetches_used":0,"reads_remaining":null,"size_bytes":158726,"syntax_hint":null,"title":null,"filename":null,"change_note":null,"cipher":null,"cipher_meta":null,"parent_id":null,"root_id":"4SyaU5Y4en","version":1,"owner_id":null,"recipient_id":null,"body":"{\n  \"version\": \"4.0.0\",\n  \"note\": \"Read-only runtime extraction. No game methods are invoked except the same readLive() inspection used by the previous probe.\",\n  \"discovery\": {\n    \"component\": \"eC\",\n    \"propsKeys\": [\n      \"engine\",\n      \"placement\",\n      \"enabled\",\n      \"spinEnabled\"\n    ],\n    \"reactFibersVisited\": 166,\n    \"engineCandidates\": 6,\n    \"objectCount\": 110\n  },\n  \"objectGraph\": [\n    {\n      \"path\": \"engine\",\n      \"constructor\": \"tD\",\n      \"ownKeys\": [\n        \"view\",\n        \"renderer\",\n        \"net\",\n        \"player\",\n        \"phase\",\n        \"state\",\n        \"guideLevel\",\n        \"soundOn\",\n        \"aimAngle\",\n        \"power\",\n        \"spinX\",\n        \"spinY\",\n        \"pullback\",\n        \"cueAlpha\",\n        \"prediction\",\n        \"predictionDirty\",\n        \"practice\",\n        \"bih\",\n        \"foulFlash\",\n        \"message\",\n        \"messageKind\",\n        \"messageId\",\n        \"lastPotted\",\n        \"opponentAway\",\n        \"opponentGone\",\n        \"shootStart\",\n        \"strokeAt\",\n        \"strokeFrom\",\n        \"strokeMs\",\n        \"setFor\",\n        \"shotSentAt\",\n        \"shotExtra\",\n        \"shotUnsureAt\",\n        \"pendingShot\",\n        \"pendingReplay\",\n        \"pendingOutcome\",\n        \"pendingState\",\n        \"resolveAt\",\n        \"remoteShot\",\n        \"remote\",\n        \"remoteSettled\",\n        \"viewAngle\",\n        \"viewPower\",\n        \"viewSpinX\",\n        \"viewSpinY\",\n        \"viewPullback\",\n        \"aimSentAt\",\n        \"sentAngle\",\n        \"sentPower\",\n        \"sentSpinX\",\n        \"sentSpinY\",\n        \"sentCueX\",\n        \"sentCueY\",\n        \"sentCharging\",\n        \"raf\",\n        \"lastTime\",\n        \"now\",\n        \"running\",\n        \"version\",\n        \"snapshot\",\n        \"listeners\",\n        \"unsubscribe\",\n        \"pointerId\",\n        \"dragMode\",\n        \"controlMode\",\n        \"sensitivity\",\n        \"turnLast\",\n        \"fingerLast\",\n        \"powerHeld\",\n        \"watchPrediction\",\n        \"watchKey\",\n        \"dragStart\",\n        \"fineAim\",\n        \"turnHold\",\n        \"turnHoldAt\",\n        \"turnHoldBy\",\n        \"track\",\n        \"spaceDown\",\n        \"spaceStart\",\n        \"powerBeforeStroke\",\n        \"myPower\",\n        \"strokeBase\",\n        \"strokeMouse\",\n        \"strokeTravelPx\",\n        \"wheelCarry\",\n        \"wheelShowUntil\",\n        \"wheelUsed\",\n        \"canvasEl\",\n        \"subscribe\",\n        \"getSnapshot\",\n        \"onFocusLost\",\n        \"onContextMenu\",\n        \"onWheel\",\n        \"onPointerDown\",\n        \"onPointerMove\",\n        \"onPointerUp\",\n        \"onPointerLeave\",\n        \"onKeyDown\",\n        \"onKeyUp\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tD\",\n          \"methods\": [\n            {\n              \"name\": \"publish\",\n              \"length\": 93,\n              \"selected\": false\n            },\n            {\n              \"name\": \"rel\",\n              \"length\": 45,\n              \"selected\": false\n            },\n            {\n              \"name\": \"buildSnapshot\",\n              \"length\": 1212,\n              \"selected\": true\n            },\n            {\n              \"name\": \"readLive\",\n              \"length\": 170,\n              \"selected\": true\n            },\n            {\n              \"name\": \"attachNetwork\",\n              \"length\": 1530,\n              \"selected\": true\n            },\n            {\n              \"name\": \"applyState\",\n              \"length\": 363,\n              \"selected\": true\n            },\n            {\n              \"name\": \"enterTurn\",\n              \"length\": 872,\n              \"selected\": true\n            },\n            {\n              \"name\": \"canReposition\",\n              \"length\": 182,\n              \"selected\": true\n            },\n            {\n              \"name\": \"faceNearestTarget\",\n              \"length\": 330,\n              \"selected\": true\n            },\n            {\n              \"name\": \"start\",\n              \"length\": 172,\n              \"selected\": false\n            },\n            {\n              \"name\": \"stop\",\n              \"length\": 54,\n              \"selected\": false\n            },\n            {\n              \"name\": \"dispose\",\n              \"length\": 96,\n              \"selected\": false\n            },\n            {\n              \"name\": \"resize\",\n              \"length\": 66,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setGuideLevel\",\n              \"length\": 111,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setPractice\",\n              \"length\": 183,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setSound\",\n              \"length\": 59,\n              \"selected\": false\n            },\n            {\n              \"name\": \"frame\",\n              \"length\": 834,\n              \"selected\": true\n            },\n            {\n              \"name\": \"showAim\",\n              \"length\": 63,\n              \"selected\": true\n            },\n            {\n              \"name\": \"showCue\",\n              \"length\": 200,\n              \"selected\": true\n            },\n            {\n              \"name\": \"blockedTarget\",\n              \"length\": 235,\n              \"selected\": true\n            },\n            {\n              \"name\": \"highlightTargets\",\n              \"length\": 186,\n              \"selected\": false\n            },\n            {\n              \"name\": \"update\",\n              \"length\": 1654,\n              \"selected\": true\n            },\n            {\n              \"name\": \"followOpponent\",\n              \"length\": 673,\n              \"selected\": true\n            },\n            {\n              \"name\": \"refreshWatchGuide\",\n              \"length\": 307,\n              \"selected\": true\n            },\n            {\n              \"name\": \"watchLevel\",\n              \"length\": 75,\n              \"selected\": false\n            },\n            {\n              \"name\": \"broadcastAim\",\n              \"length\": 829,\n              \"selected\": true\n            },\n            {\n              \"name\": \"resetAimCache\",\n              \"length\": 149,\n              \"selected\": true\n            },\n            {\n              \"name\": \"refreshPrediction\",\n              \"length\": 246,\n              \"selected\": true\n            },\n            {\n              \"name\": \"beginSet\",\n              \"length\": 74,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setLead\",\n              \"length\": 83,\n              \"selected\": false\n            },\n            {\n              \"name\": \"noteShotAnswer\",\n              \"length\": 117,\n              \"selected\": true\n            },\n            {\n              \"name\": \"awaitingOwnShot\",\n              \"length\": 100,\n              \"selected\": true\n            },\n            {\n              \"name\": \"centreSpin\",\n              \"length\": 39,\n              \"selected\": true\n            },\n            {\n              \"name\": \"forgetShot\",\n              \"length\": 79,\n              \"selected\": true\n            },\n            {\n              \"name\": \"abandonShot\",\n              \"length\": 334,\n              \"selected\": true\n            },\n            {\n              \"name\": \"beginPlayback\",\n              \"length\": 237,\n              \"selected\": true\n            },\n            {\n              \"name\": \"consumeEvent\",\n              \"length\": 500,\n              \"selected\": true\n            },\n            {\n              \"name\": \"finishPlayback\",\n              \"length\": 387,\n              \"selected\": true\n            },\n            {\n              \"name\": \"finishResolve\",\n              \"length\": 140,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setMessage\",\n              \"length\": 82,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setPower\",\n              \"length\": 131,\n              \"selected\": true\n            },\n            {\n              \"name\": \"holdPower\",\n              \"length\": 30,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setControlMode\",\n              \"length\": 58,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setSensitivity\",\n              \"length\": 78,\n              \"selected\": false\n            },\n            {\n              \"name\": \"commitPower\",\n              \"length\": 63,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setSpin\",\n              \"length\": 117,\n              \"selected\": true\n            },\n            {\n              \"name\": \"nudgeAim\",\n              \"length\": 78,\n              \"selected\": true\n            },\n            {\n              \"name\": \"wheelAim\",\n              \"length\": 55,\n              \"selected\": true\n            },\n            {\n              \"name\": \"holdFineAim\",\n              \"length\": 224,\n              \"selected\": true\n            },\n            {\n              \"name\": \"releaseFineAim\",\n              \"length\": 54,\n              \"selected\": true\n            },\n            {\n              \"name\": \"shoot\",\n              \"length\": 843,\n              \"selected\": true\n            },\n            {\n              \"name\": \"placeCueBall\",\n              \"length\": 276,\n              \"selected\": true\n            },\n            {\n              \"name\": \"placementLegal\",\n              \"length\": 116,\n              \"selected\": true\n            },\n            {\n              \"name\": \"rematch\",\n              \"length\": 81,\n              \"selected\": false\n            },\n            {\n              \"name\": \"declineRematch\",\n              \"length\": 43,\n              \"selected\": false\n            },\n            {\n              \"name\": \"attachInput\",\n              \"length\": 609,\n              \"selected\": false\n            },\n            {\n              \"name\": \"detachInput\",\n              \"length\": 637,\n              \"selected\": false\n            },\n            {\n              \"name\": \"localPoint\",\n              \"length\": 121,\n              \"selected\": false\n            },\n            {\n              \"name\": \"overTable\",\n              \"length\": 61,\n              \"selected\": true\n            },\n            {\n              \"name\": \"overCue\",\n              \"length\": 264,\n              \"selected\": true\n            },\n            {\n              \"name\": \"overCueBall\",\n              \"length\": 97,\n              \"selected\": true\n            },\n            {\n              \"name\": \"beginPlacing\",\n              \"length\": 156,\n              \"selected\": true\n            },\n            {\n              \"name\": \"beginStroke\",\n              \"length\": 296,\n              \"selected\": true\n            },\n            {\n              \"name\": \"turnAim\",\n              \"length\": 257,\n              \"selected\": true\n            },\n            {\n              \"name\": \"followFinger\",\n              \"length\": 298,\n              \"selected\": true\n            },\n            {\n              \"name\": \"aimAt\",\n              \"length\": 230,\n              \"selected\": true\n            },\n            {\n              \"name\": \"updateBallInHand\",\n              \"length\": 1072,\n              \"selected\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"view\",\n      \"constructor\": \"tL\",\n      \"ownKeys\": [\n        \"balls\",\n        \"orthoCounter\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tL\",\n          \"methods\": [\n            {\n              \"name\": \"apply\",\n              \"length\": 150,\n              \"selected\": true\n            },\n            {\n              \"name\": \"spin\",\n              \"length\": 898,\n              \"selected\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"renderer\",\n      \"constructor\": \"tM\",\n      \"ownKeys\": [\n        \"canvas\",\n        \"effects\",\n        \"ctx\",\n        \"sprite\",\n        \"scale\",\n        \"originX\",\n        \"originY\",\n        \"dpr\",\n        \"cssW\",\n        \"cssH\",\n        \"rotated\",\n        \"drops\",\n        \"lastFrame\",\n        \"spriteTable\",\n        \"theme\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tM\",\n          \"methods\": [\n            {\n              \"name\": \"resize\",\n              \"length\": 410,\n              \"selected\": false\n            },\n            {\n              \"name\": \"syncTheme\",\n              \"length\": 253,\n              \"selected\": false\n            },\n            {\n              \"name\": \"ballSkin\",\n              \"length\": 107,\n              \"selected\": true\n            },\n            {\n              \"name\": \"toWorld\",\n              \"length\": 118,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toScreen\",\n              \"length\": 121,\n              \"selected\": false\n            },\n            {\n              \"name\": \"notePot\",\n              \"length\": 78,\n              \"selected\": false\n            },\n            {\n              \"name\": \"clearDrops\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"render\",\n              \"length\": 1263,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawKitchen\",\n              \"length\": 270,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawMotionTrails\",\n              \"length\": 527,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawDrops\",\n              \"length\": 510,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawGuides\",\n              \"length\": 1985,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawBlockedMarker\",\n              \"length\": 469,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawCue\",\n              \"length\": 2322,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawBallInHand\",\n              \"length\": 680,\n              \"selected\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"net\",\n      \"constructor\": \"tR\",\n      \"ownKeys\": [\n        \"handlers\",\n        \"slot\",\n        \"code\",\n        \"connection\",\n        \"state\",\n        \"latest\",\n        \"view\",\n        \"send\",\n        \"closer\",\n        \"lastShotKey\",\n        \"lastStateKey\",\n        \"opponentWasConnected\",\n        \"opponentEverHere\",\n        \"request\",\n        \"rtt\",\n        \"rttVar\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tR\",\n          \"methods\": [\n            {\n              \"name\": \"cueOfShooter\",\n              \"length\": 84,\n              \"selected\": true\n            },\n            {\n              \"name\": \"tableOfViewer\",\n              \"length\": 55,\n              \"selected\": true\n            },\n            {\n              \"name\": \"setSend\",\n              \"length\": 23,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setCloser\",\n              \"length\": 27,\n              \"selected\": false\n            },\n            {\n              \"name\": \"on\",\n              \"length\": 72,\n              \"selected\": false\n            },\n            {\n              \"name\": \"emit\",\n              \"length\": 83,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setConnection\",\n              \"length\": 84,\n              \"selected\": false\n            },\n            {\n              \"name\": \"ingest\",\n              \"length\": 1132,\n              \"selected\": true\n            },\n            {\n              \"name\": \"emitShot\",\n              \"length\": 470,\n              \"selected\": true\n            },\n            {\n              \"name\": \"syncArrival\",\n              \"length\": 158,\n              \"selected\": false\n            },\n            {\n              \"name\": \"syncPresence\",\n              \"length\": 426,\n              \"selected\": false\n            },\n            {\n              \"name\": \"receiveAim\",\n              \"length\": 248,\n              \"selected\": true\n            },\n            {\n              \"name\": \"command\",\n              \"length\": 412,\n              \"selected\": false\n            },\n            {\n              \"name\": \"shoot\",\n              \"length\": 115,\n              \"selected\": false\n            },\n            {\n              \"name\": \"sendAim\",\n              \"length\": 280,\n              \"selected\": true\n            },\n            {\n              \"name\": \"noteRoundTrip\",\n              \"length\": 162,\n              \"selected\": false\n            },\n            {\n              \"name\": \"placeCue\",\n              \"length\": 58,\n              \"selected\": true\n            },\n            {\n              \"name\": \"rematch\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"declineRematch\",\n              \"length\": 55,\n              \"selected\": false\n            },\n            {\n              \"name\": \"ready\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"claimTurnTimeout\",\n              \"length\": 59,\n              \"selected\": true\n            },\n            {\n              \"name\": \"rejoin\",\n              \"length\": 27,\n              \"selected\": false\n            },\n            {\n              \"name\": \"leave\",\n              \"length\": 52,\n              \"selected\": false\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"player\",\n      \"constructor\": \"tI\",\n      \"ownKeys\": [\n        \"tracks\",\n        \"events\",\n        \"eventCursor\",\n        \"time\",\n        \"duration\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tI\",\n          \"methods\": [\n            {\n              \"name\": \"load\",\n              \"length\": 1057,\n              \"selected\": true\n            },\n            {\n              \"name\": \"set\",\n              \"length\": 850,\n              \"selected\": true\n            },\n            {\n              \"name\": \"clear\",\n              \"length\": 86,\n              \"selected\": false\n            },\n            {\n              \"name\": \"advance\",\n              \"length\": 369,\n              \"selected\": false\n            },\n            {\n              \"name\": \"sample\",\n              \"length\": 618,\n              \"selected\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"serverState\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"matchId\",\n        \"sequence\",\n        \"serverTime\",\n        \"status\",\n        \"phase\",\n        \"turn\",\n        \"players\",\n        \"balls\",\n        \"ballInHand\",\n        \"behindHeadString\",\n        \"cuePlaced\",\n        \"winner\",\n        \"winKind\",\n        \"rackNumber\",\n        \"busyForMs\",\n        \"potted\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"prediction\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"cuePath\",\n        \"ghost\",\n        \"targetId\",\n        \"objectPath\",\n        \"cuePathAfter\",\n        \"objectDir\",\n        \"cueDir\",\n        \"objectPocket\",\n        \"scratchPocket\",\n        \"railsBeforeContact\",\n        \"cutAngle\",\n        \"objectReach\",\n        \"cueReach\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.bih\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"legal\",\n        \"restricted\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.snapshot\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"version\",\n        \"phase\",\n        \"connection\",\n        \"status\",\n        \"slot\",\n        \"code\",\n        \"turn\",\n        \"players\",\n        \"groups\",\n        \"remaining\",\n        \"onEight\",\n        \"stats\",\n        \"openTable\",\n        \"ballInHand\",\n        \"behindHeadString\",\n        \"canReposition\",\n        \"rackNumber\",\n        \"guideLevel\",\n        \"sound\",\n        \"message\",\n        \"messageKind\",\n        \"messageId\",\n        \"interactive\",\n        \"lastPotted\",\n        \"track\",\n        \"winner\",\n        \"winKind\",\n        \"opponentAway\",\n        \"opponentGone\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.listeners\",\n      \"constructor\": \"Set\",\n      \"ownKeys\": [],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"Set\",\n          \"methods\": [\n            {\n              \"name\": \"has\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"add\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"delete\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"difference\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"clear\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"entries\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"forEach\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"intersection\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"isSubsetOf\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"isSupersetOf\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"isDisjointFrom\",\n              \"length\": 43,\n              \"selected\": false\n            },\n            {\n              \"name\": \"symmetricDifference\",\n              \"length\": 48,\n              \"selected\": false\n            },\n            {\n              \"name\": \"union\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"values\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"keys\",\n              \"length\": 35,\n              \"selected\": false\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"engine.dragStart\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[2]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[3]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[4]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[5]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[6]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[7]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[8]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[9]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[10]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[11]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[12]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[13]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[14]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[15]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"group\",\n        \"p\",\n        \"v\",\n        \"w\",\n        \"orient\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"constructor\": \"tl\",\n      \"ownKeys\": [\n        \"particles\",\n        \"rings\",\n        \"pCursor\",\n        \"rCursor\",\n        \"pocketGlow\"\n      ],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"tl\",\n          \"methods\": [\n            {\n              \"name\": \"clear\",\n              \"length\": 108,\n              \"selected\": true\n            },\n            {\n              \"name\": \"particle\",\n              \"length\": 89,\n              \"selected\": false\n            },\n            {\n              \"name\": \"ring\",\n              \"length\": 80,\n              \"selected\": false\n            },\n            {\n              \"name\": \"emit\",\n              \"length\": 1614,\n              \"selected\": true\n            },\n            {\n              \"name\": \"update\",\n              \"length\": 342,\n              \"selected\": true\n            },\n            {\n              \"name\": \"glowFor\",\n              \"length\": 44,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawUnderBalls\",\n              \"length\": 347,\n              \"selected\": true\n            },\n            {\n              \"name\": \"draw\",\n              \"length\": 495,\n              \"selected\": true\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"constructor\": \"CanvasRenderingContext2D\",\n      \"ownKeys\": [],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"CanvasRenderingContext2D\",\n          \"methods\": [\n            {\n              \"name\": \"clip\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"createConicGradient\",\n              \"length\": 48,\n              \"selected\": false\n            },\n            {\n              \"name\": \"createImageData\",\n              \"length\": 44,\n              \"selected\": false\n            },\n            {\n              \"name\": \"createLinearGradient\",\n              \"length\": 49,\n              \"selected\": false\n            },\n            {\n              \"name\": \"createPattern\",\n              \"length\": 42,\n              \"selected\": false\n            },\n            {\n              \"name\": \"createRadialGradient\",\n              \"length\": 49,\n              \"selected\": false\n            },\n            {\n              \"name\": \"drawFocusIfNeeded\",\n              \"length\": 46,\n              \"selected\": true\n            },\n            {\n              \"name\": \"drawImage\",\n              \"length\": 38,\n              \"selected\": true\n            },\n            {\n              \"name\": \"fill\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"fillText\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"getContextAttributes\",\n              \"length\": 49,\n              \"selected\": false\n            },\n            {\n              \"name\": \"getImageData\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"getLineDash\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"getTransform\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"isContextLost\",\n              \"length\": 42,\n              \"selected\": false\n            },\n            {\n              \"name\": \"isPointInPath\",\n              \"length\": 42,\n              \"selected\": true\n            },\n            {\n              \"name\": \"isPointInStroke\",\n              \"length\": 44,\n              \"selected\": true\n            },\n            {\n              \"name\": \"measureText\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reset\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"roundRect\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setLineDash\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"strokeText\",\n              \"length\": 39,\n              \"selected\": true\n            },\n            {\n              \"name\": \"arc\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"arcTo\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"beginPath\",\n              \"length\": 38,\n              \"selected\": true\n            },\n            {\n              \"name\": \"bezierCurveTo\",\n              \"length\": 42,\n              \"selected\": false\n            },\n            {\n              \"name\": \"clearRect\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"closePath\",\n              \"length\": 38,\n              \"selected\": true\n            },\n            {\n              \"name\": \"ellipse\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"fillRect\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"lineTo\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"moveTo\",\n              \"length\": 35,\n              \"selected\": true\n            },\n            {\n              \"name\": \"putImageData\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"quadraticCurveTo\",\n              \"length\": 45,\n              \"selected\": false\n            },\n            {\n              \"name\": \"rect\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"resetTransform\",\n              \"length\": 43,\n              \"selected\": false\n            },\n            {\n              \"name\": \"restore\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"rotate\",\n              \"length\": 35,\n              \"selected\": true\n            },\n            {\n              \"name\": \"save\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"scale\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"setTransform\",\n              \"length\": 41,\n              \"selected\": false\n            },\n            {\n              \"name\": \"stroke\",\n              \"length\": 35,\n              \"selected\": true\n            },\n            {\n              \"name\": \"strokeRect\",\n              \"length\": 39,\n              \"selected\": true\n            },\n            {\n              \"name\": \"transform\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"translate\",\n              \"length\": 38,\n              \"selected\": false\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"renderer.sprite\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"canvas\",\n        \"x\",\n        \"y\",\n        \"w\",\n        \"h\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"net.handlers\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"session\",\n        \"connection\",\n        \"state\",\n        \"started\",\n        \"physics\",\n        \"finished\",\n        \"opponentJoined\",\n        \"opponentLeft\",\n        \"opponentBack\",\n        \"opponentAim\",\n        \"gameStarted\",\n        \"error\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"net.view\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"status\",\n        \"matchId\",\n        \"hosted\",\n        \"sequence\",\n        \"phase\",\n        \"turn\",\n        \"players\",\n        \"balls\",\n        \"potted\",\n        \"ballInHand\",\n        \"behindHeadString\",\n        \"cuePlaced\",\n        \"winner\",\n        \"winKind\",\n        \"tournament\",\n        \"rackNumber\",\n        \"busyForMs\",\n        \"turnRemainingMs\",\n        \"turnTotalMs\",\n        \"warmupRemainingMs\",\n        \"arrived\",\n        \"lastShot\",\n        \"rematch\",\n        \"you\",\n        \"table\",\n        \"wallet\",\n        \"developer\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.players[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"slot\",\n        \"name\",\n        \"avatar\",\n        \"connected\",\n        \"ready\",\n        \"group\",\n        \"onEight\",\n        \"remaining\",\n        \"stats\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.players[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"slot\",\n        \"name\",\n        \"avatar\",\n        \"connected\",\n        \"ready\",\n        \"group\",\n        \"onEight\",\n        \"remaining\",\n        \"stats\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[2]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[3]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[4]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[5]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[6]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[7]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[8]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[9]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[10]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[11]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[12]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[13]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[14]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"serverState.balls[15]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"id\",\n        \"x\",\n        \"y\",\n        \"inPlay\",\n        \"pocket\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"prediction.cuePath[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"prediction.cuePath[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"prediction.objectDir\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"prediction.cueDir\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.snapshot.players[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"name\",\n        \"avatar\",\n        \"kind\",\n        \"connected\",\n        \"ready\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.snapshot.players[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"name\",\n        \"avatar\",\n        \"kind\",\n        \"connected\",\n        \"ready\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.snapshot.remaining[0]\",\n      \"constructor\": \"Array\",\n      \"ownKeys\": [],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"Array\",\n          \"methods\": [\n            {\n              \"name\": \"at\",\n              \"length\": 31,\n              \"selected\": false\n            },\n            {\n              \"name\": \"concat\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"copyWithin\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"fill\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"find\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findIndex\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findLast\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findLastIndex\",\n              \"length\": 42,\n              \"selected\": false\n            },\n            {\n              \"name\": \"lastIndexOf\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"pop\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"push\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reverse\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"shift\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"unshift\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"slice\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"sort\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"splice\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"includes\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"indexOf\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"join\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"keys\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"entries\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"values\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"forEach\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"filter\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"flat\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"flatMap\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"map\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"every\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"some\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reduce\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reduceRight\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toReversed\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toSorted\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toSpliced\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"with\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toLocaleString\",\n              \"length\": 43,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toString\",\n              \"length\": 37,\n              \"selected\": false\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"engine.snapshot.remaining[1]\",\n      \"constructor\": \"Array\",\n      \"ownKeys\": [],\n      \"prototypeLayers\": [\n        {\n          \"layer\": 0,\n          \"constructor\": \"Array\",\n          \"methods\": [\n            {\n              \"name\": \"at\",\n              \"length\": 31,\n              \"selected\": false\n            },\n            {\n              \"name\": \"concat\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"copyWithin\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"fill\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"find\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findIndex\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findLast\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"findLastIndex\",\n              \"length\": 42,\n              \"selected\": false\n            },\n            {\n              \"name\": \"lastIndexOf\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"pop\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"push\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reverse\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"shift\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"unshift\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"slice\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"sort\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"splice\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"includes\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"indexOf\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"join\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"keys\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"entries\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"values\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"forEach\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"filter\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"flat\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"flatMap\",\n              \"length\": 36,\n              \"selected\": false\n            },\n            {\n              \"name\": \"map\",\n              \"length\": 32,\n              \"selected\": false\n            },\n            {\n              \"name\": \"every\",\n              \"length\": 34,\n              \"selected\": false\n            },\n            {\n              \"name\": \"some\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reduce\",\n              \"length\": 35,\n              \"selected\": false\n            },\n            {\n              \"name\": \"reduceRight\",\n              \"length\": 40,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toReversed\",\n              \"length\": 39,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toSorted\",\n              \"length\": 37,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toSpliced\",\n              \"length\": 38,\n              \"selected\": false\n            },\n            {\n              \"name\": \"with\",\n              \"length\": 33,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toLocaleString\",\n              \"length\": 43,\n              \"selected\": false\n            },\n            {\n              \"name\": \"toString\",\n              \"length\": 37,\n              \"selected\": false\n            }\n          ]\n        }\n      ]\n    },\n    {\n      \"path\": \"engine.snapshot.stats[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"shots\",\n        \"potted\",\n        \"fouls\",\n        \"bestRun\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"engine.snapshot.stats[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"shots\",\n        \"potted\",\n        \"fouls\",\n        \"bestRun\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[0].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[0].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[0].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[1].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[1].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[1].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[2].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[2].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[2].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[3].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[3].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[3].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[4].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[4].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[4].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[5].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[5].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[5].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[6].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[6].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[6].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[7].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[7].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[7].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[8].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[8].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[8].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[9].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[9].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[9].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[10].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[10].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[10].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[11].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[11].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[11].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[12].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[12].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[12].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[13].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[13].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[13].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[14].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[14].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[14].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[15].p\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[15].v\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"view.balls[15].w\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"x\",\n        \"y\",\n        \"z\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"renderer.effects.particles[0]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"active\",\n        \"x\",\n        \"y\",\n        \"vx\",\n        \"vy\",\n        \"life\",\n        \"maxLife\",\n        \"size\",\n        \"drag\",\n        \"r\",\n        \"g\",\n        \"b\"\n      ],\n      \"prototypeLayers\": []\n    },\n    {\n      \"path\": \"renderer.effects.particles[1]\",\n      \"constructor\": \"Object\",\n      \"ownKeys\": [\n        \"active\",\n        \"x\",\n        \"y\",\n        \"vx\",\n        \"vy\",\n        \"life\",\n        \"maxLife\",\n        \"size\",\n        \"drag\",\n        \"r\",\n        \"g\",\n        \"b\"\n      ],\n      \"prototypeLayers\": []\n    }\n  ],\n  \"methodSources\": [\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"buildSnapshot\",\n      \"source\": \"buildSnapshot(){let e=this.state,t=this.mine,a=+(0===t),i=(t,a)=>{let i=e?.players[t];return{name:i?.name||(\\\"you\\\"===a?\\\"You\\\":\\\"Opponent\\\"),avatar:i?.avatar??null,kind:a,connected:i?.connected??!1,ready:i?.ready??!1}},n=t=>e?.players[t]?.stats??tG;return{version:this.version,phase:this.phase,connection:this.net.connection,status:e?.status??\\\"waiting\\\",slot:this.net.slot,code:this.net.code,turn:e?this.rel(e.turn)??0:0,players:[i(t,\\\"you\\\"),i(a,\\\"them\\\")],groups:[e?.players[t].group??null,e?.players[a].group??null],remaining:[e?.players[t].remaining??[],e?.players[a].remaining??[]],onEight:[e?.players[t].onEight??!1,e?.players[a].onEight??!1],stats:[n(t),n(a)],openTable:!e||\\\"open\\\"===e.phase||\\\"break\\\"===e.phase,ballInHand:e?.ballInHand??!1,behindHeadString:e?.behindHeadString??!1,canReposition:this.canReposition(),rackNumber:e?.rackNumber??1,guideLevel:this.guideLevel,sound:this.soundOn,message:this.message,messageKind:this.messageKind,messageId:this.messageId,interactive:\\\"aiming\\\"===this.phase||\\\"ballInHand\\\"===this.phase||\\\"charging\\\"===this.phase,lastPotted:this.lastPotted,track:this.track,winner:this.rel(e?.winner??null),winKind:e?.winKind??null,opponentAway:this.opponentAway,opponentGone:this.opponentGone}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"readLive\",\n      \"source\": \"readLive(){return{power:this.power,spinX:this.spinX,spinY:this.spinY,pullback:this.pullback,angle:this.aimAngle,blockedTarget:this.blockedTarget(),turning:this.turnHold}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"attachNetwork\",\n      \"source\": \"attachNetwork(){let e=this.net;this.unsubscribe.push(e.on(\\\"connection\\\",()=>this.publish()),e.on(\\\"state\\\",e=>this.applyState(e)),e.on(\\\"gameStarted\\\",()=>{eK.rack(),this.setMessage(\\\"Break!\\\",\\\"info\\\")}),e.on(\\\"started\\\",e=>{e.by===this.net.slot&&this.awaitingOwnShot()||(this.pendingShot=null,this.shotUnsureAt=null,this.remote=null,this.remoteSettled=!1,this.remoteShot=e.shot,this.aimAngle=e.shot.angle,this.spinX=e.shot.spinX,this.spinY=e.shot.spinY,this.power=e.shot.power,this.view.cueBall.p.x=e.cue.x,this.view.cueBall.p.y=e.cue.y,this.view.cueBall.inPlay=!0,this.prediction=null,this.cueAlpha=1,this.phase=\\\"shooting\\\",this.shootStart=this.now,this.beginSet(0),this.bih=null,this.publish())}),e.on(\\\"physics\\\",(e,t)=>{null!==this.shotSentAt&&0===t&&null===this.shotUnsureAt&&this.noteShotAnswer(performance.now()-this.shotSentAt),this.shotSentAt=null,this.pendingReplay={replay:e.replay,elapsedMs:t},t>0&&this.beginPlayback()}),e.on(\\\"finished\\\",e=>{this.pendingOutcome=e.outcome,this.pendingState=e.state,this.lastPotted=e.outcome.pocketed}),e.on(\\\"opponentJoined\\\",e=>{this.opponentAway=!1,this.setMessage(`${e.name} joined`,\\\"info\\\")}),e.on(\\\"opponentLeft\\\",e=>{this.opponentAway=!0,this.opponentGone=e.permanent,this.setMessage(e.permanent?\\\"Your opponent left the match\\\":\\\"Opponent disconnected — waiting\\\",\\\"foul\\\")}),e.on(\\\"opponentBack\\\",()=>{this.opponentAway=!1,this.opponentGone=!1,this.setMessage(\\\"Opponent reconnected\\\",\\\"good\\\")}),e.on(\\\"opponentAim\\\",e=>{\\\"waiting\\\"===this.phase&&(this.remote=e)}),e.on(\\\"error\\\",e=>this.setMessage(e,\\\"foul\\\")))}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"applyState\",\n      \"source\": \"applyState(e){let t=\\\"playing\\\"===this.phase||\\\"shooting\\\"===this.phase||\\\"sending\\\"===this.phase,a=this.awaitingOwnShot()&&!this.pendingReplay&&null!==this.state&&e.sequence>this.state.sequence;if(t&&!a){this.pendingState=e;return}a&&(this.forgetShot(),this.centreSpin()),this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0,this.enterTurn()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"enterTurn\",\n      \"source\": \"enterTurn(){this.practice=null;let e=this.state;if(!e){this.phase=\\\"idle\\\",this.publish();return}if(\\\"finished\\\"===e.status||\\\"gameOver\\\"===e.phase){this.phase=\\\"gameOver\\\",this.bih=null,this.publish();return}if(\\\"playing\\\"!==e.status||null===this.net.slot){this.phase=\\\"waiting\\\",this.bih=null,this.publish();return}if(e.turn!==this.net.slot){this.phase=\\\"waiting\\\",this.bih=null,this.prediction=null,this.publish();return}if(this.power=this.myPower,this.pullback=0,this.wheelUsed=!1,e.ballInHand&&!e.cuePlaced){let t=this.view.cueBall;this.bih={x:t.inPlay?t.p.x:b,y:t.inPlay?t.p.y:0,legal:!0,restricted:e.behindHeadString},this.bih.legal=this.placementLegal(this.bih.x,this.bih.y),this.phase=\\\"ballInHand\\\"}else this.bih=null,this.phase=\\\"aiming\\\",this.faceNearestTarget();this.cueAlpha=1,this.predictionDirty=!0,this.remote=null,this.remoteSettled=!1,this.resetAimCache(),this.publish()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"canReposition\",\n      \"source\": \"canReposition(){let e=this.state;return!!e&&null!==this.net.slot&&e.turn===this.net.slot&&!!e.ballInHand&&(\\\"aiming\\\"===this.phase||\\\"charging\\\"===this.phase||\\\"ballInHand\\\"===this.phase)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"faceNearestTarget\",\n      \"source\": \"faceNearestTarget(){let e=this.state;if(!e||null===this.net.slot)return;let t=this.view.cueBall,a=-1,i=1/0;for(let n of tX(e,this.net.slot)){let e=this.view.balls[n];if(!e.inPlay)continue;let l=Math.hypot(e.p.x-t.p.x,e.p.y-t.p.y);l<i&&(i=l,a=n)}if(a>=0){let e=this.view.balls[a];this.aimAngle=Math.atan2(e.p.y-t.p.y,e.p.x-t.p.x)}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"resize\",\n      \"source\": \"resize(e,t,a){this.renderer.resize(e,t,a),this.predictionDirty=!0}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"setGuideLevel\",\n      \"source\": \"setGuideLevel(e){this.guideLevel=e,\\\"extended\\\"!==e&&(this.practice=null),this.predictionDirty=!0,this.publish()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"setPractice\",\n      \"source\": \"setPractice(e){if(\\\"extended\\\"!==this.guideLevel)return;let t=e?.cuePath?.[0],a=this.view.cueBall.p;e&&(!t||Math.hypot(t.x-a.x,t.y-a.y)>1e-6)||(this.practice=e,this.predictionDirty=!0)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"frame\",\n      \"source\": \"frame(e){let t=Math.min(.05,(e-this.lastTime)/1e3),a=Math.min(50,e-this.lastTime);this.lastTime=e,this.now=e,this.update(t,a),this.broadcastAim(),this.view.spin(t);let i=\\\"waiting\\\"===this.phase&&null!==this.remote;this.renderer.render({world:this.view,time:e/1e3,angle:i?this.viewAngle:this.aimAngle,power:i?this.viewPower:this.power,spinX:i?this.viewSpinX:this.spinX,spinY:i?this.viewSpinY:this.spinY,prediction:i?this.watchPrediction:this.prediction,guideLevel:i?this.watchLevel():this.guideLevel,showAim:this.showAim()||i&&null!==this.watchPrediction,showCue:this.showCue(),pullback:i?this.viewPullback:this.pullback,cueAlpha:this.cueAlpha,ballInHand:this.bih,legalTargets:this.highlightTargets(),blockedTarget:this.blockedTarget(),foulFlash:this.foulFlash,aiThinking:!1,cue:this.net.cueOfShooter(),table:this.net.tableOfViewer()})}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"showAim\",\n      \"source\": \"showAim(){return\\\"aiming\\\"===this.phase||\\\"charging\\\"===this.phase}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"showCue\",\n      \"source\": \"showCue(){return\\\"place\\\"!==this.dragMode&&null===this.bih&&(\\\"aiming\\\"===this.phase||\\\"charging\\\"===this.phase||\\\"shooting\\\"===this.phase||\\\"sending\\\"===this.phase||\\\"waiting\\\"===this.phase&&null!==this.remote)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"blockedTarget\",\n      \"source\": \"blockedTarget(){if(\\\"aiming\\\"!==this.phase&&\\\"charging\\\"!==this.phase)return -1;let e=this.state;if(!e||null===this.net.slot)return -1;let t=this.prediction?.targetId??-1;return t<0||\\\"break\\\"===e.phase||tX(e,this.net.slot).includes(t)?-1:t}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"update\",\n      \"source\": \"update(e,t){switch(this.foulFlash=Math.max(0,this.foulFlash-1.6*e),this.phase){case\\\"waiting\\\":this.followOpponent(e);break;case\\\"aiming\\\":case\\\"ballInHand\\\":{this.cueAlpha=Math.min(1,this.cueAlpha+6*e);let t=this.powerHeld||this.now<this.wheelShowUntil,a=t&&\\\"aiming\\\"===this.phase?this.power:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\\\"aiming\\\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\\\"charging\\\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\\\"shooting\\\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\\\"sending\\\");break}case\\\"sending\\\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\\\"playing\\\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advance(t,this.view)))this.consumeEvent(a);this.player.finished&&this.finishPlayback();break;case\\\"resolving\\\":this.now>=this.resolveAt&&this.finishResolve()}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"followOpponent\",\n      \"source\": \"followOpponent(e){let t=this.remote;if(t){if(this.remoteSettled){let a=Math.min(1,18*e);this.viewAngle+=eB(this.viewAngle,t.angle)*a,this.viewPower+=(t.power-this.viewPower)*a,this.viewPullback+=((t.charging?t.power:0)-this.viewPullback)*Math.min(1,22*e)}else this.remoteSettled=!0,this.viewAngle=t.angle,this.viewPower=t.power,this.viewPullback=t.charging?t.power:0;if(this.viewSpinX=t.spinX,this.viewSpinY=t.spinY,this.cueAlpha=Math.min(1,this.cueAlpha+6*e),this.refreshWatchGuide(t),t.cue){let e=this.view.cueBall;e.p.x=t.cue.x,e.p.y=t.cue.y,e.inPlay=!0,this.bih={x:t.cue.x,y:t.cue.y,legal:!0,restricted:this.state?.behindHeadString??!1}}else this.bih&&(this.bih=null)}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"refreshWatchGuide\",\n      \"source\": \"refreshWatchGuide(e){if(e.cue||!this.view.cueBall.inPlay){this.watchPrediction=null,this.watchKey=\\\"\\\";return}let t=this.view.cueBall.p,a=`${this.viewAngle.toFixed(4)}:${t.x}:${t.y}:${this.watchLevel()}`;a!==this.watchKey&&(this.watchKey=a,this.watchPrediction=eQ(this.view,this.viewAngle,this.watchLevel()))}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"broadcastAim\",\n      \"source\": \"broadcastAim(){let e=this.state;if(!e||null===this.net.slot||e.turn!==this.net.slot||\\\"aiming\\\"!==this.phase&&\\\"charging\\\"!==this.phase&&\\\"ballInHand\\\"!==this.phase||this.now-this.aimSentAt<50)return;let t=\\\"place\\\"===this.dragMode&&this.bih?this.bih:null,a=\\\"charging\\\"===this.phase,i=t?t.x:0/0,n=t?t.y:0/0;t$(this.sentAngle,this.aimAngle,.002)&&t$(this.sentPower,this.power,.01)&&t$(this.sentSpinX,this.spinX,.01)&&t$(this.sentSpinY,this.spinY,.01)&&t$(this.sentCueX,i,8e-4)&&t$(this.sentCueY,n,8e-4)&&this.sentCharging===a||(this.aimSentAt=this.now,this.sentAngle=this.aimAngle,this.sentPower=this.power,this.sentSpinX=this.spinX,this.sentSpinY=this.spinY,this.sentCueX=i,this.sentCueY=n,this.sentCharging=a,this.net.sendAim({angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY,cue:t?{x:t.x,y:t.y}:null,charging:a}))}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"resetAimCache\",\n      \"source\": \"resetAimCache(){this.sentAngle=0/0,this.sentPower=0/0,this.sentSpinX=0/0,this.sentSpinY=0/0,this.sentCueX=0/0,this.sentCueY=0/0,this.sentCharging=!1}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"refreshPrediction\",\n      \"source\": \"refreshPrediction(){if(this.predictionDirty){if(this.predictionDirty=!1,!this.view.cueBall.inPlay){this.prediction=null;return}this.prediction=\\\"extended\\\"===this.guideLevel&&this.practice?this.practice:eQ(this.view,this.aimAngle,this.guideLevel)}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"beginSet\",\n      \"source\": \"beginSet(e){this.strokeAt=null,this.strokeMs=tE(this.power),this.setFor=e}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"noteShotAnswer\",\n      \"source\": \"noteShotAnswer(e){let t=this.net.roundTripMs;t<=0||!(e>0)||e>1e4||(this.shotExtra+=(eL(e-t,0,450)-this.shotExtra)/2)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"awaitingOwnShot\",\n      \"source\": \"awaitingOwnShot(){return null!==this.pendingShot&&(\\\"shooting\\\"===this.phase||\\\"sending\\\"===this.phase)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"centreSpin\",\n      \"source\": \"centreSpin(){this.spinX=0,this.spinY=0}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"forgetShot\",\n      \"source\": \"forgetShot(){this.pendingShot=null,this.shotUnsureAt=null,this.shotSentAt=null}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"abandonShot\",\n      \"source\": \"abandonShot(){this.forgetShot(),this.centreSpin();let e=this.net.latest;e&&this.state&&e.sequence>this.state.sequence?(this.pendingState=null,this.state=e,this.view.apply(e.balls),this.track=tW(e),this.predictionDirty=!0):this.setMessage(\\\"No answer from the table. If your shot does not play, take it again.\\\",\\\"foul\\\"),this.enterTurn()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"beginPlayback\",\n      \"source\": \"beginPlayback(){let e=this.pendingReplay;e&&(this.pendingReplay=null,this.forgetShot(),this.centreSpin(),this.player.load(e.replay,e.elapsedMs),this.prediction=null,this.bih=null,this.remoteShot=null,this.phase=\\\"playing\\\",this.publish())}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"consumeEvent\",\n      \"source\": \"consumeEvent(e){switch(this.renderer.effects.emit(e,[]),e.type){case\\\"ballBall\\\":e.speed>.06&&eK.ballHit(e.speed);break;case\\\"cushion\\\":case\\\"jaw\\\":e.speed>.12&&eK.cushion(e.speed);break;case\\\"pocketWall\\\":e.speed>.2&&eK.cushion(.6*e.speed);break;case\\\"pocket\\\":{eK.pocket();let t=v.find(t=>t.id===e.pocket),a=this.view.balls[e.a];this.renderer.notePot(e.a,e.x,e.y,t?t.hole.x:a.p.x,t?t.hole.y:a.p.y,this.now/1e3),a.inPlay=!1,0===e.a||this.track.includes(e.a)||(this.track=[...this.track,e.a],this.publish())}}}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"finishPlayback\",\n      \"source\": \"finishPlayback(){this.player.clear();let e=this.pendingOutcome;e&&(this.pendingOutcome=null,e.foul?(this.foulFlash=1,eK.foul(),this.setMessage(e.message,\\\"foul\\\")):e.message&&this.setMessage(e.message,e.messageKind),e.gameOver&&(e.winner===this.net.slot?eK.win():eK.lose()),e.stalemate&&eK.rack(),this.resolveAt=this.now+(e.foul||e.gameOver?1e3:620),this.phase=\\\"resolving\\\",this.publish())}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"finishResolve\",\n      \"source\": \"finishResolve(){let e=this.pendingState;this.pendingState=null,e&&(this.state=e,this.view.apply(e.balls),this.track=tW(e)),this.enterTurn()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"setPower\",\n      \"source\": \"setPower(e){this.power=eL(e,0,1),this.myPower=this.power,this.predictionDirty=!0,\\\"aiming\\\"===this.phase&&(this.pullback=this.power)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"holdPower\",\n      \"source\": \"holdPower(e){this.powerHeld=e}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"commitPower\",\n      \"source\": \"commitPower(e){this.powerHeld=!1,this.setPower(e),this.shoot()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"setSpin\",\n      \"source\": \"setSpin(e,t){let a=Math.hypot(e,t);a>1&&(e/=a,t/=a),this.spinX=e,this.spinY=t,this.predictionDirty=!0,this.publish()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"nudgeAim\",\n      \"source\": \"nudgeAim(e){\\\"aiming\\\"===this.phase&&(this.aimAngle+=e,this.predictionDirty=!0)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"wheelAim\",\n      \"source\": \"wheelAim(e){this.nudgeAim(3e-4*e*tB(this.sensitivity))}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"holdFineAim\",\n      \"source\": \"holdFineAim(e,t,a=!1){if(0===e){this.turnHoldBy===t&&this.releaseFineAim();return}(this.turnHold!==e||this.turnHoldBy!==t)&&this.nudgeAim(.0035*e*(a?.1:1)),this.turnHold=e,this.turnHoldBy=t,this.turnHoldAt=performance.now()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"releaseFineAim\",\n      \"source\": \"releaseFineAim(){this.turnHold=0,this.turnHoldBy=null}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"shoot\",\n      \"source\": \"shoot(){if(\\\"aiming\\\"!==this.phase&&\\\"charging\\\"!==this.phase||null===this.state)return;if(this.power<.03){this.phase=\\\"aiming\\\";return}let e={angle:this.aimAngle,power:this.power,spinX:this.spinX,spinY:this.spinY};this.myPower=e.power,this.pendingShot=e,this.pendingOutcome=null,this.pendingReplay=null,this.lastPotted=[],this.phase=\\\"shooting\\\",this.shootStart=this.now,this.shotSentAt=performance.now(),this.beginSet(this.setLead(tE(e.power))),this.publish();let t=this.state.sequence;this.net.shoot(e,t).then(t=>{if(tq(t)&&this.pendingShot===e&&this.awaitingOwnShot()&&!this.pendingReplay){if(tq(t)&&!0===t.undelivered){this.shotUnsureAt=this.now,this.setMessage(t.message,\\\"info\\\");return}this.forgetShot(),this.pendingReplay=null,this.setMessage(t.message,\\\"foul\\\"),\\\"out-of-order\\\"===t.code||\\\"internal\\\"===t.code?this.net.rejoin():this.enterTurn()}})}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"placeCueBall\",\n      \"source\": \"async placeCueBall(e,t){if(!this.bih||!this.state||\\\"ballInHand\\\"!==this.phase&&!this.canReposition()||!this.placementLegal(e,t))return!1;let a=await this.net.placeCue(e,t,this.state.sequence);return tq(a)?(this.setMessage(a.message,\\\"foul\\\"),this.enterTurn(),!1):(eK.uiTap(),!0)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"placementLegal\",\n      \"source\": \"placementLegal(e,t){return!(!S(e,t,.028575,this.view.balls.filter(e=>0!==e.id))||this.state?.behindHeadString&&e>b)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"overTable\",\n      \"source\": \"overTable(e){return Math.abs(e.x)<r+.14&&Math.abs(e.y)<o+.14}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"overCue\",\n      \"source\": \"overCue(e){if(\\\"aiming\\\"!==this.phase&&\\\"charging\\\"!==this.phase)return!1;let t=this.view.cueBall;if(!t.inPlay)return!1;let a=-Math.cos(this.aimAngle),i=-Math.sin(this.aimAngle),n=e.x-t.p.x,l=e.y-t.p.y,r=n*a+l*i;return!(r<.017145)&&!(r>.58)&&.075>Math.abs(-(n*i)+l*a)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"overCueBall\",\n      \"source\": \"overCueBall(e){let t=this.view.cueBall;return!!t.inPlay&&.051435>Math.hypot(e.x-t.p.x,e.y-t.p.y)}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"beginPlacing\",\n      \"source\": \"beginPlacing(e,t){this.pointerId=e.pointerId,this.dragMode=\\\"place\\\",this.canvasEl.setPointerCapture(e.pointerId),this.updateBallInHand(t),e.preventDefault()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"beginStroke\",\n      \"source\": \"beginStroke(e,t){this.dragMode=\\\"cue\\\",this.dragStart=t,this.phase=\\\"charging\\\",this.powerBeforeStroke=this.power,this.strokeMouse=\\\"mouse\\\"===e.pointerType,this.strokeBase=this.strokeMouse&&this.wheelUsed?this.power:0,this.strokeTravelPx=0,this.power=this.strokeBase,this.publish(),e.preventDefault()}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"turnAim\",\n      \"source\": \"turnAim(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.turnLast,n)*tB(this.sensitivity)*(this.fineAim?.12:1),this.turnLast=n,this.predictionDirty=!0}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"followFinger\",\n      \"source\": \"followFinger(e){if(tB(this.sensitivity)>=1)return void this.aimAt(e);let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.aimAngle+=eB(this.fingerLast,n)*tB(this.sensitivity),this.fingerLast=n,this.predictionDirty=!0}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"aimAt\",\n      \"source\": \"aimAt(e){let t=this.view.cueBall;if(!t.inPlay)return;let a=e.x-t.p.x,i=e.y-t.p.y;if(.0200025>Math.hypot(a,i))return;let n=Math.atan2(i,a);this.fineAim?this.aimAngle+=.12*eB(this.aimAngle,n):this.aimAngle=n,this.predictionDirty=!0}\"\n    },\n    {\n      \"path\": \"engine\",\n      \"prototype\": \"tD\",\n      \"name\": \"updateBallInHand\",\n      \"source\": \"updateBallInHand(e){let t=this.view.balls.filter(e=>0!==e.id),a=function(e,t,a=[]){let i=Math.min(Math.max(e,-r+.028575),r-.028575),n=Math.min(Math.max(t,-o+.028575),o-.028575);for(let e=0;e<12;e++){let e=!1;for(let t of a){if(!t.inPlay)continue;let a=i-t.p.x,l=n-t.p.y,r=Math.hypot(a,l);if(r<.05725){let o=r>1e-6?1/r:0,s=r>1e-6?a*o:1,c=r>1e-6?l*o:0;i=t.p.x+.05725*s,n=t.p.y+.05725*c,e=!0}}for(let t of v){let a=i-t.x,l=n-t.y,r=Math.hypot(a,l),o=t.captureRadius+.0142875;if(r<o){let s=r>1e-6?1/r:0,c=r>1e-6?a*s:-t.dirX,d=r>1e-6?l*s:-t.dirY;i=t.x+c*o,n=t.y+d*o,e=!0}}if(i=Math.min(Math.max(i,-r+.028575),r-.028575),n=Math.min(Math.max(n,-o+.028575),o-.028575),!e)break}if(S(i,n,.028575,a))return{x:i,y:n};for(let i=1;i<=26;i++){let n=.028575*i*.85,l=Math.min(48,6+3*i);for(let r=0;r<l;r++){let o=r/l*Math.PI*2+.7*i,s=e+Math.cos(o)*n,c=t+Math.sin(o)*n;if(S(s,c,.028575,a))return{x:s,y:c}}}return{x:i,y:n}}(e.x,e.y,t),i=this.placementLegal(e.x,e.y);this.bih={x:i?e.x:a.x,y:i?e.y:a.y,legal:this.placementLegal(i?e.x:a.x,i?e.y:a.y),restricted:this.state?.behindHeadString??!1}}\"\n    },\n    {\n      \"path\": \"view\",\n      \"prototype\": \"tL\",\n      \"name\": \"apply\",\n      \"source\": \"apply(e){for(let t of e){let e=this.balls[t.id];e&&(e.p.x=t.x,e.p.y=t.y,e.v.x=0,e.v.y=0,e.w.x=0,e.w.y=0,e.w.z=0,e.inPlay=t.inPlay,e.pocket=t.pocket)}}\"\n    },\n    {\n      \"path\": \"view\",\n      \"prototype\": \"tL\",\n      \"name\": \"spin\",\n      \"source\": \"spin(e){if(!(e<=0))for(let t of(this.orthoCounter++,this.balls)){if(!t.inPlay)continue;let{x:a,y:i,z:n}=t.w;(0!==a||0!==i||0!==n)&&(!function(e,t,a,i,n){let l=Math.hypot(t,a,i)*n;if(l<1e-9)return;let r=1/(l/n),o=t*r,s=a*r,c=i*r,d=Math.cos(l),h=Math.sin(l),u=1-d,f=u*o*o+d,g=u*o*s-h*c,b=u*o*c+h*s,p=u*o*s+h*c,m=u*s*s+d,w=u*s*c-h*o,y=u*o*c-h*s,x=u*s*c+h*o,k=u*c*c+d,v=e[0],M=e[1],S=e[2],P=e[3],j=e[4],T=e[5],C=e[6],A=e[7],N=e[8];e[0]=f*v+g*P+b*C,e[1]=f*M+g*j+b*A,e[2]=f*S+g*T+b*N,e[3]=p*v+m*P+w*C,e[4]=p*M+m*j+w*A,e[5]=p*S+m*T+w*N,e[6]=y*v+x*P+k*C,e[7]=y*M+x*j+k*A,e[8]=y*S+x*T+k*N}(t.orient,a,i,n,e),(this.orthoCounter+t.id)%60==0&&function(e){let t=e[0],a=e[1],i=e[2],n=Math.hypot(t,a,i)||1;t/=n,a/=n,i/=n;let l=e[3],r=e[4],o=e[5],s=t*l+a*r+i*o;l-=s*t,r-=s*a,o-=s*i,n=Math.hypot(l,r,o)||1,l/=n,r/=n,o/=n,e[0]=t,e[1]=a,e[2]=i,e[3]=l,e[4]=r,e[5]=o,e[6]=a*o-i*r,e[7]=i*l-t*o,e[8]=t*r-a*l}(t.orient))}}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"ballSkin\",\n      \"source\": \"ballSkin(){return{skin:this.theme?.balls??null,mark:this.theme?.mark??null,pxPerMetre:this.scale*this.dpr}}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"render\",\n      \"source\": \"render(e){let t=this.ctx,a=e.time,i=this.lastFrame?Math.min(.05,a-this.lastFrame):0;for(let n of(this.lastFrame=a,this.effects.update(i),this.drops=this.drops.filter(e=>a-e.t0<.44),this.syncTheme(e.table),t.setTransform(this.dpr,0,0,this.dpr,0,0),t.clearRect(0,0,this.cssW,this.cssH),t.save(),t.translate(this.originX,this.originY),this.rotated&&t.rotate(-Math.PI/2),t.scale(this.scale,this.scale),t.lineJoin=\\\"round\\\",t.lineCap=\\\"round\\\",this.sprite&&t.drawImage(this.sprite.canvas,this.sprite.x,this.sprite.y,this.sprite.w,this.sprite.h),this.effects.drawUnderBalls(t),e.ballInHand?.restricted&&this.drawKitchen(t,a),e.world.balls))n.inPlay&&ta(t,n.p.x,n.p.y,.028575);for(let a of(e.showAim&&e.prediction&&this.drawGuides(t,e),this.drawMotionTrails(t,e.world),e.world.balls)){if(!a.inPlay||0===a.id&&e.ballInHand)continue;let i=e.legalTargets.includes(a.id);ti(t,a,{dim:e.legalTargets.length&&!i&&0!==a.id?.24:0,...this.ballSkin()})}this.drawDrops(t,e.world,a),e.showAim&&e.blockedTarget>=0&&this.drawBlockedMarker(t,e.world.balls[e.blockedTarget],a),e.showCue&&e.cueAlpha>.01&&this.drawCue(t,e),this.effects.draw(t),e.ballInHand&&this.drawBallInHand(t,e,a),e.foulFlash>0&&(t.fillStyle=`rgba(255, 70, 70, ${.09*e.foulFlash})`,t.fillRect(-r,-o,2*r,2*o)),t.restore()}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawKitchen\",\n      \"source\": \"drawKitchen(e,t){e.save(),e.fillStyle=\\\"rgba(120, 220, 190, 0.07)\\\",e.fillRect(-r,-o,b+r,2*o),e.strokeStyle=\\\"rgba(160, 240, 210, 0.55)\\\",e.lineWidth=.0035,e.setLineDash([.02,.016]),e.lineDashOffset=-(.08*t),e.beginPath(),e.moveTo(b,-o),e.lineTo(b,o),e.stroke(),e.restore()}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawMotionTrails\",\n      \"source\": \"drawMotionTrails(e,t){for(let a of(e.save(),t.balls)){if(!a.inPlay)continue;let t=Math.hypot(a.v.x,a.v.y);if(t<.8)continue;let i=Math.min(1,(t-.8)/4),n=Math.min(.09,.019*t),l=a.v.x/t,r=a.v.y/t,o=_[a.id]??_[0],s=e.createLinearGradient(a.p.x,a.p.y,a.p.x-l*n,a.p.y-r*n);s.addColorStop(0,tT(o.color,.3*i)),s.addColorStop(1,tT(o.color,0)),e.fillStyle=s,e.beginPath(),e.moveTo(a.p.x-.028575*r*.92,a.p.y+.028575*l*.92),e.lineTo(a.p.x+.028575*r*.92,a.p.y-.028575*l*.92),e.lineTo(a.p.x-l*n,a.p.y-r*n),e.closePath(),e.fill()}e.restore()}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawDrops\",\n      \"source\": \"drawDrops(e,t,a){for(let i of this.drops){let n=eL((a-i.t0)/.44,0,1),l=t.balls[i.id];if(!l)continue;let r=n*n,o=i.from.x+(i.to.x-i.from.x)*Math.min(1,1.7*n),s=i.from.y+(i.to.y-i.from.y)*Math.min(1,1.7*n),c={x:l.p.x,y:l.p.y};l.p.x=o,l.p.y=s,e.save();let d=v.reduce((e,t)=>Math.hypot(t.x-i.to.x,t.y-i.to.y)<Math.hypot(e.x-i.to.x,e.y-i.to.y)?t:e);e.beginPath(),e.arc(d.hole.x,d.hole.y,1.02*d.hole.r,0,eI),e.clip(),ti(e,l,{alpha:1-.85*r,scale:1-.42*r,dim:.5*r,...this.ballSkin()}),e.restore(),l.p.x=c.x,l.p.y=c.y}}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawGuides\",\n      \"source\": \"drawGuides(e,t){let a,i=t.prediction;if(i.cuePath.length<2)return;let n=1/this.scale,l=1.15*n,r=t.blockedTarget>=0,o=r?null:(a=t.cue)&&tv[a]||null,s=o?.core??D.line;if(e.save(),e.lineCap=\\\"butt\\\",tS(e,i.cuePath,\\\"rgba(0,0,0,0.28)\\\",2.2*l),o){for(let[t,a]of(e.lineCap=\\\"round\\\",o.glow))tS(e,i.cuePath,t,n*a);e.lineCap=\\\"butt\\\"}tS(e,i.cuePath,r?D.blocked:s,l),o?.line?.(e,i.cuePath,l,t.time);let c=i.cuePath.length-1;for(let t=1;t<c;t++){let a=i.cuePath[t];e.beginPath(),e.arc(a.x,a.y,1.6*l,0,eI),e.fillStyle=s,e.fill()}if(!i.ghost||r)return void e.restore();if(o?.ghost?.(e,i.ghost,l,t.time),e.beginPath(),e.arc(i.ghost.x,i.ghost.y,.028575-.5*l,0,eI),e.strokeStyle=\\\"rgba(0,0,0,0.30)\\\",e.lineWidth=2.4*l,e.stroke(),e.strokeStyle=o?.core??D.ghost,e.lineWidth=1.1*l,e.stroke(),\\\"extended\\\"===t.guideLevel){if(i.objectPath.length>=2){let t=i.objectPocket?\\\"rgba(150, 255, 200, 0.95)\\\":D.objectPractice;tS(e,i.objectPath,\\\"rgba(0,0,0,0.26)\\\",2.2*l),tS(e,i.objectPath,t,l)}if(i.cuePathAfter.length>=2){let t=!!i.scratchPocket;tS(e,i.cuePathAfter,\\\"rgba(0,0,0,0.22)\\\",2*l),tS(e,i.cuePathAfter,t?D.danger:D.cueAfter,l);let a=i.cuePathAfter[i.cuePathAfter.length-1];e.beginPath(),e.arc(a.x,a.y,.0120015,0,eI),e.strokeStyle=t?D.danger:D.cueAfter,e.lineWidth=.9*l,e.stroke()}}else{let a=i.targetId>=0?t.world.balls[i.targetId]:null;if(i.objectDir&&a){let t={x:a.p.x,y:a.p.y},r=Math.min(.165,i.objectReach??1/0),s={x:t.x+i.objectDir.x*r,y:t.y+i.objectDir.y*r};if(tS(e,[t,s],\\\"rgba(0,0,0,0.26)\\\",2.2*l),o)for(let[a,i]of o.glow)tS(e,[t,s],a,n*i*.7);tS(e,[t,s],o?.object??D.object,l)}if(i.cueDir){let t=Math.min(.052,i.cueReach??1/0),a={x:i.ghost.x+i.cueDir.x*t,y:i.ghost.y+i.cueDir.y*t};tS(e,[i.ghost,a],\\\"rgba(0,0,0,0.22)\\\",2*l),tS(e,[i.ghost,a],o?.cueAfter??D.cueAfter,l)}}if(e.restore(),i.scratchPocket){let a=v.find(e=>e.id===i.scratchPocket);if(a){let i=.55+.45*Math.sin(6*t.time);e.beginPath(),e.arc(a.hole.x,a.hole.y,1.18*a.hole.r,0,eI),e.strokeStyle=`rgba(255, 86, 86, ${.35+.35*i})`,e.lineWidth=2*l,e.stroke()}}}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawBlockedMarker\",\n      \"source\": \"drawBlockedMarker(e,t,a){if(!t||!t.inPlay)return;let i=.0245745*(.95+.05*Math.sin(5.5*a)),n=.24*i,l=(i-.5*n)*Math.SQRT1_2;for(let[a,r]of(e.save(),e.translate(t.p.x,t.p.y),e.beginPath(),e.arc(0,0,.028575,0,eI),e.fillStyle=\\\"rgba(120, 12, 14, 0.30)\\\",e.fill(),e.lineCap=\\\"butt\\\",[[\\\"rgba(0,0,0,0.5)\\\",n+.05*.028575],[D.blockedSolid,n]]))e.strokeStyle=a,e.lineWidth=r,e.beginPath(),e.arc(0,0,i,0,eI),e.stroke(),e.beginPath(),e.moveTo(-l,-l),e.lineTo(l,l),e.stroke();e.restore()}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawCue\",\n      \"source\": \"drawCue(e,t){let a=t.world.balls[0];if(!a.inPlay)return;let i=Math.cos(t.angle),n=Math.sin(t.angle),l=.46*t.spinX*.028575,r=.46*t.spinY*.028575,o=.016+.19*t.pullback,s=a.p.x-i*(.028575+o)+-n*l,c=a.p.y-n*(.028575+o)+i*l,d=-(.35*r);e.save(),e.globalAlpha=t.cueAlpha,e.translate(s+i*d,c+n*d),e.rotate(t.angle);let h=function(e){if(!e||!ec(e))return null;let t=tu.get(e);return t||tp(e),t??null}(t.cue);if(h){let a=1/h.art.pxPerMetre,i=-h.art.tipX*a,n=-h.art.axisY*a,l=h.art.width*a,r=h.art.height*a;e.save(),e.translate(.012,.016),e.globalAlpha*=.38,e.drawImage(h.shadow,i,n,l,r),e.restore(),e.drawImage(h.sprite,i,n,l,r);let o=h.art.glow;h.glow&&o&&(e.save(),e.globalCompositeOperation=\\\"lighter\\\",e.globalAlpha*=.78+.22*Math.sin(2.2*t.time),e.drawImage(h.glow,-o.tipX*a,-o.axisY*a,o.width*a,o.height*a),e.restore()),e.restore();return}e.save(),e.translate(.012,.016),e.globalAlpha*=.38,tP(e,$.length,$.tipRadius,$.buttRadius,\\\"rgba(0,0,0,0.9)\\\"),e.restore();let u=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);u.addColorStop(0,$.shaftLight),u.addColorStop(.42,$.shaft),u.addColorStop(1,\\\"#8b6534\\\"),tP(e,$.length,$.tipRadius,$.buttRadius,u),e.save(),e.beginPath(),e.rect(-$.length,-(1.2*$.buttRadius),.46*$.length,2.4*$.buttRadius),e.clip();let f=e.createLinearGradient(0,-$.buttRadius,0,$.buttRadius);f.addColorStop(0,$.buttLight),f.addColorStop(.45,$.butt),f.addColorStop(1,\\\"#1a0f08\\\"),tP(e,$.length,$.tipRadius,$.buttRadius,f),e.restore();let g=-(.46*$.length),b=-(.3*$.length);e.save(),e.beginPath(),e.rect(g,-(1.2*$.buttRadius),b-g,2.4*$.buttRadius),e.clip(),tP(e,$.length,$.tipRadius,$.buttRadius,$.wrap),e.strokeStyle=\\\"rgba(255,255,255,0.08)\\\",e.lineWidth=8e-4;for(let t=g;t<b;t+=.004)e.beginPath(),e.moveTo(t,-$.buttRadius),e.lineTo(t+.0025,$.buttRadius),e.stroke();e.restore(),tj(e,-(.47*$.length),.012,$,$.collar),tj(e,-(.462*$.length),.002,$,$.ring),tj(e,-(.295*$.length),.0035,$,$.ring),tj(e,-.028,.028,$,$.ferrule),e.beginPath(),e.moveTo(0,-$.tipRadius),e.lineTo(-.006,-$.tipRadius),e.lineTo(-.006,$.tipRadius),e.lineTo(0,$.tipRadius),e.quadraticCurveTo(.0022,0,0,-$.tipRadius),e.closePath(),e.fillStyle=$.tip,e.fill(),e.globalAlpha*=.5,e.beginPath(),e.moveTo(-.03,-(.45*$.tipRadius)),e.lineTo(-(.5*$.length),-(.5*$.buttRadius)),e.strokeStyle=\\\"rgba(255,240,214,0.55)\\\",e.lineWidth=.0016,e.stroke(),e.restore()}\"\n    },\n    {\n      \"path\": \"renderer\",\n      \"prototype\": \"tM\",\n      \"name\": \"drawBallInHand\",\n      \"source\": \"drawBallInHand(e,t,a){let i=t.ballInHand,n=t.world.balls[0],l={x:n.p.x,y:n.p.y};n.p.x=i.x,n.p.y=i.y,e.save(),e.globalAlpha=i.legal?.92:.5,ta(e,i.x,i.y,.028575,.6),ti(e,n,{alpha:i.legal?.95:.6,...this.ballSkin()}),e.restore();let r=.6+.4*Math.sin(5.2*a);e.beginPath(),e.arc(i.x,i.y,.028575+.008+.002*r,0,eI),e.strokeStyle=i.legal?`rgba(120, 240, 190, ${.55+.35*r})`:`rgba(255, 96, 96, ${.6+.3*r})`,e.lineWidth=.0032,e.stroke(),i.legal||(e.beginPath(),e.moveTo(i.x-.0142875,i.y-.0142875),e.lineTo(i.x+.0142875,i.y+.0142875),e.moveTo(i.x+.0142875,i.y-.0142875),e.lineTo(i.x-.0142875,i.y+.0142875),e.strokeStyle=\\\"rgba(255,96,96,0.9)\\\",e.lineWidth=.0032,e.stroke()),n.p.x=l.x,n.p.y=l.y}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"cueOfShooter\",\n      \"source\": \"cueOfShooter(){let e=this.view;return e?e.players[e.turn]?.cue??\\\"classic\\\":\\\"classic\\\"}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"tableOfViewer\",\n      \"source\": \"tableOfViewer(){return this.view?.table?.id??\\\"classic\\\"}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"ingest\",\n      \"source\": \"ingest(e,t){var a,i;let n,l;if(!tC(e)){this.view=null;return}let r=this.view;this.view=e,this.slot=e.you;let o=(a=t.connected,{matchId:e.matchId??\\\"\\\",sequence:e.sequence,serverTime:0,status:tA[e.status],phase:e.phase,turn:e.turn,players:[tN(e.players[0],a),tN(e.players[1],a)],balls:e.balls.map(e=>({id:e.id,x:e.x,y:e.y,inPlay:e.inPlay,pocket:e.pocket})),ballInHand:e.ballInHand,behindHeadString:e.behindHeadString,cuePlaced:e.cuePlaced,winner:e.winner,winKind:e.winKind,rackNumber:e.rackNumber,busyForMs:e.busyForMs,potted:(n=(i=e).balls.filter(e=>0!==e.id&&!e.inPlay).map(e=>e.id),[...l=(i.potted??[]).filter(e=>n.includes(e)),...n.filter(e=>!l.includes(e)).sort((e,t)=>e-t)])});this.latest=o;let s=JSON.stringify({...o,busyForMs:0,serverTime:0}),c=null===r;this.syncPresence(e,t),this.syncArrival(e,r),c||\\\"active\\\"===r.status||\\\"active\\\"!==e.status||this.emit(\\\"gameStarted\\\",{state:o});let d=e.lastShot,h=d?`${d.at}:${d.by}`:\\\"\\\";d&&h!==this.lastShotKey?(this.lastShotKey=h,!(c&&e.busyForMs<=0)&&(this.emitShot(e,d,o),c||(this.lastStateKey=s))):d||(this.lastShotKey=\\\"\\\"),s!==this.lastStateKey&&(this.lastStateKey=s,this.emit(\\\"state\\\",o))}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"emitShot\",\n      \"source\": \"emitShot(e,t,a){var i;let n;this.emit(\\\"started\\\",{sequence:e.sequence,by:t.by,shot:t.shot,cue:t.cue,startedAt:t.at,durationMs:t.durationMs}),this.emit(\\\"physics\\\",{sequence:e.sequence,replay:function(e){let t=atob(e),a=new Uint8Array(t.length);for(let e=0;e<t.length;e++)a[e]=t.charCodeAt(e);return a.buffer}(t.replay),durationMs:t.durationMs},(i=e.busyForMs,(n=t.durationMs+(t.pauseMs??0)-i)>400?n:0)),this.emit(\\\"finished\\\",{sequence:e.sequence,outcome:t.outcome,state:a})}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"receiveAim\",\n      \"source\": \"receiveAim(e){e&&\\\"number\\\"==typeof e.angle&&(this.view?.you===null||this.view?.you===void 0||e.by!==this.view.you)&&this.emit(\\\"opponentAim\\\",{angle:e.angle,power:e.power??0,spinX:e.spinX??0,spinY:e.spinY??0,cue:e.cue??null,charging:!0===e.charging})}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"sendAim\",\n      \"source\": \"sendAim(e){let t=this.view;if(t&&null!==t.you&&t.turn!==t.you)return;let a=performance.now();this.send(\\\"aim\\\",{angle:e.angle,power:e.power,spinX:e.spinX,spinY:e.spinY,cue:e.cue??null,charging:!0===e.charging}).then(e=>{e.ok&&this.noteRoundTrip(performance.now()-a)}).catch(()=>{})}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"placeCue\",\n      \"source\": \"placeCue(e,t,a){return this.command(\\\"placeCue\\\",{x:e,y:t})}\"\n    },\n    {\n      \"path\": \"net\",\n      \"prototype\": \"tR\",\n      \"name\": \"claimTurnTimeout\",\n      \"source\": \"claimTurnTimeout(){return this.command(\\\"claimTurnTimeout\\\")}\"\n    },\n    {\n      \"path\": \"player\",\n      \"prototype\": \"tI\",\n      \"name\": \"load\",\n      \"source\": \"load(e,t){this.set(function(e){let t=new DataView(e),a=0,i=t.getUint16(a,!0);a+=2;let n=t.getUint16(a,!0);a+=2;let l=t.getUint16(a,!0);a+=4;let r=[];for(let e=0;e<i;e++){let e=t.getUint16(a,!0);a+=2;let i=t.getUint16(a,!0);a+=2;let n={t:e,mask:0,x:new Float64Array(16),y:new Float64Array(16),wx:new Float64Array(16),wy:new Float64Array(16),wz:new Float64Array(16)};n.mask=i;for(let e=0;e<16;e++)(i&1<<e)!=0&&(n.x[e]=t.getInt16(a,!0)/2e4,a+=2,n.y[e]=t.getInt16(a,!0)/2e4,a+=2,n.wx[e]=t.getInt16(a,!0)/40,a+=2,n.wy[e]=t.getInt16(a,!0)/40,a+=2,n.wz[e]=t.getInt16(a,!0)/40,a+=2);r.push(n)}let o=[];for(let e=0;e<l;e++){let e=t_[t.getUint8(a)]??\\\"ballBall\\\";a+=1;let i=t.getUint16(a,!0);a+=2;let n=t.getUint8(a);a+=1;let l=t.getUint8(a);a+=1;let r=t.getUint8(a);a+=1;let s=t.getUint16(a,!0)/500;a+=2;let c=t.getInt16(a,!0)/2e4;a+=2;let d=t.getInt16(a,!0)/2e4;a+=2;let h=t.getInt8(a)/127;a+=1;let u=t.getInt8(a)/127;a+=1,o.push({type:e,t:i,a:n,b:255===l?-1:l,pocket:255===r?null:tz[r]??null,speed:s,x:c,y:d,nx:h,ny:u})}return{durationMs:n,frames:r,events:o}}(e),t)}\"\n    },\n    {\n      \"path\": \"player\",\n      \"prototype\": \"tI\",\n      \"name\": \"set\",\n      \"source\": \"set(e,t){this.tracks=[];for(let t=0;t<16;t++){let a=0;for(let i of e.frames)i.mask&1<<t&&a++;let i={n:0,t:new Float64Array(a),x:new Float64Array(a),y:new Float64Array(a),wx:new Float64Array(a),wy:new Float64Array(a),wz:new Float64Array(a),cursor:0,end:0,present:a>0,pocketAt:1/0};this.tracks.push(i)}for(let t of e.frames)for(let e=0;e<16;e++){if((t.mask&1<<e)==0)continue;let a=this.tracks[e],i=a.n++;a.t[i]=t.t,a.x[i]=t.x[e],a.y[i]=t.y[e],a.wx[i]=t.wx[e],a.wy[i]=t.wy[e],a.wz[i]=t.wz[e]}for(let e of this.tracks)e.end=e.n>0?e.t[e.n-1]:0;for(let t of e.events){if(\\\"pocket\\\"!==t.type)continue;let e=this.tracks[t.a];e&&(e.pocketAt=Math.min(e.pocketAt,t.t))}for(this.events=e.events,this.duration=e.durationMs,this.time=Math.max(0,t),this.eventCursor=0;this.eventCursor<this.events.length&&this.events[this.eventCursor].t<this.time;)this.eventCursor++}\"\n    },\n    {\n      \"path\": \"player\",\n      \"prototype\": \"tI\",\n      \"name\": \"sample\",\n      \"source\": \"sample(e,t,a){let i=t.balls[a],n=this.time;if(n>=e.pocketAt&&(i.inPlay=!1),n<=e.t[0]){i.p.x=e.x[0],i.p.y=e.y[0],i.w.x=e.wx[0],i.w.y=e.wy[0],i.w.z=e.wz[0],i.v.x=0,i.v.y=0;return}if(n>=e.end){let t=e.n-1;i.p.x=e.x[t],i.p.y=e.y[t],i.w.x=0,i.w.y=0,i.w.z=0,i.v.x=0,i.v.y=0;return}let l=e.cursor;for((l>=e.n-1||e.t[l]>n)&&(l=0);l<e.n-2&&e.t[l+1]<=n;)l++;e.cursor=l;let r=e.t[l+1]-e.t[l],o=r>0?(n-e.t[l])/r:0,s=e.x[l+1]-e.x[l],c=e.y[l+1]-e.y[l];i.p.x=e.x[l]+s*o,i.p.y=e.y[l]+c*o;let d=r>0?1e3/r:0;i.v.x=s*d,i.v.y=c*d,i.w.x=e.wx[l]+(e.wx[l+1]-e.wx[l])*o,i.w.y=e.wy[l]+(e.wy[l+1]-e.wy[l])*o,i.w.z=e.wz[l]+(e.wz[l+1]-e.wz[l])*o}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"clear\",\n      \"source\": \"clear(){for(let e of this.particles)e.active=!1;for(let e of this.rings)e.active=!1;this.pocketGlow.clear()}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"emit\",\n      \"source\": \"emit(e,t){switch(e.type){case\\\"ballBall\\\":{let t=Math.min(14,3+Math.round(3*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=(Math.random()-.5)*2.4,i=-e.ny,n=e.nx,l=.12+.42*Math.random()*Math.min(2.2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=(i*Math.cos(a)+e.nx*Math.sin(a)*.35)*l,t.vy=(n*Math.cos(a)+e.ny*Math.sin(a)*.35)*l,t.life=t.maxLife=.16+.2*Math.random(),t.size=.0012+.0016*Math.random(),t.drag=7,t.r=226,t.g=240,t.b=236}if(e.speed>1.4){let t=this.ring();t.active=!0,t.x=e.x,t.y=e.y,t.from=.0085725,t.to=.028575*(1.1+Math.min(1.2,.25*e.speed)),t.life=t.maxLife=.17,t.width=.0016,t.color=\\\"rgba(255,255,255,0.5)\\\"}break}case\\\"cushion\\\":case\\\"jaw\\\":{let t=Math.min(10,2+Math.round(2.2*e.speed));for(let a=0;a<t;a++){let t=this.particle(),a=Math.atan2(e.ny,e.nx)+(Math.random()-.5)*2,i=.1+.36*Math.random()*Math.min(2,e.speed);t.active=!0,t.x=e.x,t.y=e.y,t.vx=Math.cos(a)*i,t.vy=Math.sin(a)*i,t.life=t.maxLife=.13+.16*Math.random(),t.size=.0011+.0013*Math.random(),t.drag=9,t.r=190,t.g=226,t.b=212}break}case\\\"pocket\\\":{let t,a=v.find(t=>t.id===e.pocket);if(!a)break;this.pocketGlow.set(a.id,.5);let[i,n,l]=[(t=parseInt((_[e.a]??_[0]).color.slice(1),16))>>16&255,t>>8&255,255&t];for(let e=0;e<16;e++){let e=this.particle(),t=Math.random()*eI,r=.06+.3*Math.random();e.active=!0,e.x=a.x-.012*a.dirX,e.y=a.y-.012*a.dirY,e.vx=Math.cos(t)*r-.1*a.dirX,e.vy=Math.sin(t)*r-.1*a.dirY,e.life=e.maxLife=.28+.3*Math.random(),e.size=.0013+.0019*Math.random(),e.drag=5,e.r=i,e.g=n,e.b=l}let r=this.ring();r.active=!0,r.x=a.hole.x,r.y=a.hole.y,r.from=.6*a.hole.r,r.to=2.1*a.hole.r,r.life=r.maxLife=.46,r.width=.0035,r.color=W}}}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"update\",\n      \"source\": \"update(e){for(let t of this.particles){if(!t.active)continue;if(t.life-=e,t.life<=0){t.active=!1;continue}let a=Math.exp(-t.drag*e);t.x+=t.vx*e,t.y+=t.vy*e,t.vx*=a,t.vy*=a}for(let t of this.rings)t.active&&(t.life-=e,t.life<=0&&(t.active=!1));for(let[t,a]of this.pocketGlow){let i=a-e;i<=0?this.pocketGlow.delete(t):this.pocketGlow.set(t,i)}}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"glowFor\",\n      \"source\": \"glowFor(e){return this.pocketGlow.get(e)??0}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"drawUnderBalls\",\n      \"source\": \"drawUnderBalls(e){for(let[t,a]of this.pocketGlow){let i=v.find(e=>e.id===t);if(!i)continue;let n=a/.5,l=e.createRadialGradient(i.hole.x,i.hole.y,0,i.hole.x,i.hole.y,1.8*i.hole.r);l.addColorStop(0,`rgba(255,226,170,${.34*n})`),l.addColorStop(1,\\\"rgba(255,226,170,0)\\\"),e.fillStyle=l,e.beginPath(),e.arc(i.hole.x,i.hole.y,1.8*i.hole.r,0,eI),e.fill()}}\"\n    },\n    {\n      \"path\": \"renderer.effects\",\n      \"prototype\": \"tl\",\n      \"name\": \"draw\",\n      \"source\": \"draw(e){for(let t of(e.save(),e.globalCompositeOperation=\\\"lighter\\\",this.particles)){if(!t.active)continue;let a=t.life/t.maxLife;e.fillStyle=`rgba(${t.r},${t.g},${t.b},${.62*a*a})`,e.beginPath(),e.arc(t.x,t.y,t.size*(.5+a),0,eI),e.fill()}for(let t of(e.restore(),this.rings)){if(!t.active)continue;let a=1-t.life/t.maxLife,i=t.from+(t.to-t.from)*(1-(1-a)*(1-a));e.globalAlpha=1-a,e.strokeStyle=t.color,e.lineWidth=t.width*(1-.5*a),e.beginPath(),e.arc(t.x,t.y,i,0,eI),e.stroke(),e.globalAlpha=1}}\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"drawFocusIfNeeded\",\n      \"source\": \"function drawFocusIfNeeded() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"drawImage\",\n      \"source\": \"function drawImage() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"isPointInPath\",\n      \"source\": \"function isPointInPath() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"isPointInStroke\",\n      \"source\": \"function isPointInStroke() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"strokeText\",\n      \"source\": \"function strokeText() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"beginPath\",\n      \"source\": \"function beginPath() { [native code] }\"\n    },\n    {\n      \"path\": \"renderer.ctx\",\n      \"prototype\": \"CanvasRenderingContext2D\",\n      \"name\": \"closePath\",\n      \"source\": \"function closePath() { [native code] }\"\n    }\n  ],\n  \"bundles\": [\n    {\n      \"url\": \"https://1536454561869332530.discordsays.com/_next/static/chunks/0gtf7gqm4h522.js\",\n      \"bytes\": 250538,\n      \"score\": 126,\n      \"excerpts\": [\n        {\n          \"term\": \"refreshPrediction\",\n          \"offset\": 213730,\n          \"excerpt\": \"er:0;if(this.pullback+=(a-this.pullback)*Math.min(1,e*(t?22:14)),0!==this.turnHold&&\\\"aiming\\\"===this.phase){let t=(performance.now()-this.turnHoldAt)/1e3;if(1e3*t>=260){let a=Math.min(1,(t-.26)/1.5);this.nudgeAim(this.turnHold*(.07+.13*a*a)*e*(this.fineAim?.1:1))}}if(this.spaceDown){let e=(this.now-this.spaceStart)/900;this.power=eL(.1+(e%2<1?e%1:1-e%1)*.95,.05,1),this.pullback=this.power,this.predictionDirty=!0}this.refreshPrediction();break}case\\\"charging\\\":this.pullback+=(this.power-this.pullback)*Math.min(1,22*e),this.refreshPrediction();break;case\\\"shooting\\\":{if(null===this.strokeAt){let e=this.now-this.shootStart,t=eL(e/220,0,1);if(this.pullback=this.power*(1+.06*(1-(1-t)*(1-t))),!this.pendingReplay&&e<this.setFor)break;this.strokeAt=this.now,this.strokeFrom=this.pullback}let e=eL((this.now-this.strokeAt)/this.strokeMs,0,1);this.pullback=this.strokeFrom*(1-e*e),e>=1&&(this.pullback=0,eK.cueStrike(this.power),this.pendingReplay?this.beginPlayback():this.phase=\\\"sending\\\");break}case\\\"sending\\\":this.pendingReplay?this.beginPlayback():null!==this.shotUnsureAt&&this.now-this.shotUnsureAt>=12e3&&this.abandonShot();break;case\\\"playing\\\":for(let a of(this.cueAlpha=Math.max(0,this.cueAlpha-8*e),this.player.advanc\"\n        },\n        {\n          \"term\": \"cuePath\",\n          \"offset\": 150730,\n          \"excerpt\": \",783.99,1046.5].forEach((t,a)=>this.tone(e+.085*a,.34,.17,t,t,\\\"triangle\\\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\\\"sine\\\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\\\"highpass\\\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\\\"triangle\\\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y\"\n        },\n        {\n          \"term\": \"objectPath\",\n          \"offset\": 150764,\n          \"excerpt\": \"s.tone(e+.085*a,.34,.17,t,t,\\\"triangle\\\"))}lose(){if(!this.ready())return;let e=this.ctx.currentTime;[392,349.23,293.66].forEach((t,a)=>this.tone(e+.12*a,.42,.15,t,.98*t,\\\"sine\\\"))}uiTap(){if(!this.ready())return;let e=this.ctx.currentTime;this.burst(e,.03,.08,\\\"highpass\\\",2400,.7)}uiConfirm(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.09,.12,660,880,\\\"triangle\\\")}},eO={cuePath:[],ghost:null,targetId:-1,objectPath:[],cuePathAfter:[],objectDir:null,cueDir:null,objectPocket:null,scratchPocket:null,railsBeforeContact:0,cutAngle:0/0,objectReach:1/0,cueReach:1/0};function eQ(e,t,a){let i=e.cueBall;if(!i.inPlay)return eO;let n=Math.cos(t),l=Math.sin(t),r=i.p.x,o=i.p.y,s=3,c=-1;for(let t=1;t<16;t++){let a=e.balls[t];if(!a.inPlay)continue;let i=a.p.x-r,d=a.p.y-o,h=i*n+d*l;if(h<=0)continue;let u=i*i+d*d-h*h,f=.0032661225;if(u>=.0032661225)continue;let g=h-Math.sqrt(f-u);g<0||g>=s||(s=g,c=t)}let d=c<0?eZ(r,o,n,l):3,h=Math.min(s,d,e0(r,o,n,l));h<s&&(c=-1);let u={x:r+n*h,y:o+l*h},f=[{x:r,y:o},u];if(c<0)return{...eO,cuePath:f,railsBeforeContact:+(h===d)};let g=e.balls[c],b=g.p.x-u.x,m=g.p.y-u.y,w=Math.hypot(b,m)||1,y=n*(b/=w)+l*(m/=w),x=n-y*b,k=l-y*m,v=x+p*y*b,M=k+p*y*m,S=Math.hypot(v,M);return{...eO,\"\n        },\n        {\n          \"term\": \"pocket\",\n          \"offset\": 149523,\n          \"excerpt\": \"this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4.2),i=2100+1500*a+380*Math.random();this.burst(t,.045+.02*a,.1+.36*a,\\\"bandpass\\\",i,2.4),this.tone(t,.035+.02*a,.05+.16*a,.92*i,.55*i,\\\"triangle\\\")}cushion(e){if(!this.ready()||!this.allow())return;let t=this.ctx.currentTime,a=Math.min(1,e/4);this.burst(t,.075+.03*a,.06+.2*a,\\\"lowpass\\\",620+520*a,.8),this.tone(t,.09,.04+.14*a,190+90*a,90,\\\"sine\\\")}pocket(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.13,.22,340,120,\\\"sine\\\"),this.burst(e+.02,.1,.14,\\\"lowpass\\\",900,.7),this.burst(e+.14,.13,.1,\\\"bandpass\\\",1500,1.4),this.tone(e+.16,.2,.12,150,62,\\\"sine\\\")}cueStrike(e){if(!this.ready())return;let t=this.ctx.currentTime,a=Math.min(1,Math.max(.05,e));this.burst(t,.05,.1+.3*a,\\\"bandpass\\\",900+700*a,1.1),this.tone(t,.05,.05+.14*a,520+260*a,180,\\\"triangle\\\")}rack(){if(!this.ready())return;let e=this.ctx.currentTime;for(let t=0;t<7;t++)this.burst(e+.022*t+.01*Math.random(),.05,.1,\\\"bandpass\\\",1600+1400*Math.random(),2)}foul(){if(!this.ready())return;let e=this.ctx.currentTime;this.tone(e,.14,.16,300,190,\\\"square\\\"),this.tone(e+.11,.2,.14,205,130,\\\"square\\\")}win(){if(!this.ready())return;let e=this.ctx.currentTime;[523.25,659.25,783.99,1046.\"\n        },\n        {\n          \"term\": \"ghost\",\n          \"offset\": 8745,\n          \"excerpt\": \"allDeep:\\\"#140b07\\\",innerLight:\\\"rgba(120, 150, 140, 0.14)\\\"},G=\\\"rgba(0,0,0,0.5)\\\",E={x:.42,y:.56,z:.72,shadowOffset:.42,shadowBlur:.55,shadowAlpha:.42},$={tip:\\\"#3f6fa8\\\",ferrule:\\\"#f2ece0\\\",shaft:\\\"#d8b07a\\\",shaftLight:\\\"#f0d3a6\\\",collar:\\\"#1b1b1f\\\",ring:\\\"#c9a227\\\",butt:\\\"#2c1b12\\\",buttLight:\\\"#5e3a24\\\",wrap:\\\"#16181c\\\",length:.82,tipRadius:.0044,buttRadius:.0108},D={line:\\\"rgba(255, 255, 255, 0.90)\\\",lineSoft:\\\"rgba(255, 255, 255, 0.22)\\\",ghost:\\\"rgba(255, 255, 255, 0.92)\\\",ghostFill:\\\"rgba(255, 255, 255, 0.06)\\\",object:\\\"rgba(255, 255, 255, 0.86)\\\",objectPractice:\\\"rgba(255, 228, 150, 0.95)\\\",cueAfter:\\\"rgba(158, 206, 255, 0.72)\\\",danger:\\\"rgba(255, 96, 96, 0.95)\\\",blocked:\\\"rgba(255, 118, 110, 0.80)\\\",blockedSolid:\\\"#ff5a52\\\"},W=\\\"rgba(255, 238, 196, 0.85)\\\",U=(()=>{let{x:e,y:t,z:a}=E,i=Math.hypot(e,t,a);return{x:e/i,y:t/i,z:a/i}})();function F({id:e,size:a=22,potted:n=!1,title:l}){let r=(0,i.useId)().replace(/:/g,\\\"\\\"),o=_[e]??_[0],s=e>8;return(0,t.jsxs)(\\\"svg\\\",{width:a,height:a,viewBox:\\\"0 0 32 32\\\",role:l?\\\"img\\\":\\\"presentation\\\",\\\"aria-label\\\":l,style:{display:\\\"block\\\",opacity:n?.26:1,filter:n?\\\"grayscale(0.55)\\\":\\\"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\\\",transition:\\\"opacity 0.35s var(--ease), filter 0.35s var(--ease)\\\"},children:[(0,t.jsxs)(\\\"defs\\\",{ch\"\n        }\n      ]\n    },\n    {\n      \"url\": \"https://1536454561869332530.discordsays.com/_next/static/chunks/19db_hr8jwljq.js\",\n      \"bytes\": 2746,\n      \"score\": 12,\n      \"excerpts\": [\n        {\n          \"term\": \"pocket\",\n          \"offset\": 1280,\n          \"excerpt\": \"rer ${c}`,...t?{\\\"content-type\\\":\\\"application/json\\\"}:{}},body:t?JSON.stringify(t):void 0})}catch{return{ok:!1,code:\\\"UNAVAILABLE\\\"}}let d=await n.json().catch(()=>null);return n.ok&&d?.data?{ok:!0,wardrobe:(i=d.data,o=e=>e.filter(e=>e.owned).map(e=>e.id),l=i.throwables.some(e=>null===e.held),{coins:i.coins,verified:i.verified,owned:{name:o(i.names),frame:o(i.frames),fx:o(i.effects),theme:o(i.themes)},equipped:i.equipped,pocket:l?null:Object.fromEntries(i.throwables.map(e=>[e.id,e.held??0])),usedToday:i.usedToday,dailyThrows:i.dailyThrows})}:{ok:!1,code:d?.details?.code??d?.code??\\\"UNAVAILABLE\\\"}}var c=e.i(76522);e.s([\\\"UnoStore\\\",0,function({onClose:e}){let[s,d]=(0,t.useState)(null),[u,f]=(0,t.useState)(!1),h=(0,t.useMemo)(()=>{let e;return e=e=>e.ok?(d(e.wardrobe),{ok:!0,wardrobe:e.wardrobe}):e,{buy:async(a,t)=>e(await l(\\\"/purchase\\\",\\\"POST\\\",{kind:a,id:t})),wear:async a=>e(await l(\\\"/equip\\\",\\\"PATCH\\\",a)),buyPack:async(a,t)=>e(await l(\\\"/packs\\\",\\\"POST\\\",{id:a,size:t,idemKey:(0,o.Z)()}))}},[]),m=(0,r.v)()?.user,b={name:m?.globalName||m?.username||\\\"You\\\",avatar:function(e){if(!e?.id)return null;if(e.avatar)return`https://cdn.discordapp.com/avatars/${e.id}/${e.avatar}.png?size=128`;let a=0;try{a=Number((BigInt(e.id)>>Big\"\n        }\n      ]\n    },\n    {\n      \"url\": \"https://1536454561869332530.discordsays.com/_next/static/chunks/2zhaf-xcw67tg.js\",\n      \"bytes\": 46836,\n      \"score\": 12,\n      \"excerpts\": [\n        {\n          \"term\": \"pocket\",\n          \"offset\": 35868,\n          \"excerpt\": \",fx:\\\"Plays for everyone at the table when you call UNO.\\\",theme:\\\"Only you see your theme: cards, back and table.\\\",throw:\\\"Tap a player's picture during a game to throw one.\\\"},rarity:{common:\\\"Common\\\",rare:\\\"Rare\\\",epic:\\\"Epic\\\",legendary:\\\"Legendary\\\"},buy:e=>`Buy & wear \\\\xb7 ${e}`,wear:\\\"Wear\\\",wearing:\\\"Wearing\\\",free:\\\"Free\\\",owned:\\\"Owned\\\",busy:\\\"One moment…\\\",preview:\\\"Preview\\\",held:e=>`You have ${e}`,heldUnknown:\\\"Can't read your pocket\\\",pack:(e,a)=>`\\\\xd7${e} \\\\xb7 ${a}`,today:(e,a)=>`${e} of ${a} throws used today`,throwsAtMe:\\\"Throws at me\\\",throwsIn:{all:\\\"Everything\\\",hearts:\\\"Friendly only\\\",off:\\\"Nothing\\\"},friendly:\\\"Friendly\\\",playful:\\\"Playful\\\",coinsUnknown:\\\"—\\\",unverified:\\\"The shop can't read what you own right now. You can still wear free looks.\\\",errors:{INSUFFICIENT_FUNDS:\\\"Not enough EPIX for this yet.\\\",ALREADY_OWNED:\\\"You already own this.\\\",NOT_OWNED:\\\"You don't own that look.\\\",BLOCKED_SPEND:\\\"Your account can't buy right now.\\\",UNAVAILABLE:\\\"The shop can't reach your wallet right now — try again in a moment.\\\",DEFAULT:\\\"That didn't go through. You were not charged twice.\\\"}},U={name:N.NAMES,frame:N.FRAMES,fx:t.EFFECTS,theme:t.THEMES},O=[\\\"name\\\",\\\"frame\\\",\\\"fx\\\",\\\"theme\\\",\\\"throw\\\"],R=N.RARITY_COLORS,D=e=>`${new Intl.NumberFormat(\\\"\"\n        }\n      ]\n    },\n    {\n      \"url\": \"https://1536454561869332530.discordsays.com/_next/static/chunks/1f3_j0-7srs8o.js\",\n      \"bytes\": 180551,\n      \"score\": 3,\n      \"excerpts\": [\n        {\n          \"term\": \"rail\",\n          \"offset\": 964,\n          \"excerpt\": \"\\\"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var o=l?Object.getOwnPropertyDescriptor(e,u):null;o&&(o.get||o.set)?Object.defineProperty(a,u,o):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}},5550,(e,t,r)=>{e.i(47167),Object.defineProperty(r,\\\"__esModule\\\",{value:!0}),Object.defineProperty(r,\\\"addBasePath\\\",{enumerable:!0,get:function(){return l}});let n=e.r(41858),a=e.r(82823);function l(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefix)(e,\\\"\\\"))}(\\\"function\\\"==typeof r.default||\\\"object\\\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\\\"__esModule\\\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},32120,(e,t,r)=>{Object.defineProperty(r,\\\"__esModule\\\",{value:!0}),Object.defineProperty(r,\\\"callServer\\\",{enumerable:!0,get:function(){return n.callServer}});let n=e.r(48658);(\\\"function\\\"==typeof r.default||\\\"object\\\"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,\\\"__esModule\\\",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92245,(e,t,r)=>{let n;e.i(47167),Object.defineProperty(r,\\\"__esModule\\\",{value:!0}),Object.defineProperty(r,\\\"findSourceMapURL\\\",{enumerable:!0,get:function(){\"\n        }\n      ]\n    },\n    {\n      \"url\": \"https://1536454561869332530.discordsays.com/_next/static/chunks/0eobm8ikdrr9l.js\",\n      \"bytes\": 62120,\n      \"score\": 3,\n      \"excerpts\": [\n        {\n          \"term\": \"rail\",\n          \"offset\": 15942,\n          \"excerpt\": \"ame||(\\\"u\\\">typeof location?location.hostname:\\\"localhost\\\"),this.port=e.port||(\\\"u\\\">typeof location&&location.port?location.port:this.secure?\\\"443\\\":\\\"80\\\"),this.transports=[],this._transportsByName={},e.transports.forEach(t=>{let e=t.prototype.name;this.transports.push(e),this._transportsByName[e]=t}),this.opts=Object.assign({path:\\\"/engine.io\\\",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:\\\"t\\\",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},e),this.opts.path=this.opts.path.replace(/\\\\/$/,\\\"\\\")+(this.opts.addTrailingSlash?\\\"/\\\":\\\"\\\"),\\\"string\\\"==typeof this.opts.query&&(this.opts.query=function(t){let e={},s=t.split(\\\"&\\\");for(let t=0,i=s.length;t<i;t++){let i=s[t].split(\\\"=\\\");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}(this.opts.query)),X&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener(\\\"beforeunload\\\",this._beforeunloadEventListener,!1)),\\\"localhost\\\"!==this.hostname&&(this._offlineEventListener=()=>{this._onClose(\\\"transport close\\\",{description:\\\"network connection lost\\\"})},Q.push(this._offli\"\n        }\n      ]\n    }\n  ],\n  \"bundleFetchErrors\": [],\n  \"live\": {\n    \"capturedAt\": \"2026-11-02T16:53:32.935Z\",\n    \"page\": {\n      \"origin\": \"https://1536454561869332530.discordsays.com\",\n      \"insideGameFrame\": true,\n      \"viewport\": [\n        864,\n        532\n      ],\n      \"pixelRatio\": 1.218749761581421,\n      \"phase\": \"ballInHand\",\n      \"screenPhase\": \"ballInHand\",\n      \"turn\": \"0\"\n    },\n    \"engine\": {\n      \"phase\": \"ballInHand\",\n      \"aimAngle\": -0.366057,\n      \"power\": 1,\n      \"spinX\": 0,\n      \"spinY\": 0,\n      \"pullback\": 0,\n      \"cueAlpha\": 1,\n      \"predictionDirty\": false,\n      \"prediction\": {\n        \"cuePath\": [\n          {\n            \"x\": -0.4953,\n            \"y\": 0\n          },\n          {\n            \"x\": 0.191626,\n            \"y\": -0.263322\n          }\n        ],\n        \"ghost\": {\n          \"x\": 0.191626,\n          \"y\": -0.263322\n        },\n        \"targetId\": 15,\n        \"objectPath\": [],\n        \"cuePathAfter\": [],\n        \"objectDir\": {\n          \"x\": 0.986777,\n          \"y\": 0.162084\n        },\n        \"cueDir\": {\n          \"x\": 0.204112,\n          \"y\": -0.978948\n        },\n        \"objectPocket\": null,\n        \"scratchPocket\": null,\n        \"railsBeforeContact\": 0,\n        \"cutAngle\": 0.528859,\n        \"objectReach\": 0.723572,\n        \"cueReach\": 0.207777\n      },\n      \"blockedTarget\": -1,\n      \"viewBalls\": [\n        {\n          \"id\": 0,\n          \"group\": \"cue\",\n          \"p\": {\n            \"x\": -0.4953,\n            \"y\": 0\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.639194,\n              -0.634319,\n              0.434823,\n              -0.728783,\n              0.68016,\n              -0.079103,\n              -0.245573,\n              -0.367453,\n              -0.897035\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 1,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": -0.039226,\n            \"y\": -0.278441\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.536329,\n              0.378206,\n              0.754528,\n              0.230215,\n              -0.925636,\n              0.300333,\n              0.812005,\n              0.012627,\n              -0.583513\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 2,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": 1.021465,\n            \"y\": -0.526165\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.192896,\n              -0.915094,\n              -0.354109,\n              -0.000893,\n              -0.36105,\n              0.932546,\n              -0.981219,\n              -0.179568,\n              -0.070463\n            ]\n          },\n          \"inPlay\": false,\n          \"pocket\": \"topRight\"\n        },\n        {\n          \"id\": 3,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": 0.123323,\n            \"y\": 0.381355\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.210475,\n              -0.092405,\n              -0.973222,\n              0.524707,\n              0.829298,\n              -0.192217,\n              0.824853,\n              -0.551113,\n              -0.126061\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 4,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": 0.616993,\n            \"y\": 0.204055\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.580965,\n              -0.229235,\n              0.780981,\n              0.573164,\n              0.566043,\n              0.592518,\n              -0.577894,\n              0.791863,\n              -0.197462\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 5,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": 0.251337,\n            \"y\": 0.360561\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.121432,\n              0.031512,\n              0.992099,\n              -0.917369,\n              0.385259,\n              0.100048,\n              -0.379063,\n              -0.92227,\n              0.075691\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 6,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": 0.116962,\n            \"y\": 0.249824\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.516971,\n              0.186249,\n              -0.835495,\n              0.587266,\n              -0.63295,\n              -0.504474,\n              -0.622784,\n              -0.751456,\n              0.217839\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 7,\n          \"group\": \"solid\",\n          \"p\": {\n            \"x\": -1.021465,\n            \"y\": -0.526165\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.513551,\n              0.681692,\n              0.521116,\n              -0.729123,\n              -0.666872,\n              0.153822,\n              0.452377,\n              -0.300962,\n              0.83951\n            ]\n          },\n          \"inPlay\": false,\n          \"pocket\": \"topLeft\"\n        },\n        {\n          \"id\": 8,\n          \"group\": \"eight\",\n          \"p\": {\n            \"x\": 0.20002,\n            \"y\": 0.457782\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.973919,\n              -0.183742,\n              -0.133121,\n              0.125004,\n              -0.055129,\n              0.990623,\n              -0.189358,\n              -0.981427,\n              -0.030723\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 9,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": -0.872744,\n            \"y\": -0.057685\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.570275,\n              0.69273,\n              0.441488,\n              0.005304,\n              -0.53433,\n              0.845259,\n              0.821437,\n              0.484371,\n              0.301041\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 10,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": -0.184468,\n            \"y\": 0.139737\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.169558,\n              0.388685,\n              -0.905635,\n              0.778616,\n              0.616176,\n              0.118677,\n              0.604158,\n              -0.685019,\n              -0.407113\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 11,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": 0.356587,\n            \"y\": 0.42555\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.409687,\n              0.755881,\n              0.510686,\n              -0.815133,\n              -0.554664,\n              0.167051,\n              0.40953,\n              -0.347839,\n              0.843382\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 12,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": 0.659868,\n            \"y\": 0.458733\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.925295,\n              -0.198187,\n              0.323344,\n              -0.313494,\n              -0.879507,\n              0.358034,\n              0.213426,\n              -0.432653,\n              -0.875934\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 13,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": 0.184987,\n            \"y\": 0.364461\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.788073,\n              -0.548562,\n              -0.279322,\n              0.597228,\n              0.79131,\n              0.130947,\n              0.149198,\n              -0.270014,\n              0.951227\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 14,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": 0.036648,\n            \"y\": 0.152676\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              -0.198794,\n              -0.755209,\n              -0.624612,\n              -0.980029,\n              0.15004,\n              0.1305,\n              -0.004837,\n              0.63808,\n              -0.769955\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        },\n        {\n          \"id\": 15,\n          \"group\": \"stripe\",\n          \"p\": {\n            \"x\": 0.248021,\n            \"y\": -0.254059\n          },\n          \"v\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"w\": {\n            \"x\": 0,\n            \"y\": 0,\n            \"z\": 0\n          },\n          \"orient\": {\n            \"type\": \"Float64Array\",\n            \"length\": 9,\n            \"values\": [\n              0.762109,\n              0.527498,\n              -0.375414,\n              0.327936,\n              0.185461,\n              0.926317,\n              0.558255,\n              -0.829066,\n              -0.031644\n            ]\n          },\n          \"inPlay\": true,\n          \"pocket\": null\n        }\n      ],\n      \"serverState\": {\n        \"matchId\": \"RyoP85XrqfX2\",\n        \"sequence\": 6,\n        \"serverTime\": 0,\n        \"status\": \"playing\",\n        \"phase\": \"open\",\n        \"turn\": 0,\n        \"players\": [\n          {\n            \"slot\": 0,\n            \"name\": \"Sa2ḿmurai\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n            \"connected\": true,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 2,\n              \"potted\": 2,\n              \"fouls\": 1,\n              \"bestRun\": 2\n            }\n          },\n          {\n            \"slot\": 1,\n            \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n            \"connected\": false,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 0,\n              \"potted\": 0,\n              \"fouls\": 0,\n              \"bestRun\": 0\n            }\n          }\n        ],\n        \"balls\": [\n          {\n            \"id\": 0,\n            \"x\": -0.4953,\n            \"y\": 0,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 1,\n            \"x\": -0.039226,\n            \"y\": -0.278441,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 2,\n            \"x\": 1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topRight\"\n          },\n          {\n            \"id\": 3,\n            \"x\": 0.123323,\n            \"y\": 0.381355,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 4,\n            \"x\": 0.616993,\n            \"y\": 0.204055,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 5,\n            \"x\": 0.251337,\n            \"y\": 0.360561,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 6,\n            \"x\": 0.116962,\n            \"y\": 0.249824,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 7,\n            \"x\": -1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topLeft\"\n          },\n          {\n            \"id\": 8,\n            \"x\": 0.20002,\n            \"y\": 0.457782,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 9,\n            \"x\": -0.872744,\n            \"y\": -0.057685,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 10,\n            \"x\": -0.184468,\n            \"y\": 0.139737,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 11,\n            \"x\": 0.356587,\n            \"y\": 0.42555,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 12,\n            \"x\": 0.659868,\n            \"y\": 0.458733,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 13,\n            \"x\": 0.184987,\n            \"y\": 0.364461,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 14,\n            \"x\": 0.036648,\n            \"y\": 0.152676,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 15,\n            \"x\": 0.248021,\n            \"y\": -0.254059,\n            \"inPlay\": true,\n            \"pocket\": null\n          }\n        ],\n        \"ballInHand\": true,\n        \"behindHeadString\": false,\n        \"cuePlaced\": false,\n        \"winner\": null,\n        \"winKind\": null,\n        \"rackNumber\": 1,\n        \"busyForMs\": 0,\n        \"potted\": [\n          2,\n          7\n        ]\n      },\n      \"latestState\": {\n        \"matchId\": \"RyoP85XrqfX2\",\n        \"sequence\": 6,\n        \"serverTime\": 0,\n        \"status\": \"playing\",\n        \"phase\": \"open\",\n        \"turn\": 0,\n        \"players\": [\n          {\n            \"slot\": 0,\n            \"name\": \"Sa2ḿmurai\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n            \"connected\": true,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 2,\n              \"potted\": 2,\n              \"fouls\": 1,\n              \"bestRun\": 2\n            }\n          },\n          {\n            \"slot\": 1,\n            \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n            \"connected\": false,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 0,\n              \"potted\": 0,\n              \"fouls\": 0,\n              \"bestRun\": 0\n            }\n          }\n        ],\n        \"balls\": [\n          {\n            \"id\": 0,\n            \"x\": -0.4953,\n            \"y\": 0,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 1,\n            \"x\": -0.039226,\n            \"y\": -0.278441,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 2,\n            \"x\": 1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topRight\"\n          },\n          {\n            \"id\": 3,\n            \"x\": 0.123323,\n            \"y\": 0.381355,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 4,\n            \"x\": 0.616993,\n            \"y\": 0.204055,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 5,\n            \"x\": 0.251337,\n            \"y\": 0.360561,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 6,\n            \"x\": 0.116962,\n            \"y\": 0.249824,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 7,\n            \"x\": -1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topLeft\"\n          },\n          {\n            \"id\": 8,\n            \"x\": 0.20002,\n            \"y\": 0.457782,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 9,\n            \"x\": -0.872744,\n            \"y\": -0.057685,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 10,\n            \"x\": -0.184468,\n            \"y\": 0.139737,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 11,\n            \"x\": 0.356587,\n            \"y\": 0.42555,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 12,\n            \"x\": 0.659868,\n            \"y\": 0.458733,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 13,\n            \"x\": 0.184987,\n            \"y\": 0.364461,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 14,\n            \"x\": 0.036648,\n            \"y\": 0.152676,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 15,\n            \"x\": 0.248021,\n            \"y\": -0.254059,\n            \"inPlay\": true,\n            \"pocket\": null\n          }\n        ],\n        \"ballInHand\": true,\n        \"behindHeadString\": false,\n        \"cuePlaced\": false,\n        \"winner\": null,\n        \"winKind\": null,\n        \"rackNumber\": 1,\n        \"busyForMs\": 0,\n        \"potted\": [\n          2,\n          7\n        ]\n      },\n      \"netState\": {\n        \"matchId\": \"RyoP85XrqfX2\",\n        \"sequence\": 6,\n        \"serverTime\": 0,\n        \"status\": \"playing\",\n        \"phase\": \"open\",\n        \"turn\": 0,\n        \"players\": [\n          {\n            \"slot\": 0,\n            \"name\": \"Sa2ḿmurai\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n            \"connected\": true,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 2,\n              \"potted\": 2,\n              \"fouls\": 1,\n              \"bestRun\": 2\n            }\n          },\n          {\n            \"slot\": 1,\n            \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n            \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n            \"connected\": false,\n            \"ready\": true,\n            \"group\": null,\n            \"onEight\": false,\n            \"remaining\": [],\n            \"stats\": {\n              \"shots\": 0,\n              \"potted\": 0,\n              \"fouls\": 0,\n              \"bestRun\": 0\n            }\n          }\n        ],\n        \"balls\": [\n          {\n            \"id\": 0,\n            \"x\": -0.4953,\n            \"y\": 0,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 1,\n            \"x\": -0.039226,\n            \"y\": -0.278441,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 2,\n            \"x\": 1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topRight\"\n          },\n          {\n            \"id\": 3,\n            \"x\": 0.123323,\n            \"y\": 0.381355,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 4,\n            \"x\": 0.616993,\n            \"y\": 0.204055,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 5,\n            \"x\": 0.251337,\n            \"y\": 0.360561,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 6,\n            \"x\": 0.116962,\n            \"y\": 0.249824,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 7,\n            \"x\": -1.021465,\n            \"y\": -0.526165,\n            \"inPlay\": false,\n            \"pocket\": \"topLeft\"\n          },\n          {\n            \"id\": 8,\n            \"x\": 0.20002,\n            \"y\": 0.457782,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 9,\n            \"x\": -0.872744,\n            \"y\": -0.057685,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 10,\n            \"x\": -0.184468,\n            \"y\": 0.139737,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 11,\n            \"x\": 0.356587,\n            \"y\": 0.42555,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 12,\n            \"x\": 0.659868,\n            \"y\": 0.458733,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 13,\n            \"x\": 0.184987,\n            \"y\": 0.364461,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 14,\n            \"x\": 0.036648,\n            \"y\": 0.152676,\n            \"inPlay\": true,\n            \"pocket\": null\n          },\n          {\n            \"id\": 15,\n            \"x\": 0.248021,\n            \"y\": -0.254059,\n            \"inPlay\": true,\n            \"pocket\": null\n          }\n        ],\n        \"ballInHand\": true,\n        \"behindHeadString\": false,\n        \"cuePlaced\": false,\n        \"winner\": null,\n        \"winKind\": null,\n        \"rackNumber\": 1,\n        \"busyForMs\": 0,\n        \"potted\": [\n          2,\n          7\n        ]\n      },\n      \"view\": {\n        \"ownKeys\": [\n          \"balls\",\n          \"orthoCounter\"\n        ],\n        \"constructor\": \"tL\",\n        \"orthoCounter\": 19988\n      },\n      \"renderer\": {\n        \"ownKeys\": [\n          \"canvas\",\n          \"effects\",\n          \"ctx\",\n          \"sprite\",\n          \"scale\",\n          \"originX\",\n          \"originY\",\n          \"dpr\",\n          \"cssW\",\n          \"cssH\",\n          \"rotated\",\n          \"drops\",\n          \"lastFrame\",\n          \"spriteTable\",\n          \"theme\"\n        ],\n        \"constructor\": \"tM\",\n        \"scale\": 305.17807,\n        \"originX\": 408.012909,\n        \"originY\": 193.269272,\n        \"dpr\": 1.21875,\n        \"cssW\": 816.025818,\n        \"cssH\": 386.538544,\n        \"rotated\": false,\n        \"sprite\": {\n          \"x\": -1.1286,\n          \"y\": -0.6333,\n          \"w\": 2.2572,\n          \"h\": 1.2666\n        },\n        \"spriteTable\": \"classic\",\n        \"canvasBitmap\": [\n          995,\n          471\n        ],\n        \"canvasRect\": {\n          \"x\": 23.987185,\n          \"y\": 85.987198,\n          \"width\": 816.025818,\n          \"height\": 386.538544\n        }\n      },\n      \"player\": {\n        \"tracks\": [],\n        \"events\": [],\n        \"eventCursor\": 0,\n        \"time\": -1,\n        \"duration\": 0\n      },\n      \"net\": {\n        \"handlers\": {\n          \"session\": {\n            \"type\": \"Set\",\n            \"size\": 0,\n            \"values\": []\n          },\n          \"connection\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"state\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"started\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"physics\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"finished\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"opponentJoined\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"opponentLeft\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"opponentBack\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"opponentAim\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"gameStarted\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          },\n          \"error\": {\n            \"type\": \"Set\",\n            \"size\": 1,\n            \"values\": [\n              \"[Function anonymous]\"\n            ]\n          }\n        },\n        \"slot\": 0,\n        \"code\": null,\n        \"connection\": \"online\",\n        \"state\": {\n          \"matchId\": \"RyoP85XrqfX2\",\n          \"sequence\": 6,\n          \"serverTime\": 0,\n          \"status\": \"playing\",\n          \"phase\": \"open\",\n          \"turn\": 0,\n          \"players\": [\n            {\n              \"slot\": 0,\n              \"name\": \"Sa2ḿmurai\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n              \"connected\": true,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 2,\n                \"potted\": 2,\n                \"fouls\": 1,\n                \"bestRun\": 2\n              }\n            },\n            {\n              \"slot\": 1,\n              \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n              \"connected\": false,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 0,\n                \"potted\": 0,\n                \"fouls\": 0,\n                \"bestRun\": 0\n              }\n            }\n          ],\n          \"balls\": [\n            {\n              \"id\": 0,\n              \"x\": -0.4953,\n              \"y\": 0,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 1,\n              \"x\": -0.039226,\n              \"y\": -0.278441,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 2,\n              \"x\": 1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topRight\"\n            },\n            {\n              \"id\": 3,\n              \"x\": 0.123323,\n              \"y\": 0.381355,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 4,\n              \"x\": 0.616993,\n              \"y\": 0.204055,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 5,\n              \"x\": 0.251337,\n              \"y\": 0.360561,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 6,\n              \"x\": 0.116962,\n              \"y\": 0.249824,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 7,\n              \"x\": -1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topLeft\"\n            },\n            {\n              \"id\": 8,\n              \"x\": 0.20002,\n              \"y\": 0.457782,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 9,\n              \"x\": -0.872744,\n              \"y\": -0.057685,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 10,\n              \"x\": -0.184468,\n              \"y\": 0.139737,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 11,\n              \"x\": 0.356587,\n              \"y\": 0.42555,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 12,\n              \"x\": 0.659868,\n              \"y\": 0.458733,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 13,\n              \"x\": 0.184987,\n              \"y\": 0.364461,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 14,\n              \"x\": 0.036648,\n              \"y\": 0.152676,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 15,\n              \"x\": 0.248021,\n              \"y\": -0.254059,\n              \"inPlay\": true,\n              \"pocket\": null\n            }\n          ],\n          \"ballInHand\": true,\n          \"behindHeadString\": false,\n          \"cuePlaced\": false,\n          \"winner\": null,\n          \"winKind\": null,\n          \"rackNumber\": 1,\n          \"busyForMs\": 0,\n          \"potted\": [\n            2,\n            7\n          ]\n        },\n        \"latest\": {\n          \"matchId\": \"RyoP85XrqfX2\",\n          \"sequence\": 6,\n          \"serverTime\": 0,\n          \"status\": \"playing\",\n          \"phase\": \"open\",\n          \"turn\": 0,\n          \"players\": [\n            {\n              \"slot\": 0,\n              \"name\": \"Sa2ḿmurai\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n              \"connected\": true,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 2,\n                \"potted\": 2,\n                \"fouls\": 1,\n                \"bestRun\": 2\n              }\n            },\n            {\n              \"slot\": 1,\n              \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n              \"connected\": false,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 0,\n                \"potted\": 0,\n                \"fouls\": 0,\n                \"bestRun\": 0\n              }\n            }\n          ],\n          \"balls\": [\n            {\n              \"id\": 0,\n              \"x\": -0.4953,\n              \"y\": 0,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 1,\n              \"x\": -0.039226,\n              \"y\": -0.278441,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 2,\n              \"x\": 1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topRight\"\n            },\n            {\n              \"id\": 3,\n              \"x\": 0.123323,\n              \"y\": 0.381355,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 4,\n              \"x\": 0.616993,\n              \"y\": 0.204055,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 5,\n              \"x\": 0.251337,\n              \"y\": 0.360561,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 6,\n              \"x\": 0.116962,\n              \"y\": 0.249824,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 7,\n              \"x\": -1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topLeft\"\n            },\n            {\n              \"id\": 8,\n              \"x\": 0.20002,\n              \"y\": 0.457782,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 9,\n              \"x\": -0.872744,\n              \"y\": -0.057685,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 10,\n              \"x\": -0.184468,\n              \"y\": 0.139737,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 11,\n              \"x\": 0.356587,\n              \"y\": 0.42555,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 12,\n              \"x\": 0.659868,\n              \"y\": 0.458733,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 13,\n              \"x\": 0.184987,\n              \"y\": 0.364461,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 14,\n              \"x\": 0.036648,\n              \"y\": 0.152676,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 15,\n              \"x\": 0.248021,\n              \"y\": -0.254059,\n              \"inPlay\": true,\n              \"pocket\": null\n            }\n          ],\n          \"ballInHand\": true,\n          \"behindHeadString\": false,\n          \"cuePlaced\": false,\n          \"winner\": null,\n          \"winKind\": null,\n          \"rackNumber\": 1,\n          \"busyForMs\": 0,\n          \"potted\": [\n            2,\n            7\n          ]\n        },\n        \"view\": {\n          \"status\": \"active\",\n          \"matchId\": \"RyoP85XrqfX2\",\n          \"hosted\": false,\n          \"sequence\": 6,\n          \"phase\": \"open\",\n          \"turn\": 0,\n          \"players\": [\n            {\n              \"slot\": 0,\n              \"name\": \"Sa2ḿmurai\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\",\n              \"userId\": \"690943650775040050\",\n              \"cue\": \"classic\",\n              \"connected\": false,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 2,\n                \"potted\": 2,\n                \"fouls\": 1,\n                \"bestRun\": 2\n              }\n            },\n            {\n              \"slot\": 1,\n              \"name\": \"𝓎𝒶𝓈𝑜_ ᵉˢᵗ\",\n              \"avatar\": \"https://cdn.discordapp.com/avatars/1254868628675760209/a_ffb8ce7ed63fb5813f769bcffb5a9609.png?size=128\",\n              \"userId\": \"1254868628675760209\",\n              \"cue\": \"classic\",\n              \"connected\": false,\n              \"ready\": true,\n              \"group\": null,\n              \"onEight\": false,\n              \"remaining\": [],\n              \"stats\": {\n                \"shots\": 0,\n                \"potted\": 0,\n                \"fouls\": 0,\n                \"bestRun\": 0\n              }\n            }\n          ],\n          \"balls\": [\n            {\n              \"id\": 0,\n              \"x\": -0.4953,\n              \"y\": 0,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 1,\n              \"x\": -0.039226,\n              \"y\": -0.278441,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 2,\n              \"x\": 1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topRight\"\n            },\n            {\n              \"id\": 3,\n              \"x\": 0.123323,\n              \"y\": 0.381355,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 4,\n              \"x\": 0.616993,\n              \"y\": 0.204055,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 5,\n              \"x\": 0.251337,\n              \"y\": 0.360561,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 6,\n              \"x\": 0.116962,\n              \"y\": 0.249824,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 7,\n              \"x\": -1.021465,\n              \"y\": -0.526165,\n              \"inPlay\": false,\n              \"pocket\": \"topLeft\"\n            },\n            {\n              \"id\": 8,\n              \"x\": 0.20002,\n              \"y\": 0.457782,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 9,\n              \"x\": -0.872744,\n              \"y\": -0.057685,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 10,\n              \"x\": -0.184468,\n              \"y\": 0.139737,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 11,\n              \"x\": 0.356587,\n              \"y\": 0.42555,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 12,\n              \"x\": 0.659868,\n              \"y\": 0.458733,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 13,\n              \"x\": 0.184987,\n              \"y\": 0.364461,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 14,\n              \"x\": 0.036648,\n              \"y\": 0.152676,\n              \"inPlay\": true,\n              \"pocket\": null\n            },\n            {\n              \"id\": 15,\n              \"x\": 0.248021,\n              \"y\": -0.254059,\n              \"inPlay\": true,\n              \"pocket\": null\n            }\n          ],\n          \"potted\": [\n            2,\n            7\n          ],\n          \"ballInHand\": true,\n          \"behindHeadString\": false,\n          \"cuePlaced\": false,\n          \"winner\": null,\n          \"winKind\": null,\n          \"tournament\": null,\n          \"rackNumber\": 1,\n          \"busyForMs\": 0,\n          \"turnRemainingMs\": 60000,\n          \"turnTotalMs\": 60000,\n          \"warmupRemainingMs\": null,\n          \"arrived\": [\n            true,\n            false\n          ],\n          \"lastShot\": null,\n          \"rematch\": {\n            \"you\": false,\n            \"them\": false,\n            \"declined\": false\n          },\n          \"you\": 0,\n          \"table\": {\n            \"id\": \"classic\",\n            \"host\": \"classic\",\n            \"mine\": false\n          },\n          \"wallet\": {\n            \"coins\": 1085,\n            \"cues\": [\n              \"classic\"\n            ],\n            \"owned\": [\n              \"classic\"\n            ],\n            \"tables\": [\n              \"classic\"\n            ],\n            \"cue\": \"classic\",\n            \"table\": \"classic\",\n            \"myTable\": false\n          },\n          \"developer\": false\n        },\n        \"send\": \"[Function anonymous]\",\n        \"closer\": \"[Function anonymous]\",\n        \"lastShotKey\": \"\",\n        \"lastStateKey\": \"{\\\"matchId\\\":\\\"RyoP85XrqfX2\\\",\\\"sequence\\\":6,\\\"serverTime\\\":0,\\\"status\\\":\\\"playing\\\",\\\"phase\\\":\\\"open\\\",\\\"turn\\\":0,\\\"players\\\":[{\\\"slot\\\":0,\\\"name\\\":\\\"Sa2ḿmurai\\\",\\\"avatar\\\":\\\"https://cdn.discordapp.com/avatars/690943650775040050/84db85240660aa2e014268a26cc6738e.png?size=128\\\",\\\"connected\\\":true,\\\"ready\\\":true,\\\"group\\\":null,\\\"onEight\\\":false,\\\"remaining\\\":[],\\\"stats\\\":{\\\"shots\\\":2,\\\"potted\\\":2,\\\"fouls\\\":1,\\\"bestRun\\\":2}},{\\\"slot\\\":1,\\\"name\\\":\\\"𝓎𝒶𝓈...\",\n        \"opponentWasConnected\": false,\n        \"opponentEverHere\": false,\n        \"request\": \"[Function request]\",\n        \"rtt\": 306.708129,\n        \"rttVar\": 4.614263\n      }\n    }\n  }\n}"}