diff --git a/asset-manifest.json b/asset-manifest.json index f1699db..50110cb 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,13 +1,13 @@ { "files": { - "main.css": "/Impression/static/css/main.2a509c91.css", - "main.js": "/Impression/static/js/main.331c72f4.js", + "main.css": "/Impression/static/css/main.7b666478.css", + "main.js": "/Impression/static/js/main.89371dd1.js", "index.html": "/Impression/index.html", - "main.2a509c91.css.map": "/Impression/static/css/main.2a509c91.css.map", - "main.331c72f4.js.map": "/Impression/static/js/main.331c72f4.js.map" + "main.7b666478.css.map": "/Impression/static/css/main.7b666478.css.map", + "main.89371dd1.js.map": "/Impression/static/js/main.89371dd1.js.map" }, "entrypoints": [ - "static/css/main.2a509c91.css", - "static/js/main.331c72f4.js" + "static/css/main.7b666478.css", + "static/js/main.89371dd1.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index 64c6047..a4c1f8b 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -
-1){d[r]=\"VB\",g++;continue}}!(a>3&&e.match(/[^e]ed$/gi)&&0===s.indexOf(\"N\"))||0!==r&&e.match(/^[A-Z][a-z]+/g)?!(a>4&&e.lastIndexOf(\"ing\")===a-3&&n.ing_excpt.indexOf(o)===-1)||0!==s.indexOf(\"N\")&&\"MD\"!==s||0!==r&&e.match(/^[A-Z][a-z]+/g)||\"NN\"===l||\"JJ\"===l||\"DT\"===l||\"VBG\"===l?a>4&&o.lastIndexOf(\"in\")===a-2&&\"NN\"===s&&(0===r||!e.match(/^[A-Z][a-z]+/g))&&\"NN\"!==l&&\"JJ\"!==l&&\"DT\"!==l&&\"VBG\"!==l&&(J=Z[o+\"g\"],J&&\"VBG\"===J.pos)?d[r]=\"VBG\":(\"TO\"===l&&n.infinitives.indexOf(o)>-1&&(s=\"VB\"),\"DT\"!==l&&e.match(/^[IVXLCDM]+$/g)&&\"I\"!==e&&(s=\"CD\"),\"NN\"===s||\"VB\"===s||\"JJ\"===s&&n.nationalities.hasOwnProperty(o)===!1?e.match(/^[A-Z]+$/g)||e.match(/^([a-z]{1}\\.)+/gi)?(s=\"NNP\",B=!0):r>0&&C(e)?(s=\"NNP\",B=!0,J=t[r-1],1!==r||\"NN\"!==l&&\"NNS\"!==l&&\"JJ\"!==l&&\"VB\"!==l||!C(J)||(d[r-1]=\"NNP\")):B=!1:B&&(\"CD\"===s&&e.match(/^[IVXLCDM]+$/g)||\"I\"===e)?s=\"NNP\":B=\"NNP\"===s||\"NNPS\"===s,\"NN\"===s&&i(e)&&(s=\"NNS\"),d[r]=s):d[r]=\"VBG\":d[r]=\"VBN\"}for(N.apply(t,d,u),r=0;r
-1?o--:(u+=1,s.match(/^[A-Z][a-zA-Z]+$/g)&&c++,s.match(/[A-Z]+/)&&!s.match(/[a-z]/)&&N++,\"FW\"===r&&d++);0===o&&(o=1),J.words=u,J.p_foreign=100*d/o,J.p_upper=100*N/o,J.p_cap=100*c/o,J.avg_length=l/o}}(),!function(){var e=n.synonyms,i=e.length;t.synonym=function(t){var n;for(n=0;n0)return e[n][0];return t}}()}(\"undefined\"==typeof exports?this.compendium={}:exports);","'use strict';\r\n\r\n// Last Updated On: 2020-08-12 11:18:41 AM UTC\r\n\r\n// ________________\r\n// DetectRTC v1.4.1\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/DetectRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n(function() {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n var isNodejs = typeof process === 'object' && typeof process.versions === 'object' && process.versions.node && /*node-process*/ !process.browser;\r\n if (isNodejs) {\r\n var version = process.versions.node.toString().replace('v', '');\r\n browserFakeUserAgent = 'Nodejs/' + version + ' (NodeOS) AppleWebKit/' + version + ' (KHTML, like Gecko) Nodejs/' + version + ' Nodejs/' + version\r\n }\r\n\r\n (function(that) {\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof window === 'undefined' && typeof global !== 'undefined') {\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n /*global window:true */\r\n that.window = global;\r\n } else if (typeof window === 'undefined') {\r\n // window = this;\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n })(typeof global !== 'undefined' ? global : window);\r\n\r\n /*global navigator:true */\r\n var navigator = window.navigator;\r\n\r\n if (typeof navigator !== 'undefined') {\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n } else {\r\n navigator = {\r\n getUserMedia: function() {},\r\n userAgent: browserFakeUserAgent\r\n };\r\n }\r\n\r\n var isMobileDevice = !!(/Android|webOS|iPhone|iPad|iPod|BB10|BlackBerry|IEMobile|Opera Mini|Mobile|mobile/i.test(navigator.userAgent || ''));\r\n\r\n var isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveOrOpenBlob || !!navigator.msSaveBlob);\r\n\r\n var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;\r\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\n var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n var isChrome = !!window.chrome && !isOpera;\r\n var isIE = typeof document !== 'undefined' && !!document.documentMode && !isEdge;\r\n\r\n // this one can also be used:\r\n // https://www.websocket.org/js/stuff.js (DetectBrowser.js)\r\n\r\n function getBrowserInfo() {\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var browserName = navigator.appName;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n // In Opera, the true version is after 'Opera' or after 'Version'\r\n if (isOpera) {\r\n browserName = 'Opera';\r\n try {\r\n fullVersion = navigator.userAgent.split('OPR/')[1].split(' ')[0];\r\n majorVersion = fullVersion.split('.')[0];\r\n } catch (e) {\r\n fullVersion = '0.0.0.0';\r\n majorVersion = 0;\r\n }\r\n }\r\n // In MSIE version <=10, the true version is after 'MSIE' in userAgent\r\n // In IE 11, look for the string after 'rv:'\r\n else if (isIE) {\r\n verOffset = nAgt.indexOf('rv:');\r\n if (verOffset > 0) { //IE 11\r\n fullVersion = nAgt.substring(verOffset + 3);\r\n } else { //IE 10 or earlier\r\n verOffset = nAgt.indexOf('MSIE');\r\n fullVersion = nAgt.substring(verOffset + 5);\r\n }\r\n browserName = 'IE';\r\n }\r\n // In Chrome, the true version is after 'Chrome' \r\n else if (isChrome) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n browserName = 'Chrome';\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n // In Safari, the true version is after 'Safari' or after 'Version' \r\n else if (isSafari) {\r\n // both and safri and chrome has same userAgent\r\n if (nAgt.indexOf('CriOS') !== -1) {\r\n verOffset = nAgt.indexOf('CriOS');\r\n browserName = 'Chrome';\r\n fullVersion = nAgt.substring(verOffset + 6);\r\n } else if (nAgt.indexOf('FxiOS') !== -1) {\r\n verOffset = nAgt.indexOf('FxiOS');\r\n browserName = 'Firefox';\r\n fullVersion = nAgt.substring(verOffset + 6);\r\n } else {\r\n verOffset = nAgt.indexOf('Safari');\r\n\r\n browserName = 'Safari';\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n\r\n if ((verOffset = nAgt.indexOf('Version')) !== -1) {\r\n fullVersion = nAgt.substring(verOffset + 8);\r\n }\r\n\r\n if (navigator.userAgent.indexOf('Version/') !== -1) {\r\n fullVersion = navigator.userAgent.split('Version/')[1].split(' ')[0];\r\n }\r\n }\r\n }\r\n // In Firefox, the true version is after 'Firefox' \r\n else if (isFirefox) {\r\n verOffset = nAgt.indexOf('Firefox');\r\n browserName = 'Firefox';\r\n fullVersion = nAgt.substring(verOffset + 8);\r\n }\r\n\r\n // In most other browsers, 'name/version' is at the end of userAgent \r\n else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {\r\n browserName = nAgt.substring(nameOffset, verOffset);\r\n fullVersion = nAgt.substring(verOffset + 1);\r\n\r\n if (browserName.toLowerCase() === browserName.toUpperCase()) {\r\n browserName = navigator.appName;\r\n }\r\n }\r\n\r\n if (isEdge) {\r\n browserName = 'Edge';\r\n fullVersion = navigator.userAgent.split('Edge/')[1];\r\n // fullVersion = parseInt(navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)[2], 10).toString();\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space/bracket if present\r\n if ((ix = fullVersion.search(/[; \\)]/)) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return {\r\n fullVersion: fullVersion,\r\n version: majorVersion,\r\n name: browserName,\r\n isPrivateBrowsing: false\r\n };\r\n }\r\n\r\n // via: https://gist.github.com/cou929/7973956\r\n\r\n function retry(isDone, next) {\r\n var currentTrial = 0,\r\n maxRetry = 50,\r\n interval = 10,\r\n isTimeout = false;\r\n var id = window.setInterval(\r\n function() {\r\n if (isDone()) {\r\n window.clearInterval(id);\r\n next(isTimeout);\r\n }\r\n if (currentTrial++ > maxRetry) {\r\n window.clearInterval(id);\r\n isTimeout = true;\r\n next(isTimeout);\r\n }\r\n },\r\n 10\r\n );\r\n }\r\n\r\n function isIE10OrLater(userAgent) {\r\n var ua = userAgent.toLowerCase();\r\n if (ua.indexOf('msie') === 0 && ua.indexOf('trident') === 0) {\r\n return false;\r\n }\r\n var match = /(?:msie|rv:)\\s?([\\d\\.]+)/.exec(ua);\r\n if (match && parseInt(match[1], 10) >= 10) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function detectPrivateMode(callback) {\r\n var isPrivate;\r\n\r\n try {\r\n\r\n if (window.webkitRequestFileSystem) {\r\n window.webkitRequestFileSystem(\r\n window.TEMPORARY, 1,\r\n function() {\r\n isPrivate = false;\r\n },\r\n function(e) {\r\n isPrivate = true;\r\n }\r\n );\r\n } else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {\r\n var db;\r\n try {\r\n db = window.indexedDB.open('test');\r\n db.onerror = function() {\r\n return true;\r\n };\r\n } catch (e) {\r\n isPrivate = true;\r\n }\r\n\r\n if (typeof isPrivate === 'undefined') {\r\n retry(\r\n function isDone() {\r\n return db.readyState === 'done' ? true : false;\r\n },\r\n function next(isTimeout) {\r\n if (!isTimeout) {\r\n isPrivate = db.result ? false : true;\r\n }\r\n }\r\n );\r\n }\r\n } else if (isIE10OrLater(window.navigator.userAgent)) {\r\n isPrivate = false;\r\n try {\r\n if (!window.indexedDB) {\r\n isPrivate = true;\r\n }\r\n } catch (e) {\r\n isPrivate = true;\r\n }\r\n } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {\r\n try {\r\n window.localStorage.setItem('test', 1);\r\n } catch (e) {\r\n isPrivate = true;\r\n }\r\n\r\n if (typeof isPrivate === 'undefined') {\r\n isPrivate = false;\r\n window.localStorage.removeItem('test');\r\n }\r\n }\r\n\r\n } catch (e) {\r\n isPrivate = false;\r\n }\r\n\r\n retry(\r\n function isDone() {\r\n return typeof isPrivate !== 'undefined' ? true : false;\r\n },\r\n function next(isTimeout) {\r\n callback(isPrivate);\r\n }\r\n );\r\n }\r\n\r\n var isMobile = {\r\n Android: function() {\r\n return navigator.userAgent.match(/Android/i);\r\n },\r\n BlackBerry: function() {\r\n return navigator.userAgent.match(/BlackBerry|BB10/i);\r\n },\r\n iOS: function() {\r\n return navigator.userAgent.match(/iPhone|iPad|iPod/i);\r\n },\r\n Opera: function() {\r\n return navigator.userAgent.match(/Opera Mini/i);\r\n },\r\n Windows: function() {\r\n return navigator.userAgent.match(/IEMobile/i);\r\n },\r\n any: function() {\r\n return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());\r\n },\r\n getOsName: function() {\r\n var osName = 'Unknown OS';\r\n if (isMobile.Android()) {\r\n osName = 'Android';\r\n }\r\n\r\n if (isMobile.BlackBerry()) {\r\n osName = 'BlackBerry';\r\n }\r\n\r\n if (isMobile.iOS()) {\r\n osName = 'iOS';\r\n }\r\n\r\n if (isMobile.Opera()) {\r\n osName = 'Opera Mini';\r\n }\r\n\r\n if (isMobile.Windows()) {\r\n osName = 'Windows';\r\n }\r\n\r\n return osName;\r\n }\r\n };\r\n\r\n // via: http://jsfiddle.net/ChristianL/AVyND/\r\n function detectDesktopOS() {\r\n var unknown = '-';\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n\r\n var os = unknown;\r\n var clientStrings = [{\r\n s: 'Chrome OS',\r\n r: /CrOS/\r\n }, {\r\n s: 'Windows 10',\r\n r: /(Windows 10.0|Windows NT 10.0)/\r\n }, {\r\n s: 'Windows 8.1',\r\n r: /(Windows 8.1|Windows NT 6.3)/\r\n }, {\r\n s: 'Windows 8',\r\n r: /(Windows 8|Windows NT 6.2)/\r\n }, {\r\n s: 'Windows 7',\r\n r: /(Windows 7|Windows NT 6.1)/\r\n }, {\r\n s: 'Windows Vista',\r\n r: /Windows NT 6.0/\r\n }, {\r\n s: 'Windows Server 2003',\r\n r: /Windows NT 5.2/\r\n }, {\r\n s: 'Windows XP',\r\n r: /(Windows NT 5.1|Windows XP)/\r\n }, {\r\n s: 'Windows 2000',\r\n r: /(Windows NT 5.0|Windows 2000)/\r\n }, {\r\n s: 'Windows ME',\r\n r: /(Win 9x 4.90|Windows ME)/\r\n }, {\r\n s: 'Windows 98',\r\n r: /(Windows 98|Win98)/\r\n }, {\r\n s: 'Windows 95',\r\n r: /(Windows 95|Win95|Windows_95)/\r\n }, {\r\n s: 'Windows NT 4.0',\r\n r: /(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/\r\n }, {\r\n s: 'Windows CE',\r\n r: /Windows CE/\r\n }, {\r\n s: 'Windows 3.11',\r\n r: /Win16/\r\n }, {\r\n s: 'Android',\r\n r: /Android/\r\n }, {\r\n s: 'Open BSD',\r\n r: /OpenBSD/\r\n }, {\r\n s: 'Sun OS',\r\n r: /SunOS/\r\n }, {\r\n s: 'Linux',\r\n r: /(Linux|X11)/\r\n }, {\r\n s: 'iOS',\r\n r: /(iPhone|iPad|iPod)/\r\n }, {\r\n s: 'Mac OS X',\r\n r: /Mac OS X/\r\n }, {\r\n s: 'Mac OS',\r\n r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/\r\n }, {\r\n s: 'QNX',\r\n r: /QNX/\r\n }, {\r\n s: 'UNIX',\r\n r: /UNIX/\r\n }, {\r\n s: 'BeOS',\r\n r: /BeOS/\r\n }, {\r\n s: 'OS/2',\r\n r: /OS\\/2/\r\n }, {\r\n s: 'Search Bot',\r\n r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\\/Teoma|ia_archiver)/\r\n }];\r\n for (var i = 0, cs; cs = clientStrings[i]; i++) {\r\n if (cs.r.test(nAgt)) {\r\n os = cs.s;\r\n break;\r\n }\r\n }\r\n\r\n var osVersion = unknown;\r\n\r\n if (/Windows/.test(os)) {\r\n if (/Windows (.*)/.test(os)) {\r\n osVersion = /Windows (.*)/.exec(os)[1];\r\n }\r\n os = 'Windows';\r\n }\r\n\r\n switch (os) {\r\n case 'Mac OS X':\r\n if (/Mac OS X (10[\\.\\_\\d]+)/.test(nAgt)) {\r\n osVersion = /Mac OS X (10[\\.\\_\\d]+)/.exec(nAgt)[1];\r\n }\r\n break;\r\n case 'Android':\r\n if (/Android ([\\.\\_\\d]+)/.test(nAgt)) {\r\n osVersion = /Android ([\\.\\_\\d]+)/.exec(nAgt)[1];\r\n }\r\n break;\r\n case 'iOS':\r\n if (/OS (\\d+)_(\\d+)_?(\\d+)?/.test(nAgt)) {\r\n osVersion = /OS (\\d+)_(\\d+)_?(\\d+)?/.exec(nVer);\r\n if (osVersion && osVersion.length > 3) {\r\n osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n return {\r\n osName: os,\r\n osVersion: osVersion\r\n };\r\n }\r\n\r\n var osName = 'Unknown OS';\r\n var osVersion = 'Unknown OS Version';\r\n\r\n function getAndroidVersion(ua) {\r\n ua = (ua || navigator.userAgent).toLowerCase();\r\n var match = ua.match(/android\\s([0-9\\.]*)/);\r\n return match ? match[1] : false;\r\n }\r\n\r\n var osInfo = detectDesktopOS();\r\n\r\n if (osInfo && osInfo.osName && osInfo.osName != '-') {\r\n osName = osInfo.osName;\r\n osVersion = osInfo.osVersion;\r\n } else if (isMobile.any()) {\r\n osName = isMobile.getOsName();\r\n\r\n if (osName == 'Android') {\r\n osVersion = getAndroidVersion();\r\n }\r\n }\r\n\r\n var isNodejs = typeof process === 'object' && typeof process.versions === 'object' && process.versions.node;\r\n\r\n if (osName === 'Unknown OS' && isNodejs) {\r\n osName = 'Nodejs';\r\n osVersion = process.versions.node.toString().replace('v', '');\r\n }\r\n\r\n var isCanvasSupportsStreamCapturing = false;\r\n var isVideoSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\r\n return;\r\n }\r\n\r\n if (!isCanvasSupportsStreamCapturing && item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n\r\n if (!isVideoSupportsStreamCapturing && item in document.createElement('video')) {\r\n isVideoSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var regexIpv4Local = /^(192\\.168\\.|169\\.254\\.|10\\.|172\\.(1[6-9]|2\\d|3[01]))/,\r\n regexIpv4 = /([0-9]{1,3}(\\.[0-9]{1,3}){3})/,\r\n regexIpv6 = /[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}/;\r\n\r\n // via: https://github.com/diafygi/webrtc-ips\r\n function DetectLocalIPAddress(callback, stream) {\r\n if (!DetectRTC.isWebRTCSupported) {\r\n return;\r\n }\r\n\r\n var isPublic = true,\r\n isIpv4 = true;\r\n getIPs(function(ip) {\r\n if (!ip) {\r\n callback(); // Pass nothing to tell that ICE-gathering-ended\r\n } else if (ip.match(regexIpv4Local)) {\r\n isPublic = false;\r\n callback('Local: ' + ip, isPublic, isIpv4);\r\n } else if (ip.match(regexIpv6)) { //via https://ourcodeworld.com/articles/read/257/how-to-get-the-client-ip-address-with-javascript-only\r\n isIpv4 = false;\r\n callback('Public: ' + ip, isPublic, isIpv4);\r\n } else {\r\n callback('Public: ' + ip, isPublic, isIpv4);\r\n }\r\n }, stream);\r\n }\r\n\r\n function getIPs(callback, stream) {\r\n if (typeof document === 'undefined' || typeof document.getElementById !== 'function') {\r\n return;\r\n }\r\n\r\n var ipDuplicates = {};\r\n\r\n var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\r\n\r\n if (!RTCPeerConnection) {\r\n var iframe = document.getElementById('iframe');\r\n if (!iframe) {\r\n return;\r\n }\r\n var win = iframe.contentWindow;\r\n RTCPeerConnection = win.RTCPeerConnection || win.mozRTCPeerConnection || win.webkitRTCPeerConnection;\r\n }\r\n\r\n if (!RTCPeerConnection) {\r\n return;\r\n }\r\n\r\n var peerConfig = null;\r\n\r\n if (DetectRTC.browser === 'Chrome' && DetectRTC.browser.version < 58) {\r\n // todo: add support for older Opera\r\n peerConfig = {\r\n optional: [{\r\n RtpDataChannels: true\r\n }]\r\n };\r\n }\r\n\r\n var servers = {\r\n iceServers: [{\r\n urls: 'stun:stun.l.google.com:19302'\r\n }]\r\n };\r\n\r\n var pc = new RTCPeerConnection(servers, peerConfig);\r\n\r\n if (stream) {\r\n if (pc.addStream) {\r\n pc.addStream(stream);\r\n } else if (pc.addTrack && stream.getTracks()[0]) {\r\n pc.addTrack(stream.getTracks()[0], stream);\r\n }\r\n }\r\n\r\n function handleCandidate(candidate) {\r\n if (!candidate) {\r\n callback(); // Pass nothing to tell that ICE-gathering-ended\r\n return;\r\n }\r\n\r\n var match = regexIpv4.exec(candidate);\r\n if (!match) {\r\n return;\r\n }\r\n var ipAddress = match[1];\r\n var isPublic = (candidate.match(regexIpv4Local)),\r\n isIpv4 = true;\r\n\r\n if (ipDuplicates[ipAddress] === undefined) {\r\n callback(ipAddress, isPublic, isIpv4);\r\n }\r\n\r\n ipDuplicates[ipAddress] = true;\r\n }\r\n\r\n // listen for candidate events\r\n pc.onicecandidate = function(event) {\r\n if (event.candidate && event.candidate.candidate) {\r\n handleCandidate(event.candidate.candidate);\r\n } else {\r\n handleCandidate(); // Pass nothing to tell that ICE-gathering-ended\r\n }\r\n };\r\n\r\n // create data channel\r\n if (!stream) {\r\n try {\r\n pc.createDataChannel('sctp', {});\r\n } catch (e) {}\r\n }\r\n\r\n // create an offer sdp\r\n if (DetectRTC.isPromisesSupported) {\r\n pc.createOffer().then(function(result) {\r\n pc.setLocalDescription(result).then(afterCreateOffer);\r\n });\r\n } else {\r\n pc.createOffer(function(result) {\r\n pc.setLocalDescription(result, afterCreateOffer, function() {});\r\n }, function() {});\r\n }\r\n\r\n function afterCreateOffer() {\r\n var lines = pc.localDescription.sdp.split('\\n');\r\n\r\n lines.forEach(function(line) {\r\n if (line && line.indexOf('a=candidate:') === 0) {\r\n handleCandidate(line);\r\n }\r\n });\r\n }\r\n }\r\n\r\n var MediaDevices = [];\r\n\r\n var audioInputDevices = [];\r\n var audioOutputDevices = [];\r\n var videoInputDevices = [];\r\n\r\n if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\r\n // Firefox 38+ seems having support of enumerateDevices\r\n // Thanks @xdumaine/enumerateDevices\r\n navigator.enumerateDevices = function(callback) {\r\n var enumerateDevices = navigator.mediaDevices.enumerateDevices();\r\n if (enumerateDevices && enumerateDevices.then) {\r\n navigator.mediaDevices.enumerateDevices().then(callback).catch(function() {\r\n callback([]);\r\n });\r\n } else {\r\n callback([]);\r\n }\r\n };\r\n }\r\n\r\n // Media Devices detection\r\n var canEnumerate = false;\r\n\r\n /*global MediaStreamTrack:true */\r\n if (typeof MediaStreamTrack !== 'undefined' && 'getSources' in MediaStreamTrack) {\r\n canEnumerate = true;\r\n } else if (navigator.mediaDevices && !!navigator.mediaDevices.enumerateDevices) {\r\n canEnumerate = true;\r\n }\r\n\r\n var hasMicrophone = false;\r\n var hasSpeakers = false;\r\n var hasWebcam = false;\r\n\r\n var isWebsiteHasMicrophonePermissions = false;\r\n var isWebsiteHasWebcamPermissions = false;\r\n\r\n // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediadevices\r\n function checkDeviceSupport(callback) {\r\n if (!canEnumerate) {\r\n if (callback) {\r\n callback();\r\n }\r\n return;\r\n }\r\n\r\n if (!navigator.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources) {\r\n navigator.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack);\r\n }\r\n\r\n if (!navigator.enumerateDevices && navigator.enumerateDevices) {\r\n navigator.enumerateDevices = navigator.enumerateDevices.bind(navigator);\r\n }\r\n\r\n if (!navigator.enumerateDevices) {\r\n if (callback) {\r\n callback();\r\n }\r\n return;\r\n }\r\n\r\n MediaDevices = [];\r\n\r\n audioInputDevices = [];\r\n audioOutputDevices = [];\r\n videoInputDevices = [];\r\n\r\n hasMicrophone = false;\r\n hasSpeakers = false;\r\n hasWebcam = false;\r\n\r\n isWebsiteHasMicrophonePermissions = false;\r\n isWebsiteHasWebcamPermissions = false;\r\n\r\n // to prevent duplication\r\n var alreadyUsedDevices = {};\r\n\r\n navigator.enumerateDevices(function(devices) {\r\n MediaDevices = [];\r\n\r\n audioInputDevices = [];\r\n audioOutputDevices = [];\r\n videoInputDevices = [];\r\n\r\n devices.forEach(function(_device) {\r\n var device = {};\r\n for (var d in _device) {\r\n try {\r\n if (typeof _device[d] !== 'function') {\r\n device[d] = _device[d];\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n if (alreadyUsedDevices[device.deviceId + device.label + device.kind]) {\r\n return;\r\n }\r\n\r\n // if it is MediaStreamTrack.getSources\r\n if (device.kind === 'audio') {\r\n device.kind = 'audioinput';\r\n }\r\n\r\n if (device.kind === 'video') {\r\n device.kind = 'videoinput';\r\n }\r\n\r\n if (!device.deviceId) {\r\n device.deviceId = device.id;\r\n }\r\n\r\n if (!device.id) {\r\n device.id = device.deviceId;\r\n }\r\n\r\n if (!device.label) {\r\n device.isCustomLabel = true;\r\n\r\n if (device.kind === 'videoinput') {\r\n device.label = 'Camera ' + (videoInputDevices.length + 1);\r\n } else if (device.kind === 'audioinput') {\r\n device.label = 'Microphone ' + (audioInputDevices.length + 1);\r\n } else if (device.kind === 'audiooutput') {\r\n device.label = 'Speaker ' + (audioOutputDevices.length + 1);\r\n } else {\r\n device.label = 'Please invoke getUserMedia once.';\r\n }\r\n\r\n if (typeof DetectRTC !== 'undefined' && DetectRTC.browser.isChrome && DetectRTC.browser.version >= 46 && !/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {\r\n if (typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1) {\r\n device.label = 'HTTPs is required to get label of this ' + device.kind + ' device.';\r\n }\r\n }\r\n } else {\r\n // Firefox on Android still returns empty label\r\n if (device.kind === 'videoinput' && !isWebsiteHasWebcamPermissions) {\r\n isWebsiteHasWebcamPermissions = true;\r\n }\r\n\r\n if (device.kind === 'audioinput' && !isWebsiteHasMicrophonePermissions) {\r\n isWebsiteHasMicrophonePermissions = true;\r\n }\r\n }\r\n\r\n if (device.kind === 'audioinput') {\r\n hasMicrophone = true;\r\n\r\n if (audioInputDevices.indexOf(device) === -1) {\r\n audioInputDevices.push(device);\r\n }\r\n }\r\n\r\n if (device.kind === 'audiooutput') {\r\n hasSpeakers = true;\r\n\r\n if (audioOutputDevices.indexOf(device) === -1) {\r\n audioOutputDevices.push(device);\r\n }\r\n }\r\n\r\n if (device.kind === 'videoinput') {\r\n hasWebcam = true;\r\n\r\n if (videoInputDevices.indexOf(device) === -1) {\r\n videoInputDevices.push(device);\r\n }\r\n }\r\n\r\n // there is no 'videoouput' in the spec.\r\n MediaDevices.push(device);\r\n\r\n alreadyUsedDevices[device.deviceId + device.label + device.kind] = device;\r\n });\r\n\r\n if (typeof DetectRTC !== 'undefined') {\r\n // to sync latest outputs\r\n DetectRTC.MediaDevices = MediaDevices;\r\n DetectRTC.hasMicrophone = hasMicrophone;\r\n DetectRTC.hasSpeakers = hasSpeakers;\r\n DetectRTC.hasWebcam = hasWebcam;\r\n\r\n DetectRTC.isWebsiteHasWebcamPermissions = isWebsiteHasWebcamPermissions;\r\n DetectRTC.isWebsiteHasMicrophonePermissions = isWebsiteHasMicrophonePermissions;\r\n\r\n DetectRTC.audioInputDevices = audioInputDevices;\r\n DetectRTC.audioOutputDevices = audioOutputDevices;\r\n DetectRTC.videoInputDevices = videoInputDevices;\r\n }\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n var DetectRTC = window.DetectRTC || {};\r\n\r\n // ----------\r\n // DetectRTC.browser.name || DetectRTC.browser.version || DetectRTC.browser.fullVersion\r\n DetectRTC.browser = getBrowserInfo();\r\n\r\n detectPrivateMode(function(isPrivateBrowsing) {\r\n DetectRTC.browser.isPrivateBrowsing = !!isPrivateBrowsing;\r\n });\r\n\r\n // DetectRTC.isChrome || DetectRTC.isFirefox || DetectRTC.isEdge\r\n DetectRTC.browser['is' + DetectRTC.browser.name] = true;\r\n\r\n // -----------\r\n DetectRTC.osName = osName;\r\n DetectRTC.osVersion = osVersion;\r\n\r\n var isNodeWebkit = typeof process === 'object' && typeof process.versions === 'object' && process.versions['node-webkit'];\r\n\r\n // --------- Detect if system supports WebRTC 1.0 or WebRTC 1.1.\r\n var isWebRTCSupported = false;\r\n ['RTCPeerConnection', 'webkitRTCPeerConnection', 'mozRTCPeerConnection', 'RTCIceGatherer'].forEach(function(item) {\r\n if (isWebRTCSupported) {\r\n return;\r\n }\r\n\r\n if (item in window) {\r\n isWebRTCSupported = true;\r\n }\r\n });\r\n DetectRTC.isWebRTCSupported = isWebRTCSupported;\r\n\r\n //-------\r\n DetectRTC.isORTCSupported = typeof RTCIceGatherer !== 'undefined';\r\n\r\n // --------- Detect if system supports screen capturing API\r\n var isScreenCapturingSupported = false;\r\n if (DetectRTC.browser.isChrome && DetectRTC.browser.version >= 35) {\r\n isScreenCapturingSupported = true;\r\n } else if (DetectRTC.browser.isFirefox && DetectRTC.browser.version >= 34) {\r\n isScreenCapturingSupported = true;\r\n } else if (DetectRTC.browser.isEdge && DetectRTC.browser.version >= 17) {\r\n isScreenCapturingSupported = true;\r\n } else if (DetectRTC.osName === 'Android' && DetectRTC.browser.isChrome) {\r\n isScreenCapturingSupported = true;\r\n }\r\n\r\n if (!!navigator.getDisplayMedia || (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia)) {\r\n isScreenCapturingSupported = true;\r\n }\r\n\r\n if (!/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {\r\n var isNonLocalHost = typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1;\r\n if (isNonLocalHost && (DetectRTC.browser.isChrome || DetectRTC.browser.isEdge || DetectRTC.browser.isOpera)) {\r\n isScreenCapturingSupported = false;\r\n } else if (DetectRTC.browser.isFirefox) {\r\n isScreenCapturingSupported = false;\r\n }\r\n }\r\n DetectRTC.isScreenCapturingSupported = isScreenCapturingSupported;\r\n\r\n // --------- Detect if WebAudio API are supported\r\n var webAudio = {\r\n isSupported: false,\r\n isCreateMediaStreamSourceSupported: false\r\n };\r\n\r\n ['AudioContext', 'webkitAudioContext', 'mozAudioContext', 'msAudioContext'].forEach(function(item) {\r\n if (webAudio.isSupported) {\r\n return;\r\n }\r\n\r\n if (item in window) {\r\n webAudio.isSupported = true;\r\n\r\n if (window[item] && 'createMediaStreamSource' in window[item].prototype) {\r\n webAudio.isCreateMediaStreamSourceSupported = true;\r\n }\r\n }\r\n });\r\n DetectRTC.isAudioContextSupported = webAudio.isSupported;\r\n DetectRTC.isCreateMediaStreamSourceSupported = webAudio.isCreateMediaStreamSourceSupported;\r\n\r\n // ---------- Detect if SCTP/RTP channels are supported.\r\n\r\n var isRtpDataChannelsSupported = false;\r\n if (DetectRTC.browser.isChrome && DetectRTC.browser.version > 31) {\r\n isRtpDataChannelsSupported = true;\r\n }\r\n DetectRTC.isRtpDataChannelsSupported = isRtpDataChannelsSupported;\r\n\r\n var isSCTPSupportd = false;\r\n if (DetectRTC.browser.isFirefox && DetectRTC.browser.version > 28) {\r\n isSCTPSupportd = true;\r\n } else if (DetectRTC.browser.isChrome && DetectRTC.browser.version > 25) {\r\n isSCTPSupportd = true;\r\n } else if (DetectRTC.browser.isOpera && DetectRTC.browser.version >= 11) {\r\n isSCTPSupportd = true;\r\n }\r\n DetectRTC.isSctpDataChannelsSupported = isSCTPSupportd;\r\n\r\n // ---------\r\n\r\n DetectRTC.isMobileDevice = isMobileDevice; // \"isMobileDevice\" boolean is defined in \"getBrowserInfo.js\"\r\n\r\n // ------\r\n var isGetUserMediaSupported = false;\r\n if (navigator.getUserMedia) {\r\n isGetUserMediaSupported = true;\r\n } else if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\r\n isGetUserMediaSupported = true;\r\n }\r\n\r\n if (DetectRTC.browser.isChrome && DetectRTC.browser.version >= 46 && !/^(https:|chrome-extension:)$/g.test(location.protocol || '')) {\r\n if (typeof document !== 'undefined' && typeof document.domain === 'string' && document.domain.search && document.domain.search(/localhost|127.0./g) === -1) {\r\n isGetUserMediaSupported = 'Requires HTTPs';\r\n }\r\n }\r\n\r\n if (DetectRTC.osName === 'Nodejs') {\r\n isGetUserMediaSupported = false;\r\n }\r\n DetectRTC.isGetUserMediaSupported = isGetUserMediaSupported;\r\n\r\n var displayResolution = '';\r\n if (screen.width) {\r\n var width = (screen.width) ? screen.width : '';\r\n var height = (screen.height) ? screen.height : '';\r\n displayResolution += '' + width + ' x ' + height;\r\n }\r\n DetectRTC.displayResolution = displayResolution;\r\n\r\n function getAspectRatio(w, h) {\r\n function gcd(a, b) {\r\n return (b == 0) ? a : gcd(b, a % b);\r\n }\r\n var r = gcd(w, h);\r\n return (w / r) / (h / r);\r\n }\r\n\r\n DetectRTC.displayAspectRatio = getAspectRatio(screen.width, screen.height).toFixed(2);\r\n\r\n // ----------\r\n DetectRTC.isCanvasSupportsStreamCapturing = isCanvasSupportsStreamCapturing;\r\n DetectRTC.isVideoSupportsStreamCapturing = isVideoSupportsStreamCapturing;\r\n\r\n if (DetectRTC.browser.name == 'Chrome' && DetectRTC.browser.version >= 53) {\r\n if (!DetectRTC.isCanvasSupportsStreamCapturing) {\r\n DetectRTC.isCanvasSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features';\r\n }\r\n\r\n if (!DetectRTC.isVideoSupportsStreamCapturing) {\r\n DetectRTC.isVideoSupportsStreamCapturing = 'Requires chrome flag: enable-experimental-web-platform-features';\r\n }\r\n }\r\n\r\n // ------\r\n DetectRTC.DetectLocalIPAddress = DetectLocalIPAddress;\r\n\r\n DetectRTC.isWebSocketsSupported = 'WebSocket' in window && 2 === window.WebSocket.CLOSING;\r\n DetectRTC.isWebSocketsBlocked = !DetectRTC.isWebSocketsSupported;\r\n\r\n if (DetectRTC.osName === 'Nodejs') {\r\n DetectRTC.isWebSocketsSupported = true;\r\n DetectRTC.isWebSocketsBlocked = false;\r\n }\r\n\r\n DetectRTC.checkWebSocketsSupport = function(callback) {\r\n callback = callback || function() {};\r\n try {\r\n var starttime;\r\n var websocket = new WebSocket('wss://echo.websocket.org:443/');\r\n websocket.onopen = function() {\r\n DetectRTC.isWebSocketsBlocked = false;\r\n starttime = (new Date).getTime();\r\n websocket.send('ping');\r\n };\r\n websocket.onmessage = function() {\r\n DetectRTC.WebsocketLatency = (new Date).getTime() - starttime + 'ms';\r\n callback();\r\n websocket.close();\r\n websocket = null;\r\n };\r\n websocket.onerror = function() {\r\n DetectRTC.isWebSocketsBlocked = true;\r\n callback();\r\n };\r\n } catch (e) {\r\n DetectRTC.isWebSocketsBlocked = true;\r\n callback();\r\n }\r\n };\r\n\r\n // -------\r\n DetectRTC.load = function(callback) {\r\n callback = callback || function() {};\r\n checkDeviceSupport(callback);\r\n };\r\n\r\n // check for microphone/camera support!\r\n if (typeof checkDeviceSupport === 'function') {\r\n // checkDeviceSupport();\r\n }\r\n\r\n if (typeof MediaDevices !== 'undefined') {\r\n DetectRTC.MediaDevices = MediaDevices;\r\n } else {\r\n DetectRTC.MediaDevices = [];\r\n }\r\n\r\n DetectRTC.hasMicrophone = hasMicrophone;\r\n DetectRTC.hasSpeakers = hasSpeakers;\r\n DetectRTC.hasWebcam = hasWebcam;\r\n\r\n DetectRTC.isWebsiteHasWebcamPermissions = isWebsiteHasWebcamPermissions;\r\n DetectRTC.isWebsiteHasMicrophonePermissions = isWebsiteHasMicrophonePermissions;\r\n\r\n DetectRTC.audioInputDevices = audioInputDevices;\r\n DetectRTC.audioOutputDevices = audioOutputDevices;\r\n DetectRTC.videoInputDevices = videoInputDevices;\r\n\r\n // ------\r\n var isSetSinkIdSupported = false;\r\n if (typeof document !== 'undefined' && typeof document.createElement === 'function' && 'setSinkId' in document.createElement('video')) {\r\n isSetSinkIdSupported = true;\r\n }\r\n DetectRTC.isSetSinkIdSupported = isSetSinkIdSupported;\r\n\r\n // -----\r\n var isRTPSenderReplaceTracksSupported = false;\r\n if (DetectRTC.browser.isFirefox && typeof mozRTCPeerConnection !== 'undefined' /*&& DetectRTC.browser.version > 39*/ ) {\r\n /*global mozRTCPeerConnection:true */\r\n if ('getSenders' in mozRTCPeerConnection.prototype) {\r\n isRTPSenderReplaceTracksSupported = true;\r\n }\r\n } else if (DetectRTC.browser.isChrome && typeof webkitRTCPeerConnection !== 'undefined') {\r\n /*global webkitRTCPeerConnection:true */\r\n if ('getSenders' in webkitRTCPeerConnection.prototype) {\r\n isRTPSenderReplaceTracksSupported = true;\r\n }\r\n }\r\n DetectRTC.isRTPSenderReplaceTracksSupported = isRTPSenderReplaceTracksSupported;\r\n\r\n //------\r\n var isRemoteStreamProcessingSupported = false;\r\n if (DetectRTC.browser.isFirefox && DetectRTC.browser.version > 38) {\r\n isRemoteStreamProcessingSupported = true;\r\n }\r\n DetectRTC.isRemoteStreamProcessingSupported = isRemoteStreamProcessingSupported;\r\n\r\n //-------\r\n var isApplyConstraintsSupported = false;\r\n\r\n /*global MediaStreamTrack:true */\r\n if (typeof MediaStreamTrack !== 'undefined' && 'applyConstraints' in MediaStreamTrack.prototype) {\r\n isApplyConstraintsSupported = true;\r\n }\r\n DetectRTC.isApplyConstraintsSupported = isApplyConstraintsSupported;\r\n\r\n //-------\r\n var isMultiMonitorScreenCapturingSupported = false;\r\n if (DetectRTC.browser.isFirefox && DetectRTC.browser.version >= 43) {\r\n // version 43 merely supports platforms for multi-monitors\r\n // version 44 will support exact multi-monitor selection i.e. you can select any monitor for screen capturing.\r\n isMultiMonitorScreenCapturingSupported = true;\r\n }\r\n DetectRTC.isMultiMonitorScreenCapturingSupported = isMultiMonitorScreenCapturingSupported;\r\n\r\n DetectRTC.isPromisesSupported = !!('Promise' in window);\r\n\r\n // version is generated by \"grunt\"\r\n DetectRTC.version = '1.4.1';\r\n\r\n if (typeof DetectRTC === 'undefined') {\r\n window.DetectRTC = {};\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n if (typeof MediaStream !== 'undefined' && typeof MediaStream === 'function') {\r\n DetectRTC.MediaStream = Object.keys(MediaStream.prototype);\r\n } else DetectRTC.MediaStream = false;\r\n\r\n if (typeof MediaStreamTrack !== 'undefined') {\r\n DetectRTC.MediaStreamTrack = Object.keys(MediaStreamTrack.prototype);\r\n } else DetectRTC.MediaStreamTrack = false;\r\n\r\n var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\r\n\r\n if (typeof RTCPeerConnection !== 'undefined') {\r\n DetectRTC.RTCPeerConnection = Object.keys(RTCPeerConnection.prototype);\r\n } else DetectRTC.RTCPeerConnection = false;\r\n\r\n window.DetectRTC = DetectRTC;\r\n\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = DetectRTC;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('DetectRTC', [], function() {\r\n return DetectRTC;\r\n });\r\n }\r\n})();\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c