�PNG  IHDR��;���IDATx��ܻn�0���K�� �)(�pA��� ���7�LeG{�� �§㻢|��ذaÆ 6lذaÆ 6lذaÆ 6lom��$^�y���ذag�5bÆ 6lذaÆ 6lذa{���� 6lذaÆ �`����}H�Fkm�,�m����Ӫ���ô�ô!� �x�|'ܢ˟;�E:���9�&ᶒ�}�{�v]�n&�6� �h��_��t�ڠ͵-ҫ���Z;��Z$�.�P���k�ž)�!��o���>}l�eQfJ�T��u і���چ��\��X=8��Rن4`Vw�l�>����n�G�^��i�s��"ms�$�u��i��?w�bs[m�6�K4���O���.�4��%����/����b�C%��t ��M�ז� �-l�G6�mrz2���s�%�9��s@���-�k�9�=���)������k�B5����\��+͂�Zsٲ ��Rn��~G���R���C����� �wIcI��n7jJ���hۛNCS|���j0��8y�iHKֶۛ�k�Ɉ+;Sz������L/��F�*\��Ԕ�#"5��m�2��[S��������=�g��n�a�P�e�ғ�L�� lذaÆ 6l�^k��̱aÆ 6lذaÆ 6lذa;���� �_��ذaÆ 6lذaÆ 6lذaÆ ���R���IEND�B` /* eslint-env browser */ 'use strict'; import pEvent from 'p-event'; import isIp from 'is-ip'; const getIp = async ({isSecondTry = false} = {}) => { try { const peerConnection = new RTCPeerConnection({iceServers: []}); peerConnection.createDataChannel(''); peerConnection.createOffer(peerConnection.setLocalDescription.bind(peerConnection), () => {}); const {candidate} = await pEvent(peerConnection, 'icecandidate', { timeout: 10000 }); peerConnection.close(); if (candidate && candidate.candidate) { const result = candidate.candidate.split(' ')[4]; if (result.endsWith('.local')) { if (isSecondTry) { return; } const inputDevices = await navigator.mediaDevices.enumerateDevices(); const inputDeviceTypes = new Set(inputDevices.map(({kind}) => kind)); const constraints = {}; if (inputDeviceTypes.has('audioinput')) { constraints.audio = true; } else if (inputDeviceTypes.has('videoinput')) { constraints.video = true; } else { return; } const mediaStream = await navigator.mediaDevices.getUserMedia(constraints); for (const track of mediaStream.getTracks()) { track.stop(); } return await getIp({isSecondTry: true}); } return result; } } catch {} }; export const v4 = async () => { const result = await getIp(); if (isIp.v4(result)) { return result; } }; v4.sync = () => undefined; export const v6 = async () => { const result = await getIp(); if (isIp.v6(result)) { return result; } }; v6.sync = () => undefined;