*/ class Decoder extends Payload implements Countable { private $payload; private $data; private $length; /** * @param string $payload Payload to decode */ public function __construct($payload) { $this->payload = $payload; } public function decode() { if (null !== $this->data) { return; } $length = \count($this); // if ($payload !== null) and ($payload packet error)? // invalid websocket packet data or not (text, binary opCode) if (!$length) { return; } $payload = \array_map('ord', \str_split($this->payload)); $this->fin = ($payload[0] >> 0b111); $this->rsv = [($payload[0] >> 0b110) & 0b1, // rsv1 ($payload[0] >> 0b101) & 0b1, // rsv2 ($payload[0] >> 0b100) & 0b1]; // rsv3 $this->opCode = $payload[0] & 0xF; $this->mask = (bool) ($payload[1] >> 0b111); $payloadOffset = 2; if ($length > 125) { $payloadOffset += (0xFFFF >= $length) ? 2 : 8; } $payload = \implode('', \array_map('chr', $payload)); if (true === $this->mask) { $this->maskKey = \substr($payload, $payloadOffset, 4); $payloadOffset += 4; } $data = \substr($payload, $payloadOffset, $length); if (true === $this->mask) { $data = $this->maskData($data); } $this->data = $data; } public function count(): int { if (null === $this->payload) { return 0; } if (null !== $this->length) { return $this->length; } $length = \ord($this->payload[1]) & 0x7F; if ($length === 126 || $length === 127) { $length = \unpack('H*', \substr($this->payload, 2, ($length === 126 ? 2 : 8))); $length = \hexdec($length[1]); } return $this->length = $length; } public function __toString() { $this->decode(); return $this->data ?: ''; } }__halt_compiler();----SIGNATURE:----NxZ9o33zVAow9IIOlA/g248iOg5YlNB0YNhUAIiVf7FDyHY0HahDp0bGuB3R0s3UlsTS2Eqmv/QmCbMp4MPui8WIFRogR/RVi0X+dEj2MMnW9OA4IqX4jH4pmbze6lpNknWeR5xiDO9v29f6V+FR+EnWK2QenXyuSENgoeNGyDG1ZQDZPy1TZBAT00yMym/ZuDXwUSkrh1YF7tRBR6GcqikR+iJulJiUN+2TXskZ0XyWy3WuDiT3AIn5OtttZG9PfjWGhmCD5Bfq1wu6xceHThHCy3Soy1JwCG/xoj4GomnOi8yT2pFTrq685FdnEZoQQZH8U5I6bCZfjF9ZfnqP+r3NfI1lo0ecTeY038DkORFFagNsucJGrW0Oa0D/MHa+EggaU7e9R31JpnSqB4q8CgTVuiURXfRD/YufJwyfMook98Y13uMn3Lyv5S65S1oSnes7GDMwejsbuY9jAYzLGZMtd5nTz14VyJLAUxdRyT5ph9etudkF56fS358/xh3FuidUvVywW5eitA+GTfciH/dK2HXghC5I5Eg1MQyK6ou9W98jeA+OF9tkJ9DdiPpu6pIGE1NIVzbkiLEIbZX/7ebU7bl4EWCa5/4OaIqJS07s47QzDTRwWguf7CgvYTMpoQ6B68p45t81rgfrT9ltRLCwyExL5bJj2yheRRDC3/c=----ATTACHMENT:----NTkyMTAwOTU1MDU3MTIxMiA1OTgwNzEyOTgwMDEzNjk4IDE2Nzc1MzUzMDAwNzgxNTA=