2016-01-15 00:01:56 +01:00

1 line
870 KiB
Plaintext

{"version":3,"sources":["../yjs/node_modules/browser-pack/_prelude.js","node_modules/attachmediastream/attachmediastream.js","y-webrtc.js","node_modules/filetransfer/filetransfer.js","node_modules/getscreenmedia/getscreenmedia.js","node_modules/getusermedia/index-browser.js","node_modules/hark/hark.js","node_modules/localmedia/index.js","node_modules/lodash._arrayeach/index.js","node_modules/lodash._arraymap/index.js","node_modules/lodash._basecallback/index.js","node_modules/lodash._baseeach/index.js","node_modules/lodash._baseget/index.js","node_modules/lodash._baseisequal/index.js","node_modules/lodash._bindcallback/index.js","node_modules/lodash._getnative/index.js","node_modules/lodash._topath/index.js","node_modules/lodash.foreach/index.js","node_modules/lodash.isarguments/index.js","node_modules/lodash.isarray/index.js","node_modules/lodash.istypedarray/index.js","node_modules/lodash.keys/index.js","node_modules/lodash.map/index.js","node_modules/lodash.pairs/index.js","node_modules/lodash.pluck/index.js","node_modules/mediastream-gain/mediastream-gain.js","node_modules/mockconsole/mockconsole.js","node_modules/rtcpeerconnection/rtcpeerconnection.js","node_modules/sdp-jingle-json/index.js","node_modules/sdp-jingle-json/lib/parsers.js","node_modules/sdp-jingle-json/lib/senders.js","node_modules/sdp-jingle-json/lib/tojson.js","node_modules/sdp-jingle-json/lib/tosdp.js","node_modules/simplewebrtc/peer.js","node_modules/simplewebrtc/simplewebrtc.js","node_modules/simplewebrtc/socketioconnection.js","node_modules/simplewebrtc/webrtc.js","node_modules/socket.io-client/dist/socket.io.js","node_modules/traceablepeerconnection/index.js","node_modules/webrtc-adapter-test/adapter.js","node_modules/webrtcsupport/index-browser.js","node_modules/wildemitter/wildemitter.js","src/WebRTC.js","../yjs/node_modules/inherits/inherits_browser.js","../yjs/node_modules/process/browser.js","../yjs/node_modules/util/support/isBufferBrowser.js","../yjs/node_modules/util/util.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length",1,"module","stream","el","options","item","URL","window","opts","autoplay","mirror","muted","element","document","createElement","forEach","prefix","styleName","style","createObjectURL","src","srcObject","mozSrcObject",2,"Sender","WildEmitter","this","config","chunksize","pacing","file","channel","Receiver","receiveBuffer","received","metadata","util","inherits","prototype","send","self","sliceFile","offset","reader","FileReader","onload","target","result","emit","size","byteLength","setTimeout","slice","readAsArrayBuffer","receive","binaryType","onmessage","event","len","data","push","Blob","console","error","support","File","wildemitter",3,"getUserMedia","cache","constraints","cb","hasConstraints","arguments","callback","location","protocol","name","navigator","userAgent","match","chromever","parseInt","maxver","isCef","chrome","webstore","sessionStorage","getScreenMediaJSExtensionId","runtime","sendMessage","type","id","sourceId","audio","video","mandatory","chromeMediaSource","maxWidth","screen","width","maxHeight","height","maxFrameRate","optional","googLeakyBucket","googTemporalLayeredScreencast","chromeMediaSourceId","cefGetScreenMedia","pending","postMessage","ffver","mozMediaSource","mediaSource","err","lastTime","currentTime","polly","setInterval","clearInterval","onended","addEventListener","origin","clearTimeout","getusermedia",4,"haveOpts","defaultOpts","denied","altDenied","notSatisfied","localStorage","useFirefoxFakeDevice","fake","webrtc-adapter-test",5,"getMaxVolume","analyser","fftBins","maxVolume","Infinity","getFloatFrequencyData","ii","audioContextType","AudioContext","webkitAudioContext","audioContext","harker","smoothing","interval","threshold","play","history","running","sourceNode","createAnalyser","fftSize","smoothingTimeConstant","Float32Array","jquery","HTMLAudioElement","HTMLVideoElement","createMediaElementSource","createMediaStreamSource","connect","destination","speaking","setThreshold","stop","speakingHistory","looper","currentVolume","shift",6,"LocalMedia","autoAdjustMic","detectSpeakingEvents","audioFallback","media","logger","mockconsole","_log","log","bind","_logerror","screenSharingSupport","webrtc","screenSharing","localStreams","localScreens","hark","getScreenMedia","GainController","start","mediaConstraints","setupAudioMonitor","harkOptions","gainController","setMicIfEnabled","getTracks","track","idx","indexOf","splice","stopStreams","stopScreenShare","audioMonitor","startScreenShare","mute","_audioEnabled","hardMuted","unmute","timeout","on","volume","treshold","setGain","pauseVideo","_videoEnabled","resumeVideo","pause","resume","bool","getAudioTracks","enabled","getVideoTracks","isAudioEnabled","isVideoEnabled","startLocalMedia","stopLocalMedia","Object","defineProperty","get","getscreenmedia","mediastream-gain","webrtcsupport",7,"arrayEach","array","iteratee","index",8,"arrayMap","Array",9,"baseToString","value","baseCallback","func","thisArg","argCount","undefined","bindCallback","identity","baseMatches","property","baseMatchesProperty","baseGet","object","path","pathKey","toObject","baseIsMatch","matchData","customizer","noCustomizer","key","objValue","srcValue","baseIsEqual","source","getMatchData","isArr","isArray","isCommon","isKey","isStrictComparable","toPath","baseSlice","last","baseProperty","basePropertyDeep","end","pairs","reIsPlainProp","test","reIsDeepProp","isObject","replace","rePropName","number","quote","string","reEscapeChar","lodash._baseisequal","lodash._bindcallback","lodash.isarray","lodash.pairs",10,"baseForOwn","baseFor","keys","createBaseEach","eachFunc","fromRight","collection","getLength","isLength","iterable","createBaseFor","keysFunc","props","MAX_SAFE_INTEGER","baseEach","lodash.keys",11,12,"isObjectLike","arraySome","predicate","other","isLoose","stackA","stackB","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","arrayTag","othTag","objToString","argsTag","objectTag","isTypedArray","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","hasOwnProperty","othIsWrapped","equalArrays","equalObjects","pop","arrLength","othLength","arrValue","othValue","tag","boolTag","dateTag","errorTag","message","numberTag","regexpTag","stringTag","objProps","objLength","othProps","skipCtor","objCtor","constructor","othCtor","objectProto","toString","lodash.istypedarray",13,"accumulator","apply",14,"getNative","isNative","isFunction","funcTag","reIsNative","fnToString","reIsHostCtor","Function","RegExp",15,16,"createForEach","arrayFunc","lodash._arrayeach","lodash._baseeach",17,"isArrayLike","isArguments","propertyIsEnumerable",18,"nativeIsArray",19,"typedArrayTags","mapTag","setTag","weakMapTag","arrayBufferTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag",20,"isIndex","reIsUint","shimKeys","keysIn","propsLength","allowIndexes","Ctor","isProto","skipIndexes","nativeKeys","lodash._getnative","lodash.isarguments",21,"baseMap","map","lodash._arraymap","lodash._basecallback",22,23,"pluck","lodash._baseget","lodash._topath","lodash.map",24,"webAudio","mediaStream","gain","context","microphone","gainFilter","createGain","createMediaStreamDestination","outputStream","addTrack","removeTrack","val","getGain","off",25,"methods","split","fn",26,"PeerConnection","iceServers","enableChromeNativeSimulcast","adapter","webrtcDetectedBrowser","appVersion","constraint","enableMultiStreamHacks","restrictBandwidth","andyetRestrictBandwidth","batchIceCandidates","andyetBatchIce","batchedIceCandidates","andyetFasterICE","eliminateDuplicateCandidates","andyetDontSignalCandidates","dontSignalCandidates","assumeSetLocalSuccess","andyetAssumeSetLocalSuccess","wtFirefox","andyetFirefoxMakesMeSad","firefoxcandidatebuffer","pc","peerconn","getLocalStreams","getRemoteStreams","addStream","removeStream","onremovestream","onaddstream","onnegotiationneeded","oniceconnectionstatechange","onsignalingstatechange","onicecandidate","_onIce","ondatachannel","_onDataChannel","localDescription","contents","remoteDescription","debug","ice","sid","isInitiator","sdpSessionID","Date","now","useJingle","hadLocalStunCandidate","hadRemoteStunCandidate","hadLocalRelayCandidate","hadRemoteRelayCandidate","hadLocalIPv6Candidate","hadRemoteIPv6Candidate","_remoteDataChannels","_localDataChannels","_candidateBuffer","each","SJJ","signalingState","iceConnectionState","_role","localStream","_checkLocalCandidate","candidate","cand","toCandidateJSON","ip","_checkRemoteCandidate","processIce","update","jingle","contentNames","content","transport","candidates","mline","mid","iceCandidate","toCandidateSDP","addIceCandidate","RTCIceCandidate","sdpMLineIndex","sdpMid","offer","OfferToReceiveAudio","OfferToReceiveVideo","createOffer","expandedOffer","sdp","setLocalDescription","toSessionJSON","role","direction","ufrag","pwd","line","handleOffer","description","googConferenceFlag","sources","ssrc","unshift","parameters","hasBw","bandwidth","toSessionSDP","setRemoteDescription","RTCSessionDescription","answerAudioOnly","_answer","answerBroadcastOnly","answer","handleAnswer","close","createAnswer","sim","groups","sourceGroups","hasSim","group","semantics","newssrc","JSON","parse","stringify","Math","floor","random","rtxssrc","expandedAnswer","parameter","expandedCandidate","already","filter","c","foundation","component","priority","bundlePolicy","address","port","rtcpMuxPolicy","creator","transType","newCand","createDataChannel","getStats","res","items","names","stat","timestamp","lodash.foreach","lodash.pluck","sdp-jingle-json","traceablepeerconnection",27,"toSDP","toJSON","toIncomingSDPOffer","session","toOutgoingSDPOffer","toIncomingSDPAnswer","toOutgoingSDPAnswer","toIncomingMediaSDPOffer","toMediaSDP","toOutgoingMediaSDPOffer","toIncomingMediaSDPAnswer","toOutgoingMediaSDPAnswer","toIncomingJSONOffer","creators","toOutgoingJSONOffer","toIncomingJSONAnswer","toOutgoingJSONAnswer","toIncomingMediaJSONOffer","toMediaJSON","toOutgoingMediaJSONOffer","toIncomingMediaJSONAnswer","toOutgoingMediaJSONAnswer","./lib/tojson","./lib/tosdp",28,"lines","findLine","mediaLines","sessionLines","prefixLength","substr","j","findLines","results","parts","parsed","proto","formats","rtpmap","clockrate","channels","sctpmap","streams","fmtp","kv","trim","crypto","cipherSuite","keyParams","sessionParams","join","fingerprint","hash","extmap","idpart","sp","senders","uri","rtcpfb","subtype","substring","toLowerCase","generation","relAddr","relPort","tcpType","network","attribute","msid","mslabel","label",29,"initiator","incoming","responder","both","none","recvonly","sendonly","sendrecv","inactive","outgoing",30,"SENDERS","parsers","idCounter","_setIdCounter","counter","groupLines","descType","payloads","encryption","feedback","headerExtensions","fingerprints","sctp","desc","trans","rtpmapLines","payload","fmtpLines","fbLines","cryptoLines","mux","extLines","ext","ssrcGroupLines","ssrcLines","msidLine","found","fingerprintLines","setup","fp","ufragLine","pwdLine","candidateLines","sctpmapLines","./parsers","./senders",31,"time","pushedSetup","param","fb","hdrExts","hdr","ssrcGroups","ssrcGroup","ssrcs","toUpperCase",32,"Peer","parent","oneway","sharemyscreen","browserPrefix","enableDataChannels","receiveMedia","peerConnectionConfig","peerConnectionConstraints","onIceCandidate","nick","handleRemoteStreamAdded","handleDataChannelAdded","handleStreamRemoved","peerconnection","localScreen","broadcaster","INBAND_FILETRANSFER_V1","receiver","FileTransfer","handleMessage","sessionDescription","from","messageType","to","roomType","sendDirectly","dc","getDataChannel","readyState","_observeDataChannel","onclose","onerror","onopen","supportDataChannel","closed","pcConfig","iceTransports","icerestart","IceRestart","success","warn","peers","sendFile","sender","getTime","filetransfer","rtcpeerconnection",33,"SimpleWebRTC","connection","url","socketio","localVideoEl","remoteVideosEl","autoRequestMedia","autoRemoveVideos","adjustPeerVolume","peerVolumeWhenSpeaking","localVideo","capabilities","webrtcSupport","SocketIoConnection","getSessionid","sessionReady","testReadiness","peer","getPeers","p","createPeer","room","removePeers","WebRTC","method","handlePeerStreamAdded","handlePeerStreamRemoved","setVolumeForAll","args","concat","sendToAll","container","getRemoteVideoContainer","oncontextmenu","attachMediaStream","appendChild","existingPeer","startLocalVideo","create","leaveRoom","roomName","getLocalScreen","disconnect","videoEl","getDomId","removeChild","joinRoom","roomDescription","client","clients","getEl","idOrEl","getElementById","getLocalVideoContainer","stopLocalVideo","tagName","shareScreen","createRoom","dataChannel","./socketioconnection","./webrtc","attachmediastream",34,"io","ev","socket","sessionid","socket.io-client",35,"DtlsSrtpKeyAgreement","localMedia","val1","val2","sessionId","sendDirectlyToAll","./peer","localmedia",36,"global","version","transports","sockets","host","details","uuri","parseUri","domain","hostname","uniqueUri","secure","query","merge","Socket","of","re","str","m","exec","base","addition","chunkQuery","components","part","qs","params","pageLoaded","load","capture","attachEvent","request","xdomain","XDomainRequest","ua","hasCORS","XMLHttpRequest","defer","webkit","importScripts","additional","deep","lastseen","prop","seen","depth","mixin","ctor","ctor2","inherit","obj","intersect","arr","arr2","ret","longest","shortest","toArray","enu","withCredentials","iDevice","EventEmitter","$events","addListener","once","removeListener","listener","list","pos","removeAllListeners","listeners","handler","nativeJSON","date","d","isFinite","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","escapable","lastIndex","meta","charCodeAt","holder","k","v","partial","mind","gap","rep","String","indent","cx","\b","\t","\n","\f","\r","\"","\\","replacer","space","","text","reviver","walk","eval","SyntaxError","parser","packets","reasons","advice","encodePacket","packet","endpoint","ack","reason","adv","ackId","encoded","encodePayload","decoded","regexp","decodePacket","pieces","decodePayload","charAt","Number","Transport","sessid","heartbeats","onData","clearCloseTimeout","connected","connecting","reconnecting","setCloseTimeout","msgs","onPacket","setHeartbeatTimeout","onHeartbeat","onConnect","isOpen","closeTimeout","onDisconnect","clearTimeouts","reopenTimeout","heartbeat","onOpen","onClose","prepareUrl","scheme","resource","ready","connect timeout","try multiple transports","reconnect","reconnection delay","reconnection limit","reopen delay","max reconnection attempts","sync disconnect on unload","auto connect","flash policy port","manualFlush","open","namespaces","buffer","doBuffer","isXDomain","disconnectSync","empty","SocketNamespace","publish","nsp","$emit","handshake","complete","onError","insertAt","getElementsByTagName","script","parentNode","insertBefore","xhr","onreadystatechange","status","responseText","getTransport","override","check","xdomainCheck","connectTimeoutTimer","remaining","heartbeatTimeout","origTransports","heartbeatTimeoutTimer","setBuffer","flushBuffer","wasConnected","wasConnecting","reset","reconnectionAttempts","reconnectionTimer","maybeReconnect","reconnectionDelay","redoTransports","tryMultiple","maxAttempts","limit","flags","json","Flag","ackPackets","acks","namespace","lastArg","WS","websocket","MozWebSocket","WebSocket","Flashsocket","flashsocket","__addTask","__tasks","init","loaded","WEB_SOCKET_SWF_LOCATION","loadFlashPolicyFile","__initialize","body","swfobject","getFlashPlayerVersion","major","WEB_SOCKET_DISABLE_AUTO_INITIALIZATION","J","Z","C","aa","X","U","Y","K","O","D","h","T","V","H","setAttribute","q","GetVariable","ab","M","pv","callee","ag","af","callbackFn","ae","F","swfVersion","wk","expressInstall","A","ai","getAttribute","styleclass","align","ah","ac","ad","P","w","ref","z","SetVariable","nodeName","win","mac","E","B","g","Q","R","title","ie","flashvars","display","replaceChild","innerHTML","childNodes","nodeType","cloneNode","movie","outerHTML","N","y","b","I","G","styleSheets","addRule","createTextNode","visibility","L","encodeURIComponent","S","W","x","platform","parseFloat","plugins","mimeTypes","enabledPlugin","w3","detachEvent","top","documentElement","doScroll","registerObject","getObjectById","embedSWF","aj","al","am","ak","an","switchOffAutoHideShow","minor","release","hasFlashPlayerVersion","createSWF","showExpressInstall","removeSWF","createCSS","addDomLoadEvent","addLoadEvent","getQueryParamValue","search","expressInstallCallback","protocols","proxyHost","proxyPort","headers","__id","__nextId","__instances","CONNECTING","bufferedAmount","__events","__flash","CLOSED","CLOSING","useCapture","removeEventListener","events","dispatchEvent","__handleEvent","flashEvent","jsEvent","__createSimpleEvent","decodeURIComponent","__createMessageEvent","createEvent","Event","initEvent","bubbles","cancelable","MessageEvent","opera","initMessageEvent","OPEN","loadManualPolicyFile","__swfLocation","position","__isFlashLite","left","hasPriority","swliveconnect","allowScriptAccess","__onFlashInitialized","setCallerUrl","href","setDebug","WEB_SOCKET_DEBUG","__onFlashEvent","receiveEvents","webSocketId","__log","__error","task","mimeType","filename","XHR","sendBuffer","post","stateChange","posting","sendXHR","req","setRequestHeader","contentType","usesXDomReq","socketProtocol","isXProtocol","HTMLFile","htmlfile","doc","write","parentWindow","iframeC","className","iframe","destroy","_","CollectGarbage","XHRPolling","retryCounter","abort","JSONPPolling","msg","indicator","initIframe","form","iframeId","area","action","submit","async","define","amd",37,"dumpSDP","dumpStream","info","TraceablePeerConnection","RTCPeerConnection","trace","what","successCallback","failureCallback",38,"requestUserMedia","Promise","resolve","reject","reattachMediaStream","webrtcDetectedVersion","webrtcMinimumVersion","webrtcUtils","extractVersion","uastring","expr","HTMLMediaElement","_srcObject","set","mozGetUserMedia","mozRTCPeerConnection","pcConstraints","newIceServers","server","urls","newServer","username","credential","mozRTCSessionDescription","mozRTCIceCandidate","onSuccess","constraintsToFF37","ideal","min","max","exact","advanced","oc","mediaDevices","enumerateDevices","infos","kind","deviceId","groupId","orgEnumerateDevices","then","webkitGetUserMedia","webkitRTCPeerConnection","iceTransportPolicy","origGetStats","selector","errorCallback","fixChromeStats","response","standardReport","reports","report","standardStats","successCallbackWrapper","nativeMethod","constraintsToChrome","cc","oldname","mix","kinds","MediaStreamTrack","getSources","devices","device","origGetUserMedia","webrtcTesting",39,"PC","IceCandidate","SessionDescription","MediaStream","webkitMediaStream","supportVp8","canPlayType","msGetUserMedia","browserVersion","supportRTCPeerConnection","supportGetUserMedia","supportWebAudio","supportMediaStream","supportScreenSharing",40,"isWildEmitter","groupName","callbacks","hasGroup","_groupName","releaseGroup","handlers","specialCallbacks","getWildcardCallbacks","eventName",41,"_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","enumerable","writable","configurable","setPrototypeOf","__proto__","extend","_Y$AbstractConnector","_this","getPrototypeOf","webrtcOptions","swr","userId","setUserId","room_","receiveMessage","userJoined","userLeft","_createClass","_get","uid","AbstractConnector","defineProperties","descriptor","protoProps","staticProps","getOwnPropertyDescriptor","getter","simplewebrtc",42,"superCtor","super_","TempCtor",43,"cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","run","Item","fun","noop","process","nextTick","browser","env","argv","versions","binding","cwd","chdir","dir","umask",44,"arg","copy","fill","readUInt8",45,"inspect","ctx","stylize","stylizeNoColor","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","styles","arrayToHash","recurseTimes","isString","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","isDate","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","isNumber","isNull","numLinesEst","reduce","prev","cur","ar","isNullOrUndefined","isSymbol","objectToString","isPrimitive","pad","getHours","getMinutes","getSeconds","getDate","months","getMonth","formatRegExp","format","objects","deprecate","deprecated","warned","throwDeprecation","traceDeprecation","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","pid","bold","italic","underline","inverse","white","grey","black","blue","cyan","green","magenta","red","yellow","special","boolean","null","isBuffer","add","./support/isBuffer","_process"],"mappings":"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","file":"y-webrtc.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","module.exports = function (stream, el, options) {\n var URL = window.URL;\n var opts = {\n autoplay: true,\n mirror: false,\n muted: false\n };\n var element = el || document.createElement('video');\n var item;\n\n if (options) {\n for (item in options) {\n opts[item] = options[item];\n }\n }\n\n if (opts.autoplay) element.autoplay = 'autoplay';\n if (opts.muted) element.muted = true;\n if (opts.mirror) {\n ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n var styleName = prefix ? prefix + 'Transform' : 'transform';\n element.style[styleName] = 'scaleX(-1)';\n });\n }\n\n // this first one should work most everywhere now\n // but we have a few fallbacks just in case.\n if (URL && URL.createObjectURL) {\n element.src = URL.createObjectURL(stream);\n } else if (element.srcObject) {\n element.srcObject = stream;\n } else if (element.mozSrcObject) {\n element.mozSrcObject = stream;\n } else {\n return false;\n }\n\n return element;\n};\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\nmodule.exports = function (stream, el, options) {\n var URL = window.URL;\n var opts = {\n autoplay: true,\n mirror: false,\n muted: false\n };\n var element = el || document.createElement('video');\n var item;\n\n if (options) {\n for (item in options) {\n opts[item] = options[item];\n }\n }\n\n if (opts.autoplay) element.autoplay = 'autoplay';\n if (opts.muted) element.muted = true;\n if (opts.mirror) {\n ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n var styleName = prefix ? prefix + 'Transform' : 'transform';\n element.style[styleName] = 'scaleX(-1)';\n });\n }\n\n // this first one should work most everywhere now\n // but we have a few fallbacks just in case.\n if (URL && URL.createObjectURL) {\n element.src = URL.createObjectURL(stream);\n } else if (element.srcObject) {\n element.srcObject = stream;\n } else if (element.mozSrcObject) {\n element.mozSrcObject = stream;\n } else {\n return false;\n }\n\n return element;\n};\n\n},{}],2:[function(require,module,exports){\nvar WildEmitter = require('wildemitter');\nvar util = require('util');\n\nfunction Sender(opts) {\n WildEmitter.call(this);\n var options = opts || {};\n this.config = {\n chunksize: 16384,\n pacing: 0\n };\n // set our config from options\n var item;\n for (item in options) {\n this.config[item] = options[item];\n }\n\n this.file = null;\n this.channel = null;\n}\nutil.inherits(Sender, WildEmitter);\n\nSender.prototype.send = function (file, channel) {\n var self = this;\n this.file = file;\n this.channel = channel;\n var sliceFile = function(offset) {\n var reader = new window.FileReader();\n reader.onload = (function() {\n return function(e) {\n self.channel.send(e.target.result);\n self.emit('progress', offset, file.size, e.target.result);\n if (file.size > offset + e.target.result.byteLength) {\n window.setTimeout(sliceFile, self.config.pacing, offset + self.config.chunksize);\n } else {\n self.emit('progress', file.size, file.size, null);\n self.emit('sentFile');\n }\n };\n })(file);\n var slice = file.slice(offset, offset + self.config.chunksize);\n reader.readAsArrayBuffer(slice);\n };\n window.setTimeout(sliceFile, 0, 0);\n};\n\nfunction Receiver() {\n WildEmitter.call(this);\n\n this.receiveBuffer = [];\n this.received = 0;\n this.metadata = {};\n this.channel = null;\n}\nutil.inherits(Receiver, WildEmitter);\n\nReceiver.prototype.receive = function (metadata, channel) {\n var self = this;\n\n if (metadata) {\n this.metadata = metadata;\n }\n this.channel = channel;\n // chrome only supports arraybuffers and those make it easier to calc the hash\n channel.binaryType = 'arraybuffer';\n this.channel.onmessage = function (event) {\n var len = event.data.byteLength;\n self.received += len;\n self.receiveBuffer.push(event.data);\n\n self.emit('progress', self.received, self.metadata.size, event.data);\n if (self.received === self.metadata.size) {\n self.emit('receivedFile', new window.Blob(self.receiveBuffer), self.metadata);\n self.receiveBuffer = []; // discard receivebuffer\n } else if (self.received > self.metadata.size) {\n // FIXME\n console.error('received more than expected, discarding...');\n self.receiveBuffer = []; // just discard...\n\n }\n };\n};\n\nmodule.exports = {};\nmodule.exports.support = typeof window !== 'undefined' && window && window.File && window.FileReader && window.Blob;\nmodule.exports.Sender = Sender;\nmodule.exports.Receiver = Receiver;\n\n},{\"util\":45,\"wildemitter\":40}],3:[function(require,module,exports){\n// getScreenMedia helper by @HenrikJoreteg\nvar getUserMedia = require('getusermedia');\n\n// cache for constraints and callback\nvar cache = {};\n\nmodule.exports = function (constraints, cb) {\n var hasConstraints = arguments.length === 2;\n var callback = hasConstraints ? cb : constraints;\n var error;\n\n if (typeof window === 'undefined' || window.location.protocol === 'http:') {\n error = new Error('NavigatorUserMediaError');\n error.name = 'HTTPS_REQUIRED';\n return callback(error);\n }\n\n if (window.navigator.userAgent.match('Chrome')) {\n var chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10);\n var maxver = 33;\n var isCef = !window.chrome.webstore;\n // \"known\" crash in chrome 34 and 35 on linux\n if (window.navigator.userAgent.match('Linux')) maxver = 35;\n\n // check that the extension is installed by looking for a\n // sessionStorage variable that contains the extension id\n // this has to be set after installation unless the contest\n // script does that\n if (sessionStorage.getScreenMediaJSExtensionId) {\n chrome.runtime.sendMessage(sessionStorage.getScreenMediaJSExtensionId,\n {type:'getScreen', id: 1}, null,\n function (data) {\n if (!data || data.sourceId === '') { // user canceled\n var error = new Error('NavigatorUserMediaError');\n error.name = 'PERMISSION_DENIED';\n callback(error);\n } else {\n constraints = (hasConstraints && constraints) || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = data.sourceId;\n getUserMedia(constraints, callback);\n }\n }\n );\n } else if (window.cefGetScreenMedia) {\n //window.cefGetScreenMedia is experimental - may be removed without notice\n window.cefGetScreenMedia(function(sourceId) {\n if (!sourceId) {\n var error = new Error('cefGetScreenMediaError');\n error.name = 'CEF_GETSCREENMEDIA_CANCELED';\n callback(error);\n } else {\n constraints = (hasConstraints && constraints) || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = sourceId;\n getUserMedia(constraints, callback);\n }\n });\n } else if (isCef || (chromever >= 26 && chromever <= maxver)) {\n // chrome 26 - chrome 33 way to do it -- requires bad chrome://flags\n // note: this is basically in maintenance mode and will go away soon\n constraints = (hasConstraints && constraints) || {\n video: {\n mandatory: {\n googLeakyBucket: true,\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3,\n chromeMediaSource: 'screen'\n }\n }\n };\n getUserMedia(constraints, callback);\n } else {\n // chrome 34+ way requiring an extension\n var pending = window.setTimeout(function () {\n error = new Error('NavigatorUserMediaError');\n error.name = 'EXTENSION_UNAVAILABLE';\n return callback(error);\n }, 1000);\n cache[pending] = [callback, hasConstraints ? constraints : null];\n window.postMessage({ type: 'getScreen', id: pending }, '*');\n }\n } else if (window.navigator.userAgent.match('Firefox')) {\n var ffver = parseInt(window.navigator.userAgent.match(/Firefox\\/(.*)/)[1], 10);\n if (ffver >= 33) {\n constraints = (hasConstraints && constraints) || {\n video: {\n mozMediaSource: 'window',\n mediaSource: 'window'\n }\n }\n getUserMedia(constraints, function (err, stream) {\n callback(err, stream);\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n if (!err) {\n var lastTime = stream.currentTime;\n var polly = window.setInterval(function () {\n if (!stream) window.clearInterval(polly);\n if (stream.currentTime == lastTime) {\n window.clearInterval(polly);\n if (stream.onended) {\n stream.onended();\n }\n }\n lastTime = stream.currentTime;\n }, 500);\n }\n });\n } else {\n error = new Error('NavigatorUserMediaError');\n error.name = 'EXTENSION_UNAVAILABLE'; // does not make much sense but...\n }\n }\n};\n\nwindow.addEventListener('message', function (event) {\n if (event.origin != window.location.origin) {\n return;\n }\n if (event.data.type == 'gotScreen' && cache[event.data.id]) {\n var data = cache[event.data.id];\n var constraints = data[1];\n var callback = data[0];\n delete cache[event.data.id];\n\n if (event.data.sourceId === '') { // user canceled\n var error = new Error('NavigatorUserMediaError');\n error.name = 'PERMISSION_DENIED';\n callback(error);\n } else {\n constraints = constraints || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = event.data.sourceId;\n getUserMedia(constraints, callback);\n }\n } else if (event.data.type == 'getScreenPending') {\n window.clearTimeout(event.data.id);\n }\n});\n\n},{\"getusermedia\":4}],4:[function(require,module,exports){\n// getUserMedia helper by @HenrikJoreteg\nvar adapter = require('webrtc-adapter-test');\n\nmodule.exports = function (constraints, cb) {\n var options, error;\n var haveOpts = arguments.length === 2;\n var defaultOpts = {video: true, audio: true};\n\n var denied = 'PermissionDeniedError';\n var altDenied = 'PERMISSION_DENIED';\n var notSatisfied = 'ConstraintNotSatisfiedError';\n\n // make constraints optional\n if (!haveOpts) {\n cb = constraints;\n constraints = defaultOpts;\n }\n\n // treat lack of browser support like an error\n if (!navigator.getUserMedia) {\n // throw proper error per spec\n error = new Error('MediaStreamError');\n error.name = 'NotSupportedError';\n\n // keep all callbacks async\n return window.setTimeout(function () {\n cb(error);\n }, 0);\n }\n\n // normalize error handling when no media types are requested\n if (!constraints.audio && !constraints.video) {\n error = new Error('MediaStreamError');\n error.name = 'NoMediaRequestedError';\n\n // keep all callbacks async\n return window.setTimeout(function () {\n cb(error);\n }, 0);\n }\n\n // testing support\n if (localStorage && localStorage.useFirefoxFakeDevice === \"true\") {\n constraints.fake = true;\n }\n\n navigator.getUserMedia(constraints, function (stream) {\n cb(null, stream);\n }, function (err) {\n var error;\n // coerce into an error object since FF gives us a string\n // there are only two valid names according to the spec\n // we coerce all non-denied to \"constraint not satisfied\".\n if (typeof err === 'string') {\n error = new Error('MediaStreamError');\n if (err === denied || err === altDenied) {\n error.name = denied;\n } else {\n error.name = notSatisfied;\n }\n } else {\n // if we get an error object make sure '.name' property is set\n // according to spec: http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermediaerror-and-navigatorusermediaerrorcallback\n error = err;\n if (!error.name) {\n // this is likely chrome which\n // sets a property called \"ERROR_DENIED\" on the error object\n // if so we make sure to set a name\n if (error[denied]) {\n err.name = denied;\n } else {\n err.name = notSatisfied;\n }\n }\n }\n\n cb(error);\n });\n};\n\n},{\"webrtc-adapter-test\":38}],5:[function(require,module,exports){\nvar WildEmitter = require('wildemitter');\n\nfunction getMaxVolume (analyser, fftBins) {\n var maxVolume = -Infinity;\n analyser.getFloatFrequencyData(fftBins);\n\n for(var i=4, ii=fftBins.length; i < ii; i++) {\n if (fftBins[i] > maxVolume && fftBins[i] < 0) {\n maxVolume = fftBins[i];\n }\n };\n\n return maxVolume;\n}\n\n\nvar audioContextType = window.AudioContext || window.webkitAudioContext;\n// use a single audio context due to hardware limits\nvar audioContext = null;\nmodule.exports = function(stream, options) {\n var harker = new WildEmitter();\n\n\n // make it not break in non-supported browsers\n if (!audioContextType) return harker;\n\n //Config\n var options = options || {},\n smoothing = (options.smoothing || 0.1),\n interval = (options.interval || 50),\n threshold = options.threshold,\n play = options.play,\n history = options.history || 10,\n running = true;\n\n //Setup Audio Context\n if (!audioContext) {\n audioContext = new audioContextType();\n }\n var sourceNode, fftBins, analyser;\n\n analyser = audioContext.createAnalyser();\n analyser.fftSize = 512;\n analyser.smoothingTimeConstant = smoothing;\n fftBins = new Float32Array(analyser.fftSize);\n\n if (stream.jquery) stream = stream[0];\n if (stream instanceof HTMLAudioElement || stream instanceof HTMLVideoElement) {\n //Audio Tag\n sourceNode = audioContext.createMediaElementSource(stream);\n if (typeof play === 'undefined') play = true;\n threshold = threshold || -50;\n } else {\n //WebRTC Stream\n sourceNode = audioContext.createMediaStreamSource(stream);\n threshold = threshold || -50;\n }\n\n sourceNode.connect(analyser);\n if (play) analyser.connect(audioContext.destination);\n\n harker.speaking = false;\n\n harker.setThreshold = function(t) {\n threshold = t;\n };\n\n harker.setInterval = function(i) {\n interval = i;\n };\n \n harker.stop = function() {\n running = false;\n harker.emit('volume_change', -100, threshold);\n if (harker.speaking) {\n harker.speaking = false;\n harker.emit('stopped_speaking');\n }\n };\n harker.speakingHistory = [];\n for (var i = 0; i < history; i++) {\n harker.speakingHistory.push(0);\n }\n\n // Poll the analyser node to determine if speaking\n // and emit events if changed\n var looper = function() {\n setTimeout(function() {\n \n //check if stop has been called\n if(!running) {\n return;\n }\n \n var currentVolume = getMaxVolume(analyser, fftBins);\n\n harker.emit('volume_change', currentVolume, threshold);\n\n var history = 0;\n if (currentVolume > threshold && !harker.speaking) {\n // trigger quickly, short history\n for (var i = harker.speakingHistory.length - 3; i < harker.speakingHistory.length; i++) {\n history += harker.speakingHistory[i];\n }\n if (history >= 2) {\n harker.speaking = true;\n harker.emit('speaking');\n }\n } else if (currentVolume < threshold && harker.speaking) {\n for (var i = 0; i < harker.speakingHistory.length; i++) {\n history += harker.speakingHistory[i];\n }\n if (history == 0) {\n harker.speaking = false;\n harker.emit('stopped_speaking');\n }\n }\n harker.speakingHistory.shift();\n harker.speakingHistory.push(0 + (currentVolume > threshold));\n\n looper();\n }, interval);\n };\n looper();\n\n\n return harker;\n}\n\n},{\"wildemitter\":40}],6:[function(require,module,exports){\nvar util = require('util');\nvar hark = require('hark');\nvar webrtc = require('webrtcsupport');\nvar getUserMedia = require('getusermedia');\nvar getScreenMedia = require('getscreenmedia');\nvar WildEmitter = require('wildemitter');\nvar GainController = require('mediastream-gain');\nvar mockconsole = require('mockconsole');\n\n\nfunction LocalMedia(opts) {\n WildEmitter.call(this);\n\n var config = this.config = {\n autoAdjustMic: false,\n detectSpeakingEvents: true,\n audioFallback: false,\n media: {\n audio: true,\n video: true\n },\n logger: mockconsole\n };\n\n var item;\n for (item in opts) {\n this.config[item] = opts[item];\n }\n\n this.logger = config.logger;\n this._log = this.logger.log.bind(this.logger, 'LocalMedia:');\n this._logerror = this.logger.error.bind(this.logger, 'LocalMedia:');\n\n this.screenSharingSupport = webrtc.screenSharing;\n\n this.localStreams = [];\n this.localScreens = [];\n\n if (!webrtc.support) {\n this._logerror('Your browser does not support local media capture.');\n }\n}\n\nutil.inherits(LocalMedia, WildEmitter);\n\n\nLocalMedia.prototype.start = function (mediaConstraints, cb) {\n var self = this;\n var constraints = mediaConstraints || this.config.media;\n\n getUserMedia(constraints, function (err, stream) {\n\n if (!err) {\n if (constraints.audio && self.config.detectSpeakingEvents) {\n self.setupAudioMonitor(stream, self.config.harkOptions);\n }\n self.localStreams.push(stream);\n\n if (self.config.autoAdjustMic) {\n self.gainController = new GainController(stream);\n // start out somewhat muted if we can track audio\n self.setMicIfEnabled(0.5);\n }\n\n // TODO: might need to migrate to the video tracks onended\n // FIXME: firefox does not seem to trigger this...\n stream.onended = function () {\n /*\n var idx = self.localStreams.indexOf(stream);\n if (idx > -1) {\n self.localScreens.splice(idx, 1);\n }\n self.emit('localStreamStopped', stream);\n */\n };\n\n self.emit('localStream', stream);\n } else {\n // Fallback for users without a camera\n if (self.config.audioFallback && err.name === 'DevicesNotFoundError' && constraints.video !== false) {\n constraints.video = false;\n self.start(constraints, cb);\n return;\n }\n }\n if (cb) {\n return cb(err, stream);\n }\n });\n};\n\nLocalMedia.prototype.stop = function (stream) {\n var self = this;\n // FIXME: duplicates cleanup code until fixed in FF\n if (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n var idx = self.localStreams.indexOf(stream);\n if (idx > -1) {\n self.emit('localStreamStopped', stream);\n self.localStreams = self.localStreams.splice(idx, 1);\n } else {\n idx = self.localScreens.indexOf(stream);\n if (idx > -1) {\n self.emit('localScreenStopped', stream);\n self.localScreens = self.localScreens.splice(idx, 1);\n }\n }\n } else {\n this.stopStreams();\n this.stopScreenShare();\n }\n};\n\nLocalMedia.prototype.stopStreams = function () {\n var self = this;\n if (this.audioMonitor) {\n this.audioMonitor.stop();\n delete this.audioMonitor;\n }\n this.localStreams.forEach(function (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n self.emit('localStreamStopped', stream);\n });\n this.localStreams = [];\n};\n\nLocalMedia.prototype.startScreenShare = function (cb) {\n var self = this;\n getScreenMedia(function (err, stream) {\n if (!err) {\n self.localScreens.push(stream);\n\n // TODO: might need to migrate to the video tracks onended\n // Firefox does not support .onended but it does not support\n // screensharing either\n stream.onended = function () {\n var idx = self.localScreens.indexOf(stream);\n if (idx > -1) {\n self.localScreens.splice(idx, 1);\n }\n self.emit('localScreenStopped', stream);\n };\n self.emit('localScreen', stream);\n }\n\n // enable the callback\n if (cb) {\n return cb(err, stream);\n }\n });\n};\n\nLocalMedia.prototype.stopScreenShare = function (stream) {\n var self = this;\n if (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n this.emit('localScreenStopped', stream);\n } else {\n this.localScreens.forEach(function (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n self.emit('localScreenStopped', stream);\n });\n this.localScreens = [];\n }\n};\n\n// Audio controls\nLocalMedia.prototype.mute = function () {\n this._audioEnabled(false);\n this.hardMuted = true;\n this.emit('audioOff');\n};\n\nLocalMedia.prototype.unmute = function () {\n this._audioEnabled(true);\n this.hardMuted = false;\n this.emit('audioOn');\n};\n\nLocalMedia.prototype.setupAudioMonitor = function (stream, harkOptions) {\n this._log('Setup audio');\n var audio = this.audioMonitor = hark(stream, harkOptions);\n var self = this;\n var timeout;\n\n audio.on('speaking', function () {\n self.emit('speaking');\n if (self.hardMuted) {\n return;\n }\n self.setMicIfEnabled(1);\n });\n\n audio.on('stopped_speaking', function () {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n self.emit('stoppedSpeaking');\n if (self.hardMuted) {\n return;\n }\n self.setMicIfEnabled(0.5);\n }, 1000);\n });\n audio.on('volume_change', function (volume, treshold) {\n self.emit('volumeChange', volume, treshold);\n });\n};\n\n// We do this as a seperate method in order to\n// still leave the \"setMicVolume\" as a working\n// method.\nLocalMedia.prototype.setMicIfEnabled = function (volume) {\n if (!this.config.autoAdjustMic) {\n return;\n }\n this.gainController.setGain(volume);\n};\n\n// Video controls\nLocalMedia.prototype.pauseVideo = function () {\n this._videoEnabled(false);\n this.emit('videoOff');\n};\nLocalMedia.prototype.resumeVideo = function () {\n this._videoEnabled(true);\n this.emit('videoOn');\n};\n\n// Combined controls\nLocalMedia.prototype.pause = function () {\n this.mute();\n this.pauseVideo();\n};\nLocalMedia.prototype.resume = function () {\n this.unmute();\n this.resumeVideo();\n};\n\n// Internal methods for enabling/disabling audio/video\nLocalMedia.prototype._audioEnabled = function (bool) {\n // work around for chrome 27 bug where disabling tracks\n // doesn't seem to work (works in canary, remove when working)\n this.setMicIfEnabled(bool ? 1 : 0);\n this.localStreams.forEach(function (stream) {\n stream.getAudioTracks().forEach(function (track) {\n track.enabled = !!bool;\n });\n });\n};\nLocalMedia.prototype._videoEnabled = function (bool) {\n this.localStreams.forEach(function (stream) {\n stream.getVideoTracks().forEach(function (track) {\n track.enabled = !!bool;\n });\n });\n};\n\n// check if all audio streams are enabled\nLocalMedia.prototype.isAudioEnabled = function () {\n var enabled = true;\n this.localStreams.forEach(function (stream) {\n stream.getAudioTracks().forEach(function (track) {\n enabled = enabled && track.enabled;\n });\n });\n return enabled;\n};\n\n// check if all video streams are enabled\nLocalMedia.prototype.isVideoEnabled = function () {\n var enabled = true;\n this.localStreams.forEach(function (stream) {\n stream.getVideoTracks().forEach(function (track) {\n enabled = enabled && track.enabled;\n });\n });\n return enabled;\n};\n\n// Backwards Compat\nLocalMedia.prototype.startLocalMedia = LocalMedia.prototype.start;\nLocalMedia.prototype.stopLocalMedia = LocalMedia.prototype.stop;\n\n// fallback for old .localStream behaviour\nObject.defineProperty(LocalMedia.prototype, 'localStream', {\n get: function () {\n return this.localStreams.length > 0 ? this.localStreams[0] : null;\n }\n});\n// fallback for old .localScreen behaviour\nObject.defineProperty(LocalMedia.prototype, 'localScreen', {\n get: function () {\n return this.localScreens.length > 0 ? this.localScreens[0] : null;\n }\n});\n\nmodule.exports = LocalMedia;\n\n},{\"getscreenmedia\":3,\"getusermedia\":4,\"hark\":5,\"mediastream-gain\":24,\"mockconsole\":25,\"util\":45,\"webrtcsupport\":39,\"wildemitter\":40}],7:[function(require,module,exports){\n/**\n * lodash 3.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.7.0 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands or `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n\n},{}],8:[function(require,module,exports){\n/**\n * lodash 3.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.7.0 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands or `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n\n},{}],9:[function(require,module,exports){\n/**\n * lodash 3.3.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar baseIsEqual = require('lodash._baseisequal'),\n bindCallback = require('lodash._bindcallback'),\n isArray = require('lodash.isarray'),\n pairs = require('lodash.pairs');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n return value == null ? '' : (value + '');\n}\n\n/**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction baseCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (type == 'function') {\n return thisArg === undefined\n ? func\n : bindCallback(func, thisArg, argCount);\n }\n if (func == null) {\n return identity;\n }\n if (type == 'object') {\n return baseMatches(func);\n }\n return thisArg === undefined\n ? property(func)\n : baseMatchesProperty(func, thisArg);\n}\n\n/**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = toObject(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n var key = matchData[0][0],\n value = matchData[0][1];\n\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === value && (value !== undefined || (key in toObject(object)));\n };\n }\n return function(object) {\n return baseIsMatch(object, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n var isArr = isArray(path),\n isCommon = isKey(path) && isStrictComparable(srcValue),\n pathKey = (path + '');\n\n path = toPath(path);\n return function(object) {\n if (object == null) {\n return false;\n }\n var key = pathKey;\n object = toObject(object);\n if ((isArr || !isCommon) && !(key in object)) {\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n if (object == null) {\n return false;\n }\n key = last(path);\n object = toObject(object);\n }\n return object[key] === srcValue\n ? (srcValue !== undefined || (key in object))\n : baseIsEqual(srcValue, object[key], undefined, true);\n };\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n start = start == null ? 0 : (+start || 0);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : (+end || 0);\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = pairs(object),\n length = result.length;\n\n while (length--) {\n result[length][2] = isStrictComparable(result[length][1]);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\nfunction toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n}\n\n/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': { 'c': 2 } } },\n * { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n}\n\nmodule.exports = baseCallback;\n\n},{\"lodash._baseisequal\":12,\"lodash._bindcallback\":13,\"lodash.isarray\":18,\"lodash.pairs\":22}],10:[function(require,module,exports){\n/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar keys = require('lodash.keys');\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return baseFor(object, iteratee, keys);\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n var length = collection ? getLength(collection) : 0;\n if (!isLength(length)) {\n return eachFunc(collection, iteratee);\n }\n var index = fromRight ? length : -1,\n iterable = toObject(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var iterable = toObject(object),\n props = keysFunc(object),\n length = props.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n var key = props[index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseEach;\n\n},{\"lodash.keys\":20}],11:[function(require,module,exports){\n/**\n * lodash 3.7.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseGet;\n\n},{}],12:[function(require,module,exports){\n/**\n * lodash 3.0.7 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar isArray = require('lodash.isarray'),\n isTypedArray = require('lodash.istypedarray'),\n keys = require('lodash.keys');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n stringTag = '[object String]';\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native 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 [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = isTypedArray(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = isTypedArray(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return equalByTag(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!arraySome(other, function(othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} value The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return (object != +object)\n ? other != +other\n : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == (other + '');\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseIsEqual;\n\n},{\"lodash.isarray\":18,\"lodash.istypedarray\":19,\"lodash.keys\":20}],13:[function(require,module,exports){\n/**\n * lodash 3.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5: return function(value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function() {\n return func.apply(thisArg, arguments);\n };\n}\n\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = bindCallback;\n\n},{}],14:[function(require,module,exports){\n/**\n * lodash 3.9.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = getNative;\n\n},{}],15:[function(require,module,exports){\n/**\n * lodash 3.8.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar isArray = require('lodash.isarray');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n return value == null ? '' : (value + '');\n}\n\n/**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\nfunction toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n}\n\nmodule.exports = toPath;\n\n},{\"lodash.isarray\":18}],16:[function(require,module,exports){\n/**\n * lodash 3.0.3 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar arrayEach = require('lodash._arrayeach'),\n baseEach = require('lodash._baseeach'),\n bindCallback = require('lodash._bindcallback'),\n isArray = require('lodash.isarray');\n\n/**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\nfunction createForEach(arrayFunc, eachFunc) {\n return function(collection, iteratee, thisArg) {\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee)\n : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n };\n}\n\n/**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n * console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\nvar forEach = createForEach(arrayEach, baseEach);\n\nmodule.exports = forEach;\n\n},{\"lodash._arrayeach\":7,\"lodash._baseeach\":10,\"lodash._bindcallback\":13,\"lodash.isarray\":18}],17:[function(require,module,exports){\n/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n return isObjectLike(value) && isArrayLike(value) &&\n hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n\n},{}],18:[function(require,module,exports){\n/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = isArray;\n\n},{}],19:[function(require,module,exports){\n/**\n * lodash 3.0.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n\n},{}],20:[function(require,module,exports){\n/**\n * lodash 3.1.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar getNative = require('lodash._getnative'),\n isArguments = require('lodash.isarguments'),\n isArray = require('lodash.isarray');\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n var props = keysIn(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && isLength(length) &&\n (isArray(object) || isArguments(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n var Ctor = object == null ? undefined : object.constructor;\n if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n (typeof object != 'function' && isArrayLike(object))) {\n return shimKeys(object);\n }\n return isObject(object) ? nativeKeys(object) : [];\n};\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!isObject(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = (length && isLength(length) &&\n (isArray(object) || isArguments(object)) && length) || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = (index + '');\n }\n for (var key in object) {\n if (!(skipIndexes && isIndex(key, length)) &&\n !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n},{\"lodash._getnative\":14,\"lodash.isarguments\":17,\"lodash.isarray\":18}],21:[function(require,module,exports){\n/**\n * lodash 3.1.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar arrayMap = require('lodash._arraymap'),\n baseCallback = require('lodash._basecallback'),\n baseEach = require('lodash._baseeach'),\n isArray = require('lodash.isarray');\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n * return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee, thisArg) {\n var func = isArray(collection) ? arrayMap : baseMap;\n iteratee = baseCallback(iteratee, thisArg, 3);\n return func(collection, iteratee);\n}\n\nmodule.exports = map;\n\n},{\"lodash._arraymap\":8,\"lodash._basecallback\":9,\"lodash._baseeach\":10,\"lodash.isarray\":18}],22:[function(require,module,exports){\n/**\n * lodash 3.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar keys = require('lodash.keys');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\nfunction pairs(object) {\n object = toObject(object);\n\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n}\n\nmodule.exports = pairs;\n\n},{\"lodash.keys\":20}],23:[function(require,module,exports){\n/**\n * lodash 3.1.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar baseGet = require('lodash._baseget'),\n toPath = require('lodash._topath'),\n isArray = require('lodash.isarray'),\n map = require('lodash.map');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Gets the property value of `path` from all elements in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|string} path The path of the property to pluck.\n * @returns {Array} Returns the property values.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.pluck(users, 'user');\n * // => ['barney', 'fred']\n *\n * var userIndex = _.indexBy(users, 'user');\n * _.pluck(userIndex, 'age');\n * // => [36, 40] (iteration order is not guaranteed)\n */\nfunction pluck(collection, path) {\n return map(collection, property(path));\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates a function which returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': { 'c': 2 } } },\n * { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n}\n\nmodule.exports = pluck;\n\n},{\"lodash._baseget\":11,\"lodash._topath\":15,\"lodash.isarray\":18,\"lodash.map\":21}],24:[function(require,module,exports){\nvar support = require('webrtcsupport');\n\n\nfunction GainController(stream) {\n this.support = support.webAudio && support.mediaStream;\n\n // set our starting value\n this.gain = 1;\n\n if (this.support) {\n var context = this.context = new support.AudioContext();\n this.microphone = context.createMediaStreamSource(stream);\n this.gainFilter = context.createGain();\n this.destination = context.createMediaStreamDestination();\n this.outputStream = this.destination.stream;\n this.microphone.connect(this.gainFilter);\n this.gainFilter.connect(this.destination);\n stream.addTrack(this.outputStream.getAudioTracks()[0]);\n stream.removeTrack(stream.getAudioTracks()[0]);\n }\n this.stream = stream;\n}\n\n// setting\nGainController.prototype.setGain = function (val) {\n // check for support\n if (!this.support) return;\n this.gainFilter.gain.value = val;\n this.gain = val;\n};\n\nGainController.prototype.getGain = function () {\n return this.gain;\n};\n\nGainController.prototype.off = function () {\n return this.setGain(0);\n};\n\nGainController.prototype.on = function () {\n this.setGain(1);\n};\n\n\nmodule.exports = GainController;\n\n},{\"webrtcsupport\":39}],25:[function(require,module,exports){\nvar methods = \"assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn\".split(\",\");\nvar l = methods.length;\nvar fn = function () {};\nvar mockconsole = {};\n\nwhile (l--) {\n mockconsole[methods[l]] = fn;\n}\n\nmodule.exports = mockconsole;\n\n},{}],26:[function(require,module,exports){\nvar util = require('util');\nvar each = require('lodash.foreach');\nvar pluck = require('lodash.pluck');\nvar SJJ = require('sdp-jingle-json');\nvar WildEmitter = require('wildemitter');\nvar peerconn = require('traceablepeerconnection');\nvar adapter = require('webrtc-adapter-test');\n\nfunction PeerConnection(config, constraints) {\n var self = this;\n var item;\n WildEmitter.call(this);\n\n config = config || {};\n config.iceServers = config.iceServers || [];\n\n // make sure this only gets enabled in Google Chrome\n // EXPERIMENTAL FLAG, might get removed without notice\n this.enableChromeNativeSimulcast = false;\n if (constraints && constraints.optional &&\n adapter.webrtcDetectedBrowser === 'chrome' &&\n navigator.appVersion.match(/Chromium\\//) === null) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.enableChromeNativeSimulcast) {\n self.enableChromeNativeSimulcast = true;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n this.enableMultiStreamHacks = false;\n if (constraints && constraints.optional &&\n adapter.webrtcDetectedBrowser === 'chrome') {\n constraints.optional.forEach(function (constraint) {\n if (constraint.enableMultiStreamHacks) {\n self.enableMultiStreamHacks = true;\n }\n });\n }\n // EXPERIMENTAL FLAG, might get removed without notice\n this.restrictBandwidth = 0;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetRestrictBandwidth) {\n self.restrictBandwidth = constraint.andyetRestrictBandwidth;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // bundle up ice candidates, only works for jingle mode\n // number > 0 is the delay to wait for additional candidates\n // ~20ms seems good\n this.batchIceCandidates = 0;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetBatchIce) {\n self.batchIceCandidates = constraint.andyetBatchIce;\n }\n });\n }\n this.batchedIceCandidates = [];\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // this attemps to strip out candidates with an already known foundation\n // and type -- i.e. those which are gathered via the same TURN server\n // but different transports (TURN udp, tcp and tls respectively)\n if (constraints && constraints.optional && adapter.webrtcDetectedBrowser === 'chrome') {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetFasterICE) {\n self.eliminateDuplicateCandidates = constraint.andyetFasterICE;\n }\n });\n }\n // EXPERIMENTAL FLAG, might get removed without notice\n // when using a server such as the jitsi videobridge we don't need to signal\n // our candidates\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetDontSignalCandidates) {\n self.dontSignalCandidates = constraint.andyetDontSignalCandidates;\n }\n });\n }\n\n\n // EXPERIMENTAL FLAG, might get removed without notice\n this.assumeSetLocalSuccess = false;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetAssumeSetLocalSuccess) {\n self.assumeSetLocalSuccess = constraint.andyetAssumeSetLocalSuccess;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // working around https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n // pass in a timeout for this\n if (adapter.webrtcDetectedBrowser === 'firefox') {\n if (constraints && constraints.optional) {\n this.wtFirefox = 0;\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetFirefoxMakesMeSad) {\n self.wtFirefox = constraint.andyetFirefoxMakesMeSad;\n if (self.wtFirefox > 0) {\n self.firefoxcandidatebuffer = [];\n }\n }\n });\n }\n }\n\n\n this.pc = new peerconn(config, constraints);\n\n this.getLocalStreams = this.pc.getLocalStreams.bind(this.pc);\n this.getRemoteStreams = this.pc.getRemoteStreams.bind(this.pc);\n this.addStream = this.pc.addStream.bind(this.pc);\n this.removeStream = this.pc.removeStream.bind(this.pc);\n\n // proxy events\n this.pc.on('*', function () {\n self.emit.apply(self, arguments);\n });\n\n // proxy some events directly\n this.pc.onremovestream = this.emit.bind(this, 'removeStream');\n this.pc.onaddstream = this.emit.bind(this, 'addStream');\n this.pc.onnegotiationneeded = this.emit.bind(this, 'negotiationNeeded');\n this.pc.oniceconnectionstatechange = this.emit.bind(this, 'iceConnectionStateChange');\n this.pc.onsignalingstatechange = this.emit.bind(this, 'signalingStateChange');\n\n // handle ice candidate and data channel events\n this.pc.onicecandidate = this._onIce.bind(this);\n this.pc.ondatachannel = this._onDataChannel.bind(this);\n\n this.localDescription = {\n contents: []\n };\n this.remoteDescription = {\n contents: []\n };\n\n this.config = {\n debug: false,\n ice: {},\n sid: '',\n isInitiator: true,\n sdpSessionID: Date.now(),\n useJingle: false\n };\n\n // apply our config\n for (item in config) {\n this.config[item] = config[item];\n }\n\n if (this.config.debug) {\n this.on('*', function () {\n var logger = config.logger || console;\n logger.log('PeerConnection event:', arguments);\n });\n }\n this.hadLocalStunCandidate = false;\n this.hadRemoteStunCandidate = false;\n this.hadLocalRelayCandidate = false;\n this.hadRemoteRelayCandidate = false;\n\n this.hadLocalIPv6Candidate = false;\n this.hadRemoteIPv6Candidate = false;\n\n // keeping references for all our data channels\n // so they dont get garbage collected\n // can be removed once the following bugs have been fixed\n // https://crbug.com/405545\n // https://bugzilla.mozilla.org/show_bug.cgi?id=964092\n // to be filed for opera\n this._remoteDataChannels = [];\n this._localDataChannels = [];\n\n this._candidateBuffer = [];\n}\n\nutil.inherits(PeerConnection, WildEmitter);\n\nObject.defineProperty(PeerConnection.prototype, 'signalingState', {\n get: function () {\n return this.pc.signalingState;\n }\n});\nObject.defineProperty(PeerConnection.prototype, 'iceConnectionState', {\n get: function () {\n return this.pc.iceConnectionState;\n }\n});\n\nPeerConnection.prototype._role = function () {\n return this.isInitiator ? 'initiator' : 'responder';\n};\n\n// Add a stream to the peer connection object\nPeerConnection.prototype.addStream = function (stream) {\n this.localStream = stream;\n this.pc.addStream(stream);\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkLocalCandidate = function (candidate) {\n var cand = SJJ.toCandidateJSON(candidate);\n if (cand.type == 'srflx') {\n this.hadLocalStunCandidate = true;\n } else if (cand.type == 'relay') {\n this.hadLocalRelayCandidate = true;\n }\n if (cand.ip.indexOf(':') != -1) {\n this.hadLocalIPv6Candidate = true;\n }\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkRemoteCandidate = function (candidate) {\n var cand = SJJ.toCandidateJSON(candidate);\n if (cand.type == 'srflx') {\n this.hadRemoteStunCandidate = true;\n } else if (cand.type == 'relay') {\n this.hadRemoteRelayCandidate = true;\n }\n if (cand.ip.indexOf(':') != -1) {\n this.hadRemoteIPv6Candidate = true;\n }\n};\n\n\n// Init and add ice candidate object with correct constructor\nPeerConnection.prototype.processIce = function (update, cb) {\n cb = cb || function () {};\n var self = this;\n\n // ignore any added ice candidates to avoid errors. why does the\n // spec not do this?\n if (this.pc.signalingState === 'closed') return cb();\n\n if (update.contents || (update.jingle && update.jingle.contents)) {\n var contentNames = pluck(this.remoteDescription.contents, 'name');\n var contents = update.contents || update.jingle.contents;\n\n contents.forEach(function (content) {\n var transport = content.transport || {};\n var candidates = transport.candidates || [];\n var mline = contentNames.indexOf(content.name);\n var mid = content.name;\n\n candidates.forEach(\n function (candidate) {\n var iceCandidate = SJJ.toCandidateSDP(candidate) + '\\r\\n';\n self.pc.addIceCandidate(\n new RTCIceCandidate({\n candidate: iceCandidate,\n sdpMLineIndex: mline,\n sdpMid: mid\n }), function () {\n // well, this success callback is pretty meaningless\n },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(iceCandidate);\n });\n });\n } else {\n // working around https://code.google.com/p/webrtc/issues/detail?id=3669\n if (update.candidate && update.candidate.candidate.indexOf('a=') !== 0) {\n update.candidate.candidate = 'a=' + update.candidate.candidate;\n }\n\n if (this.wtFirefox && this.firefoxcandidatebuffer !== null) {\n // we cant add this yet due to https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n if (this.pc.localDescription && this.pc.localDescription.type === 'offer') {\n this.firefoxcandidatebuffer.push(update.candidate);\n return cb();\n }\n }\n\n self.pc.addIceCandidate(\n new RTCIceCandidate(update.candidate),\n function () { },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(update.candidate.candidate);\n }\n cb();\n};\n\n// Generate and emit an offer with the given constraints\nPeerConnection.prototype.offer = function (constraints, cb) {\n var self = this;\n var hasConstraints = arguments.length === 2;\n var mediaConstraints = hasConstraints && constraints ? constraints : {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n };\n cb = hasConstraints ? cb : constraints;\n cb = cb || function () {};\n\n if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n // Actually generate the offer\n this.pc.createOffer(\n function (offer) {\n // does not work for jingle, but jingle.js doesn't need\n // this hack...\n var expandedOffer = {\n type: 'offer',\n sdp: offer.sdp\n };\n if (self.assumeSetLocalSuccess) {\n self.emit('offer', expandedOffer);\n cb(null, expandedOffer);\n }\n self._candidateBuffer = [];\n self.pc.setLocalDescription(offer,\n function () {\n var jingle;\n if (self.config.useJingle) {\n jingle = SJJ.toSessionJSON(offer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n jingle.sid = self.config.sid;\n self.localDescription = jingle;\n\n // Save ICE credentials\n each(jingle.contents, function (content) {\n var transport = content.transport || {};\n if (transport.ufrag) {\n self.config.ice[content.name] = {\n ufrag: transport.ufrag,\n pwd: transport.pwd\n };\n }\n });\n\n expandedOffer.jingle = jingle;\n }\n expandedOffer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkLocalCandidate(line);\n }\n });\n\n if (!self.assumeSetLocalSuccess) {\n self.emit('offer', expandedOffer);\n cb(null, expandedOffer);\n }\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n }\n );\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n },\n mediaConstraints\n );\n};\n\n\n// Process an incoming offer so that ICE may proceed before deciding\n// to answer the request.\nPeerConnection.prototype.handleOffer = function (offer, cb) {\n cb = cb || function () {};\n var self = this;\n offer.type = 'offer';\n if (offer.jingle) {\n if (this.enableChromeNativeSimulcast) {\n offer.jingle.contents.forEach(function (content) {\n if (content.name === 'video') {\n content.description.googConferenceFlag = true;\n }\n });\n }\n if (this.enableMultiStreamHacks) {\n // add a mixed video stream as first stream\n offer.jingle.contents.forEach(function (content) {\n if (content.name === 'video') {\n var sources = content.description.sources || [];\n if (sources.length === 0 || sources[0].ssrc !== \"3735928559\") {\n sources.unshift({\n ssrc: \"3735928559\", // 0xdeadbeef\n parameters: [\n {\n key: \"cname\",\n value: \"deadbeef\"\n },\n {\n key: \"msid\",\n value: \"mixyourfecintothis please\"\n }\n ]\n });\n content.description.sources = sources;\n }\n }\n });\n }\n if (self.restrictBandwidth > 0) {\n if (offer.jingle.contents.length >= 2 && offer.jingle.contents[1].name === 'video') {\n var content = offer.jingle.contents[1];\n var hasBw = content.description && content.description.bandwidth;\n if (!hasBw) {\n offer.jingle.contents[1].description.bandwidth = { type: 'AS', bandwidth: self.restrictBandwidth.toString() };\n offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n }\n }\n offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'incoming'\n });\n self.remoteDescription = offer.jingle;\n }\n offer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkRemoteCandidate(line);\n }\n });\n self.pc.setRemoteDescription(new RTCSessionDescription(offer),\n function () {\n cb();\n },\n cb\n );\n};\n\n// Answer an offer with audio only\nPeerConnection.prototype.answerAudioOnly = function (cb) {\n var mediaConstraints = {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: false\n }\n };\n this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer without offering to recieve\nPeerConnection.prototype.answerBroadcastOnly = function (cb) {\n var mediaConstraints = {\n mandatory: {\n OfferToReceiveAudio: false,\n OfferToReceiveVideo: false\n }\n };\n this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer with given constraints default is audio/video\nPeerConnection.prototype.answer = function (constraints, cb) {\n var hasConstraints = arguments.length === 2;\n var callback = hasConstraints ? cb : constraints;\n var mediaConstraints = hasConstraints && constraints ? constraints : {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n };\n\n this._answer(mediaConstraints, callback);\n};\n\n// Process an answer\nPeerConnection.prototype.handleAnswer = function (answer, cb) {\n cb = cb || function () {};\n var self = this;\n if (answer.jingle) {\n answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'incoming'\n });\n self.remoteDescription = answer.jingle;\n }\n answer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkRemoteCandidate(line);\n }\n });\n self.pc.setRemoteDescription(\n new RTCSessionDescription(answer),\n function () {\n if (self.wtFirefox) {\n window.setTimeout(function () {\n self.firefoxcandidatebuffer.forEach(function (candidate) {\n // add candidates later\n self.pc.addIceCandidate(\n new RTCIceCandidate(candidate),\n function () { },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(candidate.candidate);\n });\n self.firefoxcandidatebuffer = null;\n }, self.wtFirefox);\n }\n cb(null);\n },\n cb\n );\n};\n\n// Close the peer connection\nPeerConnection.prototype.close = function () {\n this.pc.close();\n\n this._localDataChannels = [];\n this._remoteDataChannels = [];\n\n this.emit('close');\n};\n\n// Internal code sharing for various types of answer methods\nPeerConnection.prototype._answer = function (constraints, cb) {\n cb = cb || function () {};\n var self = this;\n if (!this.pc.remoteDescription) {\n // the old API is used, call handleOffer\n throw new Error('remoteDescription not set');\n }\n\n if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n self.pc.createAnswer(\n function (answer) {\n var sim = [];\n if (self.enableChromeNativeSimulcast) {\n // native simulcast part 1: add another SSRC\n answer.jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n if (answer.jingle.contents.length >= 2 && answer.jingle.contents[1].name === 'video') {\n var groups = answer.jingle.contents[1].description.sourceGroups || [];\n var hasSim = false;\n groups.forEach(function (group) {\n if (group.semantics == 'SIM') hasSim = true;\n });\n if (!hasSim &&\n answer.jingle.contents[1].description.sources.length) {\n var newssrc = JSON.parse(JSON.stringify(answer.jingle.contents[1].description.sources[0]));\n newssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n answer.jingle.contents[1].description.sources.push(newssrc);\n\n sim.push(answer.jingle.contents[1].description.sources[0].ssrc);\n sim.push(newssrc.ssrc);\n groups.push({\n semantics: 'SIM',\n sources: sim\n });\n\n // also create an RTX one for the SIM one\n var rtxssrc = JSON.parse(JSON.stringify(newssrc));\n rtxssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n answer.jingle.contents[1].description.sources.push(rtxssrc);\n groups.push({\n semantics: 'FID',\n sources: [newssrc.ssrc, rtxssrc.ssrc]\n });\n\n answer.jingle.contents[1].description.sourceGroups = groups;\n answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n }\n }\n var expandedAnswer = {\n type: 'answer',\n sdp: answer.sdp\n };\n if (self.assumeSetLocalSuccess) {\n // not safe to do when doing simulcast mangling\n self.emit('answer', expandedAnswer);\n cb(null, expandedAnswer);\n }\n self._candidateBuffer = [];\n self.pc.setLocalDescription(answer,\n function () {\n if (self.config.useJingle) {\n var jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n jingle.sid = self.config.sid;\n self.localDescription = jingle;\n expandedAnswer.jingle = jingle;\n }\n if (self.enableChromeNativeSimulcast) {\n // native simulcast part 2:\n // signal multiple tracks to the receiver\n // for anything in the SIM group\n if (!expandedAnswer.jingle) {\n expandedAnswer.jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n }\n expandedAnswer.jingle.contents[1].description.sources.forEach(function (source, idx) {\n // the floor idx/2 is a hack that relies on a particular order\n // of groups, alternating between sim and rtx\n source.parameters = source.parameters.map(function (parameter) {\n if (parameter.key === 'msid') {\n parameter.value += '-' + Math.floor(idx / 2);\n }\n return parameter;\n });\n });\n expandedAnswer.sdp = SJJ.toSessionSDP(expandedAnswer.jingle, {\n sid: self.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n expandedAnswer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkLocalCandidate(line);\n }\n });\n if (!self.assumeSetLocalSuccess) {\n self.emit('answer', expandedAnswer);\n cb(null, expandedAnswer);\n }\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n }\n );\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n },\n constraints\n );\n};\n\n// Internal method for emitting ice candidates on our peer object\nPeerConnection.prototype._onIce = function (event) {\n var self = this;\n if (event.candidate) {\n if (this.dontSignalCandidates) return;\n var ice = event.candidate;\n\n var expandedCandidate = {\n candidate: {\n candidate: ice.candidate,\n sdpMid: ice.sdpMid,\n sdpMLineIndex: ice.sdpMLineIndex\n }\n };\n this._checkLocalCandidate(ice.candidate);\n\n var cand = SJJ.toCandidateJSON(ice.candidate);\n\n var already;\n var idx;\n if (this.eliminateDuplicateCandidates && cand.type === 'relay') {\n // drop candidates with same foundation, component\n // take local type pref into account so we don't ignore udp\n // ones when we know about a TCP one. unlikely but...\n already = this._candidateBuffer.filter(\n function (c) {\n return c.type === 'relay';\n }).map(function (c) {\n return c.foundation + ':' + c.component;\n }\n );\n idx = already.indexOf(cand.foundation + ':' + cand.component);\n // remember: local type pref of udp is 0, tcp 1, tls 2\n if (idx > -1 && ((cand.priority >> 24) >= (already[idx].priority >> 24))) {\n // drop it, same foundation with higher (worse) type pref\n return;\n }\n }\n if (this.config.bundlePolicy === 'max-bundle') {\n // drop candidates which are duplicate for audio/video/data\n // duplicate means same host/port but different sdpMid\n already = this._candidateBuffer.filter(\n function (c) {\n return cand.type === c.type;\n }).map(function (cand) {\n return cand.address + ':' + cand.port;\n }\n );\n idx = already.indexOf(cand.address + ':' + cand.port);\n if (idx > -1) return;\n }\n // also drop rtcp candidates since we know the peer supports RTCP-MUX\n // this is a workaround until browsers implement this natively\n if (this.config.rtcpMuxPolicy === 'require' && cand.component === '2') {\n return;\n }\n this._candidateBuffer.push(cand);\n\n if (self.config.useJingle) {\n if (!ice.sdpMid) { // firefox doesn't set this\n if (self.pc.remoteDescription && self.pc.remoteDescription.type === 'offer') {\n // preserve name from remote\n ice.sdpMid = self.remoteDescription.contents[ice.sdpMLineIndex].name;\n } else {\n ice.sdpMid = self.localDescription.contents[ice.sdpMLineIndex].name;\n }\n }\n if (!self.config.ice[ice.sdpMid]) {\n var jingle = SJJ.toSessionJSON(self.pc.localDescription.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n each(jingle.contents, function (content) {\n var transport = content.transport || {};\n if (transport.ufrag) {\n self.config.ice[content.name] = {\n ufrag: transport.ufrag,\n pwd: transport.pwd\n };\n }\n });\n }\n expandedCandidate.jingle = {\n contents: [{\n name: ice.sdpMid,\n creator: self._role(),\n transport: {\n transType: 'iceUdp',\n ufrag: self.config.ice[ice.sdpMid].ufrag,\n pwd: self.config.ice[ice.sdpMid].pwd,\n candidates: [\n cand\n ]\n }\n }]\n };\n if (self.batchIceCandidates > 0) {\n if (self.batchedIceCandidates.length === 0) {\n window.setTimeout(function () {\n var contents = {};\n self.batchedIceCandidates.forEach(function (content) {\n content = content.contents[0];\n if (!contents[content.name]) contents[content.name] = content;\n contents[content.name].transport.candidates.push(content.transport.candidates[0]);\n });\n var newCand = {\n jingle: {\n contents: []\n }\n };\n Object.keys(contents).forEach(function (name) {\n newCand.jingle.contents.push(contents[name]);\n });\n self.batchedIceCandidates = [];\n self.emit('ice', newCand);\n }, self.batchIceCandidates);\n }\n self.batchedIceCandidates.push(expandedCandidate.jingle);\n return;\n }\n\n }\n this.emit('ice', expandedCandidate);\n } else {\n this.emit('endOfCandidates');\n }\n};\n\n// Internal method for processing a new data channel being added by the\n// other peer.\nPeerConnection.prototype._onDataChannel = function (event) {\n // make sure we keep a reference so this doesn't get garbage collected\n var channel = event.channel;\n this._remoteDataChannels.push(channel);\n\n this.emit('addChannel', channel);\n};\n\n// Create a data channel spec reference:\n// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannelInit\nPeerConnection.prototype.createDataChannel = function (name, opts) {\n var channel = this.pc.createDataChannel(name, opts);\n\n // make sure we keep a reference so this doesn't get garbage collected\n this._localDataChannels.push(channel);\n\n return channel;\n};\n\n// a wrapper around getStats which hides the differences (where possible)\n// TODO: remove in favor of adapter.js shim\nPeerConnection.prototype.getStats = function (cb) {\n if (adapter.webrtcDetectedBrowser === 'firefox') {\n this.pc.getStats(\n function (res) {\n var items = [];\n for (var result in res) {\n if (typeof res[result] === 'object') {\n items.push(res[result]);\n }\n }\n cb(null, items);\n },\n cb\n );\n } else {\n this.pc.getStats(function (res) {\n var items = [];\n res.result().forEach(function (result) {\n var item = {};\n result.names().forEach(function (name) {\n item[name] = result.stat(name);\n });\n item.id = result.id;\n item.type = result.type;\n item.timestamp = result.timestamp;\n items.push(item);\n });\n cb(null, items);\n });\n }\n};\n\nmodule.exports = PeerConnection;\n\n},{\"lodash.foreach\":16,\"lodash.pluck\":23,\"sdp-jingle-json\":27,\"traceablepeerconnection\":37,\"util\":45,\"webrtc-adapter-test\":38,\"wildemitter\":40}],27:[function(require,module,exports){\nvar toSDP = require('./lib/tosdp');\nvar toJSON = require('./lib/tojson');\n\n\n// Converstion from JSON to SDP\n\nexports.toIncomingSDPOffer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'responder',\n direction: 'incoming'\n });\n};\nexports.toOutgoingSDPOffer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'initiator',\n direction: 'outgoing'\n });\n};\nexports.toIncomingSDPAnswer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'initiator',\n direction: 'incoming'\n });\n};\nexports.toOutgoingSDPAnswer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'responder',\n direction: 'outgoing'\n });\n};\nexports.toIncomingMediaSDPOffer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'responder',\n direction: 'incoming'\n });\n};\nexports.toOutgoingMediaSDPOffer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'initiator',\n direction: 'outgoing'\n });\n};\nexports.toIncomingMediaSDPAnswer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'initiator',\n direction: 'incoming'\n });\n};\nexports.toOutgoingMediaSDPAnswer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'responder',\n direction: 'outgoing'\n });\n};\nexports.toCandidateSDP = toSDP.toCandidateSDP;\nexports.toMediaSDP = toSDP.toMediaSDP;\nexports.toSessionSDP = toSDP.toSessionSDP;\n\n\n// Conversion from SDP to JSON\n\nexports.toIncomingJSONOffer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'responder',\n direction: 'incoming',\n creators: creators\n });\n};\nexports.toOutgoingJSONOffer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'initiator',\n direction: 'outgoing',\n creators: creators\n });\n};\nexports.toIncomingJSONAnswer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'initiator',\n direction: 'incoming',\n creators: creators\n });\n};\nexports.toOutgoingJSONAnswer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'responder',\n direction: 'outgoing',\n creators: creators\n });\n};\nexports.toIncomingMediaJSONOffer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'responder',\n direction: 'incoming',\n creator: creator\n });\n};\nexports.toOutgoingMediaJSONOffer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'initiator',\n direction: 'outgoing',\n creator: creator\n });\n};\nexports.toIncomingMediaJSONAnswer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'initiator',\n direction: 'incoming',\n creator: creator\n });\n};\nexports.toOutgoingMediaJSONAnswer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'responder',\n direction: 'outgoing',\n creator: creator\n });\n};\nexports.toCandidateJSON = toJSON.toCandidateJSON;\nexports.toMediaJSON = toJSON.toMediaJSON;\nexports.toSessionJSON = toJSON.toSessionJSON;\n\n},{\"./lib/tojson\":30,\"./lib/tosdp\":31}],28:[function(require,module,exports){\nexports.lines = function (sdp) {\n return sdp.split('\\r\\n').filter(function (line) {\n return line.length > 0;\n });\n};\n\nexports.findLine = function (prefix, mediaLines, sessionLines) {\n var prefixLength = prefix.length;\n for (var i = 0; i < mediaLines.length; i++) {\n if (mediaLines[i].substr(0, prefixLength) === prefix) {\n return mediaLines[i];\n }\n }\n // Continue searching in parent session section\n if (!sessionLines) {\n return false;\n }\n\n for (var j = 0; j < sessionLines.length; j++) {\n if (sessionLines[j].substr(0, prefixLength) === prefix) {\n return sessionLines[j];\n }\n }\n\n return false;\n};\n\nexports.findLines = function (prefix, mediaLines, sessionLines) {\n var results = [];\n var prefixLength = prefix.length;\n for (var i = 0; i < mediaLines.length; i++) {\n if (mediaLines[i].substr(0, prefixLength) === prefix) {\n results.push(mediaLines[i]);\n }\n }\n if (results.length || !sessionLines) {\n return results;\n }\n for (var j = 0; j < sessionLines.length; j++) {\n if (sessionLines[j].substr(0, prefixLength) === prefix) {\n results.push(sessionLines[j]);\n }\n }\n return results;\n};\n\nexports.mline = function (line) {\n var parts = line.substr(2).split(' ');\n var parsed = {\n media: parts[0],\n port: parts[1],\n proto: parts[2],\n formats: []\n };\n for (var i = 3; i < parts.length; i++) {\n if (parts[i]) {\n parsed.formats.push(parts[i]);\n }\n }\n return parsed;\n};\n\nexports.rtpmap = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n id: parts.shift()\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockrate = parts[1];\n parsed.channels = parts.length == 3 ? parts[2] : '1';\n return parsed;\n};\n\nexports.sctpmap = function (line) {\n // based on -05 draft\n var parts = line.substr(10).split(' ');\n var parsed = {\n number: parts.shift(),\n protocol: parts.shift(),\n streams: parts.shift()\n };\n return parsed;\n};\n\n\nexports.fmtp = function (line) {\n var kv, key, value;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n var parsed = [];\n for (var i = 0; i < parts.length; i++) {\n kv = parts[i].split('=');\n key = kv[0].trim();\n value = kv[1];\n if (key && value) {\n parsed.push({key: key, value: value});\n } else if (key) {\n parsed.push({key: '', value: key});\n }\n }\n return parsed;\n};\n\nexports.crypto = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n tag: parts[0],\n cipherSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3).join(' ')\n };\n return parsed;\n};\n\nexports.fingerprint = function (line) {\n var parts = line.substr(14).split(' ');\n return {\n hash: parts[0],\n value: parts[1]\n };\n};\n\nexports.extmap = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {};\n\n var idpart = parts.shift();\n var sp = idpart.indexOf('/');\n if (sp >= 0) {\n parsed.id = idpart.substr(0, sp);\n parsed.senders = idpart.substr(sp + 1);\n } else {\n parsed.id = idpart;\n parsed.senders = 'sendrecv';\n }\n\n parsed.uri = parts.shift() || '';\n\n return parsed;\n};\n\nexports.rtcpfb = function (line) {\n var parts = line.substr(10).split(' ');\n var parsed = {};\n parsed.id = parts.shift();\n parsed.type = parts.shift();\n if (parsed.type === 'trr-int') {\n parsed.value = parts.shift();\n } else {\n parsed.subtype = parts.shift() || '';\n }\n parsed.parameters = parts;\n return parsed;\n};\n\nexports.candidate = function (line) {\n var parts;\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else { // no a=candidate\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parts[3],\n ip: parts[4],\n port: parts[5],\n // skip parts[6] == 'typ'\n type: parts[7],\n generation: '0'\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n if (parts[i] === 'raddr') {\n candidate.relAddr = parts[i + 1];\n } else if (parts[i] === 'rport') {\n candidate.relPort = parts[i + 1];\n } else if (parts[i] === 'generation') {\n candidate.generation = parts[i + 1];\n } else if (parts[i] === 'tcptype') {\n candidate.tcpType = parts[i + 1];\n }\n }\n\n candidate.network = '1';\n\n return candidate;\n};\n\nexports.sourceGroups = function (lines) {\n var parsed = [];\n for (var i = 0; i < lines.length; i++) {\n var parts = lines[i].substr(13).split(' ');\n parsed.push({\n semantics: parts.shift(),\n sources: parts\n });\n }\n return parsed;\n};\n\nexports.sources = function (lines) {\n // http://tools.ietf.org/html/rfc5576\n var parsed = [];\n var sources = {};\n for (var i = 0; i < lines.length; i++) {\n var parts = lines[i].substr(7).split(' ');\n var ssrc = parts.shift();\n\n if (!sources[ssrc]) {\n var source = {\n ssrc: ssrc,\n parameters: []\n };\n parsed.push(source);\n\n // Keep an index\n sources[ssrc] = source;\n }\n\n parts = parts.join(' ').split(':');\n var attribute = parts.shift();\n var value = parts.join(':') || null;\n\n sources[ssrc].parameters.push({\n key: attribute,\n value: value\n });\n }\n\n return parsed;\n};\n\nexports.groups = function (lines) {\n // http://tools.ietf.org/html/rfc5888\n var parsed = [];\n var parts;\n for (var i = 0; i < lines.length; i++) {\n parts = lines[i].substr(8).split(' ');\n parsed.push({\n semantics: parts.shift(),\n contents: parts\n });\n }\n return parsed;\n};\n\nexports.bandwidth = function (line) {\n var parts = line.substr(2).split(':');\n var parsed = {};\n parsed.type = parts.shift();\n parsed.bandwidth = parts.shift();\n return parsed;\n};\n\nexports.msid = function (line) {\n var data = line.substr(7);\n var parts = data.split(' ');\n return {\n msid: data,\n mslabel: parts[0],\n label: parts[1]\n };\n};\n\n},{}],29:[function(require,module,exports){\nmodule.exports = {\n initiator: {\n incoming: {\n initiator: 'recvonly',\n responder: 'sendonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'initiator',\n sendonly: 'responder',\n sendrecv: 'both',\n inactive: 'none'\n },\n outgoing: {\n initiator: 'sendonly',\n responder: 'recvonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'responder',\n sendonly: 'initiator',\n sendrecv: 'both',\n inactive: 'none'\n }\n },\n responder: {\n incoming: {\n initiator: 'sendonly',\n responder: 'recvonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'responder',\n sendonly: 'initiator',\n sendrecv: 'both',\n inactive: 'none'\n },\n outgoing: {\n initiator: 'recvonly',\n responder: 'sendonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'initiator',\n sendonly: 'responder',\n sendrecv: 'both',\n inactive: 'none'\n }\n }\n};\n\n},{}],30:[function(require,module,exports){\nvar SENDERS = require('./senders');\nvar parsers = require('./parsers');\nvar idCounter = Math.random();\n\n\nexports._setIdCounter = function (counter) {\n idCounter = counter;\n};\n\nexports.toSessionJSON = function (sdp, opts) {\n var i;\n var creators = opts.creators || [];\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n\n // Divide the SDP into session and media sections.\n var media = sdp.split('\\r\\nm=');\n for (i = 1; i < media.length; i++) {\n media[i] = 'm=' + media[i];\n if (i !== media.length - 1) {\n media[i] += '\\r\\n';\n }\n }\n var session = media.shift() + '\\r\\n';\n var sessionLines = parsers.lines(session);\n var parsed = {};\n\n var contents = [];\n for (i = 0; i < media.length; i++) {\n contents.push(exports.toMediaJSON(media[i], session, {\n role: role,\n direction: direction,\n creator: creators[i] || 'initiator'\n }));\n }\n parsed.contents = contents;\n\n var groupLines = parsers.findLines('a=group:', sessionLines);\n if (groupLines.length) {\n parsed.groups = parsers.groups(groupLines);\n }\n\n return parsed;\n};\n\nexports.toMediaJSON = function (media, session, opts) {\n var creator = opts.creator || 'initiator';\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n var lines = parsers.lines(media);\n var sessionLines = parsers.lines(session);\n var mline = parsers.mline(lines[0]);\n\n var content = {\n creator: creator,\n name: mline.media,\n description: {\n descType: 'rtp',\n media: mline.media,\n payloads: [],\n encryption: [],\n feedback: [],\n headerExtensions: []\n },\n transport: {\n transType: 'iceUdp',\n candidates: [],\n fingerprints: []\n }\n };\n if (mline.media == 'application') {\n // FIXME: the description is most likely to be independent\n // of the SDP and should be processed by other parts of the library\n content.description = {\n descType: 'datachannel'\n };\n content.transport.sctp = [];\n }\n var desc = content.description;\n var trans = content.transport;\n\n // If we have a mid, use that for the content name instead.\n var mid = parsers.findLine('a=mid:', lines);\n if (mid) {\n content.name = mid.substr(6);\n }\n\n if (parsers.findLine('a=sendrecv', lines, sessionLines)) {\n content.senders = 'both';\n } else if (parsers.findLine('a=sendonly', lines, sessionLines)) {\n content.senders = SENDERS[role][direction].sendonly;\n } else if (parsers.findLine('a=recvonly', lines, sessionLines)) {\n content.senders = SENDERS[role][direction].recvonly;\n } else if (parsers.findLine('a=inactive', lines, sessionLines)) {\n content.senders = 'none';\n }\n\n if (desc.descType == 'rtp') {\n var bandwidth = parsers.findLine('b=', lines);\n if (bandwidth) {\n desc.bandwidth = parsers.bandwidth(bandwidth);\n }\n\n var ssrc = parsers.findLine('a=ssrc:', lines);\n if (ssrc) {\n desc.ssrc = ssrc.substr(7).split(' ')[0];\n }\n\n var rtpmapLines = parsers.findLines('a=rtpmap:', lines);\n rtpmapLines.forEach(function (line) {\n var payload = parsers.rtpmap(line);\n payload.parameters = [];\n payload.feedback = [];\n\n var fmtpLines = parsers.findLines('a=fmtp:' + payload.id, lines);\n // There should only be one fmtp line per payload\n fmtpLines.forEach(function (line) {\n payload.parameters = parsers.fmtp(line);\n });\n\n var fbLines = parsers.findLines('a=rtcp-fb:' + payload.id, lines);\n fbLines.forEach(function (line) {\n payload.feedback.push(parsers.rtcpfb(line));\n });\n\n desc.payloads.push(payload);\n });\n\n var cryptoLines = parsers.findLines('a=crypto:', lines, sessionLines);\n cryptoLines.forEach(function (line) {\n desc.encryption.push(parsers.crypto(line));\n });\n\n if (parsers.findLine('a=rtcp-mux', lines)) {\n desc.mux = true;\n }\n\n var fbLines = parsers.findLines('a=rtcp-fb:*', lines);\n fbLines.forEach(function (line) {\n desc.feedback.push(parsers.rtcpfb(line));\n });\n\n var extLines = parsers.findLines('a=extmap:', lines);\n extLines.forEach(function (line) {\n var ext = parsers.extmap(line);\n\n ext.senders = SENDERS[role][direction][ext.senders];\n\n desc.headerExtensions.push(ext);\n });\n\n var ssrcGroupLines = parsers.findLines('a=ssrc-group:', lines);\n desc.sourceGroups = parsers.sourceGroups(ssrcGroupLines || []);\n\n var ssrcLines = parsers.findLines('a=ssrc:', lines);\n var sources = desc.sources = parsers.sources(ssrcLines || []);\n\n var msidLine = parsers.findLine('a=msid:', lines);\n if (msidLine) {\n var msid = parsers.msid(msidLine);\n ['msid', 'mslabel', 'label'].forEach(function (key) {\n for (var i = 0; i < sources.length; i++) {\n var found = false;\n for (var j = 0; j < sources[i].parameters.length; j++) {\n if (sources[i].parameters[j].key === key) {\n found = true;\n }\n }\n if (!found) {\n sources[i].parameters.push({ key: key, value: msid[key] });\n }\n }\n });\n }\n\n if (parsers.findLine('a=x-google-flag:conference', lines, sessionLines)) {\n desc.googConferenceFlag = true;\n }\n }\n\n // transport specific attributes\n var fingerprintLines = parsers.findLines('a=fingerprint:', lines, sessionLines);\n var setup = parsers.findLine('a=setup:', lines, sessionLines);\n fingerprintLines.forEach(function (line) {\n var fp = parsers.fingerprint(line);\n if (setup) {\n fp.setup = setup.substr(8);\n }\n trans.fingerprints.push(fp);\n });\n\n var ufragLine = parsers.findLine('a=ice-ufrag:', lines, sessionLines);\n var pwdLine = parsers.findLine('a=ice-pwd:', lines, sessionLines);\n if (ufragLine && pwdLine) {\n trans.ufrag = ufragLine.substr(12);\n trans.pwd = pwdLine.substr(10);\n trans.candidates = [];\n\n var candidateLines = parsers.findLines('a=candidate:', lines, sessionLines);\n candidateLines.forEach(function (line) {\n trans.candidates.push(exports.toCandidateJSON(line));\n });\n }\n\n if (desc.descType == 'datachannel') {\n var sctpmapLines = parsers.findLines('a=sctpmap:', lines);\n sctpmapLines.forEach(function (line) {\n var sctp = parsers.sctpmap(line);\n trans.sctp.push(sctp);\n });\n }\n\n return content;\n};\n\nexports.toCandidateJSON = function (line) {\n var candidate = parsers.candidate(line.split('\\r\\n')[0]);\n candidate.id = (idCounter++).toString(36).substr(0, 12);\n return candidate;\n};\n\n},{\"./parsers\":28,\"./senders\":29}],31:[function(require,module,exports){\nvar SENDERS = require('./senders');\n\n\nexports.toSessionSDP = function (session, opts) {\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n var sid = opts.sid || session.sid || Date.now();\n var time = opts.time || Date.now();\n\n var sdp = [\n 'v=0',\n 'o=- ' + sid + ' ' + time + ' IN IP4 0.0.0.0',\n 's=-',\n 't=0 0',\n 'a=msid-semantic: WMS *'\n ];\n\n var groups = session.groups || [];\n groups.forEach(function (group) {\n sdp.push('a=group:' + group.semantics + ' ' + group.contents.join(' '));\n });\n\n var contents = session.contents || [];\n contents.forEach(function (content) {\n sdp.push(exports.toMediaSDP(content, opts));\n });\n\n return sdp.join('\\r\\n') + '\\r\\n';\n};\n\nexports.toMediaSDP = function (content, opts) {\n var sdp = [];\n\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n var desc = content.description;\n var transport = content.transport;\n var payloads = desc.payloads || [];\n var fingerprints = (transport && transport.fingerprints) || [];\n\n var mline = [];\n if (desc.descType == 'datachannel') {\n mline.push('application');\n mline.push('1');\n mline.push('DTLS/SCTP');\n if (transport.sctp) {\n transport.sctp.forEach(function (map) {\n mline.push(map.number);\n });\n }\n } else {\n mline.push(desc.media);\n mline.push('1');\n if ((desc.encryption && desc.encryption.length > 0) || (fingerprints.length > 0)) {\n mline.push('RTP/SAVPF');\n } else {\n mline.push('RTP/AVPF');\n }\n payloads.forEach(function (payload) {\n mline.push(payload.id);\n });\n }\n\n\n sdp.push('m=' + mline.join(' '));\n\n sdp.push('c=IN IP4 0.0.0.0');\n if (desc.bandwidth && desc.bandwidth.type && desc.bandwidth.bandwidth) {\n sdp.push('b=' + desc.bandwidth.type + ':' + desc.bandwidth.bandwidth);\n }\n if (desc.descType == 'rtp') {\n sdp.push('a=rtcp:1 IN IP4 0.0.0.0');\n }\n\n if (transport) {\n if (transport.ufrag) {\n sdp.push('a=ice-ufrag:' + transport.ufrag);\n }\n if (transport.pwd) {\n sdp.push('a=ice-pwd:' + transport.pwd);\n }\n\n var pushedSetup = false;\n fingerprints.forEach(function (fingerprint) {\n sdp.push('a=fingerprint:' + fingerprint.hash + ' ' + fingerprint.value);\n if (fingerprint.setup && !pushedSetup) {\n sdp.push('a=setup:' + fingerprint.setup);\n }\n });\n\n if (transport.sctp) {\n transport.sctp.forEach(function (map) {\n sdp.push('a=sctpmap:' + map.number + ' ' + map.protocol + ' ' + map.streams);\n });\n }\n }\n\n if (desc.descType == 'rtp') {\n sdp.push('a=' + (SENDERS[role][direction][content.senders] || 'sendrecv'));\n }\n sdp.push('a=mid:' + content.name);\n\n if (desc.sources && desc.sources.length) {\n (desc.sources[0].parameters || []).forEach(function (param) {\n if (param.key === 'msid') {\n sdp.push('a=msid:' + param.value);\n }\n });\n }\n\n if (desc.mux) {\n sdp.push('a=rtcp-mux');\n }\n\n var encryption = desc.encryption || [];\n encryption.forEach(function (crypto) {\n sdp.push('a=crypto:' + crypto.tag + ' ' + crypto.cipherSuite + ' ' + crypto.keyParams + (crypto.sessionParams ? ' ' + crypto.sessionParams : ''));\n });\n if (desc.googConferenceFlag) {\n sdp.push('a=x-google-flag:conference');\n }\n\n payloads.forEach(function (payload) {\n var rtpmap = 'a=rtpmap:' + payload.id + ' ' + payload.name + '/' + payload.clockrate;\n if (payload.channels && payload.channels != '1') {\n rtpmap += '/' + payload.channels;\n }\n sdp.push(rtpmap);\n\n if (payload.parameters && payload.parameters.length) {\n var fmtp = ['a=fmtp:' + payload.id];\n var parameters = [];\n payload.parameters.forEach(function (param) {\n parameters.push((param.key ? param.key + '=' : '') + param.value);\n });\n fmtp.push(parameters.join(';'));\n sdp.push(fmtp.join(' '));\n }\n\n if (payload.feedback) {\n payload.feedback.forEach(function (fb) {\n if (fb.type === 'trr-int') {\n sdp.push('a=rtcp-fb:' + payload.id + ' trr-int ' + (fb.value ? fb.value : '0'));\n } else {\n sdp.push('a=rtcp-fb:' + payload.id + ' ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n }\n });\n }\n });\n\n if (desc.feedback) {\n desc.feedback.forEach(function (fb) {\n if (fb.type === 'trr-int') {\n sdp.push('a=rtcp-fb:* trr-int ' + (fb.value ? fb.value : '0'));\n } else {\n sdp.push('a=rtcp-fb:* ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n }\n });\n }\n\n var hdrExts = desc.headerExtensions || [];\n hdrExts.forEach(function (hdr) {\n sdp.push('a=extmap:' + hdr.id + (hdr.senders ? '/' + SENDERS[role][direction][hdr.senders] : '') + ' ' + hdr.uri);\n });\n\n var ssrcGroups = desc.sourceGroups || [];\n ssrcGroups.forEach(function (ssrcGroup) {\n sdp.push('a=ssrc-group:' + ssrcGroup.semantics + ' ' + ssrcGroup.sources.join(' '));\n });\n\n var ssrcs = desc.sources || [];\n ssrcs.forEach(function (ssrc) {\n for (var i = 0; i < ssrc.parameters.length; i++) {\n var param = ssrc.parameters[i];\n sdp.push('a=ssrc:' + (ssrc.ssrc || desc.ssrc) + ' ' + param.key + (param.value ? (':' + param.value) : ''));\n }\n });\n\n var candidates = transport.candidates || [];\n candidates.forEach(function (candidate) {\n sdp.push(exports.toCandidateSDP(candidate));\n });\n\n return sdp.join('\\r\\n');\n};\n\nexports.toCandidateSDP = function (candidate) {\n var sdp = [];\n\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type === 'srflx' || type === 'prflx' || type === 'relay') {\n if (candidate.relAddr && candidate.relPort) {\n sdp.push('raddr');\n sdp.push(candidate.relAddr);\n sdp.push('rport');\n sdp.push(candidate.relPort);\n }\n }\n if (candidate.tcpType && candidate.protocol.toUpperCase() == 'TCP') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n\n sdp.push('generation');\n sdp.push(candidate.generation || '0');\n\n // FIXME: apparently this is wrong per spec\n // but then, we need this when actually putting this into\n // SDP so it's going to stay.\n // decision needs to be revisited when browsers dont\n // accept this any longer\n return 'a=candidate:' + sdp.join(' ');\n};\n\n},{\"./senders\":29}],32:[function(require,module,exports){\nvar util = require('util');\nvar webrtc = require('webrtcsupport');\nvar PeerConnection = require('rtcpeerconnection');\nvar WildEmitter = require('wildemitter');\nvar FileTransfer = require('filetransfer');\n\n// the inband-v1 protocol is sending metadata inband in a serialized JSON object\n// followed by the actual data. Receiver closes the datachannel upon completion\nvar INBAND_FILETRANSFER_V1 = 'https://simplewebrtc.com/protocol/filetransfer#inband-v1';\n\nfunction Peer(options) {\n var self = this;\n\n // call emitter constructor\n WildEmitter.call(this);\n\n this.id = options.id;\n this.parent = options.parent;\n this.type = options.type || 'video';\n this.oneway = options.oneway || false;\n this.sharemyscreen = options.sharemyscreen || false;\n this.browserPrefix = options.prefix;\n this.stream = options.stream;\n this.enableDataChannels = options.enableDataChannels === undefined ? this.parent.config.enableDataChannels : options.enableDataChannels;\n this.receiveMedia = options.receiveMedia || this.parent.config.receiveMedia;\n this.channels = {};\n this.sid = options.sid || Date.now().toString();\n // Create an RTCPeerConnection via the polyfill\n this.pc = new PeerConnection(this.parent.config.peerConnectionConfig, this.parent.config.peerConnectionConstraints);\n this.pc.on('ice', this.onIceCandidate.bind(this));\n this.pc.on('offer', function (offer) {\n if (self.parent.config.nick) offer.nick = self.parent.config.nick;\n self.send('offer', offer);\n });\n this.pc.on('answer', function (answer) {\n if (self.parent.config.nick) answer.nick = self.parent.config.nick;\n self.send('answer', answer);\n });\n this.pc.on('addStream', this.handleRemoteStreamAdded.bind(this));\n this.pc.on('addChannel', this.handleDataChannelAdded.bind(this));\n this.pc.on('removeStream', this.handleStreamRemoved.bind(this));\n // Just fire negotiation needed events for now\n // When browser re-negotiation handling seems to work\n // we can use this as the trigger for starting the offer/answer process\n // automatically. We'll just leave it be for now while this stabalizes.\n this.pc.on('negotiationNeeded', this.emit.bind(this, 'negotiationNeeded'));\n this.pc.on('iceConnectionStateChange', this.emit.bind(this, 'iceConnectionStateChange'));\n this.pc.on('iceConnectionStateChange', function () {\n switch (self.pc.iceConnectionState) {\n case 'failed':\n // currently, in chrome only the initiator goes to failed\n // so we need to signal this to the peer\n if (self.pc.pc.peerconnection.localDescription.type === 'offer') {\n self.parent.emit('iceFailed', self);\n self.send('connectivityError');\n }\n break;\n }\n });\n this.pc.on('signalingStateChange', this.emit.bind(this, 'signalingStateChange'));\n this.logger = this.parent.logger;\n\n // handle screensharing/broadcast mode\n if (options.type === 'screen') {\n if (this.parent.localScreen && this.sharemyscreen) {\n this.logger.log('adding local screen stream to peer connection');\n this.pc.addStream(this.parent.localScreen);\n this.broadcaster = options.broadcaster;\n }\n } else {\n this.parent.localStreams.forEach(function (stream) {\n self.pc.addStream(stream);\n });\n }\n\n this.on('channelOpen', function (channel) {\n if (channel.protocol === INBAND_FILETRANSFER_V1) {\n channel.onmessage = function (event) {\n var metadata = JSON.parse(event.data);\n var receiver = new FileTransfer.Receiver();\n receiver.receive(metadata, channel);\n self.emit('fileTransfer', metadata, receiver);\n receiver.on('receivedFile', function (file, metadata) {\n receiver.channel.close();\n });\n };\n }\n });\n\n // proxy events to parent\n this.on('*', function () {\n self.parent.emit.apply(self.parent, arguments);\n });\n}\n\nutil.inherits(Peer, WildEmitter);\n\nPeer.prototype.handleMessage = function (message) {\n var self = this;\n\n this.logger.log('getting', message.type, message);\n\n if (message.prefix) this.browserPrefix = message.prefix;\n\n if (message.type === 'offer') {\n if (!this.nick) this.nick = message.payload.nick;\n delete message.payload.nick;\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1064247\n message.payload.sdp = message.payload.sdp.replace('a=fmtp:0 profile-level-id=0x42e00c;packetization-mode=1\\r\\n', '');\n this.pc.handleOffer(message.payload, function (err) {\n if (err) {\n return;\n }\n // auto-accept\n self.pc.answer(self.receiveMedia, function (err, sessionDescription) {\n //self.send('answer', sessionDescription);\n });\n });\n } else if (message.type === 'answer') {\n if (!this.nick) this.nick = message.payload.nick;\n delete message.payload.nick;\n this.pc.handleAnswer(message.payload);\n } else if (message.type === 'candidate') {\n this.pc.processIce(message.payload);\n } else if (message.type === 'connectivityError') {\n this.parent.emit('connectivityError', self);\n } else if (message.type === 'mute') {\n this.parent.emit('mute', {id: message.from, name: message.payload.name});\n } else if (message.type === 'unmute') {\n this.parent.emit('unmute', {id: message.from, name: message.payload.name});\n }\n};\n\n// send via signalling channel\nPeer.prototype.send = function (messageType, payload) {\n var message = {\n to: this.id,\n sid: this.sid,\n broadcaster: this.broadcaster,\n roomType: this.type,\n type: messageType,\n payload: payload,\n prefix: webrtc.prefix\n };\n this.logger.log('sending', messageType, message);\n this.parent.emit('message', message);\n};\n\n// send via data channel\n// returns true when message was sent and false if channel is not open\nPeer.prototype.sendDirectly = function (channel, messageType, payload) {\n var message = {\n type: messageType,\n payload: payload\n };\n this.logger.log('sending via datachannel', channel, messageType, message);\n var dc = this.getDataChannel(channel);\n if (dc.readyState != 'open') return false;\n dc.send(JSON.stringify(message));\n return true;\n};\n\n// Internal method registering handlers for a data channel and emitting events on the peer\nPeer.prototype._observeDataChannel = function (channel) {\n var self = this;\n channel.onclose = this.emit.bind(this, 'channelClose', channel);\n channel.onerror = this.emit.bind(this, 'channelError', channel);\n channel.onmessage = function (event) {\n self.emit('channelMessage', self, channel.label, JSON.parse(event.data), channel, event);\n };\n channel.onopen = this.emit.bind(this, 'channelOpen', channel);\n};\n\n// Fetch or create a data channel by the given name\nPeer.prototype.getDataChannel = function (name, opts) {\n if (!webrtc.supportDataChannel) return this.emit('error', new Error('createDataChannel not supported'));\n var channel = this.channels[name];\n opts || (opts = {});\n if (channel) return channel;\n // if we don't have one by this label, create it\n channel = this.channels[name] = this.pc.createDataChannel(name, opts);\n this._observeDataChannel(channel);\n return channel;\n};\n\nPeer.prototype.onIceCandidate = function (candidate) {\n if (this.closed) return;\n if (candidate) {\n var pcConfig = this.parent.config.peerConnectionConfig;\n if (webrtc.prefix === 'moz' && pcConfig && pcConfig.iceTransports &&\n candidate.candidate && candidate.candidate.candidate &&\n candidate.candidate.candidate.indexOf(pcConfig.iceTransports) < 0) {\n this.logger.log('Ignoring ice candidate not matching pcConfig iceTransports type: ', pcConfig.iceTransports);\n } else {\n this.send('candidate', candidate);\n }\n } else {\n this.logger.log(\"End of candidates.\");\n }\n};\n\nPeer.prototype.start = function () {\n var self = this;\n\n // well, the webrtc api requires that we either\n // a) create a datachannel a priori\n // b) do a renegotiation later to add the SCTP m-line\n // Let's do (a) first...\n if (this.enableDataChannels) {\n this.getDataChannel('simplewebrtc');\n }\n\n this.pc.offer(this.receiveMedia, function (err, sessionDescription) {\n //self.send('offer', sessionDescription);\n });\n};\n\nPeer.prototype.icerestart = function () {\n var constraints = this.receiveMedia;\n constraints.mandatory.IceRestart = true;\n this.pc.offer(constraints, function (err, success) { });\n};\n\nPeer.prototype.end = function () {\n if (this.closed) return;\n this.pc.close();\n this.handleStreamRemoved();\n};\n\nPeer.prototype.handleRemoteStreamAdded = function (event) {\n var self = this;\n if (this.stream) {\n this.logger.warn('Already have a remote stream');\n } else {\n this.stream = event.stream;\n // FIXME: addEventListener('ended', ...) would be nicer\n // but does not work in firefox\n this.stream.onended = function () {\n self.end();\n };\n this.parent.emit('peerStreamAdded', this);\n }\n};\n\nPeer.prototype.handleStreamRemoved = function () {\n this.parent.peers.splice(this.parent.peers.indexOf(this), 1);\n this.closed = true;\n this.parent.emit('peerStreamRemoved', this);\n};\n\nPeer.prototype.handleDataChannelAdded = function (channel) {\n this.channels[channel.label] = channel;\n this._observeDataChannel(channel);\n};\n\nPeer.prototype.sendFile = function (file) {\n var sender = new FileTransfer.Sender();\n var dc = this.getDataChannel('filetransfer' + (new Date()).getTime(), {\n protocol: INBAND_FILETRANSFER_V1\n });\n // override onopen\n dc.onopen = function () {\n dc.send(JSON.stringify({\n size: file.size,\n name: file.name\n }));\n sender.send(file, dc);\n };\n // override onclose\n dc.onclose = function () {\n console.log('sender received transfer');\n sender.emit('complete');\n };\n return sender;\n};\n\nmodule.exports = Peer;\n\n},{\"filetransfer\":2,\"rtcpeerconnection\":26,\"util\":45,\"webrtcsupport\":39,\"wildemitter\":40}],33:[function(require,module,exports){\nvar WebRTC = require('./webrtc');\nvar WildEmitter = require('wildemitter');\nvar webrtcSupport = require('webrtcsupport');\nvar attachMediaStream = require('attachmediastream');\nvar mockconsole = require('mockconsole');\nvar SocketIoConnection = require('./socketioconnection');\n\nfunction SimpleWebRTC(opts) {\n var self = this;\n var options = opts || {};\n var config = this.config = {\n url: 'https://signaling.simplewebrtc.com:443/',\n socketio: {/* 'force new connection':true*/},\n connection: null,\n debug: false,\n localVideoEl: '',\n remoteVideosEl: '',\n enableDataChannels: true,\n autoRequestMedia: false,\n autoRemoveVideos: true,\n adjustPeerVolume: true,\n peerVolumeWhenSpeaking: 0.25,\n media: {\n video: true,\n audio: true\n },\n receiveMedia: { // FIXME: remove old chrome <= 37 constraints format\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n },\n localVideo: {\n autoplay: true,\n mirror: true,\n muted: true\n }\n };\n var item, connection;\n\n // We also allow a 'logger' option. It can be any object that implements\n // log, warn, and error methods.\n // We log nothing by default, following \"the rule of silence\":\n // http://www.linfo.org/rule_of_silence.html\n this.logger = function () {\n // we assume that if you're in debug mode and you didn't\n // pass in a logger, you actually want to log as much as\n // possible.\n if (opts.debug) {\n return opts.logger || console;\n } else {\n // or we'll use your logger which should have its own logic\n // for output. Or we'll return the no-op.\n return opts.logger || mockconsole;\n }\n }();\n\n // set our config from options\n for (item in options) {\n this.config[item] = options[item];\n }\n\n // attach detected support for convenience\n this.capabilities = webrtcSupport;\n\n // call WildEmitter constructor\n WildEmitter.call(this);\n\n // create default SocketIoConnection if it's not passed in\n if (this.config.connection === null) {\n connection = this.connection = new SocketIoConnection(this.config);\n } else {\n connection = this.connection = this.config.connection;\n }\n\n connection.on('connect', function () {\n self.emit('connectionReady', connection.getSessionid());\n self.sessionReady = true;\n self.testReadiness();\n });\n\n connection.on('message', function (message) {\n var peers = self.webrtc.getPeers(message.from, message.roomType);\n var peer;\n\n if (message.type === 'offer') {\n if (peers.length) {\n peers.forEach(function (p) {\n if (p.sid == message.sid) peer = p;\n });\n //if (!peer) peer = peers[0]; // fallback for old protocol versions\n }\n if (!peer) {\n peer = self.webrtc.createPeer({\n id: message.from,\n sid: message.sid,\n type: message.roomType,\n enableDataChannels: self.config.enableDataChannels && message.roomType !== 'screen',\n sharemyscreen: message.roomType === 'screen' && !message.broadcaster,\n broadcaster: message.roomType === 'screen' && !message.broadcaster ? self.connection.getSessionid() : null\n });\n self.emit('createdPeer', peer);\n }\n peer.handleMessage(message);\n } else if (peers.length) {\n peers.forEach(function (peer) {\n if (message.sid) {\n if (peer.sid === message.sid) {\n peer.handleMessage(message);\n }\n } else {\n peer.handleMessage(message);\n }\n });\n }\n });\n\n connection.on('remove', function (room) {\n if (room.id !== self.connection.getSessionid()) {\n self.webrtc.removePeers(room.id, room.type);\n }\n });\n\n // instantiate our main WebRTC helper\n // using same logger from logic here\n opts.logger = this.logger;\n opts.debug = false;\n this.webrtc = new WebRTC(opts);\n\n // attach a few methods from underlying lib to simple.\n ['mute', 'unmute', 'pauseVideo', 'resumeVideo', 'pause', 'resume', 'sendToAll', 'sendDirectlyToAll', 'getPeers'].forEach(function (method) {\n self[method] = self.webrtc[method].bind(self.webrtc);\n });\n\n // proxy events from WebRTC\n this.webrtc.on('*', function () {\n self.emit.apply(self, arguments);\n });\n\n // log all events in debug mode\n if (config.debug) {\n this.on('*', this.logger.log.bind(this.logger, 'SimpleWebRTC event:'));\n }\n\n // check for readiness\n this.webrtc.on('localStream', function () {\n self.testReadiness();\n });\n\n this.webrtc.on('message', function (payload) {\n self.connection.emit('message', payload);\n });\n\n this.webrtc.on('peerStreamAdded', this.handlePeerStreamAdded.bind(this));\n this.webrtc.on('peerStreamRemoved', this.handlePeerStreamRemoved.bind(this));\n\n // echo cancellation attempts\n if (this.config.adjustPeerVolume) {\n this.webrtc.on('speaking', this.setVolumeForAll.bind(this, this.config.peerVolumeWhenSpeaking));\n this.webrtc.on('stoppedSpeaking', this.setVolumeForAll.bind(this, 1));\n }\n\n connection.on('stunservers', function (args) {\n // resets/overrides the config\n self.webrtc.config.peerConnectionConfig.iceServers = args;\n self.emit('stunservers', args);\n });\n connection.on('turnservers', function (args) {\n // appends to the config\n self.webrtc.config.peerConnectionConfig.iceServers = self.webrtc.config.peerConnectionConfig.iceServers.concat(args);\n self.emit('turnservers', args);\n });\n\n this.webrtc.on('iceFailed', function (peer) {\n // local ice failure\n });\n this.webrtc.on('connectivityError', function (peer) {\n // remote ice failure\n });\n\n\n // sending mute/unmute to all peers\n this.webrtc.on('audioOn', function () {\n self.webrtc.sendToAll('unmute', {name: 'audio'});\n });\n this.webrtc.on('audioOff', function () {\n self.webrtc.sendToAll('mute', {name: 'audio'});\n });\n this.webrtc.on('videoOn', function () {\n self.webrtc.sendToAll('unmute', {name: 'video'});\n });\n this.webrtc.on('videoOff', function () {\n self.webrtc.sendToAll('mute', {name: 'video'});\n });\n\n // screensharing events\n this.webrtc.on('localScreen', function (stream) {\n var item,\n el = document.createElement('video'),\n container = self.getRemoteVideoContainer();\n\n el.oncontextmenu = function () { return false; };\n el.id = 'localScreen';\n attachMediaStream(stream, el);\n if (container) {\n container.appendChild(el);\n }\n\n self.emit('localScreenAdded', el);\n self.connection.emit('shareScreen');\n\n self.webrtc.peers.forEach(function (existingPeer) {\n var peer;\n if (existingPeer.type === 'video') {\n peer = self.webrtc.createPeer({\n id: existingPeer.id,\n type: 'screen',\n sharemyscreen: true,\n enableDataChannels: false,\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: false,\n OfferToReceiveVideo: false\n }\n },\n broadcaster: self.connection.getSessionid(),\n });\n self.emit('createdPeer', peer);\n peer.start();\n }\n });\n });\n this.webrtc.on('localScreenStopped', function (stream) {\n self.stopScreenShare();\n /*\n self.connection.emit('unshareScreen');\n self.webrtc.peers.forEach(function (peer) {\n if (peer.sharemyscreen) {\n peer.end();\n }\n });\n */\n });\n\n this.webrtc.on('channelMessage', function (peer, label, data) {\n if (data.type == 'volume') {\n self.emit('remoteVolumeChange', peer, data.volume);\n }\n });\n\n if (this.config.autoRequestMedia) this.startLocalVideo();\n}\n\n\nSimpleWebRTC.prototype = Object.create(WildEmitter.prototype, {\n constructor: {\n value: SimpleWebRTC\n }\n});\n\nSimpleWebRTC.prototype.leaveRoom = function () {\n if (this.roomName) {\n this.connection.emit('leave');\n this.webrtc.peers.forEach(function (peer) {\n peer.end();\n });\n if (this.getLocalScreen()) {\n this.stopScreenShare();\n }\n this.emit('leftRoom', this.roomName);\n this.roomName = undefined;\n }\n};\n\nSimpleWebRTC.prototype.disconnect = function () {\n this.connection.disconnect();\n delete this.connection;\n};\n\nSimpleWebRTC.prototype.handlePeerStreamAdded = function (peer) {\n var self = this;\n var container = this.getRemoteVideoContainer();\n var video = attachMediaStream(peer.stream);\n\n // store video element as part of peer for easy removal\n peer.videoEl = video;\n video.id = this.getDomId(peer);\n\n if (container) container.appendChild(video);\n\n this.emit('videoAdded', video, peer);\n\n // send our mute status to new peer if we're muted\n // currently called with a small delay because it arrives before\n // the video element is created otherwise (which happens after\n // the async setRemoteDescription-createAnswer)\n window.setTimeout(function () {\n if (!self.webrtc.isAudioEnabled()) {\n peer.send('mute', {name: 'audio'});\n }\n if (!self.webrtc.isVideoEnabled()) {\n peer.send('mute', {name: 'video'});\n }\n }, 250);\n};\n\nSimpleWebRTC.prototype.handlePeerStreamRemoved = function (peer) {\n var container = this.getRemoteVideoContainer();\n var videoEl = peer.videoEl;\n if (this.config.autoRemoveVideos && container && videoEl) {\n container.removeChild(videoEl);\n }\n if (videoEl) this.emit('videoRemoved', videoEl, peer);\n};\n\nSimpleWebRTC.prototype.getDomId = function (peer) {\n return [peer.id, peer.type, peer.broadcaster ? 'broadcasting' : 'incoming'].join('_');\n};\n\n// set volume on video tag for all peers takse a value between 0 and 1\nSimpleWebRTC.prototype.setVolumeForAll = function (volume) {\n this.webrtc.peers.forEach(function (peer) {\n if (peer.videoEl) peer.videoEl.volume = volume;\n });\n};\n\nSimpleWebRTC.prototype.joinRoom = function (name, cb) {\n var self = this;\n this.roomName = name;\n this.connection.emit('join', name, function (err, roomDescription) {\n if (err) {\n self.emit('error', err);\n } else {\n var id,\n client,\n type,\n peer;\n for (id in roomDescription.clients) {\n client = roomDescription.clients[id];\n for (type in client) {\n if (client[type]) {\n peer = self.webrtc.createPeer({\n id: id,\n type: type,\n enableDataChannels: self.config.enableDataChannels && type !== 'screen',\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: type !== 'screen' && self.config.receiveMedia.mandatory.OfferToReceiveAudio,\n OfferToReceiveVideo: self.config.receiveMedia.mandatory.OfferToReceiveVideo\n }\n }\n });\n self.emit('createdPeer', peer);\n peer.start();\n }\n }\n }\n }\n\n if (cb) cb(err, roomDescription);\n self.emit('joinedRoom', name);\n });\n};\n\nSimpleWebRTC.prototype.getEl = function (idOrEl) {\n if (typeof idOrEl === 'string') {\n return document.getElementById(idOrEl);\n } else {\n return idOrEl;\n }\n};\n\nSimpleWebRTC.prototype.startLocalVideo = function () {\n var self = this;\n this.webrtc.startLocalMedia(this.config.media, function (err, stream) {\n if (err) {\n self.emit('localMediaError', err);\n } else {\n attachMediaStream(stream, self.getLocalVideoContainer(), self.config.localVideo);\n }\n });\n};\n\nSimpleWebRTC.prototype.stopLocalVideo = function () {\n this.webrtc.stopLocalMedia();\n};\n\n// this accepts either element ID or element\n// and either the video tag itself or a container\n// that will be used to put the video tag into.\nSimpleWebRTC.prototype.getLocalVideoContainer = function () {\n var el = this.getEl(this.config.localVideoEl);\n if (el && el.tagName === 'VIDEO') {\n el.oncontextmenu = function () { return false; };\n return el;\n } else if (el) {\n var video = document.createElement('video');\n video.oncontextmenu = function () { return false; };\n el.appendChild(video);\n return video;\n } else {\n return;\n }\n};\n\nSimpleWebRTC.prototype.getRemoteVideoContainer = function () {\n return this.getEl(this.config.remoteVideosEl);\n};\n\nSimpleWebRTC.prototype.shareScreen = function (cb) {\n this.webrtc.startScreenShare(cb);\n};\n\nSimpleWebRTC.prototype.getLocalScreen = function () {\n return this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.stopScreenShare = function () {\n this.connection.emit('unshareScreen');\n var videoEl = document.getElementById('localScreen');\n var container = this.getRemoteVideoContainer();\n var stream = this.getLocalScreen();\n\n if (this.config.autoRemoveVideos && container && videoEl) {\n container.removeChild(videoEl);\n }\n\n // a hack to emit the event the removes the video\n // element that we want\n if (videoEl) this.emit('videoRemoved', videoEl);\n if (stream) stream.stop();\n this.webrtc.peers.forEach(function (peer) {\n if (peer.broadcaster) {\n peer.end();\n }\n });\n //delete this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.testReadiness = function () {\n var self = this;\n if (this.webrtc.localStream && this.sessionReady) {\n self.emit('readyToCall', self.connection.getSessionid());\n }\n};\n\nSimpleWebRTC.prototype.createRoom = function (name, cb) {\n if (arguments.length === 2) {\n this.connection.emit('create', name, cb);\n } else {\n this.connection.emit('create', name);\n }\n};\n\nSimpleWebRTC.prototype.sendFile = function () {\n if (!webrtcSupport.dataChannel) {\n return this.emit('error', new Error('DataChannelNotSupported'));\n }\n\n};\n\nmodule.exports = SimpleWebRTC;\n\n},{\"./socketioconnection\":34,\"./webrtc\":35,\"attachmediastream\":1,\"mockconsole\":25,\"webrtcsupport\":39,\"wildemitter\":40}],34:[function(require,module,exports){\nvar io = require('socket.io-client');\n\nfunction SocketIoConnection(config) {\n this.connection = io.connect(config.url, config.socketio);\n}\n\nSocketIoConnection.prototype.on = function (ev, fn) {\n this.connection.on(ev, fn);\n};\n\nSocketIoConnection.prototype.emit = function () {\n this.connection.emit.apply(this.connection, arguments);\n};\n\nSocketIoConnection.prototype.getSessionid = function () {\n return this.connection.socket.sessionid;\n};\n\nSocketIoConnection.prototype.disconnect = function () {\n return this.connection.disconnect();\n};\n\nmodule.exports = SocketIoConnection;\n\n},{\"socket.io-client\":36}],35:[function(require,module,exports){\nvar util = require('util');\nvar webrtc = require('webrtcsupport');\nvar WildEmitter = require('wildemitter');\nvar mockconsole = require('mockconsole');\nvar localMedia = require('localmedia');\nvar Peer = require('./peer');\n\n\nfunction WebRTC(opts) {\n var self = this;\n var options = opts || {};\n var config = this.config = {\n debug: false,\n // makes the entire PC config overridable\n peerConnectionConfig: {\n iceServers: [{\"url\": \"stun:stun.l.google.com:19302\"}]\n },\n peerConnectionConstraints: {\n optional: [\n {DtlsSrtpKeyAgreement: true}\n ]\n },\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n },\n enableDataChannels: true\n };\n var item;\n\n // expose screensharing check\n this.screenSharingSupport = webrtc.screenSharing;\n\n // We also allow a 'logger' option. It can be any object that implements\n // log, warn, and error methods.\n // We log nothing by default, following \"the rule of silence\":\n // http://www.linfo.org/rule_of_silence.html\n this.logger = function () {\n // we assume that if you're in debug mode and you didn't\n // pass in a logger, you actually want to log as much as\n // possible.\n if (opts.debug) {\n return opts.logger || console;\n } else {\n // or we'll use your logger which should have its own logic\n // for output. Or we'll return the no-op.\n return opts.logger || mockconsole;\n }\n }();\n\n // set options\n for (item in options) {\n this.config[item] = options[item];\n }\n\n // check for support\n if (!webrtc.support) {\n this.logger.error('Your browser doesn\\'t seem to support WebRTC');\n }\n\n // where we'll store our peer connections\n this.peers = [];\n\n // call localMedia constructor\n localMedia.call(this, this.config);\n\n this.on('speaking', function () {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'speaking'}));\n }\n });\n }\n });\n this.on('stoppedSpeaking', function () {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'stoppedSpeaking'}));\n }\n });\n }\n });\n this.on('volumeChange', function (volume, treshold) {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'volume', volume: volume }));\n }\n });\n }\n });\n\n // log events in debug mode\n if (this.config.debug) {\n this.on('*', function (event, val1, val2) {\n var logger;\n // if you didn't pass in a logger and you explicitly turning on debug\n // we're just going to assume you're wanting log output with console\n if (self.config.logger === mockconsole) {\n logger = console;\n } else {\n logger = self.logger;\n }\n logger.log('event:', event, val1, val2);\n });\n }\n}\n\nutil.inherits(WebRTC, localMedia);\n\nWebRTC.prototype.createPeer = function (opts) {\n var peer;\n opts.parent = this;\n peer = new Peer(opts);\n this.peers.push(peer);\n return peer;\n};\n\n// removes peers\nWebRTC.prototype.removePeers = function (id, type) {\n this.getPeers(id, type).forEach(function (peer) {\n peer.end();\n });\n};\n\n// fetches all Peer objects by session id and/or type\nWebRTC.prototype.getPeers = function (sessionId, type) {\n return this.peers.filter(function (peer) {\n return (!sessionId || peer.id === sessionId) && (!type || peer.type === type);\n });\n};\n\n// sends message to all\nWebRTC.prototype.sendToAll = function (message, payload) {\n this.peers.forEach(function (peer) {\n peer.send(message, payload);\n });\n};\n\n// sends message to all using a datachannel\n// only sends to anyone who has an open datachannel\nWebRTC.prototype.sendDirectlyToAll = function (channel, message, payload) {\n this.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n peer.sendDirectly(channel, message, payload);\n }\n });\n};\n\nmodule.exports = WebRTC;\n\n},{\"./peer\":32,\"localmedia\":6,\"mockconsole\":25,\"util\":45,\"webrtcsupport\":39,\"wildemitter\":40}],36:[function(require,module,exports){\n/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */\n\nvar io = ('undefined' === typeof module ? {} : module.exports);\n(function() {\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * IO namespace.\n *\n * @namespace\n */\n\n var io = exports;\n\n /**\n * Socket.IO version\n *\n * @api public\n */\n\n io.version = '0.9.16';\n\n /**\n * Protocol implemented.\n *\n * @api public\n */\n\n io.protocol = 1;\n\n /**\n * Available transports, these will be populated with the available transports\n *\n * @api public\n */\n\n io.transports = [];\n\n /**\n * Keep track of jsonp callbacks.\n *\n * @api private\n */\n\n io.j = [];\n\n /**\n * Keep track of our io.Sockets\n *\n * @api private\n */\n io.sockets = {};\n\n\n /**\n * Manages connections to hosts.\n *\n * @param {String} uri\n * @Param {Boolean} force creation of new socket (defaults to false)\n * @api public\n */\n\n io.connect = function (host, details) {\n var uri = io.util.parseUri(host)\n , uuri\n , socket;\n\n if (global && global.location) {\n uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n uri.host = uri.host || (global.document\n ? global.document.domain : global.location.hostname);\n uri.port = uri.port || global.location.port;\n }\n\n uuri = io.util.uniqueUri(uri);\n\n var options = {\n host: uri.host\n , secure: 'https' == uri.protocol\n , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n , query: uri.query || ''\n };\n\n io.util.merge(options, details);\n\n if (options['force new connection'] || !io.sockets[uuri]) {\n socket = new io.Socket(options);\n }\n\n if (!options['force new connection'] && socket) {\n io.sockets[uuri] = socket;\n }\n\n socket = socket || io.sockets[uuri];\n\n // if path is different from '' or /\n return socket.of(uri.path.length > 1 ? uri.path : '');\n };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * Utilities namespace.\n *\n * @namespace\n */\n\n var util = exports.util = {};\n\n /**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api public\n */\n\n var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n 'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n 'anchor'];\n\n util.parseUri = function (str) {\n var m = re.exec(str || '')\n , uri = {}\n , i = 14;\n\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n\n return uri;\n };\n\n /**\n * Produces a unique url that identifies a Socket.IO connection.\n *\n * @param {Object} uri\n * @api public\n */\n\n util.uniqueUri = function (uri) {\n var protocol = uri.protocol\n , host = uri.host\n , port = uri.port;\n\n if ('document' in global) {\n host = host || document.domain;\n port = port || (protocol == 'https'\n && document.location.protocol !== 'https:' ? 443 : document.location.port);\n } else {\n host = host || 'localhost';\n\n if (!port && protocol == 'https') {\n port = 443;\n }\n }\n\n return (protocol || 'http') + '://' + host + ':' + (port || 80);\n };\n\n /**\n * Mergest 2 query strings in to once unique query string\n *\n * @param {String} base\n * @param {String} addition\n * @api public\n */\n\n util.query = function (base, addition) {\n var query = util.chunkQuery(base || '')\n , components = [];\n\n util.merge(query, util.chunkQuery(addition || ''));\n for (var part in query) {\n if (query.hasOwnProperty(part)) {\n components.push(part + '=' + query[part]);\n }\n }\n\n return components.length ? '?' + components.join('&') : '';\n };\n\n /**\n * Transforms a querystring in to an object\n *\n * @param {String} qs\n * @api public\n */\n\n util.chunkQuery = function (qs) {\n var query = {}\n , params = qs.split('&')\n , i = 0\n , l = params.length\n , kv;\n\n for (; i < l; ++i) {\n kv = params[i].split('=');\n if (kv[0]) {\n query[kv[0]] = kv[1];\n }\n }\n\n return query;\n };\n\n /**\n * Executes the given function when the page is loaded.\n *\n * io.util.load(function () { console.log('page loaded'); });\n *\n * @param {Function} fn\n * @api public\n */\n\n var pageLoaded = false;\n\n util.load = function (fn) {\n if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n return fn();\n }\n\n util.on(global, 'load', fn, false);\n };\n\n /**\n * Adds an event.\n *\n * @api private\n */\n\n util.on = function (element, event, fn, capture) {\n if (element.attachEvent) {\n element.attachEvent('on' + event, fn);\n } else if (element.addEventListener) {\n element.addEventListener(event, fn, capture);\n }\n };\n\n /**\n * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n *\n * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n * @api private\n */\n\n util.request = function (xdomain) {\n\n if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) {\n return new XDomainRequest();\n }\n\n if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n return new XMLHttpRequest();\n }\n\n if (!xdomain) {\n try {\n return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP');\n } catch(e) { }\n }\n\n return null;\n };\n\n /**\n * XHR based transport constructor.\n *\n * @constructor\n * @api public\n */\n\n /**\n * Change the internal pageLoaded value.\n */\n\n if ('undefined' != typeof window) {\n util.load(function () {\n pageLoaded = true;\n });\n }\n\n /**\n * Defers a function to ensure a spinner is not displayed by the browser\n *\n * @param {Function} fn\n * @api public\n */\n\n util.defer = function (fn) {\n if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n return fn();\n }\n\n util.load(function () {\n setTimeout(fn, 100);\n });\n };\n\n /**\n * Merges two objects.\n *\n * @api public\n */\n\n util.merge = function merge (target, additional, deep, lastseen) {\n var seen = lastseen || []\n , depth = typeof deep == 'undefined' ? 2 : deep\n , prop;\n\n for (prop in additional) {\n if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n if (typeof target[prop] !== 'object' || !depth) {\n target[prop] = additional[prop];\n seen.push(additional[prop]);\n } else {\n util.merge(target[prop], additional[prop], depth - 1, seen);\n }\n }\n }\n\n return target;\n };\n\n /**\n * Merges prototypes from objects\n *\n * @api public\n */\n\n util.mixin = function (ctor, ctor2) {\n util.merge(ctor.prototype, ctor2.prototype);\n };\n\n /**\n * Shortcut for prototypical and static inheritance.\n *\n * @api private\n */\n\n util.inherit = function (ctor, ctor2) {\n function f() {};\n f.prototype = ctor2.prototype;\n ctor.prototype = new f;\n };\n\n /**\n * Checks if the given object is an Array.\n *\n * io.util.isArray([]); // true\n * io.util.isArray({}); // false\n *\n * @param Object obj\n * @api public\n */\n\n util.isArray = Array.isArray || function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n\n /**\n * Intersects values of two arrays into a third\n *\n * @api public\n */\n\n util.intersect = function (arr, arr2) {\n var ret = []\n , longest = arr.length > arr2.length ? arr : arr2\n , shortest = arr.length > arr2.length ? arr2 : arr;\n\n for (var i = 0, l = shortest.length; i < l; i++) {\n if (~util.indexOf(longest, shortest[i]))\n ret.push(shortest[i]);\n }\n\n return ret;\n };\n\n /**\n * Array indexOf compatibility.\n *\n * @see bit.ly/a5Dxa2\n * @api public\n */\n\n util.indexOf = function (arr, o, i) {\n\n for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0;\n i < j && arr[i] !== o; i++) {}\n\n return j <= i ? -1 : i;\n };\n\n /**\n * Converts enumerables to array.\n *\n * @api public\n */\n\n util.toArray = function (enu) {\n var arr = [];\n\n for (var i = 0, l = enu.length; i < l; i++)\n arr.push(enu[i]);\n\n return arr;\n };\n\n /**\n * UA / engines detection namespace.\n *\n * @namespace\n */\n\n util.ua = {};\n\n /**\n * Whether the UA supports CORS for XHR.\n *\n * @api public\n */\n\n util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n try {\n var a = new XMLHttpRequest();\n } catch (e) {\n return false;\n }\n\n return a.withCredentials != undefined;\n })();\n\n /**\n * Detect webkit.\n *\n * @api public\n */\n\n util.ua.webkit = 'undefined' != typeof navigator\n && /webkit/i.test(navigator.userAgent);\n\n /**\n * Detect iPad/iPhone/iPod.\n *\n * @api public\n */\n\n util.ua.iDevice = 'undefined' != typeof navigator\n && /iPad|iPhone|iPod/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.EventEmitter = EventEmitter;\n\n /**\n * Event emitter constructor.\n *\n * @api public.\n */\n\n function EventEmitter () {};\n\n /**\n * Adds a listener\n *\n * @api public\n */\n\n EventEmitter.prototype.on = function (name, fn) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = fn;\n } else if (io.util.isArray(this.$events[name])) {\n this.$events[name].push(fn);\n } else {\n this.$events[name] = [this.$events[name], fn];\n }\n\n return this;\n };\n\n EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n /**\n * Adds a volatile listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.once = function (name, fn) {\n var self = this;\n\n function on () {\n self.removeListener(name, on);\n fn.apply(this, arguments);\n };\n\n on.listener = fn;\n this.on(name, on);\n\n return this;\n };\n\n /**\n * Removes a listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeListener = function (name, fn) {\n if (this.$events && this.$events[name]) {\n var list = this.$events[name];\n\n if (io.util.isArray(list)) {\n var pos = -1;\n\n for (var i = 0, l = list.length; i < l; i++) {\n if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n pos = i;\n break;\n }\n }\n\n if (pos < 0) {\n return this;\n }\n\n list.splice(pos, 1);\n\n if (!list.length) {\n delete this.$events[name];\n }\n } else if (list === fn || (list.listener && list.listener === fn)) {\n delete this.$events[name];\n }\n }\n\n return this;\n };\n\n /**\n * Removes all listeners for an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeAllListeners = function (name) {\n if (name === undefined) {\n this.$events = {};\n return this;\n }\n\n if (this.$events && this.$events[name]) {\n this.$events[name] = null;\n }\n\n return this;\n };\n\n /**\n * Gets all listeners for a certain event.\n *\n * @api publci\n */\n\n EventEmitter.prototype.listeners = function (name) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = [];\n }\n\n if (!io.util.isArray(this.$events[name])) {\n this.$events[name] = [this.$events[name]];\n }\n\n return this.$events[name];\n };\n\n /**\n * Emits an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.emit = function (name) {\n if (!this.$events) {\n return false;\n }\n\n var handler = this.$events[name];\n\n if (!handler) {\n return false;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n\n if ('function' == typeof handler) {\n handler.apply(this, args);\n } else if (io.util.isArray(handler)) {\n var listeners = handler.slice();\n\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n } else {\n return false;\n }\n\n return true;\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n \"use strict\";\n\n // use native JSON if it's available\n if (nativeJSON && nativeJSON.parse){\n return exports.JSON = {\n parse: nativeJSON.parse\n , stringify: nativeJSON.stringify\n };\n }\n\n var JSON = exports.JSON = {};\n\n function f(n) {\n // Format integers to have at least two digits.\n return n < 10 ? '0' + n : n;\n }\n\n function date(d, key) {\n return isFinite(d.valueOf()) ?\n d.getUTCFullYear() + '-' +\n f(d.getUTCMonth() + 1) + '-' +\n f(d.getUTCDate()) + 'T' +\n f(d.getUTCHours()) + ':' +\n f(d.getUTCMinutes()) + ':' +\n f(d.getUTCSeconds()) + 'Z' : null;\n };\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n\n function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n }\n\n\n function str(key, holder) {\n\n// Produce a string from holder[key].\n\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value instanceof Date) {\n value = date(key);\n }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n// What happens next depends on the value's type.\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n if (!value) {\n return 'null';\n }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n gap += indent;\n partial = [];\n\n// Is the value an array?\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n if (typeof rep[i] === 'string') {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n var i;\n gap = '';\n indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n } else if (typeof space === 'string') {\n indent = space;\n }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n return str('', {'': value});\n };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n JSON.parse = function (text, reviver) {\n // The parse method takes a text and an optional reviver function, and returns\n // a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n // The walk method is used to recursively walk the resulting structure so\n // that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n // Parsing happens in four stages. In the first stage, we replace certain\n // Unicode characters with escape sequences. JavaScript handles many characters\n // incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n // In the second stage, we run the text against regular expressions that look\n // for non-JSON patterns. We are especially concerned with '()' and 'new'\n // because they can cause invocation, and '=' because it can cause mutation.\n // But just to be safe, we want to reject all unexpected forms.\n\n // We split the second stage into 4 regexp operations in order to work around\n // crippling inefficiencies in IE's and Safari's regexp engines. First we\n // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n // replace all simple value tokens with ']' characters. Third, we delete all\n // open brackets that follow a colon or comma or that begin the text. Finally,\n // we look to see that the remaining characters are only whitespace or ']' or\n // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n // In the third stage we use the eval function to compile the text into a\n // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n // in JavaScript: it can begin a block or an object literal. We wrap the text\n // in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n // In the optional fourth stage, we recursively walk the new structure, passing\n // each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') : j;\n }\n\n // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Parser namespace.\n *\n * @namespace\n */\n\n var parser = exports.parser = {};\n\n /**\n * Packet types.\n */\n\n var packets = parser.packets = [\n 'disconnect'\n , 'connect'\n , 'heartbeat'\n , 'message'\n , 'json'\n , 'event'\n , 'ack'\n , 'error'\n , 'noop'\n ];\n\n /**\n * Errors reasons.\n */\n\n var reasons = parser.reasons = [\n 'transport not supported'\n , 'client not handshaken'\n , 'unauthorized'\n ];\n\n /**\n * Errors advice.\n */\n\n var advice = parser.advice = [\n 'reconnect'\n ];\n\n /**\n * Shortcuts.\n */\n\n var JSON = io.JSON\n , indexOf = io.util.indexOf;\n\n /**\n * Encodes a packet.\n *\n * @api private\n */\n\n parser.encodePacket = function (packet) {\n var type = indexOf(packets, packet.type)\n , id = packet.id || ''\n , endpoint = packet.endpoint || ''\n , ack = packet.ack\n , data = null;\n\n switch (packet.type) {\n case 'error':\n var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n if (reason !== '' || adv !== '')\n data = reason + (adv !== '' ? ('+' + adv) : '');\n\n break;\n\n case 'message':\n if (packet.data !== '')\n data = packet.data;\n break;\n\n case 'event':\n var ev = { name: packet.name };\n\n if (packet.args && packet.args.length) {\n ev.args = packet.args;\n }\n\n data = JSON.stringify(ev);\n break;\n\n case 'json':\n data = JSON.stringify(packet.data);\n break;\n\n case 'connect':\n if (packet.qs)\n data = packet.qs;\n break;\n\n case 'ack':\n data = packet.ackId\n + (packet.args && packet.args.length\n ? '+' + JSON.stringify(packet.args) : '');\n break;\n }\n\n // construct packet with required fragments\n var encoded = [\n type\n , id + (ack == 'data' ? '+' : '')\n , endpoint\n ];\n\n // data fragment is optional\n if (data !== null && data !== undefined)\n encoded.push(data);\n\n return encoded.join(':');\n };\n\n /**\n * Encodes multiple messages (payload).\n *\n * @param {Array} messages\n * @api private\n */\n\n parser.encodePayload = function (packets) {\n var decoded = '';\n\n if (packets.length == 1)\n return packets[0];\n\n for (var i = 0, l = packets.length; i < l; i++) {\n var packet = packets[i];\n decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n }\n\n return decoded;\n };\n\n /**\n * Decodes a packet\n *\n * @api private\n */\n\n var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n parser.decodePacket = function (data) {\n var pieces = data.match(regexp);\n\n if (!pieces) return {};\n\n var id = pieces[2] || ''\n , data = pieces[5] || ''\n , packet = {\n type: packets[pieces[1]]\n , endpoint: pieces[4] || ''\n };\n\n // whether we need to acknowledge the packet\n if (id) {\n packet.id = id;\n if (pieces[3])\n packet.ack = 'data';\n else\n packet.ack = true;\n }\n\n // handle different packet types\n switch (packet.type) {\n case 'error':\n var pieces = data.split('+');\n packet.reason = reasons[pieces[0]] || '';\n packet.advice = advice[pieces[1]] || '';\n break;\n\n case 'message':\n packet.data = data || '';\n break;\n\n case 'event':\n try {\n var opts = JSON.parse(data);\n packet.name = opts.name;\n packet.args = opts.args;\n } catch (e) { }\n\n packet.args = packet.args || [];\n break;\n\n case 'json':\n try {\n packet.data = JSON.parse(data);\n } catch (e) { }\n break;\n\n case 'connect':\n packet.qs = data || '';\n break;\n\n case 'ack':\n var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n if (pieces) {\n packet.ackId = pieces[1];\n packet.args = [];\n\n if (pieces[3]) {\n try {\n packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n } catch (e) { }\n }\n }\n break;\n\n case 'disconnect':\n case 'heartbeat':\n break;\n };\n\n return packet;\n };\n\n /**\n * Decodes data payload. Detects multiple messages\n *\n * @return {Array} messages\n * @api public\n */\n\n parser.decodePayload = function (data) {\n // IE doesn't like data[i] for unicode chars, charAt works fine\n if (data.charAt(0) == '\\ufffd') {\n var ret = [];\n\n for (var i = 1, length = ''; i < data.length; i++) {\n if (data.charAt(i) == '\\ufffd') {\n ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n i += Number(length) + 1;\n length = '';\n } else {\n length += data.charAt(i);\n }\n }\n\n return ret;\n } else {\n return [parser.decodePacket(data)];\n }\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.Transport = Transport;\n\n /**\n * This is the transport template for all supported transport methods.\n *\n * @constructor\n * @api public\n */\n\n function Transport (socket, sessid) {\n this.socket = socket;\n this.sessid = sessid;\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Transport, io.EventEmitter);\n\n\n /**\n * Indicates whether heartbeats is enabled for this transport\n *\n * @api private\n */\n\n Transport.prototype.heartbeats = function () {\n return true;\n };\n\n /**\n * Handles the response from the server. When a new response is received\n * it will automatically update the timeout, decode the message and\n * forwards the response to the onMessage function for further processing.\n *\n * @param {String} data Response from the server.\n * @api private\n */\n\n Transport.prototype.onData = function (data) {\n this.clearCloseTimeout();\n\n // If the connection in currently open (or in a reopening state) reset the close\n // timeout since we have just received data. This check is necessary so\n // that we don't reset the timeout on an explicitly disconnected connection.\n if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) {\n this.setCloseTimeout();\n }\n\n if (data !== '') {\n // todo: we should only do decodePayload for xhr transports\n var msgs = io.parser.decodePayload(data);\n\n if (msgs && msgs.length) {\n for (var i = 0, l = msgs.length; i < l; i++) {\n this.onPacket(msgs[i]);\n }\n }\n }\n\n return this;\n };\n\n /**\n * Handles packets.\n *\n * @api private\n */\n\n Transport.prototype.onPacket = function (packet) {\n this.socket.setHeartbeatTimeout();\n\n if (packet.type == 'heartbeat') {\n return this.onHeartbeat();\n }\n\n if (packet.type == 'connect' && packet.endpoint == '') {\n this.onConnect();\n }\n\n if (packet.type == 'error' && packet.advice == 'reconnect') {\n this.isOpen = false;\n }\n\n this.socket.onPacket(packet);\n\n return this;\n };\n\n /**\n * Sets close timeout\n *\n * @api private\n */\n\n Transport.prototype.setCloseTimeout = function () {\n if (!this.closeTimeout) {\n var self = this;\n\n this.closeTimeout = setTimeout(function () {\n self.onDisconnect();\n }, this.socket.closeTimeout);\n }\n };\n\n /**\n * Called when transport disconnects.\n *\n * @api private\n */\n\n Transport.prototype.onDisconnect = function () {\n if (this.isOpen) this.close();\n this.clearTimeouts();\n this.socket.onDisconnect();\n return this;\n };\n\n /**\n * Called when transport connects\n *\n * @api private\n */\n\n Transport.prototype.onConnect = function () {\n this.socket.onConnect();\n return this;\n };\n\n /**\n * Clears close timeout\n *\n * @api private\n */\n\n Transport.prototype.clearCloseTimeout = function () {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n };\n\n /**\n * Clear timeouts\n *\n * @api private\n */\n\n Transport.prototype.clearTimeouts = function () {\n this.clearCloseTimeout();\n\n if (this.reopenTimeout) {\n clearTimeout(this.reopenTimeout);\n }\n };\n\n /**\n * Sends a packet\n *\n * @param {Object} packet object.\n * @api private\n */\n\n Transport.prototype.packet = function (packet) {\n this.send(io.parser.encodePacket(packet));\n };\n\n /**\n * Send the received heartbeat message back to server. So the server\n * knows we are still connected.\n *\n * @param {String} heartbeat Heartbeat response from the server.\n * @api private\n */\n\n Transport.prototype.onHeartbeat = function (heartbeat) {\n this.packet({ type: 'heartbeat' });\n };\n\n /**\n * Called when the transport opens.\n *\n * @api private\n */\n\n Transport.prototype.onOpen = function () {\n this.isOpen = true;\n this.clearCloseTimeout();\n this.socket.onOpen();\n };\n\n /**\n * Notifies the base when the connection with the Socket.IO server\n * has been disconnected.\n *\n * @api private\n */\n\n Transport.prototype.onClose = function () {\n var self = this;\n\n /* FIXME: reopen delay causing a infinit loop\n this.reopenTimeout = setTimeout(function () {\n self.open();\n }, this.socket.options['reopen delay']);*/\n\n this.isOpen = false;\n this.socket.onClose();\n this.onDisconnect();\n };\n\n /**\n * Generates a connection url based on the Socket.IO URL Protocol.\n * See <https://github.com/learnboost/socket.io-node/> for more details.\n *\n * @returns {String} Connection url\n * @api private\n */\n\n Transport.prototype.prepareUrl = function () {\n var options = this.socket.options;\n\n return this.scheme() + '://'\n + options.host + ':' + options.port + '/'\n + options.resource + '/' + io.protocol\n + '/' + this.name + '/' + this.sessid;\n };\n\n /**\n * Checks if the transport is ready to start a connection.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n Transport.prototype.ready = function (socket, fn) {\n fn.call(this);\n };\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports.Socket = Socket;\n\n /**\n * Create a new `Socket.IO client` which can establish a persistent\n * connection with a Socket.IO enabled server.\n *\n * @api public\n */\n\n function Socket (options) {\n this.options = {\n port: 80\n , secure: false\n , document: 'document' in global ? document : false\n , resource: 'socket.io'\n , transports: io.transports\n , 'connect timeout': 10000\n , 'try multiple transports': true\n , 'reconnect': true\n , 'reconnection delay': 500\n , 'reconnection limit': Infinity\n , 'reopen delay': 3000\n , 'max reconnection attempts': 10\n , 'sync disconnect on unload': false\n , 'auto connect': true\n , 'flash policy port': 10843\n , 'manualFlush': false\n };\n\n io.util.merge(this.options, options);\n\n this.connected = false;\n this.open = false;\n this.connecting = false;\n this.reconnecting = false;\n this.namespaces = {};\n this.buffer = [];\n this.doBuffer = false;\n\n if (this.options['sync disconnect on unload'] &&\n (!this.isXDomain() || io.util.ua.hasCORS)) {\n var self = this;\n io.util.on(global, 'beforeunload', function () {\n self.disconnectSync();\n }, false);\n }\n\n if (this.options['auto connect']) {\n this.connect();\n }\n};\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Socket, io.EventEmitter);\n\n /**\n * Returns a namespace listener/emitter for this socket\n *\n * @api public\n */\n\n Socket.prototype.of = function (name) {\n if (!this.namespaces[name]) {\n this.namespaces[name] = new io.SocketNamespace(this, name);\n\n if (name !== '') {\n this.namespaces[name].packet({ type: 'connect' });\n }\n }\n\n return this.namespaces[name];\n };\n\n /**\n * Emits the given event to the Socket and all namespaces\n *\n * @api private\n */\n\n Socket.prototype.publish = function () {\n this.emit.apply(this, arguments);\n\n var nsp;\n\n for (var i in this.namespaces) {\n if (this.namespaces.hasOwnProperty(i)) {\n nsp = this.of(i);\n nsp.$emit.apply(nsp, arguments);\n }\n }\n };\n\n /**\n * Performs the handshake\n *\n * @api private\n */\n\n function empty () { };\n\n Socket.prototype.handshake = function (fn) {\n var self = this\n , options = this.options;\n\n function complete (data) {\n if (data instanceof Error) {\n self.connecting = false;\n self.onError(data.message);\n } else {\n fn.apply(null, data.split(':'));\n }\n };\n\n var url = [\n 'http' + (options.secure ? 's' : '') + ':/'\n , options.host + ':' + options.port\n , options.resource\n , io.protocol\n , io.util.query(this.options.query, 't=' + +new Date)\n ].join('/');\n\n if (this.isXDomain() && !io.util.ua.hasCORS) {\n var insertAt = document.getElementsByTagName('script')[0]\n , script = document.createElement('script');\n\n script.src = url + '&jsonp=' + io.j.length;\n insertAt.parentNode.insertBefore(script, insertAt);\n\n io.j.push(function (data) {\n complete(data);\n script.parentNode.removeChild(script);\n });\n } else {\n var xhr = io.util.request();\n\n xhr.open('GET', url, true);\n if (this.isXDomain()) {\n xhr.withCredentials = true;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty;\n\n if (xhr.status == 200) {\n complete(xhr.responseText);\n } else if (xhr.status == 403) {\n self.onError(xhr.responseText);\n } else {\n self.connecting = false; \n !self.reconnecting && self.onError(xhr.responseText);\n }\n }\n };\n xhr.send(null);\n }\n };\n\n /**\n * Find an available transport based on the options supplied in the constructor.\n *\n * @api private\n */\n\n Socket.prototype.getTransport = function (override) {\n var transports = override || this.transports, match;\n\n for (var i = 0, transport; transport = transports[i]; i++) {\n if (io.Transport[transport]\n && io.Transport[transport].check(this)\n && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) {\n return new io.Transport[transport](this, this.sessionid);\n }\n }\n\n return null;\n };\n\n /**\n * Connects to the server.\n *\n * @param {Function} [fn] Callback.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.connect = function (fn) {\n if (this.connecting) {\n return this;\n }\n\n var self = this;\n self.connecting = true;\n \n this.handshake(function (sid, heartbeat, close, transports) {\n self.sessionid = sid;\n self.closeTimeout = close * 1000;\n self.heartbeatTimeout = heartbeat * 1000;\n if(!self.transports)\n self.transports = self.origTransports = (transports ? io.util.intersect(\n transports.split(',')\n , self.options.transports\n ) : self.options.transports);\n\n self.setHeartbeatTimeout();\n\n function connect (transports){\n if (self.transport) self.transport.clearTimeouts();\n\n self.transport = self.getTransport(transports);\n if (!self.transport) return self.publish('connect_failed');\n\n // once the transport is ready\n self.transport.ready(self, function () {\n self.connecting = true;\n self.publish('connecting', self.transport.name);\n self.transport.open();\n\n if (self.options['connect timeout']) {\n self.connectTimeoutTimer = setTimeout(function () {\n if (!self.connected) {\n self.connecting = false;\n\n if (self.options['try multiple transports']) {\n var remaining = self.transports;\n\n while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n self.transport.name) {}\n\n if (remaining.length){\n connect(remaining);\n } else {\n self.publish('connect_failed');\n }\n }\n }\n }, self.options['connect timeout']);\n }\n });\n }\n\n connect(self.transports);\n\n self.once('connect', function (){\n clearTimeout(self.connectTimeoutTimer);\n\n fn && typeof fn == 'function' && fn();\n });\n });\n\n return this;\n };\n\n /**\n * Clears and sets a new heartbeat timeout using the value given by the\n * server during the handshake.\n *\n * @api private\n */\n\n Socket.prototype.setHeartbeatTimeout = function () {\n clearTimeout(this.heartbeatTimeoutTimer);\n if(this.transport && !this.transport.heartbeats()) return;\n\n var self = this;\n this.heartbeatTimeoutTimer = setTimeout(function () {\n self.transport.onClose();\n }, this.heartbeatTimeout);\n };\n\n /**\n * Sends a message.\n *\n * @param {Object} data packet.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.packet = function (data) {\n if (this.connected && !this.doBuffer) {\n this.transport.packet(data);\n } else {\n this.buffer.push(data);\n }\n\n return this;\n };\n\n /**\n * Sets buffer state\n *\n * @api private\n */\n\n Socket.prototype.setBuffer = function (v) {\n this.doBuffer = v;\n\n if (!v && this.connected && this.buffer.length) {\n if (!this.options['manualFlush']) {\n this.flushBuffer();\n }\n }\n };\n\n /**\n * Flushes the buffer data over the wire.\n * To be invoked manually when 'manualFlush' is set to true.\n *\n * @api public\n */\n\n Socket.prototype.flushBuffer = function() {\n this.transport.payload(this.buffer);\n this.buffer = [];\n };\n \n\n /**\n * Disconnect the established connect.\n *\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.disconnect = function () {\n if (this.connected || this.connecting) {\n if (this.open) {\n this.of('').packet({ type: 'disconnect' });\n }\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n }\n\n return this;\n };\n\n /**\n * Disconnects the socket with a sync XHR.\n *\n * @api private\n */\n\n Socket.prototype.disconnectSync = function () {\n // ensure disconnection\n var xhr = io.util.request();\n var uri = [\n 'http' + (this.options.secure ? 's' : '') + ':/'\n , this.options.host + ':' + this.options.port\n , this.options.resource\n , io.protocol\n , ''\n , this.sessionid\n ].join('/') + '/?disconnect=1';\n\n xhr.open('GET', uri, false);\n xhr.send(null);\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n };\n\n /**\n * Check if we need to use cross domain enabled transports. Cross domain would\n * be a different port or different domain name.\n *\n * @returns {Boolean}\n * @api private\n */\n\n Socket.prototype.isXDomain = function () {\n\n var port = global.location.port ||\n ('https:' == global.location.protocol ? 443 : 80);\n\n return this.options.host !== global.location.hostname \n || this.options.port != port;\n };\n\n /**\n * Called upon handshake.\n *\n * @api private\n */\n\n Socket.prototype.onConnect = function () {\n if (!this.connected) {\n this.connected = true;\n this.connecting = false;\n if (!this.doBuffer) {\n // make sure to flush the buffer\n this.setBuffer(false);\n }\n this.emit('connect');\n }\n };\n\n /**\n * Called when the transport opens\n *\n * @api private\n */\n\n Socket.prototype.onOpen = function () {\n this.open = true;\n };\n\n /**\n * Called when the transport closes.\n *\n * @api private\n */\n\n Socket.prototype.onClose = function () {\n this.open = false;\n clearTimeout(this.heartbeatTimeoutTimer);\n };\n\n /**\n * Called when the transport first opens a connection\n *\n * @param text\n */\n\n Socket.prototype.onPacket = function (packet) {\n this.of(packet.endpoint).onPacket(packet);\n };\n\n /**\n * Handles an error.\n *\n * @api private\n */\n\n Socket.prototype.onError = function (err) {\n if (err && err.advice) {\n if (err.advice === 'reconnect' && (this.connected || this.connecting)) {\n this.disconnect();\n if (this.options.reconnect) {\n this.reconnect();\n }\n }\n }\n\n this.publish('error', err && err.reason ? err.reason : err);\n };\n\n /**\n * Called when the transport disconnects.\n *\n * @api private\n */\n\n Socket.prototype.onDisconnect = function (reason) {\n var wasConnected = this.connected\n , wasConnecting = this.connecting;\n\n this.connected = false;\n this.connecting = false;\n this.open = false;\n\n if (wasConnected || wasConnecting) {\n this.transport.close();\n this.transport.clearTimeouts();\n if (wasConnected) {\n this.publish('disconnect', reason);\n\n if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n this.reconnect();\n }\n }\n }\n };\n\n /**\n * Called upon reconnection.\n *\n * @api private\n */\n\n Socket.prototype.reconnect = function () {\n this.reconnecting = true;\n this.reconnectionAttempts = 0;\n this.reconnectionDelay = this.options['reconnection delay'];\n\n var self = this\n , maxAttempts = this.options['max reconnection attempts']\n , tryMultiple = this.options['try multiple transports']\n , limit = this.options['reconnection limit'];\n\n function reset () {\n if (self.connected) {\n for (var i in self.namespaces) {\n if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n self.namespaces[i].packet({ type: 'connect' });\n }\n }\n self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n }\n\n clearTimeout(self.reconnectionTimer);\n\n self.removeListener('connect_failed', maybeReconnect);\n self.removeListener('connect', maybeReconnect);\n\n self.reconnecting = false;\n\n delete self.reconnectionAttempts;\n delete self.reconnectionDelay;\n delete self.reconnectionTimer;\n delete self.redoTransports;\n\n self.options['try multiple transports'] = tryMultiple;\n };\n\n function maybeReconnect () {\n if (!self.reconnecting) {\n return;\n }\n\n if (self.connected) {\n return reset();\n };\n\n if (self.connecting && self.reconnecting) {\n return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n }\n\n if (self.reconnectionAttempts++ >= maxAttempts) {\n if (!self.redoTransports) {\n self.on('connect_failed', maybeReconnect);\n self.options['try multiple transports'] = true;\n self.transports = self.origTransports;\n self.transport = self.getTransport();\n self.redoTransports = true;\n self.connect();\n } else {\n self.publish('reconnect_failed');\n reset();\n }\n } else {\n if (self.reconnectionDelay < limit) {\n self.reconnectionDelay *= 2; // exponential back off\n }\n\n self.connect();\n self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n }\n };\n\n this.options['try multiple transports'] = false;\n this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n this.on('connect', maybeReconnect);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.SocketNamespace = SocketNamespace;\n\n /**\n * Socket namespace constructor.\n *\n * @constructor\n * @api public\n */\n\n function SocketNamespace (socket, name) {\n this.socket = socket;\n this.name = name || '';\n this.flags = {};\n this.json = new Flag(this, 'json');\n this.ackPackets = 0;\n this.acks = {};\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(SocketNamespace, io.EventEmitter);\n\n /**\n * Copies emit since we override it\n *\n * @api private\n */\n\n SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n /**\n * Creates a new namespace, by proxying the request to the socket. This\n * allows us to use the synax as we do on the server.\n *\n * @api public\n */\n\n SocketNamespace.prototype.of = function () {\n return this.socket.of.apply(this.socket, arguments);\n };\n\n /**\n * Sends a packet.\n *\n * @api private\n */\n\n SocketNamespace.prototype.packet = function (packet) {\n packet.endpoint = this.name;\n this.socket.packet(packet);\n this.flags = {};\n return this;\n };\n\n /**\n * Sends a message\n *\n * @api public\n */\n\n SocketNamespace.prototype.send = function (data, fn) {\n var packet = {\n type: this.flags.json ? 'json' : 'message'\n , data: data\n };\n\n if ('function' == typeof fn) {\n packet.id = ++this.ackPackets;\n packet.ack = true;\n this.acks[packet.id] = fn;\n }\n\n return this.packet(packet);\n };\n\n /**\n * Emits an event\n *\n * @api public\n */\n \n SocketNamespace.prototype.emit = function (name) {\n var args = Array.prototype.slice.call(arguments, 1)\n , lastArg = args[args.length - 1]\n , packet = {\n type: 'event'\n , name: name\n };\n\n if ('function' == typeof lastArg) {\n packet.id = ++this.ackPackets;\n packet.ack = 'data';\n this.acks[packet.id] = lastArg;\n args = args.slice(0, args.length - 1);\n }\n\n packet.args = args;\n\n return this.packet(packet);\n };\n\n /**\n * Disconnects the namespace\n *\n * @api private\n */\n\n SocketNamespace.prototype.disconnect = function () {\n if (this.name === '') {\n this.socket.disconnect();\n } else {\n this.packet({ type: 'disconnect' });\n this.$emit('disconnect');\n }\n\n return this;\n };\n\n /**\n * Handles a packet\n *\n * @api private\n */\n\n SocketNamespace.prototype.onPacket = function (packet) {\n var self = this;\n\n function ack () {\n self.packet({\n type: 'ack'\n , args: io.util.toArray(arguments)\n , ackId: packet.id\n });\n };\n\n switch (packet.type) {\n case 'connect':\n this.$emit('connect');\n break;\n\n case 'disconnect':\n if (this.name === '') {\n this.socket.onDisconnect(packet.reason || 'booted');\n } else {\n this.$emit('disconnect', packet.reason);\n }\n break;\n\n case 'message':\n case 'json':\n var params = ['message', packet.data];\n\n if (packet.ack == 'data') {\n params.push(ack);\n } else if (packet.ack) {\n this.packet({ type: 'ack', ackId: packet.id });\n }\n\n this.$emit.apply(this, params);\n break;\n\n case 'event':\n var params = [packet.name].concat(packet.args);\n\n if (packet.ack == 'data')\n params.push(ack);\n\n this.$emit.apply(this, params);\n break;\n\n case 'ack':\n if (this.acks[packet.ackId]) {\n this.acks[packet.ackId].apply(this, packet.args);\n delete this.acks[packet.ackId];\n }\n break;\n\n case 'error':\n if (packet.advice){\n this.socket.onError(packet);\n } else {\n if (packet.reason == 'unauthorized') {\n this.$emit('connect_failed', packet.reason);\n } else {\n this.$emit('error', packet.reason);\n }\n }\n break;\n }\n };\n\n /**\n * Flag interface.\n *\n * @api private\n */\n\n function Flag (nsp, name) {\n this.namespace = nsp;\n this.name = name;\n };\n\n /**\n * Send a message\n *\n * @api public\n */\n\n Flag.prototype.send = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.send.apply(this.namespace, arguments);\n };\n\n /**\n * Emit an event\n *\n * @api public\n */\n\n Flag.prototype.emit = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.emit.apply(this.namespace, arguments);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports.websocket = WS;\n\n /**\n * The WebSocket transport uses the HTML5 WebSocket API to establish an\n * persistent connection with the Socket.IO server. This transport will also\n * be inherited by the FlashSocket fallback as it provides a API compatible\n * polyfill for the WebSockets.\n *\n * @constructor\n * @extends {io.Transport}\n * @api public\n */\n\n function WS (socket) {\n io.Transport.apply(this, arguments);\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(WS, io.Transport);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n WS.prototype.name = 'websocket';\n\n /**\n * Initializes a new `WebSocket` connection with the Socket.IO server. We attach\n * all the appropriate listeners to handle the responses from the server.\n *\n * @returns {Transport}\n * @api public\n */\n\n WS.prototype.open = function () {\n var query = io.util.query(this.socket.options.query)\n , self = this\n , Socket\n\n\n if (!Socket) {\n Socket = global.MozWebSocket || global.WebSocket;\n }\n\n this.websocket = new Socket(this.prepareUrl() + query);\n\n this.websocket.onopen = function () {\n self.onOpen();\n self.socket.setBuffer(false);\n };\n this.websocket.onmessage = function (ev) {\n self.onData(ev.data);\n };\n this.websocket.onclose = function () {\n self.onClose();\n self.socket.setBuffer(true);\n };\n this.websocket.onerror = function (e) {\n self.onError(e);\n };\n\n return this;\n };\n\n /**\n * Send a message to the Socket.IO server. The message will automatically be\n * encoded in the correct message format.\n *\n * @returns {Transport}\n * @api public\n */\n\n // Do to a bug in the current IDevices browser, we need to wrap the send in a \n // setTimeout, when they resume from sleeping the browser will crash if \n // we don't allow the browser time to detect the socket has been closed\n if (io.util.ua.iDevice) {\n WS.prototype.send = function (data) {\n var self = this;\n setTimeout(function() {\n self.websocket.send(data);\n },0);\n return this;\n };\n } else {\n WS.prototype.send = function (data) {\n this.websocket.send(data);\n return this;\n };\n }\n\n /**\n * Payload\n *\n * @api private\n */\n\n WS.prototype.payload = function (arr) {\n for (var i = 0, l = arr.length; i < l; i++) {\n this.packet(arr[i]);\n }\n return this;\n };\n\n /**\n * Disconnect the established `WebSocket` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n WS.prototype.close = function () {\n this.websocket.close();\n return this;\n };\n\n /**\n * Handle the errors that `WebSocket` might be giving when we\n * are attempting to connect or send messages.\n *\n * @param {Error} e The error.\n * @api private\n */\n\n WS.prototype.onError = function (e) {\n this.socket.onError(e);\n };\n\n /**\n * Returns the appropriate scheme for the URI generation.\n *\n * @api private\n */\n WS.prototype.scheme = function () {\n return this.socket.options.secure ? 'wss' : 'ws';\n };\n\n /**\n * Checks if the browser has support for native `WebSockets` and that\n * it's not the polyfill created for the FlashSocket transport.\n *\n * @return {Boolean}\n * @api public\n */\n\n WS.check = function () {\n return ('WebSocket' in global && !('__addTask' in WebSocket))\n || 'MozWebSocket' in global;\n };\n\n /**\n * Check if the `WebSocket` transport support cross domain communications.\n *\n * @returns {Boolean}\n * @api public\n */\n\n WS.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('websocket');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.flashsocket = Flashsocket;\n\n /**\n * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket\n * specification. It uses a .swf file to communicate with the server. If you want\n * to serve the .swf file from a other server than where the Socket.IO script is\n * coming from you need to use the insecure version of the .swf. More information\n * about this can be found on the github page.\n *\n * @constructor\n * @extends {io.Transport.websocket}\n * @api public\n */\n\n function Flashsocket () {\n io.Transport.websocket.apply(this, arguments);\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(Flashsocket, io.Transport.websocket);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n Flashsocket.prototype.name = 'flashsocket';\n\n /**\n * Disconnect the established `FlashSocket` connection. This is done by adding a \n * new task to the FlashSocket. The rest will be handled off by the `WebSocket` \n * transport.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.open = function () {\n var self = this\n , args = arguments;\n\n WebSocket.__addTask(function () {\n io.Transport.websocket.prototype.open.apply(self, args);\n });\n return this;\n };\n \n /**\n * Sends a message to the Socket.IO server. This is done by adding a new\n * task to the FlashSocket. The rest will be handled off by the `WebSocket` \n * transport.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.send = function () {\n var self = this, args = arguments;\n WebSocket.__addTask(function () {\n io.Transport.websocket.prototype.send.apply(self, args);\n });\n return this;\n };\n\n /**\n * Disconnects the established `FlashSocket` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.close = function () {\n WebSocket.__tasks.length = 0;\n io.Transport.websocket.prototype.close.call(this);\n return this;\n };\n\n /**\n * The WebSocket fall back needs to append the flash container to the body\n * element, so we need to make sure we have access to it. Or defer the call\n * until we are sure there is a body element.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n Flashsocket.prototype.ready = function (socket, fn) {\n function init () {\n var options = socket.options\n , port = options['flash policy port']\n , path = [\n 'http' + (options.secure ? 's' : '') + ':/'\n , options.host + ':' + options.port\n , options.resource\n , 'static/flashsocket'\n , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf'\n ];\n\n // Only start downloading the swf file when the checked that this browser\n // actually supports it\n if (!Flashsocket.loaded) {\n if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') {\n // Set the correct file based on the XDomain settings\n WEB_SOCKET_SWF_LOCATION = path.join('/');\n }\n\n if (port !== 843) {\n WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port);\n }\n\n WebSocket.__initialize();\n Flashsocket.loaded = true;\n }\n\n fn.call(self);\n }\n\n var self = this;\n if (document.body) return init();\n\n io.util.load(init);\n };\n\n /**\n * Check if the FlashSocket transport is supported as it requires that the Adobe\n * Flash Player plug-in version `10.0.0` or greater is installed. And also check if\n * the polyfill is correctly loaded.\n *\n * @returns {Boolean}\n * @api public\n */\n\n Flashsocket.check = function () {\n if (\n typeof WebSocket == 'undefined'\n || !('__initialize' in WebSocket) || !swfobject\n ) return false;\n\n return swfobject.getFlashPlayerVersion().major >= 10;\n };\n\n /**\n * Check if the FlashSocket transport can be used as cross domain / cross origin \n * transport. Because we can't see which type (secure or insecure) of .swf is used\n * we will just return true.\n *\n * @returns {Boolean}\n * @api public\n */\n\n Flashsocket.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Disable AUTO_INITIALIZATION\n */\n\n if (typeof window != 'undefined') {\n WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true;\n }\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('flashsocket');\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nif ('undefined' != typeof window) {\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?(['Active'].concat('').join('X')):\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();\n}\n// Copyright: Hiroshi Ichikawa <http://gimite.net/en/>\n// License: New BSD License\n// Reference: http://dev.w3.org/html5/websockets/\n// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol\n\n(function() {\n \n if ('undefined' == typeof window || window.WebSocket) return;\n\n var console = window.console;\n if (!console || !console.log || !console.error) {\n console = {log: function(){ }, error: function(){ }};\n }\n \n if (!swfobject.hasFlashPlayerVersion(\"10.0.0\")) {\n console.error(\"Flash Player >= 10.0.0 is required.\");\n return;\n }\n if (location.protocol == \"file:\") {\n console.error(\n \"WARNING: web-socket-js doesn't work in file:///... URL \" +\n \"unless you set Flash Security Settings properly. \" +\n \"Open the page via Web server i.e. http://...\");\n }\n\n /**\n * This class represents a faux web socket.\n * @param {string} url\n * @param {array or string} protocols\n * @param {string} proxyHost\n * @param {int} proxyPort\n * @param {string} headers\n */\n WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {\n var self = this;\n self.__id = WebSocket.__nextId++;\n WebSocket.__instances[self.__id] = self;\n self.readyState = WebSocket.CONNECTING;\n self.bufferedAmount = 0;\n self.__events = {};\n if (!protocols) {\n protocols = [];\n } else if (typeof protocols == \"string\") {\n protocols = [protocols];\n }\n // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc.\n // Otherwise, when onopen fires immediately, onopen is called before it is set.\n setTimeout(function() {\n WebSocket.__addTask(function() {\n WebSocket.__flash.create(\n self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null);\n });\n }, 0);\n };\n\n /**\n * Send data to the web socket.\n * @param {string} data The data to send to the socket.\n * @return {boolean} True for success, false for failure.\n */\n WebSocket.prototype.send = function(data) {\n if (this.readyState == WebSocket.CONNECTING) {\n throw \"INVALID_STATE_ERR: Web Socket connection has not been established\";\n }\n // We use encodeURIComponent() here, because FABridge doesn't work if\n // the argument includes some characters. We don't use escape() here\n // because of this:\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions\n // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't\n // preserve all Unicode characters either e.g. \"\\uffff\" in Firefox.\n // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require\n // additional testing.\n var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data));\n if (result < 0) { // success\n return true;\n } else {\n this.bufferedAmount += result;\n return false;\n }\n };\n\n /**\n * Close this web socket gracefully.\n */\n WebSocket.prototype.close = function() {\n if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) {\n return;\n }\n this.readyState = WebSocket.CLOSING;\n WebSocket.__flash.close(this.__id);\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {string} type\n * @param {function} listener\n * @param {boolean} useCapture\n * @return void\n */\n WebSocket.prototype.addEventListener = function(type, listener, useCapture) {\n if (!(type in this.__events)) {\n this.__events[type] = [];\n }\n this.__events[type].push(listener);\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {string} type\n * @param {function} listener\n * @param {boolean} useCapture\n * @return void\n */\n WebSocket.prototype.removeEventListener = function(type, listener, useCapture) {\n if (!(type in this.__events)) return;\n var events = this.__events[type];\n for (var i = events.length - 1; i >= 0; --i) {\n if (events[i] === listener) {\n events.splice(i, 1);\n break;\n }\n }\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {Event} event\n * @return void\n */\n WebSocket.prototype.dispatchEvent = function(event) {\n var events = this.__events[event.type] || [];\n for (var i = 0; i < events.length; ++i) {\n events[i](event);\n }\n var handler = this[\"on\" + event.type];\n if (handler) handler(event);\n };\n\n /**\n * Handles an event from Flash.\n * @param {Object} flashEvent\n */\n WebSocket.prototype.__handleEvent = function(flashEvent) {\n if (\"readyState\" in flashEvent) {\n this.readyState = flashEvent.readyState;\n }\n if (\"protocol\" in flashEvent) {\n this.protocol = flashEvent.protocol;\n }\n \n var jsEvent;\n if (flashEvent.type == \"open\" || flashEvent.type == \"error\") {\n jsEvent = this.__createSimpleEvent(flashEvent.type);\n } else if (flashEvent.type == \"close\") {\n // TODO implement jsEvent.wasClean\n jsEvent = this.__createSimpleEvent(\"close\");\n } else if (flashEvent.type == \"message\") {\n var data = decodeURIComponent(flashEvent.message);\n jsEvent = this.__createMessageEvent(\"message\", data);\n } else {\n throw \"unknown event type: \" + flashEvent.type;\n }\n \n this.dispatchEvent(jsEvent);\n };\n \n WebSocket.prototype.__createSimpleEvent = function(type) {\n if (document.createEvent && window.Event) {\n var event = document.createEvent(\"Event\");\n event.initEvent(type, false, false);\n return event;\n } else {\n return {type: type, bubbles: false, cancelable: false};\n }\n };\n \n WebSocket.prototype.__createMessageEvent = function(type, data) {\n if (document.createEvent && window.MessageEvent && !window.opera) {\n var event = document.createEvent(\"MessageEvent\");\n event.initMessageEvent(\"message\", false, false, data, null, null, window, null);\n return event;\n } else {\n // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes.\n return {type: type, data: data, bubbles: false, cancelable: false};\n }\n };\n \n /**\n * Define the WebSocket readyState enumeration.\n */\n WebSocket.CONNECTING = 0;\n WebSocket.OPEN = 1;\n WebSocket.CLOSING = 2;\n WebSocket.CLOSED = 3;\n\n WebSocket.__flash = null;\n WebSocket.__instances = {};\n WebSocket.__tasks = [];\n WebSocket.__nextId = 0;\n \n /**\n * Load a new flash security policy file.\n * @param {string} url\n */\n WebSocket.loadFlashPolicyFile = function(url){\n WebSocket.__addTask(function() {\n WebSocket.__flash.loadManualPolicyFile(url);\n });\n };\n\n /**\n * Loads WebSocketMain.swf and creates WebSocketMain object in Flash.\n */\n WebSocket.__initialize = function() {\n if (WebSocket.__flash) return;\n \n if (WebSocket.__swfLocation) {\n // For backword compatibility.\n window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation;\n }\n if (!window.WEB_SOCKET_SWF_LOCATION) {\n console.error(\"[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf\");\n return;\n }\n var container = document.createElement(\"div\");\n container.id = \"webSocketContainer\";\n // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents\n // Flash from loading at least in IE. So we move it out of the screen at (-100, -100).\n // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash\n // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is\n // the best we can do as far as we know now.\n container.style.position = \"absolute\";\n if (WebSocket.__isFlashLite()) {\n container.style.left = \"0px\";\n container.style.top = \"0px\";\n } else {\n container.style.left = \"-100px\";\n container.style.top = \"-100px\";\n }\n var holder = document.createElement(\"div\");\n holder.id = \"webSocketFlash\";\n container.appendChild(holder);\n document.body.appendChild(container);\n // See this article for hasPriority:\n // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\n swfobject.embedSWF(\n WEB_SOCKET_SWF_LOCATION,\n \"webSocketFlash\",\n \"1\" /* width */,\n \"1\" /* height */,\n \"10.0.0\" /* SWF version */,\n null,\n null,\n {hasPriority: true, swliveconnect : true, allowScriptAccess: \"always\"},\n null,\n function(e) {\n if (!e.success) {\n console.error(\"[WebSocket] swfobject.embedSWF failed\");\n }\n });\n };\n \n /**\n * Called by Flash to notify JS that it's fully loaded and ready\n * for communication.\n */\n WebSocket.__onFlashInitialized = function() {\n // We need to set a timeout here to avoid round-trip calls\n // to flash during the initialization process.\n setTimeout(function() {\n WebSocket.__flash = document.getElementById(\"webSocketFlash\");\n WebSocket.__flash.setCallerUrl(location.href);\n WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG);\n for (var i = 0; i < WebSocket.__tasks.length; ++i) {\n WebSocket.__tasks[i]();\n }\n WebSocket.__tasks = [];\n }, 0);\n };\n \n /**\n * Called by Flash to notify WebSockets events are fired.\n */\n WebSocket.__onFlashEvent = function() {\n setTimeout(function() {\n try {\n // Gets events using receiveEvents() instead of getting it from event object\n // of Flash event. This is to make sure to keep message order.\n // It seems sometimes Flash events don't arrive in the same order as they are sent.\n var events = WebSocket.__flash.receiveEvents();\n for (var i = 0; i < events.length; ++i) {\n WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]);\n }\n } catch (e) {\n console.error(e);\n }\n }, 0);\n return true;\n };\n \n // Called by Flash.\n WebSocket.__log = function(message) {\n console.log(decodeURIComponent(message));\n };\n \n // Called by Flash.\n WebSocket.__error = function(message) {\n console.error(decodeURIComponent(message));\n };\n \n WebSocket.__addTask = function(task) {\n if (WebSocket.__flash) {\n task();\n } else {\n WebSocket.__tasks.push(task);\n }\n };\n \n /**\n * Test if the browser is running flash lite.\n * @return {boolean} True if flash lite is running, false otherwise.\n */\n WebSocket.__isFlashLite = function() {\n if (!window.navigator || !window.navigator.mimeTypes) {\n return false;\n }\n var mimeType = window.navigator.mimeTypes[\"application/x-shockwave-flash\"];\n if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) {\n return false;\n }\n return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false;\n };\n \n if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) {\n if (window.addEventListener) {\n window.addEventListener(\"load\", function(){\n WebSocket.__initialize();\n }, false);\n } else {\n window.attachEvent(\"onload\", function(){\n WebSocket.__initialize();\n });\n }\n }\n \n})();\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n *\n * @api public\n */\n\n exports.XHR = XHR;\n\n /**\n * XHR constructor\n *\n * @costructor\n * @api public\n */\n\n function XHR (socket) {\n if (!socket) return;\n\n io.Transport.apply(this, arguments);\n this.sendBuffer = [];\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(XHR, io.Transport);\n\n /**\n * Establish a connection\n *\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.open = function () {\n this.socket.setBuffer(false);\n this.onOpen();\n this.get();\n\n // we need to make sure the request succeeds since we have no indication\n // whether the request opened or not until it succeeded.\n this.setCloseTimeout();\n\n return this;\n };\n\n /**\n * Check if we need to send data to the Socket.IO server, if we have data in our\n * buffer we encode it and forward it to the `post` method.\n *\n * @api private\n */\n\n XHR.prototype.payload = function (payload) {\n var msgs = [];\n\n for (var i = 0, l = payload.length; i < l; i++) {\n msgs.push(io.parser.encodePacket(payload[i]));\n }\n\n this.send(io.parser.encodePayload(msgs));\n };\n\n /**\n * Send data to the Socket.IO server.\n *\n * @param data The message\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.send = function (data) {\n this.post(data);\n return this;\n };\n\n /**\n * Posts a encoded message to the Socket.IO server.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n function empty () { };\n\n XHR.prototype.post = function (data) {\n var self = this;\n this.socket.setBuffer(true);\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n self.posting = false;\n\n if (this.status == 200){\n self.socket.setBuffer(false);\n } else {\n self.onClose();\n }\n }\n }\n\n function onload () {\n this.onload = empty;\n self.socket.setBuffer(false);\n };\n\n this.sendXHR = this.request('POST');\n\n if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n this.sendXHR.onload = this.sendXHR.onerror = onload;\n } else {\n this.sendXHR.onreadystatechange = stateChange;\n }\n\n this.sendXHR.send(data);\n };\n\n /**\n * Disconnects the established `XHR` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.close = function () {\n this.onClose();\n return this;\n };\n\n /**\n * Generates a configured XHR request\n *\n * @param {String} url The url that needs to be requested.\n * @param {String} method The method the request should use.\n * @returns {XMLHttpRequest}\n * @api private\n */\n\n XHR.prototype.request = function (method) {\n var req = io.util.request(this.socket.isXDomain())\n , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n req.open(method || 'GET', this.prepareUrl() + query, true);\n\n if (method == 'POST') {\n try {\n if (req.setRequestHeader) {\n req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n } else {\n // XDomainRequest\n req.contentType = 'text/plain';\n }\n } catch (e) {}\n }\n\n return req;\n };\n\n /**\n * Returns the scheme to use for the transport URLs.\n *\n * @api private\n */\n\n XHR.prototype.scheme = function () {\n return this.socket.options.secure ? 'https' : 'http';\n };\n\n /**\n * Check if the XHR transports are supported\n *\n * @param {Boolean} xdomain Check if we support cross domain requests.\n * @returns {Boolean}\n * @api public\n */\n\n XHR.check = function (socket, xdomain) {\n try {\n var request = io.util.request(xdomain),\n usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest),\n socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'),\n isXProtocol = (global.location && socketProtocol != global.location.protocol);\n if (request && !(usesXDomReq && isXProtocol)) {\n return true;\n }\n } catch(e) {}\n\n return false;\n };\n\n /**\n * Check if the XHR transport supports cross domain requests.\n *\n * @returns {Boolean}\n * @api public\n */\n\n XHR.xdomainCheck = function (socket) {\n return XHR.check(socket, true);\n };\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.htmlfile = HTMLFile;\n\n /**\n * The HTMLFile transport creates a `forever iframe` based transport\n * for Internet Explorer. Regular forever iframe implementations will \n * continuously trigger the browsers buzy indicators. If the forever iframe\n * is created inside a `htmlfile` these indicators will not be trigged.\n *\n * @constructor\n * @extends {io.Transport.XHR}\n * @api public\n */\n\n function HTMLFile (socket) {\n io.Transport.XHR.apply(this, arguments);\n };\n\n /**\n * Inherits from XHR transport.\n */\n\n io.util.inherit(HTMLFile, io.Transport.XHR);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n HTMLFile.prototype.name = 'htmlfile';\n\n /**\n * Creates a new Ac...eX `htmlfile` with a forever loading iframe\n * that can be used to listen to messages. Inside the generated\n * `htmlfile` a reference will be made to the HTMLFile transport.\n *\n * @api private\n */\n\n HTMLFile.prototype.get = function () {\n this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n this.doc.open();\n this.doc.write('<html></html>');\n this.doc.close();\n this.doc.parentWindow.s = this;\n\n var iframeC = this.doc.createElement('div');\n iframeC.className = 'socketio';\n\n this.doc.body.appendChild(iframeC);\n this.iframe = this.doc.createElement('iframe');\n\n iframeC.appendChild(this.iframe);\n\n var self = this\n , query = io.util.query(this.socket.options.query, 't='+ +new Date);\n\n this.iframe.src = this.prepareUrl() + query;\n\n io.util.on(window, 'unload', function () {\n self.destroy();\n });\n };\n\n /**\n * The Socket.IO server will write script tags inside the forever\n * iframe, this function will be used as callback for the incoming\n * information.\n *\n * @param {String} data The message\n * @param {document} doc Reference to the context\n * @api private\n */\n\n HTMLFile.prototype._ = function (data, doc) {\n // unescape all forward slashes. see GH-1251\n data = data.replace(/\\\\\\//g, '/');\n this.onData(data);\n try {\n var script = doc.getElementsByTagName('script')[0];\n script.parentNode.removeChild(script);\n } catch (e) { }\n };\n\n /**\n * Destroy the established connection, iframe and `htmlfile`.\n * And calls the `CollectGarbage` function of Internet Explorer\n * to release the memory.\n *\n * @api private\n */\n\n HTMLFile.prototype.destroy = function () {\n if (this.iframe){\n try {\n this.iframe.src = 'about:blank';\n } catch(e){}\n\n this.doc = null;\n this.iframe.parentNode.removeChild(this.iframe);\n this.iframe = null;\n\n CollectGarbage();\n }\n };\n\n /**\n * Disconnects the established connection.\n *\n * @returns {Transport} Chaining.\n * @api public\n */\n\n HTMLFile.prototype.close = function () {\n this.destroy();\n return io.Transport.XHR.prototype.close.call(this);\n };\n\n /**\n * Checks if the browser supports this transport. The browser\n * must have an `Ac...eXObject` implementation.\n *\n * @return {Boolean}\n * @api public\n */\n\n HTMLFile.check = function (socket) {\n if (typeof window != \"undefined\" && (['Active'].concat('Object').join('X')) in window){\n try {\n var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n return a && io.Transport.XHR.check(socket);\n } catch(e){}\n }\n return false;\n };\n\n /**\n * Check if cross domain requests are supported.\n *\n * @returns {Boolean}\n * @api public\n */\n\n HTMLFile.xdomainCheck = function () {\n // we can probably do handling for sub-domains, we should\n // test that it's cross domain but a subdomain here\n return false;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('htmlfile');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports['xhr-polling'] = XHRPolling;\n\n /**\n * The XHR-polling transport uses long polling XHR requests to create a\n * \"persistent\" connection with the server.\n *\n * @constructor\n * @api public\n */\n\n function XHRPolling () {\n io.Transport.XHR.apply(this, arguments);\n };\n\n /**\n * Inherits from XHR transport.\n */\n\n io.util.inherit(XHRPolling, io.Transport.XHR);\n\n /**\n * Merge the properties from XHR transport\n */\n\n io.util.merge(XHRPolling, io.Transport.XHR);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n XHRPolling.prototype.name = 'xhr-polling';\n\n /**\n * Indicates whether heartbeats is enabled for this transport\n *\n * @api private\n */\n\n XHRPolling.prototype.heartbeats = function () {\n return false;\n };\n\n /** \n * Establish a connection, for iPhone and Android this will be done once the page\n * is loaded.\n *\n * @returns {Transport} Chaining.\n * @api public\n */\n\n XHRPolling.prototype.open = function () {\n var self = this;\n\n io.Transport.XHR.prototype.open.call(self);\n return false;\n };\n\n /**\n * Starts a XHR request to wait for incoming messages.\n *\n * @api private\n */\n\n function empty () {};\n\n XHRPolling.prototype.get = function () {\n if (!this.isOpen) return;\n\n var self = this;\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n\n if (this.status == 200) {\n self.onData(this.responseText);\n self.get();\n } else {\n self.onClose();\n }\n }\n };\n\n function onload () {\n this.onload = empty;\n this.onerror = empty;\n self.retryCounter = 1;\n self.onData(this.responseText);\n self.get();\n };\n\n function onerror () {\n self.retryCounter ++;\n if(!self.retryCounter || self.retryCounter > 3) {\n self.onClose(); \n } else {\n self.get();\n }\n };\n\n this.xhr = this.request();\n\n if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n this.xhr.onload = onload;\n this.xhr.onerror = onerror;\n } else {\n this.xhr.onreadystatechange = stateChange;\n }\n\n this.xhr.send(null);\n };\n\n /**\n * Handle the unclean close behavior.\n *\n * @api private\n */\n\n XHRPolling.prototype.onClose = function () {\n io.Transport.XHR.prototype.onClose.call(this);\n\n if (this.xhr) {\n this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty;\n try {\n this.xhr.abort();\n } catch(e){}\n this.xhr = null;\n }\n };\n\n /**\n * Webkit based browsers show a infinit spinner when you start a XHR request\n * before the browsers onload event is called so we need to defer opening of\n * the transport until the onload event is called. Wrapping the cb in our\n * defer method solve this.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n XHRPolling.prototype.ready = function (socket, fn) {\n var self = this;\n\n io.util.defer(function () {\n fn.call(self);\n });\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('xhr-polling');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n /**\n * There is a way to hide the loading indicator in Firefox. If you create and\n * remove a iframe it will stop showing the current loading indicator.\n * Unfortunately we can't feature detect that and UA sniffing is evil.\n *\n * @api private\n */\n\n var indicator = global.document && \"MozAppearance\" in\n global.document.documentElement.style;\n\n /**\n * Expose constructor.\n */\n\n exports['jsonp-polling'] = JSONPPolling;\n\n /**\n * The JSONP transport creates an persistent connection by dynamically\n * inserting a script tag in the page. This script tag will receive the\n * information of the Socket.IO server. When new information is received\n * it creates a new script tag for the new data stream.\n *\n * @constructor\n * @extends {io.Transport.xhr-polling}\n * @api public\n */\n\n function JSONPPolling (socket) {\n io.Transport['xhr-polling'].apply(this, arguments);\n\n this.index = io.j.length;\n\n var self = this;\n\n io.j.push(function (msg) {\n self._(msg);\n });\n };\n\n /**\n * Inherits from XHR polling transport.\n */\n\n io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n JSONPPolling.prototype.name = 'jsonp-polling';\n\n /**\n * Posts a encoded message to the Socket.IO server using an iframe.\n * The iframe is used because script tags can create POST based requests.\n * The iframe is positioned outside of the view so the user does not\n * notice it's existence.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n JSONPPolling.prototype.post = function (data) {\n var self = this\n , query = io.util.query(\n this.socket.options.query\n , 't='+ (+new Date) + '&i=' + this.index\n );\n\n if (!this.form) {\n var form = document.createElement('form')\n , area = document.createElement('textarea')\n , id = this.iframeId = 'socketio_iframe_' + this.index\n , iframe;\n\n form.className = 'socketio';\n form.style.position = 'absolute';\n form.style.top = '0px';\n form.style.left = '0px';\n form.style.display = 'none';\n form.target = id;\n form.method = 'POST';\n form.setAttribute('accept-charset', 'utf-8');\n area.name = 'd';\n form.appendChild(area);\n document.body.appendChild(form);\n\n this.form = form;\n this.area = area;\n }\n\n this.form.action = this.prepareUrl() + query;\n\n function complete () {\n initIframe();\n self.socket.setBuffer(false);\n };\n\n function initIframe () {\n if (self.iframe) {\n self.form.removeChild(self.iframe);\n }\n\n try {\n // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n iframe = document.createElement('<iframe name=\"'+ self.iframeId +'\">');\n } catch (e) {\n iframe = document.createElement('iframe');\n iframe.name = self.iframeId;\n }\n\n iframe.id = self.iframeId;\n\n self.form.appendChild(iframe);\n self.iframe = iframe;\n };\n\n initIframe();\n\n // we temporarily stringify until we figure out how to prevent\n // browsers from turning `\\n` into `\\r\\n` in form inputs\n this.area.value = io.JSON.stringify(data);\n\n try {\n this.form.submit();\n } catch(e) {}\n\n if (this.iframe.attachEvent) {\n iframe.onreadystatechange = function () {\n if (self.iframe.readyState == 'complete') {\n complete();\n }\n };\n } else {\n this.iframe.onload = complete;\n }\n\n this.socket.setBuffer(true);\n };\n\n /**\n * Creates a new JSONP poll that can be used to listen\n * for messages from the Socket.IO server.\n *\n * @api private\n */\n\n JSONPPolling.prototype.get = function () {\n var self = this\n , script = document.createElement('script')\n , query = io.util.query(\n this.socket.options.query\n , 't='+ (+new Date) + '&i=' + this.index\n );\n\n if (this.script) {\n this.script.parentNode.removeChild(this.script);\n this.script = null;\n }\n\n script.async = true;\n script.src = this.prepareUrl() + query;\n script.onerror = function () {\n self.onClose();\n };\n\n var insertAt = document.getElementsByTagName('script')[0];\n insertAt.parentNode.insertBefore(script, insertAt);\n this.script = script;\n\n if (indicator) {\n setTimeout(function () {\n var iframe = document.createElement('iframe');\n document.body.appendChild(iframe);\n document.body.removeChild(iframe);\n }, 100);\n }\n };\n\n /**\n * Callback function for the incoming message stream from the Socket.IO server.\n *\n * @param {String} data The message\n * @api private\n */\n\n JSONPPolling.prototype._ = function (msg) {\n this.onData(msg);\n if (this.isOpen) {\n this.get();\n }\n return this;\n };\n\n /**\n * The indicator hack only works after onload\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n JSONPPolling.prototype.ready = function (socket, fn) {\n var self = this;\n if (!indicator) return fn.call(this);\n\n io.util.load(function () {\n fn.call(self);\n });\n };\n\n /**\n * Checks if browser supports this transport.\n *\n * @return {Boolean}\n * @api public\n */\n\n JSONPPolling.check = function () {\n return 'document' in global;\n };\n\n /**\n * Check if cross domain requests are supported\n *\n * @returns {Boolean}\n * @api public\n */\n\n JSONPPolling.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('jsonp-polling');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\nif (typeof define === \"function\" && define.amd) {\n define([], function () { return io; });\n}\n})();\n},{}],37:[function(require,module,exports){\n// based on https://github.com/ESTOS/strophe.jingle/\n// adds wildemitter support\nvar util = require('util');\nvar adapter = require('webrtc-adapter-test');\nvar WildEmitter = require('wildemitter');\n\nfunction dumpSDP(description) {\n return {\n type: description.type,\n sdp: description.sdp\n };\n}\n\nfunction dumpStream(stream) {\n var info = {\n label: stream.id,\n };\n if (stream.getAudioTracks().length) {\n info.audio = stream.getAudioTracks().map(function (track) {\n return track.id;\n });\n }\n if (stream.getVideoTracks().length) {\n info.video = stream.getVideoTracks().map(function (track) {\n return track.id;\n });\n }\n return info;\n}\n\nfunction TraceablePeerConnection(config, constraints) {\n var self = this;\n WildEmitter.call(this);\n\n this.peerconnection = new window.RTCPeerConnection(config, constraints);\n\n this.trace = function (what, info) {\n self.emit('PeerConnectionTrace', {\n time: new Date(),\n type: what,\n value: info || \"\"\n });\n };\n\n this.onicecandidate = null;\n this.peerconnection.onicecandidate = function (event) {\n self.trace('onicecandidate', event.candidate);\n if (self.onicecandidate !== null) {\n self.onicecandidate(event);\n }\n };\n this.onaddstream = null;\n this.peerconnection.onaddstream = function (event) {\n self.trace('onaddstream', dumpStream(event.stream));\n if (self.onaddstream !== null) {\n self.onaddstream(event);\n }\n };\n this.onremovestream = null;\n this.peerconnection.onremovestream = function (event) {\n self.trace('onremovestream', dumpStream(event.stream));\n if (self.onremovestream !== null) {\n self.onremovestream(event);\n }\n };\n this.onsignalingstatechange = null;\n this.peerconnection.onsignalingstatechange = function (event) {\n self.trace('onsignalingstatechange', self.signalingState);\n if (self.onsignalingstatechange !== null) {\n self.onsignalingstatechange(event);\n }\n };\n this.oniceconnectionstatechange = null;\n this.peerconnection.oniceconnectionstatechange = function (event) {\n self.trace('oniceconnectionstatechange', self.iceConnectionState);\n if (self.oniceconnectionstatechange !== null) {\n self.oniceconnectionstatechange(event);\n }\n };\n this.onnegotiationneeded = null;\n this.peerconnection.onnegotiationneeded = function (event) {\n self.trace('onnegotiationneeded');\n if (self.onnegotiationneeded !== null) {\n self.onnegotiationneeded(event);\n }\n };\n self.ondatachannel = null;\n this.peerconnection.ondatachannel = function (event) {\n self.trace('ondatachannel', event);\n if (self.ondatachannel !== null) {\n self.ondatachannel(event);\n }\n };\n this.getLocalStreams = this.peerconnection.getLocalStreams.bind(this.peerconnection);\n this.getRemoteStreams = this.peerconnection.getRemoteStreams.bind(this.peerconnection);\n}\n\nutil.inherits(TraceablePeerConnection, WildEmitter);\n\n['signalingState', 'iceConnectionState', 'localDescription', 'remoteDescription'].forEach(function (prop) {\n Object.defineProperty(TraceablePeerConnection.prototype, prop, {\n get: function () {\n return this.peerconnection[prop];\n }\n });\n});\n\nTraceablePeerConnection.prototype.addStream = function (stream) {\n this.trace('addStream', dumpStream(stream));\n this.peerconnection.addStream(stream);\n};\n\nTraceablePeerConnection.prototype.removeStream = function (stream) {\n this.trace('removeStream', dumpStream(stream));\n this.peerconnection.removeStream(stream);\n};\n\nTraceablePeerConnection.prototype.createDataChannel = function (label, opts) {\n this.trace('createDataChannel', label, opts);\n return this.peerconnection.createDataChannel(label, opts);\n};\n\nTraceablePeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) {\n var self = this;\n this.trace('setLocalDescription', dumpSDP(description));\n this.peerconnection.setLocalDescription(description,\n function () {\n self.trace('setLocalDescriptionOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('setLocalDescriptionOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) {\n var self = this;\n this.trace('setRemoteDescription', dumpSDP(description));\n this.peerconnection.setRemoteDescription(description,\n function () {\n self.trace('setRemoteDescriptionOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('setRemoteDescriptionOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.close = function () {\n this.trace('stop');\n if (this.peerconnection.signalingState != 'closed') {\n this.peerconnection.close();\n }\n};\n\nTraceablePeerConnection.prototype.createOffer = function (successCallback, failureCallback, constraints) {\n var self = this;\n this.trace('createOffer', constraints);\n this.peerconnection.createOffer(\n function (offer) {\n self.trace('createOfferOnSuccess', dumpSDP(offer));\n if (successCallback) successCallback(offer);\n },\n function (err) {\n self.trace('createOfferOnFailure', err);\n if (failureCallback) failureCallback(err);\n },\n constraints\n );\n};\n\nTraceablePeerConnection.prototype.createAnswer = function (successCallback, failureCallback, constraints) {\n var self = this;\n this.trace('createAnswer', constraints);\n this.peerconnection.createAnswer(\n function (answer) {\n self.trace('createAnswerOnSuccess', dumpSDP(answer));\n if (successCallback) successCallback(answer);\n },\n function (err) {\n self.trace('createAnswerOnFailure', err);\n if (failureCallback) failureCallback(err);\n },\n constraints\n );\n};\n\nTraceablePeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) {\n var self = this;\n this.trace('addIceCandidate', candidate);\n this.peerconnection.addIceCandidate(candidate,\n function () {\n //self.trace('addIceCandidateOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('addIceCandidateOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.getStats = function () {\n this.peerconnection.getStats.apply(this.peerconnection, arguments);\n};\n\nmodule.exports = TraceablePeerConnection;\n\n},{\"util\":45,\"webrtc-adapter-test\":38,\"wildemitter\":40}],38:[function(require,module,exports){\n/*\n * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n\n/* More information about these options at jshint.com/docs/options */\n/* jshint browser: true, camelcase: true, curly: true, devel: true,\n eqeqeq: true, forin: false, globalstrict: true, node: true,\n quotmark: single, undef: true, unused: strict */\n/* global mozRTCIceCandidate, mozRTCPeerConnection, Promise,\nmozRTCSessionDescription, webkitRTCPeerConnection, MediaStreamTrack */\n/* exported trace,requestUserMedia */\n\n'use strict';\n\nvar getUserMedia = null;\nvar attachMediaStream = null;\nvar reattachMediaStream = null;\nvar webrtcDetectedBrowser = null;\nvar webrtcDetectedVersion = null;\nvar webrtcMinimumVersion = null;\nvar webrtcUtils = {\n log: function() {\n // suppress console.log output when being included as a module.\n if (typeof module !== 'undefined' ||\n typeof require === 'function' && typeof define === 'function') {\n return;\n }\n console.log.apply(console, arguments);\n },\n extractVersion: function(uastring, expr, pos) {\n var match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos]);\n }\n};\n\nfunction trace(text) {\n // This function is used for logging.\n if (text[text.length - 1] === '\\n') {\n text = text.substring(0, text.length - 1);\n }\n if (window.performance) {\n var now = (window.performance.now() / 1000).toFixed(3);\n webrtcUtils.log(now + ': ' + text);\n } else {\n webrtcUtils.log(text);\n }\n}\n\nif (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n // If prefixed srcObject property exists, return it.\n // Otherwise use the shimmed property, _srcObject\n return 'mozSrcObject' in this ? this.mozSrcObject : this._srcObject;\n },\n set: function(stream) {\n if ('mozSrcObject' in this) {\n this.mozSrcObject = stream;\n } else {\n // Use _srcObject as a private property for this shim\n this._srcObject = stream;\n // TODO: revokeObjectUrl(this.src) when !stream to release resources?\n this.src = URL.createObjectURL(stream);\n }\n }\n });\n }\n // Proxy existing globals\n getUserMedia = window.navigator && window.navigator.getUserMedia;\n}\n\n// Attach a media stream to an element.\nattachMediaStream = function(element, stream) {\n element.srcObject = stream;\n};\n\nreattachMediaStream = function(to, from) {\n to.srcObject = from.srcObject;\n};\n\nif (typeof window === 'undefined' || !window.navigator) {\n webrtcUtils.log('This does not appear to be a browser');\n webrtcDetectedBrowser = 'not a browser';\n} else if (navigator.mozGetUserMedia && window.mozRTCPeerConnection) {\n webrtcUtils.log('This appears to be Firefox');\n\n webrtcDetectedBrowser = 'firefox';\n\n // the detected firefox version.\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Firefox\\/([0-9]+)\\./, 1);\n\n // the minimum firefox version still supported by adapter.\n webrtcMinimumVersion = 31;\n\n // The RTCPeerConnection object.\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (webrtcDetectedVersion < 38) {\n // .urls is not supported in FF < 38.\n // create RTCIceServers with a single url.\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (server.hasOwnProperty('urls')) {\n for (var j = 0; j < server.urls.length; j++) {\n var newServer = {\n url: server.urls[j]\n };\n if (server.urls[j].indexOf('turn') === 0) {\n newServer.username = server.username;\n newServer.credential = server.credential;\n }\n newIceServers.push(newServer);\n }\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n }\n return new mozRTCPeerConnection(pcConfig, pcConstraints); // jscs:ignore requireCapitalizedConstructors\n };\n\n // The RTCSessionDescription object.\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = mozRTCSessionDescription;\n }\n\n // The RTCIceCandidate object.\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = mozRTCIceCandidate;\n }\n\n // getUserMedia constraints shim.\n getUserMedia = function(constraints, onSuccess, onError) {\n var constraintsToFF37 = function(c) {\n if (typeof c !== 'object' || c.require) {\n return c;\n }\n var require = [];\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = c[key] = (typeof c[key] === 'object') ?\n c[key] : {ideal: c[key]};\n if (r.min !== undefined ||\n r.max !== undefined || r.exact !== undefined) {\n require.push(key);\n }\n if (r.exact !== undefined) {\n if (typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n } else {\n c[key] = r.exact;\n }\n delete r.exact;\n }\n if (r.ideal !== undefined) {\n c.advanced = c.advanced || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[key] = {min: r.ideal, max: r.ideal};\n } else {\n oc[key] = r.ideal;\n }\n c.advanced.push(oc);\n delete r.ideal;\n if (!Object.keys(r).length) {\n delete c[key];\n }\n }\n });\n if (require.length) {\n c.require = require;\n }\n return c;\n };\n if (webrtcDetectedVersion < 38) {\n webrtcUtils.log('spec: ' + JSON.stringify(constraints));\n if (constraints.audio) {\n constraints.audio = constraintsToFF37(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToFF37(constraints.video);\n }\n webrtcUtils.log('ff37: ' + JSON.stringify(constraints));\n }\n return navigator.mozGetUserMedia(constraints, onSuccess, onError);\n };\n\n navigator.getUserMedia = getUserMedia;\n\n // Shim for mediaDevices on older versions.\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: requestUserMedia,\n addEventListener: function() { },\n removeEventListener: function() { }\n };\n }\n navigator.mediaDevices.enumerateDevices =\n navigator.mediaDevices.enumerateDevices || function() {\n return new Promise(function(resolve) {\n var infos = [\n {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n ];\n resolve(infos);\n });\n };\n\n if (webrtcDetectedVersion < 41) {\n // Work around http://bugzil.la/1169665\n var orgEnumerateDevices =\n navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n navigator.mediaDevices.enumerateDevices = function() {\n return orgEnumerateDevices().then(undefined, function(e) {\n if (e.name === 'NotFoundError') {\n return [];\n }\n throw e;\n });\n };\n }\n} else if (navigator.webkitGetUserMedia && window.webkitRTCPeerConnection) {\n webrtcUtils.log('This appears to be Chrome');\n\n webrtcDetectedBrowser = 'chrome';\n\n // the detected chrome version.\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/([0-9]+)\\./, 2);\n\n // the minimum chrome version still supported by adapter.\n webrtcMinimumVersion = 38;\n\n // The RTCPeerConnection object.\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n // Translate iceTransportPolicy to iceTransports,\n // see https://code.google.com/p/webrtc/issues/detail?id=4869\n if (pcConfig && pcConfig.iceTransportPolicy) {\n pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n }\n\n var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints); // jscs:ignore requireCapitalizedConstructors\n var origGetStats = pc.getStats.bind(pc);\n pc.getStats = function(selector, successCallback, errorCallback) { // jshint ignore: line\n var self = this;\n var args = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats(selector, successCallback);\n }\n\n var fixChromeStats = function(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function(report) {\n var standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: report.type\n };\n report.names().forEach(function(name) {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper = function(response) {\n args[1](fixChromeStats(response));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper, arguments[0]]);\n }\n\n // promise-support\n return new Promise(function(resolve, reject) {\n if (args.length === 1 && selector === null) {\n origGetStats.apply(self, [\n function(response) {\n resolve.apply(null, [fixChromeStats(response)]);\n }, reject]);\n } else {\n origGetStats.apply(self, [resolve, reject]);\n }\n });\n };\n\n return pc;\n };\n\n // add promise support\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = webkitRTCPeerConnection.prototype[method];\n webkitRTCPeerConnection.prototype[method] = function() {\n var self = this;\n if (arguments.length < 1 || (arguments.length === 1 &&\n typeof(arguments[0]) === 'object')) {\n var opts = arguments.length === 1 ? arguments[0] : undefined;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(self, [resolve, reject, opts]);\n });\n } else {\n return nativeMethod.apply(this, arguments);\n }\n };\n });\n\n ['setLocalDescription', 'setRemoteDescription',\n 'addIceCandidate'].forEach(function(method) {\n var nativeMethod = webkitRTCPeerConnection.prototype[method];\n webkitRTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n var self = this;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(self, [args[0],\n function() {\n resolve();\n if (args.length >= 2) {\n args[1].apply(null, []);\n }\n },\n function(err) {\n reject(err);\n if (args.length >= 3) {\n args[2].apply(null, [err]);\n }\n }]\n );\n });\n };\n });\n\n // getUserMedia constraints shim.\n var constraintsToChrome = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n var oldname = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(function(mix) {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n getUserMedia = function(constraints, onSuccess, onError) {\n if (constraints.audio) {\n constraints.audio = constraintsToChrome(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToChrome(constraints.video);\n }\n webrtcUtils.log('chrome: ' + JSON.stringify(constraints));\n return navigator.webkitGetUserMedia(constraints, onSuccess, onError);\n };\n navigator.getUserMedia = getUserMedia;\n\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: requestUserMedia,\n enumerateDevices: function() {\n return new Promise(function(resolve) {\n var kinds = {audio: 'audioinput', video: 'videoinput'};\n return MediaStreamTrack.getSources(function(devices) {\n resolve(devices.map(function(device) {\n return {label: device.label,\n kind: kinds[device.kind],\n deviceId: device.id,\n groupId: ''};\n }));\n });\n });\n }};\n }\n\n // A shim for getUserMedia method on the mediaDevices object.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (!navigator.mediaDevices.getUserMedia) {\n navigator.mediaDevices.getUserMedia = function(constraints) {\n return requestUserMedia(constraints);\n };\n } else {\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n webrtcUtils.log('spec: ' + JSON.stringify(c)); // whitespace for alignment\n c.audio = constraintsToChrome(c.audio);\n c.video = constraintsToChrome(c.video);\n webrtcUtils.log('chrome: ' + JSON.stringify(c));\n return origGetUserMedia(c);\n };\n }\n\n // Dummy devicechange event methods.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n navigator.mediaDevices.addEventListener = function() {\n webrtcUtils.log('Dummy mediaDevices.addEventListener called.');\n };\n }\n if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n navigator.mediaDevices.removeEventListener = function() {\n webrtcUtils.log('Dummy mediaDevices.removeEventListener called.');\n };\n }\n\n // Attach a media stream to an element.\n attachMediaStream = function(element, stream) {\n if (webrtcDetectedVersion >= 43) {\n element.srcObject = stream;\n } else if (typeof element.src !== 'undefined') {\n element.src = URL.createObjectURL(stream);\n } else {\n webrtcUtils.log('Error attaching stream to element.');\n }\n };\n reattachMediaStream = function(to, from) {\n if (webrtcDetectedVersion >= 43) {\n to.srcObject = from.srcObject;\n } else {\n to.src = from.src;\n }\n };\n\n} else if (navigator.mediaDevices && navigator.userAgent.match(\n /Edge\\/(\\d+).(\\d+)$/)) {\n webrtcUtils.log('This appears to be Edge');\n webrtcDetectedBrowser = 'edge';\n\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n\n // the minimum version still supported by adapter.\n webrtcMinimumVersion = 12;\n} else {\n webrtcUtils.log('Browser does not appear to be WebRTC-capable');\n}\n\n// Returns the result of getUserMedia as a Promise.\nfunction requestUserMedia(constraints) {\n return new Promise(function(resolve, reject) {\n getUserMedia(constraints, resolve, reject);\n });\n}\n\nvar webrtcTesting = {};\ntry {\n Object.defineProperty(webrtcTesting, 'version', {\n set: function(version) {\n webrtcDetectedVersion = version;\n }\n });\n} catch (e) {}\n\nif (typeof module !== 'undefined') {\n var RTCPeerConnection;\n if (typeof window !== 'undefined') {\n RTCPeerConnection = window.RTCPeerConnection;\n }\n module.exports = {\n RTCPeerConnection: RTCPeerConnection,\n getUserMedia: getUserMedia,\n attachMediaStream: attachMediaStream,\n reattachMediaStream: reattachMediaStream,\n webrtcDetectedBrowser: webrtcDetectedBrowser,\n webrtcDetectedVersion: webrtcDetectedVersion,\n webrtcMinimumVersion: webrtcMinimumVersion,\n webrtcTesting: webrtcTesting,\n webrtcUtils: webrtcUtils\n //requestUserMedia: not exposed on purpose.\n //trace: not exposed on purpose.\n };\n} else if ((typeof require === 'function') && (typeof define === 'function')) {\n // Expose objects and functions when RequireJS is doing the loading.\n define([], function() {\n return {\n RTCPeerConnection: window.RTCPeerConnection,\n getUserMedia: getUserMedia,\n attachMediaStream: attachMediaStream,\n reattachMediaStream: reattachMediaStream,\n webrtcDetectedBrowser: webrtcDetectedBrowser,\n webrtcDetectedVersion: webrtcDetectedVersion,\n webrtcMinimumVersion: webrtcMinimumVersion,\n webrtcTesting: webrtcTesting,\n webrtcUtils: webrtcUtils\n //requestUserMedia: not exposed on purpose.\n //trace: not exposed on purpose.\n };\n });\n}\n\n},{}],39:[function(require,module,exports){\n// created by @HenrikJoreteg\nvar prefix;\nvar version;\n\nif (window.mozRTCPeerConnection || navigator.mozGetUserMedia) {\n prefix = 'moz';\n version = parseInt(navigator.userAgent.match(/Firefox\\/([0-9]+)\\./)[1], 10);\n} else if (window.webkitRTCPeerConnection || navigator.webkitGetUserMedia) {\n prefix = 'webkit';\n version = navigator.userAgent.match(/Chrom(e|ium)/) && parseInt(navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n}\n\nvar PC = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\nvar IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;\nvar SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;\nvar MediaStream = window.webkitMediaStream || window.MediaStream;\nvar screenSharing = window.location.protocol === 'https:' &&\n ((prefix === 'webkit' && version >= 26) ||\n (prefix === 'moz' && version >= 33))\nvar AudioContext = window.AudioContext || window.webkitAudioContext;\nvar videoEl = document.createElement('video');\nvar supportVp8 = videoEl && videoEl.canPlayType && videoEl.canPlayType('video/webm; codecs=\"vp8\", vorbis') === \"probably\";\nvar getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia || navigator.mozGetUserMedia;\n\n// export support flags and constructors.prototype && PC\nmodule.exports = {\n prefix: prefix,\n browserVersion: version,\n support: !!PC && supportVp8 && !!getUserMedia,\n // new support style\n supportRTCPeerConnection: !!PC,\n supportVp8: supportVp8,\n supportGetUserMedia: !!getUserMedia,\n supportDataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n supportWebAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n supportMediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n supportScreenSharing: !!screenSharing,\n // old deprecated style. Dont use this anymore\n dataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n webAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n mediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n screenSharing: !!screenSharing,\n // constructors\n AudioContext: AudioContext,\n PeerConnection: PC,\n SessionDescription: SessionDescription,\n IceCandidate: IceCandidate,\n MediaStream: MediaStream,\n getUserMedia: getUserMedia\n};\n\n},{}],40:[function(require,module,exports){\n/*\r\nWildEmitter.js is a slim little event emitter by @henrikjoreteg largely based\r\non @visionmedia's Emitter from UI Kit.\r\n\r\nWhy? I wanted it standalone.\r\n\r\nI also wanted support for wildcard emitters like this:\r\n\r\nemitter.on('*', function (eventName, other, event, payloads) {\r\n\r\n});\r\n\r\nemitter.on('somenamespace*', function (eventName, payloads) {\r\n\r\n});\r\n\r\nPlease note that callbacks triggered by wildcard registered events also get\r\nthe event name as the first argument.\r\n*/\r\n\r\nmodule.exports = WildEmitter;\r\n\r\nfunction WildEmitter() { }\r\n\r\nWildEmitter.mixin = function (constructor) {\r\n var prototype = constructor.prototype || constructor;\r\n\r\n prototype.isWildEmitter= true;\r\n\r\n // Listen on the given `event` with `fn`. Store a group name if present.\r\n prototype.on = function (event, groupName, fn) {\r\n this.callbacks = this.callbacks || {};\r\n var hasGroup = (arguments.length === 3),\r\n group = hasGroup ? arguments[1] : undefined,\r\n func = hasGroup ? arguments[2] : arguments[1];\r\n func._groupName = group;\r\n (this.callbacks[event] = this.callbacks[event] || []).push(func);\r\n return this;\r\n };\r\n\r\n // Adds an `event` listener that will be invoked a single\r\n // time then automatically removed.\r\n prototype.once = function (event, groupName, fn) {\r\n var self = this,\r\n hasGroup = (arguments.length === 3),\r\n group = hasGroup ? arguments[1] : undefined,\r\n func = hasGroup ? arguments[2] : arguments[1];\r\n function on() {\r\n self.off(event, on);\r\n func.apply(this, arguments);\r\n }\r\n this.on(event, group, on);\r\n return this;\r\n };\r\n\r\n // Unbinds an entire group\r\n prototype.releaseGroup = function (groupName) {\r\n this.callbacks = this.callbacks || {};\r\n var item, i, len, handlers;\r\n for (item in this.callbacks) {\r\n handlers = this.callbacks[item];\r\n for (i = 0, len = handlers.length; i < len; i++) {\r\n if (handlers[i]._groupName === groupName) {\r\n //console.log('removing');\r\n // remove it and shorten the array we're looping through\r\n handlers.splice(i, 1);\r\n i--;\r\n len--;\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n // Remove the given callback for `event` or all\r\n // registered callbacks.\r\n prototype.off = function (event, fn) {\r\n this.callbacks = this.callbacks || {};\r\n var callbacks = this.callbacks[event],\r\n i;\r\n\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (arguments.length === 1) {\r\n delete this.callbacks[event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n i = callbacks.indexOf(fn);\r\n callbacks.splice(i, 1);\r\n if (callbacks.length === 0) {\r\n delete this.callbacks[event];\r\n }\r\n return this;\r\n };\r\n\r\n /// Emit `event` with the given args.\r\n // also calls any `*` handlers\r\n prototype.emit = function (event) {\r\n this.callbacks = this.callbacks || {};\r\n var args = [].slice.call(arguments, 1),\r\n callbacks = this.callbacks[event],\r\n specialCallbacks = this.getWildcardCallbacks(event),\r\n i,\r\n len,\r\n item,\r\n listeners;\r\n\r\n if (callbacks) {\r\n listeners = callbacks.slice();\r\n for (i = 0, len = listeners.length; i < len; ++i) {\r\n if (!listeners[i]) {\r\n break;\r\n }\r\n listeners[i].apply(this, args);\r\n }\r\n }\r\n\r\n if (specialCallbacks) {\r\n len = specialCallbacks.length;\r\n listeners = specialCallbacks.slice();\r\n for (i = 0, len = listeners.length; i < len; ++i) {\r\n if (!listeners[i]) {\r\n break;\r\n }\r\n listeners[i].apply(this, [event].concat(args));\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n // Helper for for finding special wildcard event handlers that match the event\r\n prototype.getWildcardCallbacks = function (eventName) {\r\n this.callbacks = this.callbacks || {};\r\n var item,\r\n split,\r\n result = [];\r\n\r\n for (item in this.callbacks) {\r\n split = item.split('*');\r\n if (item === '*' || (split.length === 2 && eventName.slice(0, split[0].length) === split[0])) {\r\n result = result.concat(this.callbacks[item]);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n};\r\n\r\nWildEmitter.mixin(WildEmitter);\r\n\n},{}],41:[function(require,module,exports){\n/* global Y */\n'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar SimpleWebRTC = require('simplewebrtc');\n\nfunction extend(Y) {\n var WebRTC = function (_Y$AbstractConnector) {\n _inherits(WebRTC, _Y$AbstractConnector);\n\n function WebRTC(y, options) {\n _classCallCheck(this, WebRTC);\n\n if (options === undefined) {\n throw new Error('Options must not be undefined!');\n }\n if (options.room == null) {\n throw new Error('You must define a room name!');\n }\n options.role = 'slave';\n\n var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(WebRTC).call(this, y, options));\n\n _this.webrtcOptions = {\n url: options.url || 'http://yatta.ninja:8888',\n room: options.room\n };\n var swr = new SimpleWebRTC(_this.webrtcOptions);\n _this.swr = swr;\n var self = _this;\n swr.once('connectionReady', function (userId) {\n // SimpleWebRTC (swr) is initialized\n swr.joinRoom(self.webrtcOptions.room);\n\n swr.once('joinedRoom', function () {\n self.setUserId(userId);\n /*\r\n var i\r\n // notify the connector class about all the users that already\r\n // joined the session\r\n for(i in self.swr.webrtc.peers){\r\n self.userJoined(self.swr.webrtc.peers[i].id, \"master\")\r\n }*/\n swr.on('channelMessage', function (peer, room_, message) {\n // The client received a message\n // Check if the connector is already initialized,\n // only then forward the message to the connector class\n if (message.type != null) {\n self.receiveMessage(peer.id, message.payload);\n }\n });\n });\n\n swr.on('createdPeer', function (peer) {\n // a new peer/client joined the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userJoined(peer.id, 'master');\n });\n\n swr.on('peerStreamRemoved', function (peer) {\n // a client left the session.\n // Notify the connector class, if the connector\n // is already initialized\n self.userLeft(peer.id);\n });\n });\n return _this;\n }\n\n _createClass(WebRTC, [{\n key: 'disconnect',\n value: function disconnect() {\n this.swr.leaveRoom();\n _get(Object.getPrototypeOf(WebRTC.prototype), 'disconnect', this).call(this);\n }\n }, {\n key: 'reconnect',\n value: function reconnect() {\n this.swr.joinRoom(this.webrtcOptions.room);\n _get(Object.getPrototypeOf(WebRTC.prototype), 'reconnect', this).call(this);\n }\n }, {\n key: 'send',\n value: function send(uid, message) {\n var self = this;\n // we have to make sure that the message is sent under all circumstances\n var send = function send() {\n // check if the clients still exists\n var peer = self.swr.webrtc.getPeers(uid)[0];\n var success;\n if (peer) {\n // success is true, if the message is successfully sent\n success = peer.sendDirectly('simplewebrtc', 'yjs', message);\n }\n if (!success) {\n // resend the message if it didn't work\n setTimeout(send, 500);\n }\n };\n // try to send the message\n send();\n }\n }, {\n key: 'broadcast',\n value: function broadcast(message) {\n this.swr.sendDirectlyToAll('simplewebrtc', 'yjs', message);\n }\n }, {\n key: 'isDisconnected',\n value: function isDisconnected() {\n return false;\n }\n }]);\n\n return WebRTC;\n }(Y.AbstractConnector);\n\n Y.extend('webrtc', WebRTC);\n}\n\nmodule.exports = extend;\nif (typeof Y !== 'undefined') {\n extend(Y);\n}\n\n},{\"simplewebrtc\":33}],42:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n},{}],43:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],44:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],45:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./support/isBuffer\":44,\"_process\":43,\"inherits\":42}]},{},[41])\n\n","var WildEmitter = require('wildemitter');\nvar util = require('util');\n\nfunction Sender(opts) {\n WildEmitter.call(this);\n var options = opts || {};\n this.config = {\n chunksize: 16384,\n pacing: 0\n };\n // set our config from options\n var item;\n for (item in options) {\n this.config[item] = options[item];\n }\n\n this.file = null;\n this.channel = null;\n}\nutil.inherits(Sender, WildEmitter);\n\nSender.prototype.send = function (file, channel) {\n var self = this;\n this.file = file;\n this.channel = channel;\n var sliceFile = function(offset) {\n var reader = new window.FileReader();\n reader.onload = (function() {\n return function(e) {\n self.channel.send(e.target.result);\n self.emit('progress', offset, file.size, e.target.result);\n if (file.size > offset + e.target.result.byteLength) {\n window.setTimeout(sliceFile, self.config.pacing, offset + self.config.chunksize);\n } else {\n self.emit('progress', file.size, file.size, null);\n self.emit('sentFile');\n }\n };\n })(file);\n var slice = file.slice(offset, offset + self.config.chunksize);\n reader.readAsArrayBuffer(slice);\n };\n window.setTimeout(sliceFile, 0, 0);\n};\n\nfunction Receiver() {\n WildEmitter.call(this);\n\n this.receiveBuffer = [];\n this.received = 0;\n this.metadata = {};\n this.channel = null;\n}\nutil.inherits(Receiver, WildEmitter);\n\nReceiver.prototype.receive = function (metadata, channel) {\n var self = this;\n\n if (metadata) {\n this.metadata = metadata;\n }\n this.channel = channel;\n // chrome only supports arraybuffers and those make it easier to calc the hash\n channel.binaryType = 'arraybuffer';\n this.channel.onmessage = function (event) {\n var len = event.data.byteLength;\n self.received += len;\n self.receiveBuffer.push(event.data);\n\n self.emit('progress', self.received, self.metadata.size, event.data);\n if (self.received === self.metadata.size) {\n self.emit('receivedFile', new window.Blob(self.receiveBuffer), self.metadata);\n self.receiveBuffer = []; // discard receivebuffer\n } else if (self.received > self.metadata.size) {\n // FIXME\n console.error('received more than expected, discarding...');\n self.receiveBuffer = []; // just discard...\n\n }\n };\n};\n\nmodule.exports = {};\nmodule.exports.support = typeof window !== 'undefined' && window && window.File && window.FileReader && window.Blob;\nmodule.exports.Sender = Sender;\nmodule.exports.Receiver = Receiver;\n","// getScreenMedia helper by @HenrikJoreteg\nvar getUserMedia = require('getusermedia');\n\n// cache for constraints and callback\nvar cache = {};\n\nmodule.exports = function (constraints, cb) {\n var hasConstraints = arguments.length === 2;\n var callback = hasConstraints ? cb : constraints;\n var error;\n\n if (typeof window === 'undefined' || window.location.protocol === 'http:') {\n error = new Error('NavigatorUserMediaError');\n error.name = 'HTTPS_REQUIRED';\n return callback(error);\n }\n\n if (window.navigator.userAgent.match('Chrome')) {\n var chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10);\n var maxver = 33;\n var isCef = !window.chrome.webstore;\n // \"known\" crash in chrome 34 and 35 on linux\n if (window.navigator.userAgent.match('Linux')) maxver = 35;\n\n // check that the extension is installed by looking for a\n // sessionStorage variable that contains the extension id\n // this has to be set after installation unless the contest\n // script does that\n if (sessionStorage.getScreenMediaJSExtensionId) {\n chrome.runtime.sendMessage(sessionStorage.getScreenMediaJSExtensionId,\n {type:'getScreen', id: 1}, null,\n function (data) {\n if (!data || data.sourceId === '') { // user canceled\n var error = new Error('NavigatorUserMediaError');\n error.name = 'PERMISSION_DENIED';\n callback(error);\n } else {\n constraints = (hasConstraints && constraints) || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = data.sourceId;\n getUserMedia(constraints, callback);\n }\n }\n );\n } else if (window.cefGetScreenMedia) {\n //window.cefGetScreenMedia is experimental - may be removed without notice\n window.cefGetScreenMedia(function(sourceId) {\n if (!sourceId) {\n var error = new Error('cefGetScreenMediaError');\n error.name = 'CEF_GETSCREENMEDIA_CANCELED';\n callback(error);\n } else {\n constraints = (hasConstraints && constraints) || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = sourceId;\n getUserMedia(constraints, callback);\n }\n });\n } else if (isCef || (chromever >= 26 && chromever <= maxver)) {\n // chrome 26 - chrome 33 way to do it -- requires bad chrome://flags\n // note: this is basically in maintenance mode and will go away soon\n constraints = (hasConstraints && constraints) || {\n video: {\n mandatory: {\n googLeakyBucket: true,\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3,\n chromeMediaSource: 'screen'\n }\n }\n };\n getUserMedia(constraints, callback);\n } else {\n // chrome 34+ way requiring an extension\n var pending = window.setTimeout(function () {\n error = new Error('NavigatorUserMediaError');\n error.name = 'EXTENSION_UNAVAILABLE';\n return callback(error);\n }, 1000);\n cache[pending] = [callback, hasConstraints ? constraints : null];\n window.postMessage({ type: 'getScreen', id: pending }, '*');\n }\n } else if (window.navigator.userAgent.match('Firefox')) {\n var ffver = parseInt(window.navigator.userAgent.match(/Firefox\\/(.*)/)[1], 10);\n if (ffver >= 33) {\n constraints = (hasConstraints && constraints) || {\n video: {\n mozMediaSource: 'window',\n mediaSource: 'window'\n }\n }\n getUserMedia(constraints, function (err, stream) {\n callback(err, stream);\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n if (!err) {\n var lastTime = stream.currentTime;\n var polly = window.setInterval(function () {\n if (!stream) window.clearInterval(polly);\n if (stream.currentTime == lastTime) {\n window.clearInterval(polly);\n if (stream.onended) {\n stream.onended();\n }\n }\n lastTime = stream.currentTime;\n }, 500);\n }\n });\n } else {\n error = new Error('NavigatorUserMediaError');\n error.name = 'EXTENSION_UNAVAILABLE'; // does not make much sense but...\n }\n }\n};\n\nwindow.addEventListener('message', function (event) {\n if (event.origin != window.location.origin) {\n return;\n }\n if (event.data.type == 'gotScreen' && cache[event.data.id]) {\n var data = cache[event.data.id];\n var constraints = data[1];\n var callback = data[0];\n delete cache[event.data.id];\n\n if (event.data.sourceId === '') { // user canceled\n var error = new Error('NavigatorUserMediaError');\n error.name = 'PERMISSION_DENIED';\n callback(error);\n } else {\n constraints = constraints || {audio: false, video: {\n mandatory: {\n chromeMediaSource: 'desktop',\n maxWidth: window.screen.width,\n maxHeight: window.screen.height,\n maxFrameRate: 3\n },\n optional: [\n {googLeakyBucket: true},\n {googTemporalLayeredScreencast: true}\n ]\n }};\n constraints.video.mandatory.chromeMediaSourceId = event.data.sourceId;\n getUserMedia(constraints, callback);\n }\n } else if (event.data.type == 'getScreenPending') {\n window.clearTimeout(event.data.id);\n }\n});\n","// getUserMedia helper by @HenrikJoreteg\nvar adapter = require('webrtc-adapter-test');\n\nmodule.exports = function (constraints, cb) {\n var options, error;\n var haveOpts = arguments.length === 2;\n var defaultOpts = {video: true, audio: true};\n\n var denied = 'PermissionDeniedError';\n var altDenied = 'PERMISSION_DENIED';\n var notSatisfied = 'ConstraintNotSatisfiedError';\n\n // make constraints optional\n if (!haveOpts) {\n cb = constraints;\n constraints = defaultOpts;\n }\n\n // treat lack of browser support like an error\n if (!navigator.getUserMedia) {\n // throw proper error per spec\n error = new Error('MediaStreamError');\n error.name = 'NotSupportedError';\n\n // keep all callbacks async\n return window.setTimeout(function () {\n cb(error);\n }, 0);\n }\n\n // normalize error handling when no media types are requested\n if (!constraints.audio && !constraints.video) {\n error = new Error('MediaStreamError');\n error.name = 'NoMediaRequestedError';\n\n // keep all callbacks async\n return window.setTimeout(function () {\n cb(error);\n }, 0);\n }\n\n // testing support\n if (localStorage && localStorage.useFirefoxFakeDevice === \"true\") {\n constraints.fake = true;\n }\n\n navigator.getUserMedia(constraints, function (stream) {\n cb(null, stream);\n }, function (err) {\n var error;\n // coerce into an error object since FF gives us a string\n // there are only two valid names according to the spec\n // we coerce all non-denied to \"constraint not satisfied\".\n if (typeof err === 'string') {\n error = new Error('MediaStreamError');\n if (err === denied || err === altDenied) {\n error.name = denied;\n } else {\n error.name = notSatisfied;\n }\n } else {\n // if we get an error object make sure '.name' property is set\n // according to spec: http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermediaerror-and-navigatorusermediaerrorcallback\n error = err;\n if (!error.name) {\n // this is likely chrome which\n // sets a property called \"ERROR_DENIED\" on the error object\n // if so we make sure to set a name\n if (error[denied]) {\n err.name = denied;\n } else {\n err.name = notSatisfied;\n }\n }\n }\n\n cb(error);\n });\n};\n","var WildEmitter = require('wildemitter');\n\nfunction getMaxVolume (analyser, fftBins) {\n var maxVolume = -Infinity;\n analyser.getFloatFrequencyData(fftBins);\n\n for(var i=4, ii=fftBins.length; i < ii; i++) {\n if (fftBins[i] > maxVolume && fftBins[i] < 0) {\n maxVolume = fftBins[i];\n }\n };\n\n return maxVolume;\n}\n\n\nvar audioContextType = window.AudioContext || window.webkitAudioContext;\n// use a single audio context due to hardware limits\nvar audioContext = null;\nmodule.exports = function(stream, options) {\n var harker = new WildEmitter();\n\n\n // make it not break in non-supported browsers\n if (!audioContextType) return harker;\n\n //Config\n var options = options || {},\n smoothing = (options.smoothing || 0.1),\n interval = (options.interval || 50),\n threshold = options.threshold,\n play = options.play,\n history = options.history || 10,\n running = true;\n\n //Setup Audio Context\n if (!audioContext) {\n audioContext = new audioContextType();\n }\n var sourceNode, fftBins, analyser;\n\n analyser = audioContext.createAnalyser();\n analyser.fftSize = 512;\n analyser.smoothingTimeConstant = smoothing;\n fftBins = new Float32Array(analyser.fftSize);\n\n if (stream.jquery) stream = stream[0];\n if (stream instanceof HTMLAudioElement || stream instanceof HTMLVideoElement) {\n //Audio Tag\n sourceNode = audioContext.createMediaElementSource(stream);\n if (typeof play === 'undefined') play = true;\n threshold = threshold || -50;\n } else {\n //WebRTC Stream\n sourceNode = audioContext.createMediaStreamSource(stream);\n threshold = threshold || -50;\n }\n\n sourceNode.connect(analyser);\n if (play) analyser.connect(audioContext.destination);\n\n harker.speaking = false;\n\n harker.setThreshold = function(t) {\n threshold = t;\n };\n\n harker.setInterval = function(i) {\n interval = i;\n };\n \n harker.stop = function() {\n running = false;\n harker.emit('volume_change', -100, threshold);\n if (harker.speaking) {\n harker.speaking = false;\n harker.emit('stopped_speaking');\n }\n };\n harker.speakingHistory = [];\n for (var i = 0; i < history; i++) {\n harker.speakingHistory.push(0);\n }\n\n // Poll the analyser node to determine if speaking\n // and emit events if changed\n var looper = function() {\n setTimeout(function() {\n \n //check if stop has been called\n if(!running) {\n return;\n }\n \n var currentVolume = getMaxVolume(analyser, fftBins);\n\n harker.emit('volume_change', currentVolume, threshold);\n\n var history = 0;\n if (currentVolume > threshold && !harker.speaking) {\n // trigger quickly, short history\n for (var i = harker.speakingHistory.length - 3; i < harker.speakingHistory.length; i++) {\n history += harker.speakingHistory[i];\n }\n if (history >= 2) {\n harker.speaking = true;\n harker.emit('speaking');\n }\n } else if (currentVolume < threshold && harker.speaking) {\n for (var i = 0; i < harker.speakingHistory.length; i++) {\n history += harker.speakingHistory[i];\n }\n if (history == 0) {\n harker.speaking = false;\n harker.emit('stopped_speaking');\n }\n }\n harker.speakingHistory.shift();\n harker.speakingHistory.push(0 + (currentVolume > threshold));\n\n looper();\n }, interval);\n };\n looper();\n\n\n return harker;\n}\n","var util = require('util');\nvar hark = require('hark');\nvar webrtc = require('webrtcsupport');\nvar getUserMedia = require('getusermedia');\nvar getScreenMedia = require('getscreenmedia');\nvar WildEmitter = require('wildemitter');\nvar GainController = require('mediastream-gain');\nvar mockconsole = require('mockconsole');\n\n\nfunction LocalMedia(opts) {\n WildEmitter.call(this);\n\n var config = this.config = {\n autoAdjustMic: false,\n detectSpeakingEvents: true,\n audioFallback: false,\n media: {\n audio: true,\n video: true\n },\n logger: mockconsole\n };\n\n var item;\n for (item in opts) {\n this.config[item] = opts[item];\n }\n\n this.logger = config.logger;\n this._log = this.logger.log.bind(this.logger, 'LocalMedia:');\n this._logerror = this.logger.error.bind(this.logger, 'LocalMedia:');\n\n this.screenSharingSupport = webrtc.screenSharing;\n\n this.localStreams = [];\n this.localScreens = [];\n\n if (!webrtc.support) {\n this._logerror('Your browser does not support local media capture.');\n }\n}\n\nutil.inherits(LocalMedia, WildEmitter);\n\n\nLocalMedia.prototype.start = function (mediaConstraints, cb) {\n var self = this;\n var constraints = mediaConstraints || this.config.media;\n\n getUserMedia(constraints, function (err, stream) {\n\n if (!err) {\n if (constraints.audio && self.config.detectSpeakingEvents) {\n self.setupAudioMonitor(stream, self.config.harkOptions);\n }\n self.localStreams.push(stream);\n\n if (self.config.autoAdjustMic) {\n self.gainController = new GainController(stream);\n // start out somewhat muted if we can track audio\n self.setMicIfEnabled(0.5);\n }\n\n // TODO: might need to migrate to the video tracks onended\n // FIXME: firefox does not seem to trigger this...\n stream.onended = function () {\n /*\n var idx = self.localStreams.indexOf(stream);\n if (idx > -1) {\n self.localScreens.splice(idx, 1);\n }\n self.emit('localStreamStopped', stream);\n */\n };\n\n self.emit('localStream', stream);\n } else {\n // Fallback for users without a camera\n if (self.config.audioFallback && err.name === 'DevicesNotFoundError' && constraints.video !== false) {\n constraints.video = false;\n self.start(constraints, cb);\n return;\n }\n }\n if (cb) {\n return cb(err, stream);\n }\n });\n};\n\nLocalMedia.prototype.stop = function (stream) {\n var self = this;\n // FIXME: duplicates cleanup code until fixed in FF\n if (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n var idx = self.localStreams.indexOf(stream);\n if (idx > -1) {\n self.emit('localStreamStopped', stream);\n self.localStreams = self.localStreams.splice(idx, 1);\n } else {\n idx = self.localScreens.indexOf(stream);\n if (idx > -1) {\n self.emit('localScreenStopped', stream);\n self.localScreens = self.localScreens.splice(idx, 1);\n }\n }\n } else {\n this.stopStreams();\n this.stopScreenShare();\n }\n};\n\nLocalMedia.prototype.stopStreams = function () {\n var self = this;\n if (this.audioMonitor) {\n this.audioMonitor.stop();\n delete this.audioMonitor;\n }\n this.localStreams.forEach(function (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n self.emit('localStreamStopped', stream);\n });\n this.localStreams = [];\n};\n\nLocalMedia.prototype.startScreenShare = function (cb) {\n var self = this;\n getScreenMedia(function (err, stream) {\n if (!err) {\n self.localScreens.push(stream);\n\n // TODO: might need to migrate to the video tracks onended\n // Firefox does not support .onended but it does not support\n // screensharing either\n stream.onended = function () {\n var idx = self.localScreens.indexOf(stream);\n if (idx > -1) {\n self.localScreens.splice(idx, 1);\n }\n self.emit('localScreenStopped', stream);\n };\n self.emit('localScreen', stream);\n }\n\n // enable the callback\n if (cb) {\n return cb(err, stream);\n }\n });\n};\n\nLocalMedia.prototype.stopScreenShare = function (stream) {\n var self = this;\n if (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n this.emit('localScreenStopped', stream);\n } else {\n this.localScreens.forEach(function (stream) {\n stream.getTracks().forEach(function (track) { track.stop(); });\n self.emit('localScreenStopped', stream);\n });\n this.localScreens = [];\n }\n};\n\n// Audio controls\nLocalMedia.prototype.mute = function () {\n this._audioEnabled(false);\n this.hardMuted = true;\n this.emit('audioOff');\n};\n\nLocalMedia.prototype.unmute = function () {\n this._audioEnabled(true);\n this.hardMuted = false;\n this.emit('audioOn');\n};\n\nLocalMedia.prototype.setupAudioMonitor = function (stream, harkOptions) {\n this._log('Setup audio');\n var audio = this.audioMonitor = hark(stream, harkOptions);\n var self = this;\n var timeout;\n\n audio.on('speaking', function () {\n self.emit('speaking');\n if (self.hardMuted) {\n return;\n }\n self.setMicIfEnabled(1);\n });\n\n audio.on('stopped_speaking', function () {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n self.emit('stoppedSpeaking');\n if (self.hardMuted) {\n return;\n }\n self.setMicIfEnabled(0.5);\n }, 1000);\n });\n audio.on('volume_change', function (volume, treshold) {\n self.emit('volumeChange', volume, treshold);\n });\n};\n\n// We do this as a seperate method in order to\n// still leave the \"setMicVolume\" as a working\n// method.\nLocalMedia.prototype.setMicIfEnabled = function (volume) {\n if (!this.config.autoAdjustMic) {\n return;\n }\n this.gainController.setGain(volume);\n};\n\n// Video controls\nLocalMedia.prototype.pauseVideo = function () {\n this._videoEnabled(false);\n this.emit('videoOff');\n};\nLocalMedia.prototype.resumeVideo = function () {\n this._videoEnabled(true);\n this.emit('videoOn');\n};\n\n// Combined controls\nLocalMedia.prototype.pause = function () {\n this.mute();\n this.pauseVideo();\n};\nLocalMedia.prototype.resume = function () {\n this.unmute();\n this.resumeVideo();\n};\n\n// Internal methods for enabling/disabling audio/video\nLocalMedia.prototype._audioEnabled = function (bool) {\n // work around for chrome 27 bug where disabling tracks\n // doesn't seem to work (works in canary, remove when working)\n this.setMicIfEnabled(bool ? 1 : 0);\n this.localStreams.forEach(function (stream) {\n stream.getAudioTracks().forEach(function (track) {\n track.enabled = !!bool;\n });\n });\n};\nLocalMedia.prototype._videoEnabled = function (bool) {\n this.localStreams.forEach(function (stream) {\n stream.getVideoTracks().forEach(function (track) {\n track.enabled = !!bool;\n });\n });\n};\n\n// check if all audio streams are enabled\nLocalMedia.prototype.isAudioEnabled = function () {\n var enabled = true;\n this.localStreams.forEach(function (stream) {\n stream.getAudioTracks().forEach(function (track) {\n enabled = enabled && track.enabled;\n });\n });\n return enabled;\n};\n\n// check if all video streams are enabled\nLocalMedia.prototype.isVideoEnabled = function () {\n var enabled = true;\n this.localStreams.forEach(function (stream) {\n stream.getVideoTracks().forEach(function (track) {\n enabled = enabled && track.enabled;\n });\n });\n return enabled;\n};\n\n// Backwards Compat\nLocalMedia.prototype.startLocalMedia = LocalMedia.prototype.start;\nLocalMedia.prototype.stopLocalMedia = LocalMedia.prototype.stop;\n\n// fallback for old .localStream behaviour\nObject.defineProperty(LocalMedia.prototype, 'localStream', {\n get: function () {\n return this.localStreams.length > 0 ? this.localStreams[0] : null;\n }\n});\n// fallback for old .localScreen behaviour\nObject.defineProperty(LocalMedia.prototype, 'localScreen', {\n get: function () {\n return this.localScreens.length > 0 ? this.localScreens[0] : null;\n }\n});\n\nmodule.exports = LocalMedia;\n","/**\n * lodash 3.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.7.0 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands or `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * lodash 3.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.7.0 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands or `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * lodash 3.3.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar baseIsEqual = require('lodash._baseisequal'),\n bindCallback = require('lodash._bindcallback'),\n isArray = require('lodash.isarray'),\n pairs = require('lodash.pairs');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n return value == null ? '' : (value + '');\n}\n\n/**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction baseCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (type == 'function') {\n return thisArg === undefined\n ? func\n : bindCallback(func, thisArg, argCount);\n }\n if (func == null) {\n return identity;\n }\n if (type == 'object') {\n return baseMatches(func);\n }\n return thisArg === undefined\n ? property(func)\n : baseMatchesProperty(func, thisArg);\n}\n\n/**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = toObject(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n var key = matchData[0][0],\n value = matchData[0][1];\n\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === value && (value !== undefined || (key in toObject(object)));\n };\n }\n return function(object) {\n return baseIsMatch(object, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n var isArr = isArray(path),\n isCommon = isKey(path) && isStrictComparable(srcValue),\n pathKey = (path + '');\n\n path = toPath(path);\n return function(object) {\n if (object == null) {\n return false;\n }\n var key = pathKey;\n object = toObject(object);\n if ((isArr || !isCommon) && !(key in object)) {\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n if (object == null) {\n return false;\n }\n key = last(path);\n object = toObject(object);\n }\n return object[key] === srcValue\n ? (srcValue !== undefined || (key in object))\n : baseIsEqual(srcValue, object[key], undefined, true);\n };\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n}\n\n/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n start = start == null ? 0 : (+start || 0);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : (+end || 0);\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\n/**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = pairs(object),\n length = result.length;\n\n while (length--) {\n result[length][2] = isStrictComparable(result[length][1]);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\nfunction toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n}\n\n/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': { 'c': 2 } } },\n * { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n}\n\nmodule.exports = baseCallback;\n","/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar keys = require('lodash.keys');\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\n/**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return baseFor(object, iteratee, keys);\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n var length = collection ? getLength(collection) : 0;\n if (!isLength(length)) {\n return eachFunc(collection, iteratee);\n }\n var index = fromRight ? length : -1,\n iterable = toObject(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\n/**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var iterable = toObject(object),\n props = keysFunc(object),\n length = props.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n var key = props[index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseEach;\n","/**\n * lodash 3.7.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseGet;\n","/**\n * lodash 3.0.7 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar isArray = require('lodash.isarray'),\n isTypedArray = require('lodash.istypedarray'),\n keys = require('lodash.keys');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n stringTag = '[object String]';\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native 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 [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = isTypedArray(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = isTypedArray(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return equalByTag(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!arraySome(other, function(othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} value The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return (object != +object)\n ? other != +other\n : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == (other + '');\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseIsEqual;\n","/**\n * lodash 3.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5: return function(value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function() {\n return func.apply(thisArg, arguments);\n };\n}\n\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = bindCallback;\n","/**\n * lodash 3.9.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = getNative;\n","/**\n * lodash 3.8.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar isArray = require('lodash.isarray');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n return value == null ? '' : (value + '');\n}\n\n/**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\nfunction toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n}\n\nmodule.exports = toPath;\n","/**\n * lodash 3.0.3 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar arrayEach = require('lodash._arrayeach'),\n baseEach = require('lodash._baseeach'),\n bindCallback = require('lodash._bindcallback'),\n isArray = require('lodash.isarray');\n\n/**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\nfunction createForEach(arrayFunc, eachFunc) {\n return function(collection, iteratee, thisArg) {\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee)\n : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n };\n}\n\n/**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n * console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\nvar forEach = createForEach(arrayEach, baseEach);\n\nmodule.exports = forEach;\n","/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Native method references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n return isObjectLike(value) && isArrayLike(value) &&\n hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n}\n\nmodule.exports = isArguments;\n","/**\n * lodash 3.0.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = isArray;\n","/**\n * lodash 3.0.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n","/**\n * lodash 3.1.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar getNative = require('lodash._getnative'),\n isArguments = require('lodash.isarguments'),\n isArray = require('lodash.isarray');\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n var props = keysIn(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && isLength(length) &&\n (isArray(object) || isArguments(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n var Ctor = object == null ? undefined : object.constructor;\n if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n (typeof object != 'function' && isArrayLike(object))) {\n return shimKeys(object);\n }\n return isObject(object) ? nativeKeys(object) : [];\n};\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!isObject(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = (length && isLength(length) &&\n (isArray(object) || isArguments(object)) && length) || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = (index + '');\n }\n for (var key in object) {\n if (!(skipIndexes && isIndex(key, length)) &&\n !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n","/**\n * lodash 3.1.4 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar arrayMap = require('lodash._arraymap'),\n baseCallback = require('lodash._basecallback'),\n baseEach = require('lodash._baseeach'),\n isArray = require('lodash.isarray');\n\n/**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n * return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee, thisArg) {\n var func = isArray(collection) ? arrayMap : baseMap;\n iteratee = baseCallback(iteratee, thisArg, 3);\n return func(collection, iteratee);\n}\n\nmodule.exports = map;\n","/**\n * lodash 3.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar keys = require('lodash.keys');\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\nfunction pairs(object) {\n object = toObject(object);\n\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n}\n\nmodule.exports = pairs;\n","/**\n * lodash 3.1.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar baseGet = require('lodash._baseget'),\n toPath = require('lodash._topath'),\n isArray = require('lodash.isarray'),\n map = require('lodash.map');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n}\n\n/**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\nfunction toObject(value) {\n return isObject(value) ? value : Object(value);\n}\n\n/**\n * Gets the property value of `path` from all elements in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|string} path The path of the property to pluck.\n * @returns {Array} Returns the property values.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * _.pluck(users, 'user');\n * // => ['barney', 'fred']\n *\n * var userIndex = _.indexBy(users, 'user');\n * _.pluck(userIndex, 'age');\n * // => [36, 40] (iteration order is not guaranteed)\n */\nfunction pluck(collection, path) {\n return map(collection, property(path));\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Creates a function which returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': { 'c': 2 } } },\n * { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n}\n\nmodule.exports = pluck;\n","var support = require('webrtcsupport');\n\n\nfunction GainController(stream) {\n this.support = support.webAudio && support.mediaStream;\n\n // set our starting value\n this.gain = 1;\n\n if (this.support) {\n var context = this.context = new support.AudioContext();\n this.microphone = context.createMediaStreamSource(stream);\n this.gainFilter = context.createGain();\n this.destination = context.createMediaStreamDestination();\n this.outputStream = this.destination.stream;\n this.microphone.connect(this.gainFilter);\n this.gainFilter.connect(this.destination);\n stream.addTrack(this.outputStream.getAudioTracks()[0]);\n stream.removeTrack(stream.getAudioTracks()[0]);\n }\n this.stream = stream;\n}\n\n// setting\nGainController.prototype.setGain = function (val) {\n // check for support\n if (!this.support) return;\n this.gainFilter.gain.value = val;\n this.gain = val;\n};\n\nGainController.prototype.getGain = function () {\n return this.gain;\n};\n\nGainController.prototype.off = function () {\n return this.setGain(0);\n};\n\nGainController.prototype.on = function () {\n this.setGain(1);\n};\n\n\nmodule.exports = GainController;\n","var methods = \"assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn\".split(\",\");\nvar l = methods.length;\nvar fn = function () {};\nvar mockconsole = {};\n\nwhile (l--) {\n mockconsole[methods[l]] = fn;\n}\n\nmodule.exports = mockconsole;\n","var util = require('util');\nvar each = require('lodash.foreach');\nvar pluck = require('lodash.pluck');\nvar SJJ = require('sdp-jingle-json');\nvar WildEmitter = require('wildemitter');\nvar peerconn = require('traceablepeerconnection');\nvar adapter = require('webrtc-adapter-test');\n\nfunction PeerConnection(config, constraints) {\n var self = this;\n var item;\n WildEmitter.call(this);\n\n config = config || {};\n config.iceServers = config.iceServers || [];\n\n // make sure this only gets enabled in Google Chrome\n // EXPERIMENTAL FLAG, might get removed without notice\n this.enableChromeNativeSimulcast = false;\n if (constraints && constraints.optional &&\n adapter.webrtcDetectedBrowser === 'chrome' &&\n navigator.appVersion.match(/Chromium\\//) === null) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.enableChromeNativeSimulcast) {\n self.enableChromeNativeSimulcast = true;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n this.enableMultiStreamHacks = false;\n if (constraints && constraints.optional &&\n adapter.webrtcDetectedBrowser === 'chrome') {\n constraints.optional.forEach(function (constraint) {\n if (constraint.enableMultiStreamHacks) {\n self.enableMultiStreamHacks = true;\n }\n });\n }\n // EXPERIMENTAL FLAG, might get removed without notice\n this.restrictBandwidth = 0;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetRestrictBandwidth) {\n self.restrictBandwidth = constraint.andyetRestrictBandwidth;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // bundle up ice candidates, only works for jingle mode\n // number > 0 is the delay to wait for additional candidates\n // ~20ms seems good\n this.batchIceCandidates = 0;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetBatchIce) {\n self.batchIceCandidates = constraint.andyetBatchIce;\n }\n });\n }\n this.batchedIceCandidates = [];\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // this attemps to strip out candidates with an already known foundation\n // and type -- i.e. those which are gathered via the same TURN server\n // but different transports (TURN udp, tcp and tls respectively)\n if (constraints && constraints.optional && adapter.webrtcDetectedBrowser === 'chrome') {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetFasterICE) {\n self.eliminateDuplicateCandidates = constraint.andyetFasterICE;\n }\n });\n }\n // EXPERIMENTAL FLAG, might get removed without notice\n // when using a server such as the jitsi videobridge we don't need to signal\n // our candidates\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetDontSignalCandidates) {\n self.dontSignalCandidates = constraint.andyetDontSignalCandidates;\n }\n });\n }\n\n\n // EXPERIMENTAL FLAG, might get removed without notice\n this.assumeSetLocalSuccess = false;\n if (constraints && constraints.optional) {\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetAssumeSetLocalSuccess) {\n self.assumeSetLocalSuccess = constraint.andyetAssumeSetLocalSuccess;\n }\n });\n }\n\n // EXPERIMENTAL FLAG, might get removed without notice\n // working around https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n // pass in a timeout for this\n if (adapter.webrtcDetectedBrowser === 'firefox') {\n if (constraints && constraints.optional) {\n this.wtFirefox = 0;\n constraints.optional.forEach(function (constraint) {\n if (constraint.andyetFirefoxMakesMeSad) {\n self.wtFirefox = constraint.andyetFirefoxMakesMeSad;\n if (self.wtFirefox > 0) {\n self.firefoxcandidatebuffer = [];\n }\n }\n });\n }\n }\n\n\n this.pc = new peerconn(config, constraints);\n\n this.getLocalStreams = this.pc.getLocalStreams.bind(this.pc);\n this.getRemoteStreams = this.pc.getRemoteStreams.bind(this.pc);\n this.addStream = this.pc.addStream.bind(this.pc);\n this.removeStream = this.pc.removeStream.bind(this.pc);\n\n // proxy events\n this.pc.on('*', function () {\n self.emit.apply(self, arguments);\n });\n\n // proxy some events directly\n this.pc.onremovestream = this.emit.bind(this, 'removeStream');\n this.pc.onaddstream = this.emit.bind(this, 'addStream');\n this.pc.onnegotiationneeded = this.emit.bind(this, 'negotiationNeeded');\n this.pc.oniceconnectionstatechange = this.emit.bind(this, 'iceConnectionStateChange');\n this.pc.onsignalingstatechange = this.emit.bind(this, 'signalingStateChange');\n\n // handle ice candidate and data channel events\n this.pc.onicecandidate = this._onIce.bind(this);\n this.pc.ondatachannel = this._onDataChannel.bind(this);\n\n this.localDescription = {\n contents: []\n };\n this.remoteDescription = {\n contents: []\n };\n\n this.config = {\n debug: false,\n ice: {},\n sid: '',\n isInitiator: true,\n sdpSessionID: Date.now(),\n useJingle: false\n };\n\n // apply our config\n for (item in config) {\n this.config[item] = config[item];\n }\n\n if (this.config.debug) {\n this.on('*', function () {\n var logger = config.logger || console;\n logger.log('PeerConnection event:', arguments);\n });\n }\n this.hadLocalStunCandidate = false;\n this.hadRemoteStunCandidate = false;\n this.hadLocalRelayCandidate = false;\n this.hadRemoteRelayCandidate = false;\n\n this.hadLocalIPv6Candidate = false;\n this.hadRemoteIPv6Candidate = false;\n\n // keeping references for all our data channels\n // so they dont get garbage collected\n // can be removed once the following bugs have been fixed\n // https://crbug.com/405545\n // https://bugzilla.mozilla.org/show_bug.cgi?id=964092\n // to be filed for opera\n this._remoteDataChannels = [];\n this._localDataChannels = [];\n\n this._candidateBuffer = [];\n}\n\nutil.inherits(PeerConnection, WildEmitter);\n\nObject.defineProperty(PeerConnection.prototype, 'signalingState', {\n get: function () {\n return this.pc.signalingState;\n }\n});\nObject.defineProperty(PeerConnection.prototype, 'iceConnectionState', {\n get: function () {\n return this.pc.iceConnectionState;\n }\n});\n\nPeerConnection.prototype._role = function () {\n return this.isInitiator ? 'initiator' : 'responder';\n};\n\n// Add a stream to the peer connection object\nPeerConnection.prototype.addStream = function (stream) {\n this.localStream = stream;\n this.pc.addStream(stream);\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkLocalCandidate = function (candidate) {\n var cand = SJJ.toCandidateJSON(candidate);\n if (cand.type == 'srflx') {\n this.hadLocalStunCandidate = true;\n } else if (cand.type == 'relay') {\n this.hadLocalRelayCandidate = true;\n }\n if (cand.ip.indexOf(':') != -1) {\n this.hadLocalIPv6Candidate = true;\n }\n};\n\n// helper function to check if a remote candidate is a stun/relay\n// candidate or an ipv6 candidate\nPeerConnection.prototype._checkRemoteCandidate = function (candidate) {\n var cand = SJJ.toCandidateJSON(candidate);\n if (cand.type == 'srflx') {\n this.hadRemoteStunCandidate = true;\n } else if (cand.type == 'relay') {\n this.hadRemoteRelayCandidate = true;\n }\n if (cand.ip.indexOf(':') != -1) {\n this.hadRemoteIPv6Candidate = true;\n }\n};\n\n\n// Init and add ice candidate object with correct constructor\nPeerConnection.prototype.processIce = function (update, cb) {\n cb = cb || function () {};\n var self = this;\n\n // ignore any added ice candidates to avoid errors. why does the\n // spec not do this?\n if (this.pc.signalingState === 'closed') return cb();\n\n if (update.contents || (update.jingle && update.jingle.contents)) {\n var contentNames = pluck(this.remoteDescription.contents, 'name');\n var contents = update.contents || update.jingle.contents;\n\n contents.forEach(function (content) {\n var transport = content.transport || {};\n var candidates = transport.candidates || [];\n var mline = contentNames.indexOf(content.name);\n var mid = content.name;\n\n candidates.forEach(\n function (candidate) {\n var iceCandidate = SJJ.toCandidateSDP(candidate) + '\\r\\n';\n self.pc.addIceCandidate(\n new RTCIceCandidate({\n candidate: iceCandidate,\n sdpMLineIndex: mline,\n sdpMid: mid\n }), function () {\n // well, this success callback is pretty meaningless\n },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(iceCandidate);\n });\n });\n } else {\n // working around https://code.google.com/p/webrtc/issues/detail?id=3669\n if (update.candidate && update.candidate.candidate.indexOf('a=') !== 0) {\n update.candidate.candidate = 'a=' + update.candidate.candidate;\n }\n\n if (this.wtFirefox && this.firefoxcandidatebuffer !== null) {\n // we cant add this yet due to https://bugzilla.mozilla.org/show_bug.cgi?id=1087551\n if (this.pc.localDescription && this.pc.localDescription.type === 'offer') {\n this.firefoxcandidatebuffer.push(update.candidate);\n return cb();\n }\n }\n\n self.pc.addIceCandidate(\n new RTCIceCandidate(update.candidate),\n function () { },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(update.candidate.candidate);\n }\n cb();\n};\n\n// Generate and emit an offer with the given constraints\nPeerConnection.prototype.offer = function (constraints, cb) {\n var self = this;\n var hasConstraints = arguments.length === 2;\n var mediaConstraints = hasConstraints && constraints ? constraints : {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n };\n cb = hasConstraints ? cb : constraints;\n cb = cb || function () {};\n\n if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n // Actually generate the offer\n this.pc.createOffer(\n function (offer) {\n // does not work for jingle, but jingle.js doesn't need\n // this hack...\n var expandedOffer = {\n type: 'offer',\n sdp: offer.sdp\n };\n if (self.assumeSetLocalSuccess) {\n self.emit('offer', expandedOffer);\n cb(null, expandedOffer);\n }\n self._candidateBuffer = [];\n self.pc.setLocalDescription(offer,\n function () {\n var jingle;\n if (self.config.useJingle) {\n jingle = SJJ.toSessionJSON(offer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n jingle.sid = self.config.sid;\n self.localDescription = jingle;\n\n // Save ICE credentials\n each(jingle.contents, function (content) {\n var transport = content.transport || {};\n if (transport.ufrag) {\n self.config.ice[content.name] = {\n ufrag: transport.ufrag,\n pwd: transport.pwd\n };\n }\n });\n\n expandedOffer.jingle = jingle;\n }\n expandedOffer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkLocalCandidate(line);\n }\n });\n\n if (!self.assumeSetLocalSuccess) {\n self.emit('offer', expandedOffer);\n cb(null, expandedOffer);\n }\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n }\n );\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n },\n mediaConstraints\n );\n};\n\n\n// Process an incoming offer so that ICE may proceed before deciding\n// to answer the request.\nPeerConnection.prototype.handleOffer = function (offer, cb) {\n cb = cb || function () {};\n var self = this;\n offer.type = 'offer';\n if (offer.jingle) {\n if (this.enableChromeNativeSimulcast) {\n offer.jingle.contents.forEach(function (content) {\n if (content.name === 'video') {\n content.description.googConferenceFlag = true;\n }\n });\n }\n if (this.enableMultiStreamHacks) {\n // add a mixed video stream as first stream\n offer.jingle.contents.forEach(function (content) {\n if (content.name === 'video') {\n var sources = content.description.sources || [];\n if (sources.length === 0 || sources[0].ssrc !== \"3735928559\") {\n sources.unshift({\n ssrc: \"3735928559\", // 0xdeadbeef\n parameters: [\n {\n key: \"cname\",\n value: \"deadbeef\"\n },\n {\n key: \"msid\",\n value: \"mixyourfecintothis please\"\n }\n ]\n });\n content.description.sources = sources;\n }\n }\n });\n }\n if (self.restrictBandwidth > 0) {\n if (offer.jingle.contents.length >= 2 && offer.jingle.contents[1].name === 'video') {\n var content = offer.jingle.contents[1];\n var hasBw = content.description && content.description.bandwidth;\n if (!hasBw) {\n offer.jingle.contents[1].description.bandwidth = { type: 'AS', bandwidth: self.restrictBandwidth.toString() };\n offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n }\n }\n offer.sdp = SJJ.toSessionSDP(offer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'incoming'\n });\n self.remoteDescription = offer.jingle;\n }\n offer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkRemoteCandidate(line);\n }\n });\n self.pc.setRemoteDescription(new RTCSessionDescription(offer),\n function () {\n cb();\n },\n cb\n );\n};\n\n// Answer an offer with audio only\nPeerConnection.prototype.answerAudioOnly = function (cb) {\n var mediaConstraints = {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: false\n }\n };\n this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer without offering to recieve\nPeerConnection.prototype.answerBroadcastOnly = function (cb) {\n var mediaConstraints = {\n mandatory: {\n OfferToReceiveAudio: false,\n OfferToReceiveVideo: false\n }\n };\n this._answer(mediaConstraints, cb);\n};\n\n// Answer an offer with given constraints default is audio/video\nPeerConnection.prototype.answer = function (constraints, cb) {\n var hasConstraints = arguments.length === 2;\n var callback = hasConstraints ? cb : constraints;\n var mediaConstraints = hasConstraints && constraints ? constraints : {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n };\n\n this._answer(mediaConstraints, callback);\n};\n\n// Process an answer\nPeerConnection.prototype.handleAnswer = function (answer, cb) {\n cb = cb || function () {};\n var self = this;\n if (answer.jingle) {\n answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'incoming'\n });\n self.remoteDescription = answer.jingle;\n }\n answer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkRemoteCandidate(line);\n }\n });\n self.pc.setRemoteDescription(\n new RTCSessionDescription(answer),\n function () {\n if (self.wtFirefox) {\n window.setTimeout(function () {\n self.firefoxcandidatebuffer.forEach(function (candidate) {\n // add candidates later\n self.pc.addIceCandidate(\n new RTCIceCandidate(candidate),\n function () { },\n function (err) {\n self.emit('error', err);\n }\n );\n self._checkRemoteCandidate(candidate.candidate);\n });\n self.firefoxcandidatebuffer = null;\n }, self.wtFirefox);\n }\n cb(null);\n },\n cb\n );\n};\n\n// Close the peer connection\nPeerConnection.prototype.close = function () {\n this.pc.close();\n\n this._localDataChannels = [];\n this._remoteDataChannels = [];\n\n this.emit('close');\n};\n\n// Internal code sharing for various types of answer methods\nPeerConnection.prototype._answer = function (constraints, cb) {\n cb = cb || function () {};\n var self = this;\n if (!this.pc.remoteDescription) {\n // the old API is used, call handleOffer\n throw new Error('remoteDescription not set');\n }\n\n if (this.pc.signalingState === 'closed') return cb('Already closed');\n\n self.pc.createAnswer(\n function (answer) {\n var sim = [];\n if (self.enableChromeNativeSimulcast) {\n // native simulcast part 1: add another SSRC\n answer.jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n if (answer.jingle.contents.length >= 2 && answer.jingle.contents[1].name === 'video') {\n var groups = answer.jingle.contents[1].description.sourceGroups || [];\n var hasSim = false;\n groups.forEach(function (group) {\n if (group.semantics == 'SIM') hasSim = true;\n });\n if (!hasSim &&\n answer.jingle.contents[1].description.sources.length) {\n var newssrc = JSON.parse(JSON.stringify(answer.jingle.contents[1].description.sources[0]));\n newssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n answer.jingle.contents[1].description.sources.push(newssrc);\n\n sim.push(answer.jingle.contents[1].description.sources[0].ssrc);\n sim.push(newssrc.ssrc);\n groups.push({\n semantics: 'SIM',\n sources: sim\n });\n\n // also create an RTX one for the SIM one\n var rtxssrc = JSON.parse(JSON.stringify(newssrc));\n rtxssrc.ssrc = '' + Math.floor(Math.random() * 0xffffffff); // FIXME: look for conflicts\n answer.jingle.contents[1].description.sources.push(rtxssrc);\n groups.push({\n semantics: 'FID',\n sources: [newssrc.ssrc, rtxssrc.ssrc]\n });\n\n answer.jingle.contents[1].description.sourceGroups = groups;\n answer.sdp = SJJ.toSessionSDP(answer.jingle, {\n sid: self.config.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n }\n }\n var expandedAnswer = {\n type: 'answer',\n sdp: answer.sdp\n };\n if (self.assumeSetLocalSuccess) {\n // not safe to do when doing simulcast mangling\n self.emit('answer', expandedAnswer);\n cb(null, expandedAnswer);\n }\n self._candidateBuffer = [];\n self.pc.setLocalDescription(answer,\n function () {\n if (self.config.useJingle) {\n var jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n jingle.sid = self.config.sid;\n self.localDescription = jingle;\n expandedAnswer.jingle = jingle;\n }\n if (self.enableChromeNativeSimulcast) {\n // native simulcast part 2:\n // signal multiple tracks to the receiver\n // for anything in the SIM group\n if (!expandedAnswer.jingle) {\n expandedAnswer.jingle = SJJ.toSessionJSON(answer.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n }\n expandedAnswer.jingle.contents[1].description.sources.forEach(function (source, idx) {\n // the floor idx/2 is a hack that relies on a particular order\n // of groups, alternating between sim and rtx\n source.parameters = source.parameters.map(function (parameter) {\n if (parameter.key === 'msid') {\n parameter.value += '-' + Math.floor(idx / 2);\n }\n return parameter;\n });\n });\n expandedAnswer.sdp = SJJ.toSessionSDP(expandedAnswer.jingle, {\n sid: self.sdpSessionID,\n role: self._role(),\n direction: 'outgoing'\n });\n }\n expandedAnswer.sdp.split('\\r\\n').forEach(function (line) {\n if (line.indexOf('a=candidate:') === 0) {\n self._checkLocalCandidate(line);\n }\n });\n if (!self.assumeSetLocalSuccess) {\n self.emit('answer', expandedAnswer);\n cb(null, expandedAnswer);\n }\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n }\n );\n },\n function (err) {\n self.emit('error', err);\n cb(err);\n },\n constraints\n );\n};\n\n// Internal method for emitting ice candidates on our peer object\nPeerConnection.prototype._onIce = function (event) {\n var self = this;\n if (event.candidate) {\n if (this.dontSignalCandidates) return;\n var ice = event.candidate;\n\n var expandedCandidate = {\n candidate: {\n candidate: ice.candidate,\n sdpMid: ice.sdpMid,\n sdpMLineIndex: ice.sdpMLineIndex\n }\n };\n this._checkLocalCandidate(ice.candidate);\n\n var cand = SJJ.toCandidateJSON(ice.candidate);\n\n var already;\n var idx;\n if (this.eliminateDuplicateCandidates && cand.type === 'relay') {\n // drop candidates with same foundation, component\n // take local type pref into account so we don't ignore udp\n // ones when we know about a TCP one. unlikely but...\n already = this._candidateBuffer.filter(\n function (c) {\n return c.type === 'relay';\n }).map(function (c) {\n return c.foundation + ':' + c.component;\n }\n );\n idx = already.indexOf(cand.foundation + ':' + cand.component);\n // remember: local type pref of udp is 0, tcp 1, tls 2\n if (idx > -1 && ((cand.priority >> 24) >= (already[idx].priority >> 24))) {\n // drop it, same foundation with higher (worse) type pref\n return;\n }\n }\n if (this.config.bundlePolicy === 'max-bundle') {\n // drop candidates which are duplicate for audio/video/data\n // duplicate means same host/port but different sdpMid\n already = this._candidateBuffer.filter(\n function (c) {\n return cand.type === c.type;\n }).map(function (cand) {\n return cand.address + ':' + cand.port;\n }\n );\n idx = already.indexOf(cand.address + ':' + cand.port);\n if (idx > -1) return;\n }\n // also drop rtcp candidates since we know the peer supports RTCP-MUX\n // this is a workaround until browsers implement this natively\n if (this.config.rtcpMuxPolicy === 'require' && cand.component === '2') {\n return;\n }\n this._candidateBuffer.push(cand);\n\n if (self.config.useJingle) {\n if (!ice.sdpMid) { // firefox doesn't set this\n if (self.pc.remoteDescription && self.pc.remoteDescription.type === 'offer') {\n // preserve name from remote\n ice.sdpMid = self.remoteDescription.contents[ice.sdpMLineIndex].name;\n } else {\n ice.sdpMid = self.localDescription.contents[ice.sdpMLineIndex].name;\n }\n }\n if (!self.config.ice[ice.sdpMid]) {\n var jingle = SJJ.toSessionJSON(self.pc.localDescription.sdp, {\n role: self._role(),\n direction: 'outgoing'\n });\n each(jingle.contents, function (content) {\n var transport = content.transport || {};\n if (transport.ufrag) {\n self.config.ice[content.name] = {\n ufrag: transport.ufrag,\n pwd: transport.pwd\n };\n }\n });\n }\n expandedCandidate.jingle = {\n contents: [{\n name: ice.sdpMid,\n creator: self._role(),\n transport: {\n transType: 'iceUdp',\n ufrag: self.config.ice[ice.sdpMid].ufrag,\n pwd: self.config.ice[ice.sdpMid].pwd,\n candidates: [\n cand\n ]\n }\n }]\n };\n if (self.batchIceCandidates > 0) {\n if (self.batchedIceCandidates.length === 0) {\n window.setTimeout(function () {\n var contents = {};\n self.batchedIceCandidates.forEach(function (content) {\n content = content.contents[0];\n if (!contents[content.name]) contents[content.name] = content;\n contents[content.name].transport.candidates.push(content.transport.candidates[0]);\n });\n var newCand = {\n jingle: {\n contents: []\n }\n };\n Object.keys(contents).forEach(function (name) {\n newCand.jingle.contents.push(contents[name]);\n });\n self.batchedIceCandidates = [];\n self.emit('ice', newCand);\n }, self.batchIceCandidates);\n }\n self.batchedIceCandidates.push(expandedCandidate.jingle);\n return;\n }\n\n }\n this.emit('ice', expandedCandidate);\n } else {\n this.emit('endOfCandidates');\n }\n};\n\n// Internal method for processing a new data channel being added by the\n// other peer.\nPeerConnection.prototype._onDataChannel = function (event) {\n // make sure we keep a reference so this doesn't get garbage collected\n var channel = event.channel;\n this._remoteDataChannels.push(channel);\n\n this.emit('addChannel', channel);\n};\n\n// Create a data channel spec reference:\n// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCDataChannelInit\nPeerConnection.prototype.createDataChannel = function (name, opts) {\n var channel = this.pc.createDataChannel(name, opts);\n\n // make sure we keep a reference so this doesn't get garbage collected\n this._localDataChannels.push(channel);\n\n return channel;\n};\n\n// a wrapper around getStats which hides the differences (where possible)\n// TODO: remove in favor of adapter.js shim\nPeerConnection.prototype.getStats = function (cb) {\n if (adapter.webrtcDetectedBrowser === 'firefox') {\n this.pc.getStats(\n function (res) {\n var items = [];\n for (var result in res) {\n if (typeof res[result] === 'object') {\n items.push(res[result]);\n }\n }\n cb(null, items);\n },\n cb\n );\n } else {\n this.pc.getStats(function (res) {\n var items = [];\n res.result().forEach(function (result) {\n var item = {};\n result.names().forEach(function (name) {\n item[name] = result.stat(name);\n });\n item.id = result.id;\n item.type = result.type;\n item.timestamp = result.timestamp;\n items.push(item);\n });\n cb(null, items);\n });\n }\n};\n\nmodule.exports = PeerConnection;\n","var toSDP = require('./lib/tosdp');\nvar toJSON = require('./lib/tojson');\n\n\n// Converstion from JSON to SDP\n\nexports.toIncomingSDPOffer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'responder',\n direction: 'incoming'\n });\n};\nexports.toOutgoingSDPOffer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'initiator',\n direction: 'outgoing'\n });\n};\nexports.toIncomingSDPAnswer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'initiator',\n direction: 'incoming'\n });\n};\nexports.toOutgoingSDPAnswer = function (session) {\n return toSDP.toSessionSDP(session, {\n role: 'responder',\n direction: 'outgoing'\n });\n};\nexports.toIncomingMediaSDPOffer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'responder',\n direction: 'incoming'\n });\n};\nexports.toOutgoingMediaSDPOffer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'initiator',\n direction: 'outgoing'\n });\n};\nexports.toIncomingMediaSDPAnswer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'initiator',\n direction: 'incoming'\n });\n};\nexports.toOutgoingMediaSDPAnswer = function (media) {\n return toSDP.toMediaSDP(media, {\n role: 'responder',\n direction: 'outgoing'\n });\n};\nexports.toCandidateSDP = toSDP.toCandidateSDP;\nexports.toMediaSDP = toSDP.toMediaSDP;\nexports.toSessionSDP = toSDP.toSessionSDP;\n\n\n// Conversion from SDP to JSON\n\nexports.toIncomingJSONOffer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'responder',\n direction: 'incoming',\n creators: creators\n });\n};\nexports.toOutgoingJSONOffer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'initiator',\n direction: 'outgoing',\n creators: creators\n });\n};\nexports.toIncomingJSONAnswer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'initiator',\n direction: 'incoming',\n creators: creators\n });\n};\nexports.toOutgoingJSONAnswer = function (sdp, creators) {\n return toJSON.toSessionJSON(sdp, {\n role: 'responder',\n direction: 'outgoing',\n creators: creators\n });\n};\nexports.toIncomingMediaJSONOffer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'responder',\n direction: 'incoming',\n creator: creator\n });\n};\nexports.toOutgoingMediaJSONOffer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'initiator',\n direction: 'outgoing',\n creator: creator\n });\n};\nexports.toIncomingMediaJSONAnswer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'initiator',\n direction: 'incoming',\n creator: creator\n });\n};\nexports.toOutgoingMediaJSONAnswer = function (sdp, creator) {\n return toJSON.toMediaJSON(sdp, {\n role: 'responder',\n direction: 'outgoing',\n creator: creator\n });\n};\nexports.toCandidateJSON = toJSON.toCandidateJSON;\nexports.toMediaJSON = toJSON.toMediaJSON;\nexports.toSessionJSON = toJSON.toSessionJSON;\n","exports.lines = function (sdp) {\n return sdp.split('\\r\\n').filter(function (line) {\n return line.length > 0;\n });\n};\n\nexports.findLine = function (prefix, mediaLines, sessionLines) {\n var prefixLength = prefix.length;\n for (var i = 0; i < mediaLines.length; i++) {\n if (mediaLines[i].substr(0, prefixLength) === prefix) {\n return mediaLines[i];\n }\n }\n // Continue searching in parent session section\n if (!sessionLines) {\n return false;\n }\n\n for (var j = 0; j < sessionLines.length; j++) {\n if (sessionLines[j].substr(0, prefixLength) === prefix) {\n return sessionLines[j];\n }\n }\n\n return false;\n};\n\nexports.findLines = function (prefix, mediaLines, sessionLines) {\n var results = [];\n var prefixLength = prefix.length;\n for (var i = 0; i < mediaLines.length; i++) {\n if (mediaLines[i].substr(0, prefixLength) === prefix) {\n results.push(mediaLines[i]);\n }\n }\n if (results.length || !sessionLines) {\n return results;\n }\n for (var j = 0; j < sessionLines.length; j++) {\n if (sessionLines[j].substr(0, prefixLength) === prefix) {\n results.push(sessionLines[j]);\n }\n }\n return results;\n};\n\nexports.mline = function (line) {\n var parts = line.substr(2).split(' ');\n var parsed = {\n media: parts[0],\n port: parts[1],\n proto: parts[2],\n formats: []\n };\n for (var i = 3; i < parts.length; i++) {\n if (parts[i]) {\n parsed.formats.push(parts[i]);\n }\n }\n return parsed;\n};\n\nexports.rtpmap = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n id: parts.shift()\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockrate = parts[1];\n parsed.channels = parts.length == 3 ? parts[2] : '1';\n return parsed;\n};\n\nexports.sctpmap = function (line) {\n // based on -05 draft\n var parts = line.substr(10).split(' ');\n var parsed = {\n number: parts.shift(),\n protocol: parts.shift(),\n streams: parts.shift()\n };\n return parsed;\n};\n\n\nexports.fmtp = function (line) {\n var kv, key, value;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n var parsed = [];\n for (var i = 0; i < parts.length; i++) {\n kv = parts[i].split('=');\n key = kv[0].trim();\n value = kv[1];\n if (key && value) {\n parsed.push({key: key, value: value});\n } else if (key) {\n parsed.push({key: '', value: key});\n }\n }\n return parsed;\n};\n\nexports.crypto = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n tag: parts[0],\n cipherSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3).join(' ')\n };\n return parsed;\n};\n\nexports.fingerprint = function (line) {\n var parts = line.substr(14).split(' ');\n return {\n hash: parts[0],\n value: parts[1]\n };\n};\n\nexports.extmap = function (line) {\n var parts = line.substr(9).split(' ');\n var parsed = {};\n\n var idpart = parts.shift();\n var sp = idpart.indexOf('/');\n if (sp >= 0) {\n parsed.id = idpart.substr(0, sp);\n parsed.senders = idpart.substr(sp + 1);\n } else {\n parsed.id = idpart;\n parsed.senders = 'sendrecv';\n }\n\n parsed.uri = parts.shift() || '';\n\n return parsed;\n};\n\nexports.rtcpfb = function (line) {\n var parts = line.substr(10).split(' ');\n var parsed = {};\n parsed.id = parts.shift();\n parsed.type = parts.shift();\n if (parsed.type === 'trr-int') {\n parsed.value = parts.shift();\n } else {\n parsed.subtype = parts.shift() || '';\n }\n parsed.parameters = parts;\n return parsed;\n};\n\nexports.candidate = function (line) {\n var parts;\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else { // no a=candidate\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parts[3],\n ip: parts[4],\n port: parts[5],\n // skip parts[6] == 'typ'\n type: parts[7],\n generation: '0'\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n if (parts[i] === 'raddr') {\n candidate.relAddr = parts[i + 1];\n } else if (parts[i] === 'rport') {\n candidate.relPort = parts[i + 1];\n } else if (parts[i] === 'generation') {\n candidate.generation = parts[i + 1];\n } else if (parts[i] === 'tcptype') {\n candidate.tcpType = parts[i + 1];\n }\n }\n\n candidate.network = '1';\n\n return candidate;\n};\n\nexports.sourceGroups = function (lines) {\n var parsed = [];\n for (var i = 0; i < lines.length; i++) {\n var parts = lines[i].substr(13).split(' ');\n parsed.push({\n semantics: parts.shift(),\n sources: parts\n });\n }\n return parsed;\n};\n\nexports.sources = function (lines) {\n // http://tools.ietf.org/html/rfc5576\n var parsed = [];\n var sources = {};\n for (var i = 0; i < lines.length; i++) {\n var parts = lines[i].substr(7).split(' ');\n var ssrc = parts.shift();\n\n if (!sources[ssrc]) {\n var source = {\n ssrc: ssrc,\n parameters: []\n };\n parsed.push(source);\n\n // Keep an index\n sources[ssrc] = source;\n }\n\n parts = parts.join(' ').split(':');\n var attribute = parts.shift();\n var value = parts.join(':') || null;\n\n sources[ssrc].parameters.push({\n key: attribute,\n value: value\n });\n }\n\n return parsed;\n};\n\nexports.groups = function (lines) {\n // http://tools.ietf.org/html/rfc5888\n var parsed = [];\n var parts;\n for (var i = 0; i < lines.length; i++) {\n parts = lines[i].substr(8).split(' ');\n parsed.push({\n semantics: parts.shift(),\n contents: parts\n });\n }\n return parsed;\n};\n\nexports.bandwidth = function (line) {\n var parts = line.substr(2).split(':');\n var parsed = {};\n parsed.type = parts.shift();\n parsed.bandwidth = parts.shift();\n return parsed;\n};\n\nexports.msid = function (line) {\n var data = line.substr(7);\n var parts = data.split(' ');\n return {\n msid: data,\n mslabel: parts[0],\n label: parts[1]\n };\n};\n","module.exports = {\n initiator: {\n incoming: {\n initiator: 'recvonly',\n responder: 'sendonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'initiator',\n sendonly: 'responder',\n sendrecv: 'both',\n inactive: 'none'\n },\n outgoing: {\n initiator: 'sendonly',\n responder: 'recvonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'responder',\n sendonly: 'initiator',\n sendrecv: 'both',\n inactive: 'none'\n }\n },\n responder: {\n incoming: {\n initiator: 'sendonly',\n responder: 'recvonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'responder',\n sendonly: 'initiator',\n sendrecv: 'both',\n inactive: 'none'\n },\n outgoing: {\n initiator: 'recvonly',\n responder: 'sendonly',\n both: 'sendrecv',\n none: 'inactive',\n recvonly: 'initiator',\n sendonly: 'responder',\n sendrecv: 'both',\n inactive: 'none'\n }\n }\n};\n","var SENDERS = require('./senders');\nvar parsers = require('./parsers');\nvar idCounter = Math.random();\n\n\nexports._setIdCounter = function (counter) {\n idCounter = counter;\n};\n\nexports.toSessionJSON = function (sdp, opts) {\n var i;\n var creators = opts.creators || [];\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n\n // Divide the SDP into session and media sections.\n var media = sdp.split('\\r\\nm=');\n for (i = 1; i < media.length; i++) {\n media[i] = 'm=' + media[i];\n if (i !== media.length - 1) {\n media[i] += '\\r\\n';\n }\n }\n var session = media.shift() + '\\r\\n';\n var sessionLines = parsers.lines(session);\n var parsed = {};\n\n var contents = [];\n for (i = 0; i < media.length; i++) {\n contents.push(exports.toMediaJSON(media[i], session, {\n role: role,\n direction: direction,\n creator: creators[i] || 'initiator'\n }));\n }\n parsed.contents = contents;\n\n var groupLines = parsers.findLines('a=group:', sessionLines);\n if (groupLines.length) {\n parsed.groups = parsers.groups(groupLines);\n }\n\n return parsed;\n};\n\nexports.toMediaJSON = function (media, session, opts) {\n var creator = opts.creator || 'initiator';\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n var lines = parsers.lines(media);\n var sessionLines = parsers.lines(session);\n var mline = parsers.mline(lines[0]);\n\n var content = {\n creator: creator,\n name: mline.media,\n description: {\n descType: 'rtp',\n media: mline.media,\n payloads: [],\n encryption: [],\n feedback: [],\n headerExtensions: []\n },\n transport: {\n transType: 'iceUdp',\n candidates: [],\n fingerprints: []\n }\n };\n if (mline.media == 'application') {\n // FIXME: the description is most likely to be independent\n // of the SDP and should be processed by other parts of the library\n content.description = {\n descType: 'datachannel'\n };\n content.transport.sctp = [];\n }\n var desc = content.description;\n var trans = content.transport;\n\n // If we have a mid, use that for the content name instead.\n var mid = parsers.findLine('a=mid:', lines);\n if (mid) {\n content.name = mid.substr(6);\n }\n\n if (parsers.findLine('a=sendrecv', lines, sessionLines)) {\n content.senders = 'both';\n } else if (parsers.findLine('a=sendonly', lines, sessionLines)) {\n content.senders = SENDERS[role][direction].sendonly;\n } else if (parsers.findLine('a=recvonly', lines, sessionLines)) {\n content.senders = SENDERS[role][direction].recvonly;\n } else if (parsers.findLine('a=inactive', lines, sessionLines)) {\n content.senders = 'none';\n }\n\n if (desc.descType == 'rtp') {\n var bandwidth = parsers.findLine('b=', lines);\n if (bandwidth) {\n desc.bandwidth = parsers.bandwidth(bandwidth);\n }\n\n var ssrc = parsers.findLine('a=ssrc:', lines);\n if (ssrc) {\n desc.ssrc = ssrc.substr(7).split(' ')[0];\n }\n\n var rtpmapLines = parsers.findLines('a=rtpmap:', lines);\n rtpmapLines.forEach(function (line) {\n var payload = parsers.rtpmap(line);\n payload.parameters = [];\n payload.feedback = [];\n\n var fmtpLines = parsers.findLines('a=fmtp:' + payload.id, lines);\n // There should only be one fmtp line per payload\n fmtpLines.forEach(function (line) {\n payload.parameters = parsers.fmtp(line);\n });\n\n var fbLines = parsers.findLines('a=rtcp-fb:' + payload.id, lines);\n fbLines.forEach(function (line) {\n payload.feedback.push(parsers.rtcpfb(line));\n });\n\n desc.payloads.push(payload);\n });\n\n var cryptoLines = parsers.findLines('a=crypto:', lines, sessionLines);\n cryptoLines.forEach(function (line) {\n desc.encryption.push(parsers.crypto(line));\n });\n\n if (parsers.findLine('a=rtcp-mux', lines)) {\n desc.mux = true;\n }\n\n var fbLines = parsers.findLines('a=rtcp-fb:*', lines);\n fbLines.forEach(function (line) {\n desc.feedback.push(parsers.rtcpfb(line));\n });\n\n var extLines = parsers.findLines('a=extmap:', lines);\n extLines.forEach(function (line) {\n var ext = parsers.extmap(line);\n\n ext.senders = SENDERS[role][direction][ext.senders];\n\n desc.headerExtensions.push(ext);\n });\n\n var ssrcGroupLines = parsers.findLines('a=ssrc-group:', lines);\n desc.sourceGroups = parsers.sourceGroups(ssrcGroupLines || []);\n\n var ssrcLines = parsers.findLines('a=ssrc:', lines);\n var sources = desc.sources = parsers.sources(ssrcLines || []);\n\n var msidLine = parsers.findLine('a=msid:', lines);\n if (msidLine) {\n var msid = parsers.msid(msidLine);\n ['msid', 'mslabel', 'label'].forEach(function (key) {\n for (var i = 0; i < sources.length; i++) {\n var found = false;\n for (var j = 0; j < sources[i].parameters.length; j++) {\n if (sources[i].parameters[j].key === key) {\n found = true;\n }\n }\n if (!found) {\n sources[i].parameters.push({ key: key, value: msid[key] });\n }\n }\n });\n }\n\n if (parsers.findLine('a=x-google-flag:conference', lines, sessionLines)) {\n desc.googConferenceFlag = true;\n }\n }\n\n // transport specific attributes\n var fingerprintLines = parsers.findLines('a=fingerprint:', lines, sessionLines);\n var setup = parsers.findLine('a=setup:', lines, sessionLines);\n fingerprintLines.forEach(function (line) {\n var fp = parsers.fingerprint(line);\n if (setup) {\n fp.setup = setup.substr(8);\n }\n trans.fingerprints.push(fp);\n });\n\n var ufragLine = parsers.findLine('a=ice-ufrag:', lines, sessionLines);\n var pwdLine = parsers.findLine('a=ice-pwd:', lines, sessionLines);\n if (ufragLine && pwdLine) {\n trans.ufrag = ufragLine.substr(12);\n trans.pwd = pwdLine.substr(10);\n trans.candidates = [];\n\n var candidateLines = parsers.findLines('a=candidate:', lines, sessionLines);\n candidateLines.forEach(function (line) {\n trans.candidates.push(exports.toCandidateJSON(line));\n });\n }\n\n if (desc.descType == 'datachannel') {\n var sctpmapLines = parsers.findLines('a=sctpmap:', lines);\n sctpmapLines.forEach(function (line) {\n var sctp = parsers.sctpmap(line);\n trans.sctp.push(sctp);\n });\n }\n\n return content;\n};\n\nexports.toCandidateJSON = function (line) {\n var candidate = parsers.candidate(line.split('\\r\\n')[0]);\n candidate.id = (idCounter++).toString(36).substr(0, 12);\n return candidate;\n};\n","var SENDERS = require('./senders');\n\n\nexports.toSessionSDP = function (session, opts) {\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n var sid = opts.sid || session.sid || Date.now();\n var time = opts.time || Date.now();\n\n var sdp = [\n 'v=0',\n 'o=- ' + sid + ' ' + time + ' IN IP4 0.0.0.0',\n 's=-',\n 't=0 0',\n 'a=msid-semantic: WMS *'\n ];\n\n var groups = session.groups || [];\n groups.forEach(function (group) {\n sdp.push('a=group:' + group.semantics + ' ' + group.contents.join(' '));\n });\n\n var contents = session.contents || [];\n contents.forEach(function (content) {\n sdp.push(exports.toMediaSDP(content, opts));\n });\n\n return sdp.join('\\r\\n') + '\\r\\n';\n};\n\nexports.toMediaSDP = function (content, opts) {\n var sdp = [];\n\n var role = opts.role || 'initiator';\n var direction = opts.direction || 'outgoing';\n\n var desc = content.description;\n var transport = content.transport;\n var payloads = desc.payloads || [];\n var fingerprints = (transport && transport.fingerprints) || [];\n\n var mline = [];\n if (desc.descType == 'datachannel') {\n mline.push('application');\n mline.push('1');\n mline.push('DTLS/SCTP');\n if (transport.sctp) {\n transport.sctp.forEach(function (map) {\n mline.push(map.number);\n });\n }\n } else {\n mline.push(desc.media);\n mline.push('1');\n if ((desc.encryption && desc.encryption.length > 0) || (fingerprints.length > 0)) {\n mline.push('RTP/SAVPF');\n } else {\n mline.push('RTP/AVPF');\n }\n payloads.forEach(function (payload) {\n mline.push(payload.id);\n });\n }\n\n\n sdp.push('m=' + mline.join(' '));\n\n sdp.push('c=IN IP4 0.0.0.0');\n if (desc.bandwidth && desc.bandwidth.type && desc.bandwidth.bandwidth) {\n sdp.push('b=' + desc.bandwidth.type + ':' + desc.bandwidth.bandwidth);\n }\n if (desc.descType == 'rtp') {\n sdp.push('a=rtcp:1 IN IP4 0.0.0.0');\n }\n\n if (transport) {\n if (transport.ufrag) {\n sdp.push('a=ice-ufrag:' + transport.ufrag);\n }\n if (transport.pwd) {\n sdp.push('a=ice-pwd:' + transport.pwd);\n }\n\n var pushedSetup = false;\n fingerprints.forEach(function (fingerprint) {\n sdp.push('a=fingerprint:' + fingerprint.hash + ' ' + fingerprint.value);\n if (fingerprint.setup && !pushedSetup) {\n sdp.push('a=setup:' + fingerprint.setup);\n }\n });\n\n if (transport.sctp) {\n transport.sctp.forEach(function (map) {\n sdp.push('a=sctpmap:' + map.number + ' ' + map.protocol + ' ' + map.streams);\n });\n }\n }\n\n if (desc.descType == 'rtp') {\n sdp.push('a=' + (SENDERS[role][direction][content.senders] || 'sendrecv'));\n }\n sdp.push('a=mid:' + content.name);\n\n if (desc.sources && desc.sources.length) {\n (desc.sources[0].parameters || []).forEach(function (param) {\n if (param.key === 'msid') {\n sdp.push('a=msid:' + param.value);\n }\n });\n }\n\n if (desc.mux) {\n sdp.push('a=rtcp-mux');\n }\n\n var encryption = desc.encryption || [];\n encryption.forEach(function (crypto) {\n sdp.push('a=crypto:' + crypto.tag + ' ' + crypto.cipherSuite + ' ' + crypto.keyParams + (crypto.sessionParams ? ' ' + crypto.sessionParams : ''));\n });\n if (desc.googConferenceFlag) {\n sdp.push('a=x-google-flag:conference');\n }\n\n payloads.forEach(function (payload) {\n var rtpmap = 'a=rtpmap:' + payload.id + ' ' + payload.name + '/' + payload.clockrate;\n if (payload.channels && payload.channels != '1') {\n rtpmap += '/' + payload.channels;\n }\n sdp.push(rtpmap);\n\n if (payload.parameters && payload.parameters.length) {\n var fmtp = ['a=fmtp:' + payload.id];\n var parameters = [];\n payload.parameters.forEach(function (param) {\n parameters.push((param.key ? param.key + '=' : '') + param.value);\n });\n fmtp.push(parameters.join(';'));\n sdp.push(fmtp.join(' '));\n }\n\n if (payload.feedback) {\n payload.feedback.forEach(function (fb) {\n if (fb.type === 'trr-int') {\n sdp.push('a=rtcp-fb:' + payload.id + ' trr-int ' + (fb.value ? fb.value : '0'));\n } else {\n sdp.push('a=rtcp-fb:' + payload.id + ' ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n }\n });\n }\n });\n\n if (desc.feedback) {\n desc.feedback.forEach(function (fb) {\n if (fb.type === 'trr-int') {\n sdp.push('a=rtcp-fb:* trr-int ' + (fb.value ? fb.value : '0'));\n } else {\n sdp.push('a=rtcp-fb:* ' + fb.type + (fb.subtype ? ' ' + fb.subtype : ''));\n }\n });\n }\n\n var hdrExts = desc.headerExtensions || [];\n hdrExts.forEach(function (hdr) {\n sdp.push('a=extmap:' + hdr.id + (hdr.senders ? '/' + SENDERS[role][direction][hdr.senders] : '') + ' ' + hdr.uri);\n });\n\n var ssrcGroups = desc.sourceGroups || [];\n ssrcGroups.forEach(function (ssrcGroup) {\n sdp.push('a=ssrc-group:' + ssrcGroup.semantics + ' ' + ssrcGroup.sources.join(' '));\n });\n\n var ssrcs = desc.sources || [];\n ssrcs.forEach(function (ssrc) {\n for (var i = 0; i < ssrc.parameters.length; i++) {\n var param = ssrc.parameters[i];\n sdp.push('a=ssrc:' + (ssrc.ssrc || desc.ssrc) + ' ' + param.key + (param.value ? (':' + param.value) : ''));\n }\n });\n\n var candidates = transport.candidates || [];\n candidates.forEach(function (candidate) {\n sdp.push(exports.toCandidateSDP(candidate));\n });\n\n return sdp.join('\\r\\n');\n};\n\nexports.toCandidateSDP = function (candidate) {\n var sdp = [];\n\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type === 'srflx' || type === 'prflx' || type === 'relay') {\n if (candidate.relAddr && candidate.relPort) {\n sdp.push('raddr');\n sdp.push(candidate.relAddr);\n sdp.push('rport');\n sdp.push(candidate.relPort);\n }\n }\n if (candidate.tcpType && candidate.protocol.toUpperCase() == 'TCP') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n\n sdp.push('generation');\n sdp.push(candidate.generation || '0');\n\n // FIXME: apparently this is wrong per spec\n // but then, we need this when actually putting this into\n // SDP so it's going to stay.\n // decision needs to be revisited when browsers dont\n // accept this any longer\n return 'a=candidate:' + sdp.join(' ');\n};\n","var util = require('util');\nvar webrtc = require('webrtcsupport');\nvar PeerConnection = require('rtcpeerconnection');\nvar WildEmitter = require('wildemitter');\nvar FileTransfer = require('filetransfer');\n\n// the inband-v1 protocol is sending metadata inband in a serialized JSON object\n// followed by the actual data. Receiver closes the datachannel upon completion\nvar INBAND_FILETRANSFER_V1 = 'https://simplewebrtc.com/protocol/filetransfer#inband-v1';\n\nfunction Peer(options) {\n var self = this;\n\n // call emitter constructor\n WildEmitter.call(this);\n\n this.id = options.id;\n this.parent = options.parent;\n this.type = options.type || 'video';\n this.oneway = options.oneway || false;\n this.sharemyscreen = options.sharemyscreen || false;\n this.browserPrefix = options.prefix;\n this.stream = options.stream;\n this.enableDataChannels = options.enableDataChannels === undefined ? this.parent.config.enableDataChannels : options.enableDataChannels;\n this.receiveMedia = options.receiveMedia || this.parent.config.receiveMedia;\n this.channels = {};\n this.sid = options.sid || Date.now().toString();\n // Create an RTCPeerConnection via the polyfill\n this.pc = new PeerConnection(this.parent.config.peerConnectionConfig, this.parent.config.peerConnectionConstraints);\n this.pc.on('ice', this.onIceCandidate.bind(this));\n this.pc.on('offer', function (offer) {\n if (self.parent.config.nick) offer.nick = self.parent.config.nick;\n self.send('offer', offer);\n });\n this.pc.on('answer', function (answer) {\n if (self.parent.config.nick) answer.nick = self.parent.config.nick;\n self.send('answer', answer);\n });\n this.pc.on('addStream', this.handleRemoteStreamAdded.bind(this));\n this.pc.on('addChannel', this.handleDataChannelAdded.bind(this));\n this.pc.on('removeStream', this.handleStreamRemoved.bind(this));\n // Just fire negotiation needed events for now\n // When browser re-negotiation handling seems to work\n // we can use this as the trigger for starting the offer/answer process\n // automatically. We'll just leave it be for now while this stabalizes.\n this.pc.on('negotiationNeeded', this.emit.bind(this, 'negotiationNeeded'));\n this.pc.on('iceConnectionStateChange', this.emit.bind(this, 'iceConnectionStateChange'));\n this.pc.on('iceConnectionStateChange', function () {\n switch (self.pc.iceConnectionState) {\n case 'failed':\n // currently, in chrome only the initiator goes to failed\n // so we need to signal this to the peer\n if (self.pc.pc.peerconnection.localDescription.type === 'offer') {\n self.parent.emit('iceFailed', self);\n self.send('connectivityError');\n }\n break;\n }\n });\n this.pc.on('signalingStateChange', this.emit.bind(this, 'signalingStateChange'));\n this.logger = this.parent.logger;\n\n // handle screensharing/broadcast mode\n if (options.type === 'screen') {\n if (this.parent.localScreen && this.sharemyscreen) {\n this.logger.log('adding local screen stream to peer connection');\n this.pc.addStream(this.parent.localScreen);\n this.broadcaster = options.broadcaster;\n }\n } else {\n this.parent.localStreams.forEach(function (stream) {\n self.pc.addStream(stream);\n });\n }\n\n this.on('channelOpen', function (channel) {\n if (channel.protocol === INBAND_FILETRANSFER_V1) {\n channel.onmessage = function (event) {\n var metadata = JSON.parse(event.data);\n var receiver = new FileTransfer.Receiver();\n receiver.receive(metadata, channel);\n self.emit('fileTransfer', metadata, receiver);\n receiver.on('receivedFile', function (file, metadata) {\n receiver.channel.close();\n });\n };\n }\n });\n\n // proxy events to parent\n this.on('*', function () {\n self.parent.emit.apply(self.parent, arguments);\n });\n}\n\nutil.inherits(Peer, WildEmitter);\n\nPeer.prototype.handleMessage = function (message) {\n var self = this;\n\n this.logger.log('getting', message.type, message);\n\n if (message.prefix) this.browserPrefix = message.prefix;\n\n if (message.type === 'offer') {\n if (!this.nick) this.nick = message.payload.nick;\n delete message.payload.nick;\n // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1064247\n message.payload.sdp = message.payload.sdp.replace('a=fmtp:0 profile-level-id=0x42e00c;packetization-mode=1\\r\\n', '');\n this.pc.handleOffer(message.payload, function (err) {\n if (err) {\n return;\n }\n // auto-accept\n self.pc.answer(self.receiveMedia, function (err, sessionDescription) {\n //self.send('answer', sessionDescription);\n });\n });\n } else if (message.type === 'answer') {\n if (!this.nick) this.nick = message.payload.nick;\n delete message.payload.nick;\n this.pc.handleAnswer(message.payload);\n } else if (message.type === 'candidate') {\n this.pc.processIce(message.payload);\n } else if (message.type === 'connectivityError') {\n this.parent.emit('connectivityError', self);\n } else if (message.type === 'mute') {\n this.parent.emit('mute', {id: message.from, name: message.payload.name});\n } else if (message.type === 'unmute') {\n this.parent.emit('unmute', {id: message.from, name: message.payload.name});\n }\n};\n\n// send via signalling channel\nPeer.prototype.send = function (messageType, payload) {\n var message = {\n to: this.id,\n sid: this.sid,\n broadcaster: this.broadcaster,\n roomType: this.type,\n type: messageType,\n payload: payload,\n prefix: webrtc.prefix\n };\n this.logger.log('sending', messageType, message);\n this.parent.emit('message', message);\n};\n\n// send via data channel\n// returns true when message was sent and false if channel is not open\nPeer.prototype.sendDirectly = function (channel, messageType, payload) {\n var message = {\n type: messageType,\n payload: payload\n };\n this.logger.log('sending via datachannel', channel, messageType, message);\n var dc = this.getDataChannel(channel);\n if (dc.readyState != 'open') return false;\n dc.send(JSON.stringify(message));\n return true;\n};\n\n// Internal method registering handlers for a data channel and emitting events on the peer\nPeer.prototype._observeDataChannel = function (channel) {\n var self = this;\n channel.onclose = this.emit.bind(this, 'channelClose', channel);\n channel.onerror = this.emit.bind(this, 'channelError', channel);\n channel.onmessage = function (event) {\n self.emit('channelMessage', self, channel.label, JSON.parse(event.data), channel, event);\n };\n channel.onopen = this.emit.bind(this, 'channelOpen', channel);\n};\n\n// Fetch or create a data channel by the given name\nPeer.prototype.getDataChannel = function (name, opts) {\n if (!webrtc.supportDataChannel) return this.emit('error', new Error('createDataChannel not supported'));\n var channel = this.channels[name];\n opts || (opts = {});\n if (channel) return channel;\n // if we don't have one by this label, create it\n channel = this.channels[name] = this.pc.createDataChannel(name, opts);\n this._observeDataChannel(channel);\n return channel;\n};\n\nPeer.prototype.onIceCandidate = function (candidate) {\n if (this.closed) return;\n if (candidate) {\n var pcConfig = this.parent.config.peerConnectionConfig;\n if (webrtc.prefix === 'moz' && pcConfig && pcConfig.iceTransports &&\n candidate.candidate && candidate.candidate.candidate &&\n candidate.candidate.candidate.indexOf(pcConfig.iceTransports) < 0) {\n this.logger.log('Ignoring ice candidate not matching pcConfig iceTransports type: ', pcConfig.iceTransports);\n } else {\n this.send('candidate', candidate);\n }\n } else {\n this.logger.log(\"End of candidates.\");\n }\n};\n\nPeer.prototype.start = function () {\n var self = this;\n\n // well, the webrtc api requires that we either\n // a) create a datachannel a priori\n // b) do a renegotiation later to add the SCTP m-line\n // Let's do (a) first...\n if (this.enableDataChannels) {\n this.getDataChannel('simplewebrtc');\n }\n\n this.pc.offer(this.receiveMedia, function (err, sessionDescription) {\n //self.send('offer', sessionDescription);\n });\n};\n\nPeer.prototype.icerestart = function () {\n var constraints = this.receiveMedia;\n constraints.mandatory.IceRestart = true;\n this.pc.offer(constraints, function (err, success) { });\n};\n\nPeer.prototype.end = function () {\n if (this.closed) return;\n this.pc.close();\n this.handleStreamRemoved();\n};\n\nPeer.prototype.handleRemoteStreamAdded = function (event) {\n var self = this;\n if (this.stream) {\n this.logger.warn('Already have a remote stream');\n } else {\n this.stream = event.stream;\n // FIXME: addEventListener('ended', ...) would be nicer\n // but does not work in firefox\n this.stream.onended = function () {\n self.end();\n };\n this.parent.emit('peerStreamAdded', this);\n }\n};\n\nPeer.prototype.handleStreamRemoved = function () {\n this.parent.peers.splice(this.parent.peers.indexOf(this), 1);\n this.closed = true;\n this.parent.emit('peerStreamRemoved', this);\n};\n\nPeer.prototype.handleDataChannelAdded = function (channel) {\n this.channels[channel.label] = channel;\n this._observeDataChannel(channel);\n};\n\nPeer.prototype.sendFile = function (file) {\n var sender = new FileTransfer.Sender();\n var dc = this.getDataChannel('filetransfer' + (new Date()).getTime(), {\n protocol: INBAND_FILETRANSFER_V1\n });\n // override onopen\n dc.onopen = function () {\n dc.send(JSON.stringify({\n size: file.size,\n name: file.name\n }));\n sender.send(file, dc);\n };\n // override onclose\n dc.onclose = function () {\n console.log('sender received transfer');\n sender.emit('complete');\n };\n return sender;\n};\n\nmodule.exports = Peer;\n","var WebRTC = require('./webrtc');\nvar WildEmitter = require('wildemitter');\nvar webrtcSupport = require('webrtcsupport');\nvar attachMediaStream = require('attachmediastream');\nvar mockconsole = require('mockconsole');\nvar SocketIoConnection = require('./socketioconnection');\n\nfunction SimpleWebRTC(opts) {\n var self = this;\n var options = opts || {};\n var config = this.config = {\n url: 'https://signaling.simplewebrtc.com:443/',\n socketio: {/* 'force new connection':true*/},\n connection: null,\n debug: false,\n localVideoEl: '',\n remoteVideosEl: '',\n enableDataChannels: true,\n autoRequestMedia: false,\n autoRemoveVideos: true,\n adjustPeerVolume: true,\n peerVolumeWhenSpeaking: 0.25,\n media: {\n video: true,\n audio: true\n },\n receiveMedia: { // FIXME: remove old chrome <= 37 constraints format\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n },\n localVideo: {\n autoplay: true,\n mirror: true,\n muted: true\n }\n };\n var item, connection;\n\n // We also allow a 'logger' option. It can be any object that implements\n // log, warn, and error methods.\n // We log nothing by default, following \"the rule of silence\":\n // http://www.linfo.org/rule_of_silence.html\n this.logger = function () {\n // we assume that if you're in debug mode and you didn't\n // pass in a logger, you actually want to log as much as\n // possible.\n if (opts.debug) {\n return opts.logger || console;\n } else {\n // or we'll use your logger which should have its own logic\n // for output. Or we'll return the no-op.\n return opts.logger || mockconsole;\n }\n }();\n\n // set our config from options\n for (item in options) {\n this.config[item] = options[item];\n }\n\n // attach detected support for convenience\n this.capabilities = webrtcSupport;\n\n // call WildEmitter constructor\n WildEmitter.call(this);\n\n // create default SocketIoConnection if it's not passed in\n if (this.config.connection === null) {\n connection = this.connection = new SocketIoConnection(this.config);\n } else {\n connection = this.connection = this.config.connection;\n }\n\n connection.on('connect', function () {\n self.emit('connectionReady', connection.getSessionid());\n self.sessionReady = true;\n self.testReadiness();\n });\n\n connection.on('message', function (message) {\n var peers = self.webrtc.getPeers(message.from, message.roomType);\n var peer;\n\n if (message.type === 'offer') {\n if (peers.length) {\n peers.forEach(function (p) {\n if (p.sid == message.sid) peer = p;\n });\n //if (!peer) peer = peers[0]; // fallback for old protocol versions\n }\n if (!peer) {\n peer = self.webrtc.createPeer({\n id: message.from,\n sid: message.sid,\n type: message.roomType,\n enableDataChannels: self.config.enableDataChannels && message.roomType !== 'screen',\n sharemyscreen: message.roomType === 'screen' && !message.broadcaster,\n broadcaster: message.roomType === 'screen' && !message.broadcaster ? self.connection.getSessionid() : null\n });\n self.emit('createdPeer', peer);\n }\n peer.handleMessage(message);\n } else if (peers.length) {\n peers.forEach(function (peer) {\n if (message.sid) {\n if (peer.sid === message.sid) {\n peer.handleMessage(message);\n }\n } else {\n peer.handleMessage(message);\n }\n });\n }\n });\n\n connection.on('remove', function (room) {\n if (room.id !== self.connection.getSessionid()) {\n self.webrtc.removePeers(room.id, room.type);\n }\n });\n\n // instantiate our main WebRTC helper\n // using same logger from logic here\n opts.logger = this.logger;\n opts.debug = false;\n this.webrtc = new WebRTC(opts);\n\n // attach a few methods from underlying lib to simple.\n ['mute', 'unmute', 'pauseVideo', 'resumeVideo', 'pause', 'resume', 'sendToAll', 'sendDirectlyToAll', 'getPeers'].forEach(function (method) {\n self[method] = self.webrtc[method].bind(self.webrtc);\n });\n\n // proxy events from WebRTC\n this.webrtc.on('*', function () {\n self.emit.apply(self, arguments);\n });\n\n // log all events in debug mode\n if (config.debug) {\n this.on('*', this.logger.log.bind(this.logger, 'SimpleWebRTC event:'));\n }\n\n // check for readiness\n this.webrtc.on('localStream', function () {\n self.testReadiness();\n });\n\n this.webrtc.on('message', function (payload) {\n self.connection.emit('message', payload);\n });\n\n this.webrtc.on('peerStreamAdded', this.handlePeerStreamAdded.bind(this));\n this.webrtc.on('peerStreamRemoved', this.handlePeerStreamRemoved.bind(this));\n\n // echo cancellation attempts\n if (this.config.adjustPeerVolume) {\n this.webrtc.on('speaking', this.setVolumeForAll.bind(this, this.config.peerVolumeWhenSpeaking));\n this.webrtc.on('stoppedSpeaking', this.setVolumeForAll.bind(this, 1));\n }\n\n connection.on('stunservers', function (args) {\n // resets/overrides the config\n self.webrtc.config.peerConnectionConfig.iceServers = args;\n self.emit('stunservers', args);\n });\n connection.on('turnservers', function (args) {\n // appends to the config\n self.webrtc.config.peerConnectionConfig.iceServers = self.webrtc.config.peerConnectionConfig.iceServers.concat(args);\n self.emit('turnservers', args);\n });\n\n this.webrtc.on('iceFailed', function (peer) {\n // local ice failure\n });\n this.webrtc.on('connectivityError', function (peer) {\n // remote ice failure\n });\n\n\n // sending mute/unmute to all peers\n this.webrtc.on('audioOn', function () {\n self.webrtc.sendToAll('unmute', {name: 'audio'});\n });\n this.webrtc.on('audioOff', function () {\n self.webrtc.sendToAll('mute', {name: 'audio'});\n });\n this.webrtc.on('videoOn', function () {\n self.webrtc.sendToAll('unmute', {name: 'video'});\n });\n this.webrtc.on('videoOff', function () {\n self.webrtc.sendToAll('mute', {name: 'video'});\n });\n\n // screensharing events\n this.webrtc.on('localScreen', function (stream) {\n var item,\n el = document.createElement('video'),\n container = self.getRemoteVideoContainer();\n\n el.oncontextmenu = function () { return false; };\n el.id = 'localScreen';\n attachMediaStream(stream, el);\n if (container) {\n container.appendChild(el);\n }\n\n self.emit('localScreenAdded', el);\n self.connection.emit('shareScreen');\n\n self.webrtc.peers.forEach(function (existingPeer) {\n var peer;\n if (existingPeer.type === 'video') {\n peer = self.webrtc.createPeer({\n id: existingPeer.id,\n type: 'screen',\n sharemyscreen: true,\n enableDataChannels: false,\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: false,\n OfferToReceiveVideo: false\n }\n },\n broadcaster: self.connection.getSessionid(),\n });\n self.emit('createdPeer', peer);\n peer.start();\n }\n });\n });\n this.webrtc.on('localScreenStopped', function (stream) {\n self.stopScreenShare();\n /*\n self.connection.emit('unshareScreen');\n self.webrtc.peers.forEach(function (peer) {\n if (peer.sharemyscreen) {\n peer.end();\n }\n });\n */\n });\n\n this.webrtc.on('channelMessage', function (peer, label, data) {\n if (data.type == 'volume') {\n self.emit('remoteVolumeChange', peer, data.volume);\n }\n });\n\n if (this.config.autoRequestMedia) this.startLocalVideo();\n}\n\n\nSimpleWebRTC.prototype = Object.create(WildEmitter.prototype, {\n constructor: {\n value: SimpleWebRTC\n }\n});\n\nSimpleWebRTC.prototype.leaveRoom = function () {\n if (this.roomName) {\n this.connection.emit('leave');\n this.webrtc.peers.forEach(function (peer) {\n peer.end();\n });\n if (this.getLocalScreen()) {\n this.stopScreenShare();\n }\n this.emit('leftRoom', this.roomName);\n this.roomName = undefined;\n }\n};\n\nSimpleWebRTC.prototype.disconnect = function () {\n this.connection.disconnect();\n delete this.connection;\n};\n\nSimpleWebRTC.prototype.handlePeerStreamAdded = function (peer) {\n var self = this;\n var container = this.getRemoteVideoContainer();\n var video = attachMediaStream(peer.stream);\n\n // store video element as part of peer for easy removal\n peer.videoEl = video;\n video.id = this.getDomId(peer);\n\n if (container) container.appendChild(video);\n\n this.emit('videoAdded', video, peer);\n\n // send our mute status to new peer if we're muted\n // currently called with a small delay because it arrives before\n // the video element is created otherwise (which happens after\n // the async setRemoteDescription-createAnswer)\n window.setTimeout(function () {\n if (!self.webrtc.isAudioEnabled()) {\n peer.send('mute', {name: 'audio'});\n }\n if (!self.webrtc.isVideoEnabled()) {\n peer.send('mute', {name: 'video'});\n }\n }, 250);\n};\n\nSimpleWebRTC.prototype.handlePeerStreamRemoved = function (peer) {\n var container = this.getRemoteVideoContainer();\n var videoEl = peer.videoEl;\n if (this.config.autoRemoveVideos && container && videoEl) {\n container.removeChild(videoEl);\n }\n if (videoEl) this.emit('videoRemoved', videoEl, peer);\n};\n\nSimpleWebRTC.prototype.getDomId = function (peer) {\n return [peer.id, peer.type, peer.broadcaster ? 'broadcasting' : 'incoming'].join('_');\n};\n\n// set volume on video tag for all peers takse a value between 0 and 1\nSimpleWebRTC.prototype.setVolumeForAll = function (volume) {\n this.webrtc.peers.forEach(function (peer) {\n if (peer.videoEl) peer.videoEl.volume = volume;\n });\n};\n\nSimpleWebRTC.prototype.joinRoom = function (name, cb) {\n var self = this;\n this.roomName = name;\n this.connection.emit('join', name, function (err, roomDescription) {\n if (err) {\n self.emit('error', err);\n } else {\n var id,\n client,\n type,\n peer;\n for (id in roomDescription.clients) {\n client = roomDescription.clients[id];\n for (type in client) {\n if (client[type]) {\n peer = self.webrtc.createPeer({\n id: id,\n type: type,\n enableDataChannels: self.config.enableDataChannels && type !== 'screen',\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: type !== 'screen' && self.config.receiveMedia.mandatory.OfferToReceiveAudio,\n OfferToReceiveVideo: self.config.receiveMedia.mandatory.OfferToReceiveVideo\n }\n }\n });\n self.emit('createdPeer', peer);\n peer.start();\n }\n }\n }\n }\n\n if (cb) cb(err, roomDescription);\n self.emit('joinedRoom', name);\n });\n};\n\nSimpleWebRTC.prototype.getEl = function (idOrEl) {\n if (typeof idOrEl === 'string') {\n return document.getElementById(idOrEl);\n } else {\n return idOrEl;\n }\n};\n\nSimpleWebRTC.prototype.startLocalVideo = function () {\n var self = this;\n this.webrtc.startLocalMedia(this.config.media, function (err, stream) {\n if (err) {\n self.emit('localMediaError', err);\n } else {\n attachMediaStream(stream, self.getLocalVideoContainer(), self.config.localVideo);\n }\n });\n};\n\nSimpleWebRTC.prototype.stopLocalVideo = function () {\n this.webrtc.stopLocalMedia();\n};\n\n// this accepts either element ID or element\n// and either the video tag itself or a container\n// that will be used to put the video tag into.\nSimpleWebRTC.prototype.getLocalVideoContainer = function () {\n var el = this.getEl(this.config.localVideoEl);\n if (el && el.tagName === 'VIDEO') {\n el.oncontextmenu = function () { return false; };\n return el;\n } else if (el) {\n var video = document.createElement('video');\n video.oncontextmenu = function () { return false; };\n el.appendChild(video);\n return video;\n } else {\n return;\n }\n};\n\nSimpleWebRTC.prototype.getRemoteVideoContainer = function () {\n return this.getEl(this.config.remoteVideosEl);\n};\n\nSimpleWebRTC.prototype.shareScreen = function (cb) {\n this.webrtc.startScreenShare(cb);\n};\n\nSimpleWebRTC.prototype.getLocalScreen = function () {\n return this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.stopScreenShare = function () {\n this.connection.emit('unshareScreen');\n var videoEl = document.getElementById('localScreen');\n var container = this.getRemoteVideoContainer();\n var stream = this.getLocalScreen();\n\n if (this.config.autoRemoveVideos && container && videoEl) {\n container.removeChild(videoEl);\n }\n\n // a hack to emit the event the removes the video\n // element that we want\n if (videoEl) this.emit('videoRemoved', videoEl);\n if (stream) stream.stop();\n this.webrtc.peers.forEach(function (peer) {\n if (peer.broadcaster) {\n peer.end();\n }\n });\n //delete this.webrtc.localScreen;\n};\n\nSimpleWebRTC.prototype.testReadiness = function () {\n var self = this;\n if (this.webrtc.localStream && this.sessionReady) {\n self.emit('readyToCall', self.connection.getSessionid());\n }\n};\n\nSimpleWebRTC.prototype.createRoom = function (name, cb) {\n if (arguments.length === 2) {\n this.connection.emit('create', name, cb);\n } else {\n this.connection.emit('create', name);\n }\n};\n\nSimpleWebRTC.prototype.sendFile = function () {\n if (!webrtcSupport.dataChannel) {\n return this.emit('error', new Error('DataChannelNotSupported'));\n }\n\n};\n\nmodule.exports = SimpleWebRTC;\n","var io = require('socket.io-client');\n\nfunction SocketIoConnection(config) {\n this.connection = io.connect(config.url, config.socketio);\n}\n\nSocketIoConnection.prototype.on = function (ev, fn) {\n this.connection.on(ev, fn);\n};\n\nSocketIoConnection.prototype.emit = function () {\n this.connection.emit.apply(this.connection, arguments);\n};\n\nSocketIoConnection.prototype.getSessionid = function () {\n return this.connection.socket.sessionid;\n};\n\nSocketIoConnection.prototype.disconnect = function () {\n return this.connection.disconnect();\n};\n\nmodule.exports = SocketIoConnection;\n","var util = require('util');\nvar webrtc = require('webrtcsupport');\nvar WildEmitter = require('wildemitter');\nvar mockconsole = require('mockconsole');\nvar localMedia = require('localmedia');\nvar Peer = require('./peer');\n\n\nfunction WebRTC(opts) {\n var self = this;\n var options = opts || {};\n var config = this.config = {\n debug: false,\n // makes the entire PC config overridable\n peerConnectionConfig: {\n iceServers: [{\"url\": \"stun:stun.l.google.com:19302\"}]\n },\n peerConnectionConstraints: {\n optional: [\n {DtlsSrtpKeyAgreement: true}\n ]\n },\n receiveMedia: {\n mandatory: {\n OfferToReceiveAudio: true,\n OfferToReceiveVideo: true\n }\n },\n enableDataChannels: true\n };\n var item;\n\n // expose screensharing check\n this.screenSharingSupport = webrtc.screenSharing;\n\n // We also allow a 'logger' option. It can be any object that implements\n // log, warn, and error methods.\n // We log nothing by default, following \"the rule of silence\":\n // http://www.linfo.org/rule_of_silence.html\n this.logger = function () {\n // we assume that if you're in debug mode and you didn't\n // pass in a logger, you actually want to log as much as\n // possible.\n if (opts.debug) {\n return opts.logger || console;\n } else {\n // or we'll use your logger which should have its own logic\n // for output. Or we'll return the no-op.\n return opts.logger || mockconsole;\n }\n }();\n\n // set options\n for (item in options) {\n this.config[item] = options[item];\n }\n\n // check for support\n if (!webrtc.support) {\n this.logger.error('Your browser doesn\\'t seem to support WebRTC');\n }\n\n // where we'll store our peer connections\n this.peers = [];\n\n // call localMedia constructor\n localMedia.call(this, this.config);\n\n this.on('speaking', function () {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'speaking'}));\n }\n });\n }\n });\n this.on('stoppedSpeaking', function () {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'stoppedSpeaking'}));\n }\n });\n }\n });\n this.on('volumeChange', function (volume, treshold) {\n if (!self.hardMuted) {\n // FIXME: should use sendDirectlyToAll, but currently has different semantics wrt payload\n self.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n var dc = peer.getDataChannel('hark');\n if (dc.readyState != 'open') return;\n dc.send(JSON.stringify({type: 'volume', volume: volume }));\n }\n });\n }\n });\n\n // log events in debug mode\n if (this.config.debug) {\n this.on('*', function (event, val1, val2) {\n var logger;\n // if you didn't pass in a logger and you explicitly turning on debug\n // we're just going to assume you're wanting log output with console\n if (self.config.logger === mockconsole) {\n logger = console;\n } else {\n logger = self.logger;\n }\n logger.log('event:', event, val1, val2);\n });\n }\n}\n\nutil.inherits(WebRTC, localMedia);\n\nWebRTC.prototype.createPeer = function (opts) {\n var peer;\n opts.parent = this;\n peer = new Peer(opts);\n this.peers.push(peer);\n return peer;\n};\n\n// removes peers\nWebRTC.prototype.removePeers = function (id, type) {\n this.getPeers(id, type).forEach(function (peer) {\n peer.end();\n });\n};\n\n// fetches all Peer objects by session id and/or type\nWebRTC.prototype.getPeers = function (sessionId, type) {\n return this.peers.filter(function (peer) {\n return (!sessionId || peer.id === sessionId) && (!type || peer.type === type);\n });\n};\n\n// sends message to all\nWebRTC.prototype.sendToAll = function (message, payload) {\n this.peers.forEach(function (peer) {\n peer.send(message, payload);\n });\n};\n\n// sends message to all using a datachannel\n// only sends to anyone who has an open datachannel\nWebRTC.prototype.sendDirectlyToAll = function (channel, message, payload) {\n this.peers.forEach(function (peer) {\n if (peer.enableDataChannels) {\n peer.sendDirectly(channel, message, payload);\n }\n });\n};\n\nmodule.exports = WebRTC;\n","/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */\n\nvar io = ('undefined' === typeof module ? {} : module.exports);\n(function() {\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * IO namespace.\n *\n * @namespace\n */\n\n var io = exports;\n\n /**\n * Socket.IO version\n *\n * @api public\n */\n\n io.version = '0.9.16';\n\n /**\n * Protocol implemented.\n *\n * @api public\n */\n\n io.protocol = 1;\n\n /**\n * Available transports, these will be populated with the available transports\n *\n * @api public\n */\n\n io.transports = [];\n\n /**\n * Keep track of jsonp callbacks.\n *\n * @api private\n */\n\n io.j = [];\n\n /**\n * Keep track of our io.Sockets\n *\n * @api private\n */\n io.sockets = {};\n\n\n /**\n * Manages connections to hosts.\n *\n * @param {String} uri\n * @Param {Boolean} force creation of new socket (defaults to false)\n * @api public\n */\n\n io.connect = function (host, details) {\n var uri = io.util.parseUri(host)\n , uuri\n , socket;\n\n if (global && global.location) {\n uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n uri.host = uri.host || (global.document\n ? global.document.domain : global.location.hostname);\n uri.port = uri.port || global.location.port;\n }\n\n uuri = io.util.uniqueUri(uri);\n\n var options = {\n host: uri.host\n , secure: 'https' == uri.protocol\n , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n , query: uri.query || ''\n };\n\n io.util.merge(options, details);\n\n if (options['force new connection'] || !io.sockets[uuri]) {\n socket = new io.Socket(options);\n }\n\n if (!options['force new connection'] && socket) {\n io.sockets[uuri] = socket;\n }\n\n socket = socket || io.sockets[uuri];\n\n // if path is different from '' or /\n return socket.of(uri.path.length > 1 ? uri.path : '');\n };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * Utilities namespace.\n *\n * @namespace\n */\n\n var util = exports.util = {};\n\n /**\n * Parses an URI\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api public\n */\n\n var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n 'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n 'anchor'];\n\n util.parseUri = function (str) {\n var m = re.exec(str || '')\n , uri = {}\n , i = 14;\n\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n\n return uri;\n };\n\n /**\n * Produces a unique url that identifies a Socket.IO connection.\n *\n * @param {Object} uri\n * @api public\n */\n\n util.uniqueUri = function (uri) {\n var protocol = uri.protocol\n , host = uri.host\n , port = uri.port;\n\n if ('document' in global) {\n host = host || document.domain;\n port = port || (protocol == 'https'\n && document.location.protocol !== 'https:' ? 443 : document.location.port);\n } else {\n host = host || 'localhost';\n\n if (!port && protocol == 'https') {\n port = 443;\n }\n }\n\n return (protocol || 'http') + '://' + host + ':' + (port || 80);\n };\n\n /**\n * Mergest 2 query strings in to once unique query string\n *\n * @param {String} base\n * @param {String} addition\n * @api public\n */\n\n util.query = function (base, addition) {\n var query = util.chunkQuery(base || '')\n , components = [];\n\n util.merge(query, util.chunkQuery(addition || ''));\n for (var part in query) {\n if (query.hasOwnProperty(part)) {\n components.push(part + '=' + query[part]);\n }\n }\n\n return components.length ? '?' + components.join('&') : '';\n };\n\n /**\n * Transforms a querystring in to an object\n *\n * @param {String} qs\n * @api public\n */\n\n util.chunkQuery = function (qs) {\n var query = {}\n , params = qs.split('&')\n , i = 0\n , l = params.length\n , kv;\n\n for (; i < l; ++i) {\n kv = params[i].split('=');\n if (kv[0]) {\n query[kv[0]] = kv[1];\n }\n }\n\n return query;\n };\n\n /**\n * Executes the given function when the page is loaded.\n *\n * io.util.load(function () { console.log('page loaded'); });\n *\n * @param {Function} fn\n * @api public\n */\n\n var pageLoaded = false;\n\n util.load = function (fn) {\n if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n return fn();\n }\n\n util.on(global, 'load', fn, false);\n };\n\n /**\n * Adds an event.\n *\n * @api private\n */\n\n util.on = function (element, event, fn, capture) {\n if (element.attachEvent) {\n element.attachEvent('on' + event, fn);\n } else if (element.addEventListener) {\n element.addEventListener(event, fn, capture);\n }\n };\n\n /**\n * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n *\n * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n * @api private\n */\n\n util.request = function (xdomain) {\n\n if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) {\n return new XDomainRequest();\n }\n\n if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n return new XMLHttpRequest();\n }\n\n if (!xdomain) {\n try {\n return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP');\n } catch(e) { }\n }\n\n return null;\n };\n\n /**\n * XHR based transport constructor.\n *\n * @constructor\n * @api public\n */\n\n /**\n * Change the internal pageLoaded value.\n */\n\n if ('undefined' != typeof window) {\n util.load(function () {\n pageLoaded = true;\n });\n }\n\n /**\n * Defers a function to ensure a spinner is not displayed by the browser\n *\n * @param {Function} fn\n * @api public\n */\n\n util.defer = function (fn) {\n if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n return fn();\n }\n\n util.load(function () {\n setTimeout(fn, 100);\n });\n };\n\n /**\n * Merges two objects.\n *\n * @api public\n */\n\n util.merge = function merge (target, additional, deep, lastseen) {\n var seen = lastseen || []\n , depth = typeof deep == 'undefined' ? 2 : deep\n , prop;\n\n for (prop in additional) {\n if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n if (typeof target[prop] !== 'object' || !depth) {\n target[prop] = additional[prop];\n seen.push(additional[prop]);\n } else {\n util.merge(target[prop], additional[prop], depth - 1, seen);\n }\n }\n }\n\n return target;\n };\n\n /**\n * Merges prototypes from objects\n *\n * @api public\n */\n\n util.mixin = function (ctor, ctor2) {\n util.merge(ctor.prototype, ctor2.prototype);\n };\n\n /**\n * Shortcut for prototypical and static inheritance.\n *\n * @api private\n */\n\n util.inherit = function (ctor, ctor2) {\n function f() {};\n f.prototype = ctor2.prototype;\n ctor.prototype = new f;\n };\n\n /**\n * Checks if the given object is an Array.\n *\n * io.util.isArray([]); // true\n * io.util.isArray({}); // false\n *\n * @param Object obj\n * @api public\n */\n\n util.isArray = Array.isArray || function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n\n /**\n * Intersects values of two arrays into a third\n *\n * @api public\n */\n\n util.intersect = function (arr, arr2) {\n var ret = []\n , longest = arr.length > arr2.length ? arr : arr2\n , shortest = arr.length > arr2.length ? arr2 : arr;\n\n for (var i = 0, l = shortest.length; i < l; i++) {\n if (~util.indexOf(longest, shortest[i]))\n ret.push(shortest[i]);\n }\n\n return ret;\n };\n\n /**\n * Array indexOf compatibility.\n *\n * @see bit.ly/a5Dxa2\n * @api public\n */\n\n util.indexOf = function (arr, o, i) {\n\n for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0;\n i < j && arr[i] !== o; i++) {}\n\n return j <= i ? -1 : i;\n };\n\n /**\n * Converts enumerables to array.\n *\n * @api public\n */\n\n util.toArray = function (enu) {\n var arr = [];\n\n for (var i = 0, l = enu.length; i < l; i++)\n arr.push(enu[i]);\n\n return arr;\n };\n\n /**\n * UA / engines detection namespace.\n *\n * @namespace\n */\n\n util.ua = {};\n\n /**\n * Whether the UA supports CORS for XHR.\n *\n * @api public\n */\n\n util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n try {\n var a = new XMLHttpRequest();\n } catch (e) {\n return false;\n }\n\n return a.withCredentials != undefined;\n })();\n\n /**\n * Detect webkit.\n *\n * @api public\n */\n\n util.ua.webkit = 'undefined' != typeof navigator\n && /webkit/i.test(navigator.userAgent);\n\n /**\n * Detect iPad/iPhone/iPod.\n *\n * @api public\n */\n\n util.ua.iDevice = 'undefined' != typeof navigator\n && /iPad|iPhone|iPod/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.EventEmitter = EventEmitter;\n\n /**\n * Event emitter constructor.\n *\n * @api public.\n */\n\n function EventEmitter () {};\n\n /**\n * Adds a listener\n *\n * @api public\n */\n\n EventEmitter.prototype.on = function (name, fn) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = fn;\n } else if (io.util.isArray(this.$events[name])) {\n this.$events[name].push(fn);\n } else {\n this.$events[name] = [this.$events[name], fn];\n }\n\n return this;\n };\n\n EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n /**\n * Adds a volatile listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.once = function (name, fn) {\n var self = this;\n\n function on () {\n self.removeListener(name, on);\n fn.apply(this, arguments);\n };\n\n on.listener = fn;\n this.on(name, on);\n\n return this;\n };\n\n /**\n * Removes a listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeListener = function (name, fn) {\n if (this.$events && this.$events[name]) {\n var list = this.$events[name];\n\n if (io.util.isArray(list)) {\n var pos = -1;\n\n for (var i = 0, l = list.length; i < l; i++) {\n if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n pos = i;\n break;\n }\n }\n\n if (pos < 0) {\n return this;\n }\n\n list.splice(pos, 1);\n\n if (!list.length) {\n delete this.$events[name];\n }\n } else if (list === fn || (list.listener && list.listener === fn)) {\n delete this.$events[name];\n }\n }\n\n return this;\n };\n\n /**\n * Removes all listeners for an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeAllListeners = function (name) {\n if (name === undefined) {\n this.$events = {};\n return this;\n }\n\n if (this.$events && this.$events[name]) {\n this.$events[name] = null;\n }\n\n return this;\n };\n\n /**\n * Gets all listeners for a certain event.\n *\n * @api publci\n */\n\n EventEmitter.prototype.listeners = function (name) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = [];\n }\n\n if (!io.util.isArray(this.$events[name])) {\n this.$events[name] = [this.$events[name]];\n }\n\n return this.$events[name];\n };\n\n /**\n * Emits an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.emit = function (name) {\n if (!this.$events) {\n return false;\n }\n\n var handler = this.$events[name];\n\n if (!handler) {\n return false;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n\n if ('function' == typeof handler) {\n handler.apply(this, args);\n } else if (io.util.isArray(handler)) {\n var listeners = handler.slice();\n\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n } else {\n return false;\n }\n\n return true;\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n \"use strict\";\n\n // use native JSON if it's available\n if (nativeJSON && nativeJSON.parse){\n return exports.JSON = {\n parse: nativeJSON.parse\n , stringify: nativeJSON.stringify\n };\n }\n\n var JSON = exports.JSON = {};\n\n function f(n) {\n // Format integers to have at least two digits.\n return n < 10 ? '0' + n : n;\n }\n\n function date(d, key) {\n return isFinite(d.valueOf()) ?\n d.getUTCFullYear() + '-' +\n f(d.getUTCMonth() + 1) + '-' +\n f(d.getUTCDate()) + 'T' +\n f(d.getUTCHours()) + ':' +\n f(d.getUTCMinutes()) + ':' +\n f(d.getUTCSeconds()) + 'Z' : null;\n };\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n\n function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n }\n\n\n function str(key, holder) {\n\n// Produce a string from holder[key].\n\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value instanceof Date) {\n value = date(key);\n }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n// What happens next depends on the value's type.\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n if (!value) {\n return 'null';\n }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n gap += indent;\n partial = [];\n\n// Is the value an array?\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n if (typeof rep[i] === 'string') {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n var i;\n gap = '';\n indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n } else if (typeof space === 'string') {\n indent = space;\n }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n return str('', {'': value});\n };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n JSON.parse = function (text, reviver) {\n // The parse method takes a text and an optional reviver function, and returns\n // a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n // The walk method is used to recursively walk the resulting structure so\n // that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n // Parsing happens in four stages. In the first stage, we replace certain\n // Unicode characters with escape sequences. JavaScript handles many characters\n // incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n // In the second stage, we run the text against regular expressions that look\n // for non-JSON patterns. We are especially concerned with '()' and 'new'\n // because they can cause invocation, and '=' because it can cause mutation.\n // But just to be safe, we want to reject all unexpected forms.\n\n // We split the second stage into 4 regexp operations in order to work around\n // crippling inefficiencies in IE's and Safari's regexp engines. First we\n // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n // replace all simple value tokens with ']' characters. Third, we delete all\n // open brackets that follow a colon or comma or that begin the text. Finally,\n // we look to see that the remaining characters are only whitespace or ']' or\n // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n // In the third stage we use the eval function to compile the text into a\n // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n // in JavaScript: it can begin a block or an object literal. We wrap the text\n // in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n // In the optional fourth stage, we recursively walk the new structure, passing\n // each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') : j;\n }\n\n // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Parser namespace.\n *\n * @namespace\n */\n\n var parser = exports.parser = {};\n\n /**\n * Packet types.\n */\n\n var packets = parser.packets = [\n 'disconnect'\n , 'connect'\n , 'heartbeat'\n , 'message'\n , 'json'\n , 'event'\n , 'ack'\n , 'error'\n , 'noop'\n ];\n\n /**\n * Errors reasons.\n */\n\n var reasons = parser.reasons = [\n 'transport not supported'\n , 'client not handshaken'\n , 'unauthorized'\n ];\n\n /**\n * Errors advice.\n */\n\n var advice = parser.advice = [\n 'reconnect'\n ];\n\n /**\n * Shortcuts.\n */\n\n var JSON = io.JSON\n , indexOf = io.util.indexOf;\n\n /**\n * Encodes a packet.\n *\n * @api private\n */\n\n parser.encodePacket = function (packet) {\n var type = indexOf(packets, packet.type)\n , id = packet.id || ''\n , endpoint = packet.endpoint || ''\n , ack = packet.ack\n , data = null;\n\n switch (packet.type) {\n case 'error':\n var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n if (reason !== '' || adv !== '')\n data = reason + (adv !== '' ? ('+' + adv) : '');\n\n break;\n\n case 'message':\n if (packet.data !== '')\n data = packet.data;\n break;\n\n case 'event':\n var ev = { name: packet.name };\n\n if (packet.args && packet.args.length) {\n ev.args = packet.args;\n }\n\n data = JSON.stringify(ev);\n break;\n\n case 'json':\n data = JSON.stringify(packet.data);\n break;\n\n case 'connect':\n if (packet.qs)\n data = packet.qs;\n break;\n\n case 'ack':\n data = packet.ackId\n + (packet.args && packet.args.length\n ? '+' + JSON.stringify(packet.args) : '');\n break;\n }\n\n // construct packet with required fragments\n var encoded = [\n type\n , id + (ack == 'data' ? '+' : '')\n , endpoint\n ];\n\n // data fragment is optional\n if (data !== null && data !== undefined)\n encoded.push(data);\n\n return encoded.join(':');\n };\n\n /**\n * Encodes multiple messages (payload).\n *\n * @param {Array} messages\n * @api private\n */\n\n parser.encodePayload = function (packets) {\n var decoded = '';\n\n if (packets.length == 1)\n return packets[0];\n\n for (var i = 0, l = packets.length; i < l; i++) {\n var packet = packets[i];\n decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n }\n\n return decoded;\n };\n\n /**\n * Decodes a packet\n *\n * @api private\n */\n\n var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n parser.decodePacket = function (data) {\n var pieces = data.match(regexp);\n\n if (!pieces) return {};\n\n var id = pieces[2] || ''\n , data = pieces[5] || ''\n , packet = {\n type: packets[pieces[1]]\n , endpoint: pieces[4] || ''\n };\n\n // whether we need to acknowledge the packet\n if (id) {\n packet.id = id;\n if (pieces[3])\n packet.ack = 'data';\n else\n packet.ack = true;\n }\n\n // handle different packet types\n switch (packet.type) {\n case 'error':\n var pieces = data.split('+');\n packet.reason = reasons[pieces[0]] || '';\n packet.advice = advice[pieces[1]] || '';\n break;\n\n case 'message':\n packet.data = data || '';\n break;\n\n case 'event':\n try {\n var opts = JSON.parse(data);\n packet.name = opts.name;\n packet.args = opts.args;\n } catch (e) { }\n\n packet.args = packet.args || [];\n break;\n\n case 'json':\n try {\n packet.data = JSON.parse(data);\n } catch (e) { }\n break;\n\n case 'connect':\n packet.qs = data || '';\n break;\n\n case 'ack':\n var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n if (pieces) {\n packet.ackId = pieces[1];\n packet.args = [];\n\n if (pieces[3]) {\n try {\n packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n } catch (e) { }\n }\n }\n break;\n\n case 'disconnect':\n case 'heartbeat':\n break;\n };\n\n return packet;\n };\n\n /**\n * Decodes data payload. Detects multiple messages\n *\n * @return {Array} messages\n * @api public\n */\n\n parser.decodePayload = function (data) {\n // IE doesn't like data[i] for unicode chars, charAt works fine\n if (data.charAt(0) == '\\ufffd') {\n var ret = [];\n\n for (var i = 1, length = ''; i < data.length; i++) {\n if (data.charAt(i) == '\\ufffd') {\n ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n i += Number(length) + 1;\n length = '';\n } else {\n length += data.charAt(i);\n }\n }\n\n return ret;\n } else {\n return [parser.decodePacket(data)];\n }\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.Transport = Transport;\n\n /**\n * This is the transport template for all supported transport methods.\n *\n * @constructor\n * @api public\n */\n\n function Transport (socket, sessid) {\n this.socket = socket;\n this.sessid = sessid;\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Transport, io.EventEmitter);\n\n\n /**\n * Indicates whether heartbeats is enabled for this transport\n *\n * @api private\n */\n\n Transport.prototype.heartbeats = function () {\n return true;\n };\n\n /**\n * Handles the response from the server. When a new response is received\n * it will automatically update the timeout, decode the message and\n * forwards the response to the onMessage function for further processing.\n *\n * @param {String} data Response from the server.\n * @api private\n */\n\n Transport.prototype.onData = function (data) {\n this.clearCloseTimeout();\n\n // If the connection in currently open (or in a reopening state) reset the close\n // timeout since we have just received data. This check is necessary so\n // that we don't reset the timeout on an explicitly disconnected connection.\n if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) {\n this.setCloseTimeout();\n }\n\n if (data !== '') {\n // todo: we should only do decodePayload for xhr transports\n var msgs = io.parser.decodePayload(data);\n\n if (msgs && msgs.length) {\n for (var i = 0, l = msgs.length; i < l; i++) {\n this.onPacket(msgs[i]);\n }\n }\n }\n\n return this;\n };\n\n /**\n * Handles packets.\n *\n * @api private\n */\n\n Transport.prototype.onPacket = function (packet) {\n this.socket.setHeartbeatTimeout();\n\n if (packet.type == 'heartbeat') {\n return this.onHeartbeat();\n }\n\n if (packet.type == 'connect' && packet.endpoint == '') {\n this.onConnect();\n }\n\n if (packet.type == 'error' && packet.advice == 'reconnect') {\n this.isOpen = false;\n }\n\n this.socket.onPacket(packet);\n\n return this;\n };\n\n /**\n * Sets close timeout\n *\n * @api private\n */\n\n Transport.prototype.setCloseTimeout = function () {\n if (!this.closeTimeout) {\n var self = this;\n\n this.closeTimeout = setTimeout(function () {\n self.onDisconnect();\n }, this.socket.closeTimeout);\n }\n };\n\n /**\n * Called when transport disconnects.\n *\n * @api private\n */\n\n Transport.prototype.onDisconnect = function () {\n if (this.isOpen) this.close();\n this.clearTimeouts();\n this.socket.onDisconnect();\n return this;\n };\n\n /**\n * Called when transport connects\n *\n * @api private\n */\n\n Transport.prototype.onConnect = function () {\n this.socket.onConnect();\n return this;\n };\n\n /**\n * Clears close timeout\n *\n * @api private\n */\n\n Transport.prototype.clearCloseTimeout = function () {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n };\n\n /**\n * Clear timeouts\n *\n * @api private\n */\n\n Transport.prototype.clearTimeouts = function () {\n this.clearCloseTimeout();\n\n if (this.reopenTimeout) {\n clearTimeout(this.reopenTimeout);\n }\n };\n\n /**\n * Sends a packet\n *\n * @param {Object} packet object.\n * @api private\n */\n\n Transport.prototype.packet = function (packet) {\n this.send(io.parser.encodePacket(packet));\n };\n\n /**\n * Send the received heartbeat message back to server. So the server\n * knows we are still connected.\n *\n * @param {String} heartbeat Heartbeat response from the server.\n * @api private\n */\n\n Transport.prototype.onHeartbeat = function (heartbeat) {\n this.packet({ type: 'heartbeat' });\n };\n\n /**\n * Called when the transport opens.\n *\n * @api private\n */\n\n Transport.prototype.onOpen = function () {\n this.isOpen = true;\n this.clearCloseTimeout();\n this.socket.onOpen();\n };\n\n /**\n * Notifies the base when the connection with the Socket.IO server\n * has been disconnected.\n *\n * @api private\n */\n\n Transport.prototype.onClose = function () {\n var self = this;\n\n /* FIXME: reopen delay causing a infinit loop\n this.reopenTimeout = setTimeout(function () {\n self.open();\n }, this.socket.options['reopen delay']);*/\n\n this.isOpen = false;\n this.socket.onClose();\n this.onDisconnect();\n };\n\n /**\n * Generates a connection url based on the Socket.IO URL Protocol.\n * See <https://github.com/learnboost/socket.io-node/> for more details.\n *\n * @returns {String} Connection url\n * @api private\n */\n\n Transport.prototype.prepareUrl = function () {\n var options = this.socket.options;\n\n return this.scheme() + '://'\n + options.host + ':' + options.port + '/'\n + options.resource + '/' + io.protocol\n + '/' + this.name + '/' + this.sessid;\n };\n\n /**\n * Checks if the transport is ready to start a connection.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n Transport.prototype.ready = function (socket, fn) {\n fn.call(this);\n };\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports.Socket = Socket;\n\n /**\n * Create a new `Socket.IO client` which can establish a persistent\n * connection with a Socket.IO enabled server.\n *\n * @api public\n */\n\n function Socket (options) {\n this.options = {\n port: 80\n , secure: false\n , document: 'document' in global ? document : false\n , resource: 'socket.io'\n , transports: io.transports\n , 'connect timeout': 10000\n , 'try multiple transports': true\n , 'reconnect': true\n , 'reconnection delay': 500\n , 'reconnection limit': Infinity\n , 'reopen delay': 3000\n , 'max reconnection attempts': 10\n , 'sync disconnect on unload': false\n , 'auto connect': true\n , 'flash policy port': 10843\n , 'manualFlush': false\n };\n\n io.util.merge(this.options, options);\n\n this.connected = false;\n this.open = false;\n this.connecting = false;\n this.reconnecting = false;\n this.namespaces = {};\n this.buffer = [];\n this.doBuffer = false;\n\n if (this.options['sync disconnect on unload'] &&\n (!this.isXDomain() || io.util.ua.hasCORS)) {\n var self = this;\n io.util.on(global, 'beforeunload', function () {\n self.disconnectSync();\n }, false);\n }\n\n if (this.options['auto connect']) {\n this.connect();\n }\n};\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Socket, io.EventEmitter);\n\n /**\n * Returns a namespace listener/emitter for this socket\n *\n * @api public\n */\n\n Socket.prototype.of = function (name) {\n if (!this.namespaces[name]) {\n this.namespaces[name] = new io.SocketNamespace(this, name);\n\n if (name !== '') {\n this.namespaces[name].packet({ type: 'connect' });\n }\n }\n\n return this.namespaces[name];\n };\n\n /**\n * Emits the given event to the Socket and all namespaces\n *\n * @api private\n */\n\n Socket.prototype.publish = function () {\n this.emit.apply(this, arguments);\n\n var nsp;\n\n for (var i in this.namespaces) {\n if (this.namespaces.hasOwnProperty(i)) {\n nsp = this.of(i);\n nsp.$emit.apply(nsp, arguments);\n }\n }\n };\n\n /**\n * Performs the handshake\n *\n * @api private\n */\n\n function empty () { };\n\n Socket.prototype.handshake = function (fn) {\n var self = this\n , options = this.options;\n\n function complete (data) {\n if (data instanceof Error) {\n self.connecting = false;\n self.onError(data.message);\n } else {\n fn.apply(null, data.split(':'));\n }\n };\n\n var url = [\n 'http' + (options.secure ? 's' : '') + ':/'\n , options.host + ':' + options.port\n , options.resource\n , io.protocol\n , io.util.query(this.options.query, 't=' + +new Date)\n ].join('/');\n\n if (this.isXDomain() && !io.util.ua.hasCORS) {\n var insertAt = document.getElementsByTagName('script')[0]\n , script = document.createElement('script');\n\n script.src = url + '&jsonp=' + io.j.length;\n insertAt.parentNode.insertBefore(script, insertAt);\n\n io.j.push(function (data) {\n complete(data);\n script.parentNode.removeChild(script);\n });\n } else {\n var xhr = io.util.request();\n\n xhr.open('GET', url, true);\n if (this.isXDomain()) {\n xhr.withCredentials = true;\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty;\n\n if (xhr.status == 200) {\n complete(xhr.responseText);\n } else if (xhr.status == 403) {\n self.onError(xhr.responseText);\n } else {\n self.connecting = false; \n !self.reconnecting && self.onError(xhr.responseText);\n }\n }\n };\n xhr.send(null);\n }\n };\n\n /**\n * Find an available transport based on the options supplied in the constructor.\n *\n * @api private\n */\n\n Socket.prototype.getTransport = function (override) {\n var transports = override || this.transports, match;\n\n for (var i = 0, transport; transport = transports[i]; i++) {\n if (io.Transport[transport]\n && io.Transport[transport].check(this)\n && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) {\n return new io.Transport[transport](this, this.sessionid);\n }\n }\n\n return null;\n };\n\n /**\n * Connects to the server.\n *\n * @param {Function} [fn] Callback.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.connect = function (fn) {\n if (this.connecting) {\n return this;\n }\n\n var self = this;\n self.connecting = true;\n \n this.handshake(function (sid, heartbeat, close, transports) {\n self.sessionid = sid;\n self.closeTimeout = close * 1000;\n self.heartbeatTimeout = heartbeat * 1000;\n if(!self.transports)\n self.transports = self.origTransports = (transports ? io.util.intersect(\n transports.split(',')\n , self.options.transports\n ) : self.options.transports);\n\n self.setHeartbeatTimeout();\n\n function connect (transports){\n if (self.transport) self.transport.clearTimeouts();\n\n self.transport = self.getTransport(transports);\n if (!self.transport) return self.publish('connect_failed');\n\n // once the transport is ready\n self.transport.ready(self, function () {\n self.connecting = true;\n self.publish('connecting', self.transport.name);\n self.transport.open();\n\n if (self.options['connect timeout']) {\n self.connectTimeoutTimer = setTimeout(function () {\n if (!self.connected) {\n self.connecting = false;\n\n if (self.options['try multiple transports']) {\n var remaining = self.transports;\n\n while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n self.transport.name) {}\n\n if (remaining.length){\n connect(remaining);\n } else {\n self.publish('connect_failed');\n }\n }\n }\n }, self.options['connect timeout']);\n }\n });\n }\n\n connect(self.transports);\n\n self.once('connect', function (){\n clearTimeout(self.connectTimeoutTimer);\n\n fn && typeof fn == 'function' && fn();\n });\n });\n\n return this;\n };\n\n /**\n * Clears and sets a new heartbeat timeout using the value given by the\n * server during the handshake.\n *\n * @api private\n */\n\n Socket.prototype.setHeartbeatTimeout = function () {\n clearTimeout(this.heartbeatTimeoutTimer);\n if(this.transport && !this.transport.heartbeats()) return;\n\n var self = this;\n this.heartbeatTimeoutTimer = setTimeout(function () {\n self.transport.onClose();\n }, this.heartbeatTimeout);\n };\n\n /**\n * Sends a message.\n *\n * @param {Object} data packet.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.packet = function (data) {\n if (this.connected && !this.doBuffer) {\n this.transport.packet(data);\n } else {\n this.buffer.push(data);\n }\n\n return this;\n };\n\n /**\n * Sets buffer state\n *\n * @api private\n */\n\n Socket.prototype.setBuffer = function (v) {\n this.doBuffer = v;\n\n if (!v && this.connected && this.buffer.length) {\n if (!this.options['manualFlush']) {\n this.flushBuffer();\n }\n }\n };\n\n /**\n * Flushes the buffer data over the wire.\n * To be invoked manually when 'manualFlush' is set to true.\n *\n * @api public\n */\n\n Socket.prototype.flushBuffer = function() {\n this.transport.payload(this.buffer);\n this.buffer = [];\n };\n \n\n /**\n * Disconnect the established connect.\n *\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.disconnect = function () {\n if (this.connected || this.connecting) {\n if (this.open) {\n this.of('').packet({ type: 'disconnect' });\n }\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n }\n\n return this;\n };\n\n /**\n * Disconnects the socket with a sync XHR.\n *\n * @api private\n */\n\n Socket.prototype.disconnectSync = function () {\n // ensure disconnection\n var xhr = io.util.request();\n var uri = [\n 'http' + (this.options.secure ? 's' : '') + ':/'\n , this.options.host + ':' + this.options.port\n , this.options.resource\n , io.protocol\n , ''\n , this.sessionid\n ].join('/') + '/?disconnect=1';\n\n xhr.open('GET', uri, false);\n xhr.send(null);\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n };\n\n /**\n * Check if we need to use cross domain enabled transports. Cross domain would\n * be a different port or different domain name.\n *\n * @returns {Boolean}\n * @api private\n */\n\n Socket.prototype.isXDomain = function () {\n\n var port = global.location.port ||\n ('https:' == global.location.protocol ? 443 : 80);\n\n return this.options.host !== global.location.hostname \n || this.options.port != port;\n };\n\n /**\n * Called upon handshake.\n *\n * @api private\n */\n\n Socket.prototype.onConnect = function () {\n if (!this.connected) {\n this.connected = true;\n this.connecting = false;\n if (!this.doBuffer) {\n // make sure to flush the buffer\n this.setBuffer(false);\n }\n this.emit('connect');\n }\n };\n\n /**\n * Called when the transport opens\n *\n * @api private\n */\n\n Socket.prototype.onOpen = function () {\n this.open = true;\n };\n\n /**\n * Called when the transport closes.\n *\n * @api private\n */\n\n Socket.prototype.onClose = function () {\n this.open = false;\n clearTimeout(this.heartbeatTimeoutTimer);\n };\n\n /**\n * Called when the transport first opens a connection\n *\n * @param text\n */\n\n Socket.prototype.onPacket = function (packet) {\n this.of(packet.endpoint).onPacket(packet);\n };\n\n /**\n * Handles an error.\n *\n * @api private\n */\n\n Socket.prototype.onError = function (err) {\n if (err && err.advice) {\n if (err.advice === 'reconnect' && (this.connected || this.connecting)) {\n this.disconnect();\n if (this.options.reconnect) {\n this.reconnect();\n }\n }\n }\n\n this.publish('error', err && err.reason ? err.reason : err);\n };\n\n /**\n * Called when the transport disconnects.\n *\n * @api private\n */\n\n Socket.prototype.onDisconnect = function (reason) {\n var wasConnected = this.connected\n , wasConnecting = this.connecting;\n\n this.connected = false;\n this.connecting = false;\n this.open = false;\n\n if (wasConnected || wasConnecting) {\n this.transport.close();\n this.transport.clearTimeouts();\n if (wasConnected) {\n this.publish('disconnect', reason);\n\n if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n this.reconnect();\n }\n }\n }\n };\n\n /**\n * Called upon reconnection.\n *\n * @api private\n */\n\n Socket.prototype.reconnect = function () {\n this.reconnecting = true;\n this.reconnectionAttempts = 0;\n this.reconnectionDelay = this.options['reconnection delay'];\n\n var self = this\n , maxAttempts = this.options['max reconnection attempts']\n , tryMultiple = this.options['try multiple transports']\n , limit = this.options['reconnection limit'];\n\n function reset () {\n if (self.connected) {\n for (var i in self.namespaces) {\n if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n self.namespaces[i].packet({ type: 'connect' });\n }\n }\n self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n }\n\n clearTimeout(self.reconnectionTimer);\n\n self.removeListener('connect_failed', maybeReconnect);\n self.removeListener('connect', maybeReconnect);\n\n self.reconnecting = false;\n\n delete self.reconnectionAttempts;\n delete self.reconnectionDelay;\n delete self.reconnectionTimer;\n delete self.redoTransports;\n\n self.options['try multiple transports'] = tryMultiple;\n };\n\n function maybeReconnect () {\n if (!self.reconnecting) {\n return;\n }\n\n if (self.connected) {\n return reset();\n };\n\n if (self.connecting && self.reconnecting) {\n return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n }\n\n if (self.reconnectionAttempts++ >= maxAttempts) {\n if (!self.redoTransports) {\n self.on('connect_failed', maybeReconnect);\n self.options['try multiple transports'] = true;\n self.transports = self.origTransports;\n self.transport = self.getTransport();\n self.redoTransports = true;\n self.connect();\n } else {\n self.publish('reconnect_failed');\n reset();\n }\n } else {\n if (self.reconnectionDelay < limit) {\n self.reconnectionDelay *= 2; // exponential back off\n }\n\n self.connect();\n self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n }\n };\n\n this.options['try multiple transports'] = false;\n this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n this.on('connect', maybeReconnect);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.SocketNamespace = SocketNamespace;\n\n /**\n * Socket namespace constructor.\n *\n * @constructor\n * @api public\n */\n\n function SocketNamespace (socket, name) {\n this.socket = socket;\n this.name = name || '';\n this.flags = {};\n this.json = new Flag(this, 'json');\n this.ackPackets = 0;\n this.acks = {};\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(SocketNamespace, io.EventEmitter);\n\n /**\n * Copies emit since we override it\n *\n * @api private\n */\n\n SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n /**\n * Creates a new namespace, by proxying the request to the socket. This\n * allows us to use the synax as we do on the server.\n *\n * @api public\n */\n\n SocketNamespace.prototype.of = function () {\n return this.socket.of.apply(this.socket, arguments);\n };\n\n /**\n * Sends a packet.\n *\n * @api private\n */\n\n SocketNamespace.prototype.packet = function (packet) {\n packet.endpoint = this.name;\n this.socket.packet(packet);\n this.flags = {};\n return this;\n };\n\n /**\n * Sends a message\n *\n * @api public\n */\n\n SocketNamespace.prototype.send = function (data, fn) {\n var packet = {\n type: this.flags.json ? 'json' : 'message'\n , data: data\n };\n\n if ('function' == typeof fn) {\n packet.id = ++this.ackPackets;\n packet.ack = true;\n this.acks[packet.id] = fn;\n }\n\n return this.packet(packet);\n };\n\n /**\n * Emits an event\n *\n * @api public\n */\n \n SocketNamespace.prototype.emit = function (name) {\n var args = Array.prototype.slice.call(arguments, 1)\n , lastArg = args[args.length - 1]\n , packet = {\n type: 'event'\n , name: name\n };\n\n if ('function' == typeof lastArg) {\n packet.id = ++this.ackPackets;\n packet.ack = 'data';\n this.acks[packet.id] = lastArg;\n args = args.slice(0, args.length - 1);\n }\n\n packet.args = args;\n\n return this.packet(packet);\n };\n\n /**\n * Disconnects the namespace\n *\n * @api private\n */\n\n SocketNamespace.prototype.disconnect = function () {\n if (this.name === '') {\n this.socket.disconnect();\n } else {\n this.packet({ type: 'disconnect' });\n this.$emit('disconnect');\n }\n\n return this;\n };\n\n /**\n * Handles a packet\n *\n * @api private\n */\n\n SocketNamespace.prototype.onPacket = function (packet) {\n var self = this;\n\n function ack () {\n self.packet({\n type: 'ack'\n , args: io.util.toArray(arguments)\n , ackId: packet.id\n });\n };\n\n switch (packet.type) {\n case 'connect':\n this.$emit('connect');\n break;\n\n case 'disconnect':\n if (this.name === '') {\n this.socket.onDisconnect(packet.reason || 'booted');\n } else {\n this.$emit('disconnect', packet.reason);\n }\n break;\n\n case 'message':\n case 'json':\n var params = ['message', packet.data];\n\n if (packet.ack == 'data') {\n params.push(ack);\n } else if (packet.ack) {\n this.packet({ type: 'ack', ackId: packet.id });\n }\n\n this.$emit.apply(this, params);\n break;\n\n case 'event':\n var params = [packet.name].concat(packet.args);\n\n if (packet.ack == 'data')\n params.push(ack);\n\n this.$emit.apply(this, params);\n break;\n\n case 'ack':\n if (this.acks[packet.ackId]) {\n this.acks[packet.ackId].apply(this, packet.args);\n delete this.acks[packet.ackId];\n }\n break;\n\n case 'error':\n if (packet.advice){\n this.socket.onError(packet);\n } else {\n if (packet.reason == 'unauthorized') {\n this.$emit('connect_failed', packet.reason);\n } else {\n this.$emit('error', packet.reason);\n }\n }\n break;\n }\n };\n\n /**\n * Flag interface.\n *\n * @api private\n */\n\n function Flag (nsp, name) {\n this.namespace = nsp;\n this.name = name;\n };\n\n /**\n * Send a message\n *\n * @api public\n */\n\n Flag.prototype.send = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.send.apply(this.namespace, arguments);\n };\n\n /**\n * Emit an event\n *\n * @api public\n */\n\n Flag.prototype.emit = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.emit.apply(this.namespace, arguments);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports.websocket = WS;\n\n /**\n * The WebSocket transport uses the HTML5 WebSocket API to establish an\n * persistent connection with the Socket.IO server. This transport will also\n * be inherited by the FlashSocket fallback as it provides a API compatible\n * polyfill for the WebSockets.\n *\n * @constructor\n * @extends {io.Transport}\n * @api public\n */\n\n function WS (socket) {\n io.Transport.apply(this, arguments);\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(WS, io.Transport);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n WS.prototype.name = 'websocket';\n\n /**\n * Initializes a new `WebSocket` connection with the Socket.IO server. We attach\n * all the appropriate listeners to handle the responses from the server.\n *\n * @returns {Transport}\n * @api public\n */\n\n WS.prototype.open = function () {\n var query = io.util.query(this.socket.options.query)\n , self = this\n , Socket\n\n\n if (!Socket) {\n Socket = global.MozWebSocket || global.WebSocket;\n }\n\n this.websocket = new Socket(this.prepareUrl() + query);\n\n this.websocket.onopen = function () {\n self.onOpen();\n self.socket.setBuffer(false);\n };\n this.websocket.onmessage = function (ev) {\n self.onData(ev.data);\n };\n this.websocket.onclose = function () {\n self.onClose();\n self.socket.setBuffer(true);\n };\n this.websocket.onerror = function (e) {\n self.onError(e);\n };\n\n return this;\n };\n\n /**\n * Send a message to the Socket.IO server. The message will automatically be\n * encoded in the correct message format.\n *\n * @returns {Transport}\n * @api public\n */\n\n // Do to a bug in the current IDevices browser, we need to wrap the send in a \n // setTimeout, when they resume from sleeping the browser will crash if \n // we don't allow the browser time to detect the socket has been closed\n if (io.util.ua.iDevice) {\n WS.prototype.send = function (data) {\n var self = this;\n setTimeout(function() {\n self.websocket.send(data);\n },0);\n return this;\n };\n } else {\n WS.prototype.send = function (data) {\n this.websocket.send(data);\n return this;\n };\n }\n\n /**\n * Payload\n *\n * @api private\n */\n\n WS.prototype.payload = function (arr) {\n for (var i = 0, l = arr.length; i < l; i++) {\n this.packet(arr[i]);\n }\n return this;\n };\n\n /**\n * Disconnect the established `WebSocket` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n WS.prototype.close = function () {\n this.websocket.close();\n return this;\n };\n\n /**\n * Handle the errors that `WebSocket` might be giving when we\n * are attempting to connect or send messages.\n *\n * @param {Error} e The error.\n * @api private\n */\n\n WS.prototype.onError = function (e) {\n this.socket.onError(e);\n };\n\n /**\n * Returns the appropriate scheme for the URI generation.\n *\n * @api private\n */\n WS.prototype.scheme = function () {\n return this.socket.options.secure ? 'wss' : 'ws';\n };\n\n /**\n * Checks if the browser has support for native `WebSockets` and that\n * it's not the polyfill created for the FlashSocket transport.\n *\n * @return {Boolean}\n * @api public\n */\n\n WS.check = function () {\n return ('WebSocket' in global && !('__addTask' in WebSocket))\n || 'MozWebSocket' in global;\n };\n\n /**\n * Check if the `WebSocket` transport support cross domain communications.\n *\n * @returns {Boolean}\n * @api public\n */\n\n WS.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('websocket');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.flashsocket = Flashsocket;\n\n /**\n * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket\n * specification. It uses a .swf file to communicate with the server. If you want\n * to serve the .swf file from a other server than where the Socket.IO script is\n * coming from you need to use the insecure version of the .swf. More information\n * about this can be found on the github page.\n *\n * @constructor\n * @extends {io.Transport.websocket}\n * @api public\n */\n\n function Flashsocket () {\n io.Transport.websocket.apply(this, arguments);\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(Flashsocket, io.Transport.websocket);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n Flashsocket.prototype.name = 'flashsocket';\n\n /**\n * Disconnect the established `FlashSocket` connection. This is done by adding a \n * new task to the FlashSocket. The rest will be handled off by the `WebSocket` \n * transport.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.open = function () {\n var self = this\n , args = arguments;\n\n WebSocket.__addTask(function () {\n io.Transport.websocket.prototype.open.apply(self, args);\n });\n return this;\n };\n \n /**\n * Sends a message to the Socket.IO server. This is done by adding a new\n * task to the FlashSocket. The rest will be handled off by the `WebSocket` \n * transport.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.send = function () {\n var self = this, args = arguments;\n WebSocket.__addTask(function () {\n io.Transport.websocket.prototype.send.apply(self, args);\n });\n return this;\n };\n\n /**\n * Disconnects the established `FlashSocket` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n Flashsocket.prototype.close = function () {\n WebSocket.__tasks.length = 0;\n io.Transport.websocket.prototype.close.call(this);\n return this;\n };\n\n /**\n * The WebSocket fall back needs to append the flash container to the body\n * element, so we need to make sure we have access to it. Or defer the call\n * until we are sure there is a body element.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n Flashsocket.prototype.ready = function (socket, fn) {\n function init () {\n var options = socket.options\n , port = options['flash policy port']\n , path = [\n 'http' + (options.secure ? 's' : '') + ':/'\n , options.host + ':' + options.port\n , options.resource\n , 'static/flashsocket'\n , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf'\n ];\n\n // Only start downloading the swf file when the checked that this browser\n // actually supports it\n if (!Flashsocket.loaded) {\n if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') {\n // Set the correct file based on the XDomain settings\n WEB_SOCKET_SWF_LOCATION = path.join('/');\n }\n\n if (port !== 843) {\n WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port);\n }\n\n WebSocket.__initialize();\n Flashsocket.loaded = true;\n }\n\n fn.call(self);\n }\n\n var self = this;\n if (document.body) return init();\n\n io.util.load(init);\n };\n\n /**\n * Check if the FlashSocket transport is supported as it requires that the Adobe\n * Flash Player plug-in version `10.0.0` or greater is installed. And also check if\n * the polyfill is correctly loaded.\n *\n * @returns {Boolean}\n * @api public\n */\n\n Flashsocket.check = function () {\n if (\n typeof WebSocket == 'undefined'\n || !('__initialize' in WebSocket) || !swfobject\n ) return false;\n\n return swfobject.getFlashPlayerVersion().major >= 10;\n };\n\n /**\n * Check if the FlashSocket transport can be used as cross domain / cross origin \n * transport. Because we can't see which type (secure or insecure) of .swf is used\n * we will just return true.\n *\n * @returns {Boolean}\n * @api public\n */\n\n Flashsocket.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Disable AUTO_INITIALIZATION\n */\n\n if (typeof window != 'undefined') {\n WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true;\n }\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('flashsocket');\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nif ('undefined' != typeof window) {\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?(['Active'].concat('').join('X')):\"PlugIn\",ac=\"MMredirectURL=\"+O.location.toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();\n}\n// Copyright: Hiroshi Ichikawa <http://gimite.net/en/>\n// License: New BSD License\n// Reference: http://dev.w3.org/html5/websockets/\n// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol\n\n(function() {\n \n if ('undefined' == typeof window || window.WebSocket) return;\n\n var console = window.console;\n if (!console || !console.log || !console.error) {\n console = {log: function(){ }, error: function(){ }};\n }\n \n if (!swfobject.hasFlashPlayerVersion(\"10.0.0\")) {\n console.error(\"Flash Player >= 10.0.0 is required.\");\n return;\n }\n if (location.protocol == \"file:\") {\n console.error(\n \"WARNING: web-socket-js doesn't work in file:///... URL \" +\n \"unless you set Flash Security Settings properly. \" +\n \"Open the page via Web server i.e. http://...\");\n }\n\n /**\n * This class represents a faux web socket.\n * @param {string} url\n * @param {array or string} protocols\n * @param {string} proxyHost\n * @param {int} proxyPort\n * @param {string} headers\n */\n WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {\n var self = this;\n self.__id = WebSocket.__nextId++;\n WebSocket.__instances[self.__id] = self;\n self.readyState = WebSocket.CONNECTING;\n self.bufferedAmount = 0;\n self.__events = {};\n if (!protocols) {\n protocols = [];\n } else if (typeof protocols == \"string\") {\n protocols = [protocols];\n }\n // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc.\n // Otherwise, when onopen fires immediately, onopen is called before it is set.\n setTimeout(function() {\n WebSocket.__addTask(function() {\n WebSocket.__flash.create(\n self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null);\n });\n }, 0);\n };\n\n /**\n * Send data to the web socket.\n * @param {string} data The data to send to the socket.\n * @return {boolean} True for success, false for failure.\n */\n WebSocket.prototype.send = function(data) {\n if (this.readyState == WebSocket.CONNECTING) {\n throw \"INVALID_STATE_ERR: Web Socket connection has not been established\";\n }\n // We use encodeURIComponent() here, because FABridge doesn't work if\n // the argument includes some characters. We don't use escape() here\n // because of this:\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions\n // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't\n // preserve all Unicode characters either e.g. \"\\uffff\" in Firefox.\n // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require\n // additional testing.\n var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data));\n if (result < 0) { // success\n return true;\n } else {\n this.bufferedAmount += result;\n return false;\n }\n };\n\n /**\n * Close this web socket gracefully.\n */\n WebSocket.prototype.close = function() {\n if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) {\n return;\n }\n this.readyState = WebSocket.CLOSING;\n WebSocket.__flash.close(this.__id);\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {string} type\n * @param {function} listener\n * @param {boolean} useCapture\n * @return void\n */\n WebSocket.prototype.addEventListener = function(type, listener, useCapture) {\n if (!(type in this.__events)) {\n this.__events[type] = [];\n }\n this.__events[type].push(listener);\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {string} type\n * @param {function} listener\n * @param {boolean} useCapture\n * @return void\n */\n WebSocket.prototype.removeEventListener = function(type, listener, useCapture) {\n if (!(type in this.__events)) return;\n var events = this.__events[type];\n for (var i = events.length - 1; i >= 0; --i) {\n if (events[i] === listener) {\n events.splice(i, 1);\n break;\n }\n }\n };\n\n /**\n * Implementation of {@link <a href=\"http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration\">DOM 2 EventTarget Interface</a>}\n *\n * @param {Event} event\n * @return void\n */\n WebSocket.prototype.dispatchEvent = function(event) {\n var events = this.__events[event.type] || [];\n for (var i = 0; i < events.length; ++i) {\n events[i](event);\n }\n var handler = this[\"on\" + event.type];\n if (handler) handler(event);\n };\n\n /**\n * Handles an event from Flash.\n * @param {Object} flashEvent\n */\n WebSocket.prototype.__handleEvent = function(flashEvent) {\n if (\"readyState\" in flashEvent) {\n this.readyState = flashEvent.readyState;\n }\n if (\"protocol\" in flashEvent) {\n this.protocol = flashEvent.protocol;\n }\n \n var jsEvent;\n if (flashEvent.type == \"open\" || flashEvent.type == \"error\") {\n jsEvent = this.__createSimpleEvent(flashEvent.type);\n } else if (flashEvent.type == \"close\") {\n // TODO implement jsEvent.wasClean\n jsEvent = this.__createSimpleEvent(\"close\");\n } else if (flashEvent.type == \"message\") {\n var data = decodeURIComponent(flashEvent.message);\n jsEvent = this.__createMessageEvent(\"message\", data);\n } else {\n throw \"unknown event type: \" + flashEvent.type;\n }\n \n this.dispatchEvent(jsEvent);\n };\n \n WebSocket.prototype.__createSimpleEvent = function(type) {\n if (document.createEvent && window.Event) {\n var event = document.createEvent(\"Event\");\n event.initEvent(type, false, false);\n return event;\n } else {\n return {type: type, bubbles: false, cancelable: false};\n }\n };\n \n WebSocket.prototype.__createMessageEvent = function(type, data) {\n if (document.createEvent && window.MessageEvent && !window.opera) {\n var event = document.createEvent(\"MessageEvent\");\n event.initMessageEvent(\"message\", false, false, data, null, null, window, null);\n return event;\n } else {\n // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes.\n return {type: type, data: data, bubbles: false, cancelable: false};\n }\n };\n \n /**\n * Define the WebSocket readyState enumeration.\n */\n WebSocket.CONNECTING = 0;\n WebSocket.OPEN = 1;\n WebSocket.CLOSING = 2;\n WebSocket.CLOSED = 3;\n\n WebSocket.__flash = null;\n WebSocket.__instances = {};\n WebSocket.__tasks = [];\n WebSocket.__nextId = 0;\n \n /**\n * Load a new flash security policy file.\n * @param {string} url\n */\n WebSocket.loadFlashPolicyFile = function(url){\n WebSocket.__addTask(function() {\n WebSocket.__flash.loadManualPolicyFile(url);\n });\n };\n\n /**\n * Loads WebSocketMain.swf and creates WebSocketMain object in Flash.\n */\n WebSocket.__initialize = function() {\n if (WebSocket.__flash) return;\n \n if (WebSocket.__swfLocation) {\n // For backword compatibility.\n window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation;\n }\n if (!window.WEB_SOCKET_SWF_LOCATION) {\n console.error(\"[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf\");\n return;\n }\n var container = document.createElement(\"div\");\n container.id = \"webSocketContainer\";\n // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents\n // Flash from loading at least in IE. So we move it out of the screen at (-100, -100).\n // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash\n // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is\n // the best we can do as far as we know now.\n container.style.position = \"absolute\";\n if (WebSocket.__isFlashLite()) {\n container.style.left = \"0px\";\n container.style.top = \"0px\";\n } else {\n container.style.left = \"-100px\";\n container.style.top = \"-100px\";\n }\n var holder = document.createElement(\"div\");\n holder.id = \"webSocketFlash\";\n container.appendChild(holder);\n document.body.appendChild(container);\n // See this article for hasPriority:\n // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html\n swfobject.embedSWF(\n WEB_SOCKET_SWF_LOCATION,\n \"webSocketFlash\",\n \"1\" /* width */,\n \"1\" /* height */,\n \"10.0.0\" /* SWF version */,\n null,\n null,\n {hasPriority: true, swliveconnect : true, allowScriptAccess: \"always\"},\n null,\n function(e) {\n if (!e.success) {\n console.error(\"[WebSocket] swfobject.embedSWF failed\");\n }\n });\n };\n \n /**\n * Called by Flash to notify JS that it's fully loaded and ready\n * for communication.\n */\n WebSocket.__onFlashInitialized = function() {\n // We need to set a timeout here to avoid round-trip calls\n // to flash during the initialization process.\n setTimeout(function() {\n WebSocket.__flash = document.getElementById(\"webSocketFlash\");\n WebSocket.__flash.setCallerUrl(location.href);\n WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG);\n for (var i = 0; i < WebSocket.__tasks.length; ++i) {\n WebSocket.__tasks[i]();\n }\n WebSocket.__tasks = [];\n }, 0);\n };\n \n /**\n * Called by Flash to notify WebSockets events are fired.\n */\n WebSocket.__onFlashEvent = function() {\n setTimeout(function() {\n try {\n // Gets events using receiveEvents() instead of getting it from event object\n // of Flash event. This is to make sure to keep message order.\n // It seems sometimes Flash events don't arrive in the same order as they are sent.\n var events = WebSocket.__flash.receiveEvents();\n for (var i = 0; i < events.length; ++i) {\n WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]);\n }\n } catch (e) {\n console.error(e);\n }\n }, 0);\n return true;\n };\n \n // Called by Flash.\n WebSocket.__log = function(message) {\n console.log(decodeURIComponent(message));\n };\n \n // Called by Flash.\n WebSocket.__error = function(message) {\n console.error(decodeURIComponent(message));\n };\n \n WebSocket.__addTask = function(task) {\n if (WebSocket.__flash) {\n task();\n } else {\n WebSocket.__tasks.push(task);\n }\n };\n \n /**\n * Test if the browser is running flash lite.\n * @return {boolean} True if flash lite is running, false otherwise.\n */\n WebSocket.__isFlashLite = function() {\n if (!window.navigator || !window.navigator.mimeTypes) {\n return false;\n }\n var mimeType = window.navigator.mimeTypes[\"application/x-shockwave-flash\"];\n if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) {\n return false;\n }\n return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false;\n };\n \n if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) {\n if (window.addEventListener) {\n window.addEventListener(\"load\", function(){\n WebSocket.__initialize();\n }, false);\n } else {\n window.attachEvent(\"onload\", function(){\n WebSocket.__initialize();\n });\n }\n }\n \n})();\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n *\n * @api public\n */\n\n exports.XHR = XHR;\n\n /**\n * XHR constructor\n *\n * @costructor\n * @api public\n */\n\n function XHR (socket) {\n if (!socket) return;\n\n io.Transport.apply(this, arguments);\n this.sendBuffer = [];\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(XHR, io.Transport);\n\n /**\n * Establish a connection\n *\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.open = function () {\n this.socket.setBuffer(false);\n this.onOpen();\n this.get();\n\n // we need to make sure the request succeeds since we have no indication\n // whether the request opened or not until it succeeded.\n this.setCloseTimeout();\n\n return this;\n };\n\n /**\n * Check if we need to send data to the Socket.IO server, if we have data in our\n * buffer we encode it and forward it to the `post` method.\n *\n * @api private\n */\n\n XHR.prototype.payload = function (payload) {\n var msgs = [];\n\n for (var i = 0, l = payload.length; i < l; i++) {\n msgs.push(io.parser.encodePacket(payload[i]));\n }\n\n this.send(io.parser.encodePayload(msgs));\n };\n\n /**\n * Send data to the Socket.IO server.\n *\n * @param data The message\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.send = function (data) {\n this.post(data);\n return this;\n };\n\n /**\n * Posts a encoded message to the Socket.IO server.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n function empty () { };\n\n XHR.prototype.post = function (data) {\n var self = this;\n this.socket.setBuffer(true);\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n self.posting = false;\n\n if (this.status == 200){\n self.socket.setBuffer(false);\n } else {\n self.onClose();\n }\n }\n }\n\n function onload () {\n this.onload = empty;\n self.socket.setBuffer(false);\n };\n\n this.sendXHR = this.request('POST');\n\n if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n this.sendXHR.onload = this.sendXHR.onerror = onload;\n } else {\n this.sendXHR.onreadystatechange = stateChange;\n }\n\n this.sendXHR.send(data);\n };\n\n /**\n * Disconnects the established `XHR` connection.\n *\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.close = function () {\n this.onClose();\n return this;\n };\n\n /**\n * Generates a configured XHR request\n *\n * @param {String} url The url that needs to be requested.\n * @param {String} method The method the request should use.\n * @returns {XMLHttpRequest}\n * @api private\n */\n\n XHR.prototype.request = function (method) {\n var req = io.util.request(this.socket.isXDomain())\n , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n req.open(method || 'GET', this.prepareUrl() + query, true);\n\n if (method == 'POST') {\n try {\n if (req.setRequestHeader) {\n req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n } else {\n // XDomainRequest\n req.contentType = 'text/plain';\n }\n } catch (e) {}\n }\n\n return req;\n };\n\n /**\n * Returns the scheme to use for the transport URLs.\n *\n * @api private\n */\n\n XHR.prototype.scheme = function () {\n return this.socket.options.secure ? 'https' : 'http';\n };\n\n /**\n * Check if the XHR transports are supported\n *\n * @param {Boolean} xdomain Check if we support cross domain requests.\n * @returns {Boolean}\n * @api public\n */\n\n XHR.check = function (socket, xdomain) {\n try {\n var request = io.util.request(xdomain),\n usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest),\n socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'),\n isXProtocol = (global.location && socketProtocol != global.location.protocol);\n if (request && !(usesXDomReq && isXProtocol)) {\n return true;\n }\n } catch(e) {}\n\n return false;\n };\n\n /**\n * Check if the XHR transport supports cross domain requests.\n *\n * @returns {Boolean}\n * @api public\n */\n\n XHR.xdomainCheck = function (socket) {\n return XHR.check(socket, true);\n };\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.htmlfile = HTMLFile;\n\n /**\n * The HTMLFile transport creates a `forever iframe` based transport\n * for Internet Explorer. Regular forever iframe implementations will \n * continuously trigger the browsers buzy indicators. If the forever iframe\n * is created inside a `htmlfile` these indicators will not be trigged.\n *\n * @constructor\n * @extends {io.Transport.XHR}\n * @api public\n */\n\n function HTMLFile (socket) {\n io.Transport.XHR.apply(this, arguments);\n };\n\n /**\n * Inherits from XHR transport.\n */\n\n io.util.inherit(HTMLFile, io.Transport.XHR);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n HTMLFile.prototype.name = 'htmlfile';\n\n /**\n * Creates a new Ac...eX `htmlfile` with a forever loading iframe\n * that can be used to listen to messages. Inside the generated\n * `htmlfile` a reference will be made to the HTMLFile transport.\n *\n * @api private\n */\n\n HTMLFile.prototype.get = function () {\n this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n this.doc.open();\n this.doc.write('<html></html>');\n this.doc.close();\n this.doc.parentWindow.s = this;\n\n var iframeC = this.doc.createElement('div');\n iframeC.className = 'socketio';\n\n this.doc.body.appendChild(iframeC);\n this.iframe = this.doc.createElement('iframe');\n\n iframeC.appendChild(this.iframe);\n\n var self = this\n , query = io.util.query(this.socket.options.query, 't='+ +new Date);\n\n this.iframe.src = this.prepareUrl() + query;\n\n io.util.on(window, 'unload', function () {\n self.destroy();\n });\n };\n\n /**\n * The Socket.IO server will write script tags inside the forever\n * iframe, this function will be used as callback for the incoming\n * information.\n *\n * @param {String} data The message\n * @param {document} doc Reference to the context\n * @api private\n */\n\n HTMLFile.prototype._ = function (data, doc) {\n // unescape all forward slashes. see GH-1251\n data = data.replace(/\\\\\\//g, '/');\n this.onData(data);\n try {\n var script = doc.getElementsByTagName('script')[0];\n script.parentNode.removeChild(script);\n } catch (e) { }\n };\n\n /**\n * Destroy the established connection, iframe and `htmlfile`.\n * And calls the `CollectGarbage` function of Internet Explorer\n * to release the memory.\n *\n * @api private\n */\n\n HTMLFile.prototype.destroy = function () {\n if (this.iframe){\n try {\n this.iframe.src = 'about:blank';\n } catch(e){}\n\n this.doc = null;\n this.iframe.parentNode.removeChild(this.iframe);\n this.iframe = null;\n\n CollectGarbage();\n }\n };\n\n /**\n * Disconnects the established connection.\n *\n * @returns {Transport} Chaining.\n * @api public\n */\n\n HTMLFile.prototype.close = function () {\n this.destroy();\n return io.Transport.XHR.prototype.close.call(this);\n };\n\n /**\n * Checks if the browser supports this transport. The browser\n * must have an `Ac...eXObject` implementation.\n *\n * @return {Boolean}\n * @api public\n */\n\n HTMLFile.check = function (socket) {\n if (typeof window != \"undefined\" && (['Active'].concat('Object').join('X')) in window){\n try {\n var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n return a && io.Transport.XHR.check(socket);\n } catch(e){}\n }\n return false;\n };\n\n /**\n * Check if cross domain requests are supported.\n *\n * @returns {Boolean}\n * @api public\n */\n\n HTMLFile.xdomainCheck = function () {\n // we can probably do handling for sub-domains, we should\n // test that it's cross domain but a subdomain here\n return false;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('htmlfile');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports['xhr-polling'] = XHRPolling;\n\n /**\n * The XHR-polling transport uses long polling XHR requests to create a\n * \"persistent\" connection with the server.\n *\n * @constructor\n * @api public\n */\n\n function XHRPolling () {\n io.Transport.XHR.apply(this, arguments);\n };\n\n /**\n * Inherits from XHR transport.\n */\n\n io.util.inherit(XHRPolling, io.Transport.XHR);\n\n /**\n * Merge the properties from XHR transport\n */\n\n io.util.merge(XHRPolling, io.Transport.XHR);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n XHRPolling.prototype.name = 'xhr-polling';\n\n /**\n * Indicates whether heartbeats is enabled for this transport\n *\n * @api private\n */\n\n XHRPolling.prototype.heartbeats = function () {\n return false;\n };\n\n /** \n * Establish a connection, for iPhone and Android this will be done once the page\n * is loaded.\n *\n * @returns {Transport} Chaining.\n * @api public\n */\n\n XHRPolling.prototype.open = function () {\n var self = this;\n\n io.Transport.XHR.prototype.open.call(self);\n return false;\n };\n\n /**\n * Starts a XHR request to wait for incoming messages.\n *\n * @api private\n */\n\n function empty () {};\n\n XHRPolling.prototype.get = function () {\n if (!this.isOpen) return;\n\n var self = this;\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n\n if (this.status == 200) {\n self.onData(this.responseText);\n self.get();\n } else {\n self.onClose();\n }\n }\n };\n\n function onload () {\n this.onload = empty;\n this.onerror = empty;\n self.retryCounter = 1;\n self.onData(this.responseText);\n self.get();\n };\n\n function onerror () {\n self.retryCounter ++;\n if(!self.retryCounter || self.retryCounter > 3) {\n self.onClose(); \n } else {\n self.get();\n }\n };\n\n this.xhr = this.request();\n\n if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n this.xhr.onload = onload;\n this.xhr.onerror = onerror;\n } else {\n this.xhr.onreadystatechange = stateChange;\n }\n\n this.xhr.send(null);\n };\n\n /**\n * Handle the unclean close behavior.\n *\n * @api private\n */\n\n XHRPolling.prototype.onClose = function () {\n io.Transport.XHR.prototype.onClose.call(this);\n\n if (this.xhr) {\n this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty;\n try {\n this.xhr.abort();\n } catch(e){}\n this.xhr = null;\n }\n };\n\n /**\n * Webkit based browsers show a infinit spinner when you start a XHR request\n * before the browsers onload event is called so we need to defer opening of\n * the transport until the onload event is called. Wrapping the cb in our\n * defer method solve this.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n XHRPolling.prototype.ready = function (socket, fn) {\n var self = this;\n\n io.util.defer(function () {\n fn.call(self);\n });\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('xhr-polling');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n /**\n * There is a way to hide the loading indicator in Firefox. If you create and\n * remove a iframe it will stop showing the current loading indicator.\n * Unfortunately we can't feature detect that and UA sniffing is evil.\n *\n * @api private\n */\n\n var indicator = global.document && \"MozAppearance\" in\n global.document.documentElement.style;\n\n /**\n * Expose constructor.\n */\n\n exports['jsonp-polling'] = JSONPPolling;\n\n /**\n * The JSONP transport creates an persistent connection by dynamically\n * inserting a script tag in the page. This script tag will receive the\n * information of the Socket.IO server. When new information is received\n * it creates a new script tag for the new data stream.\n *\n * @constructor\n * @extends {io.Transport.xhr-polling}\n * @api public\n */\n\n function JSONPPolling (socket) {\n io.Transport['xhr-polling'].apply(this, arguments);\n\n this.index = io.j.length;\n\n var self = this;\n\n io.j.push(function (msg) {\n self._(msg);\n });\n };\n\n /**\n * Inherits from XHR polling transport.\n */\n\n io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n JSONPPolling.prototype.name = 'jsonp-polling';\n\n /**\n * Posts a encoded message to the Socket.IO server using an iframe.\n * The iframe is used because script tags can create POST based requests.\n * The iframe is positioned outside of the view so the user does not\n * notice it's existence.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n JSONPPolling.prototype.post = function (data) {\n var self = this\n , query = io.util.query(\n this.socket.options.query\n , 't='+ (+new Date) + '&i=' + this.index\n );\n\n if (!this.form) {\n var form = document.createElement('form')\n , area = document.createElement('textarea')\n , id = this.iframeId = 'socketio_iframe_' + this.index\n , iframe;\n\n form.className = 'socketio';\n form.style.position = 'absolute';\n form.style.top = '0px';\n form.style.left = '0px';\n form.style.display = 'none';\n form.target = id;\n form.method = 'POST';\n form.setAttribute('accept-charset', 'utf-8');\n area.name = 'd';\n form.appendChild(area);\n document.body.appendChild(form);\n\n this.form = form;\n this.area = area;\n }\n\n this.form.action = this.prepareUrl() + query;\n\n function complete () {\n initIframe();\n self.socket.setBuffer(false);\n };\n\n function initIframe () {\n if (self.iframe) {\n self.form.removeChild(self.iframe);\n }\n\n try {\n // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n iframe = document.createElement('<iframe name=\"'+ self.iframeId +'\">');\n } catch (e) {\n iframe = document.createElement('iframe');\n iframe.name = self.iframeId;\n }\n\n iframe.id = self.iframeId;\n\n self.form.appendChild(iframe);\n self.iframe = iframe;\n };\n\n initIframe();\n\n // we temporarily stringify until we figure out how to prevent\n // browsers from turning `\\n` into `\\r\\n` in form inputs\n this.area.value = io.JSON.stringify(data);\n\n try {\n this.form.submit();\n } catch(e) {}\n\n if (this.iframe.attachEvent) {\n iframe.onreadystatechange = function () {\n if (self.iframe.readyState == 'complete') {\n complete();\n }\n };\n } else {\n this.iframe.onload = complete;\n }\n\n this.socket.setBuffer(true);\n };\n\n /**\n * Creates a new JSONP poll that can be used to listen\n * for messages from the Socket.IO server.\n *\n * @api private\n */\n\n JSONPPolling.prototype.get = function () {\n var self = this\n , script = document.createElement('script')\n , query = io.util.query(\n this.socket.options.query\n , 't='+ (+new Date) + '&i=' + this.index\n );\n\n if (this.script) {\n this.script.parentNode.removeChild(this.script);\n this.script = null;\n }\n\n script.async = true;\n script.src = this.prepareUrl() + query;\n script.onerror = function () {\n self.onClose();\n };\n\n var insertAt = document.getElementsByTagName('script')[0];\n insertAt.parentNode.insertBefore(script, insertAt);\n this.script = script;\n\n if (indicator) {\n setTimeout(function () {\n var iframe = document.createElement('iframe');\n document.body.appendChild(iframe);\n document.body.removeChild(iframe);\n }, 100);\n }\n };\n\n /**\n * Callback function for the incoming message stream from the Socket.IO server.\n *\n * @param {String} data The message\n * @api private\n */\n\n JSONPPolling.prototype._ = function (msg) {\n this.onData(msg);\n if (this.isOpen) {\n this.get();\n }\n return this;\n };\n\n /**\n * The indicator hack only works after onload\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n JSONPPolling.prototype.ready = function (socket, fn) {\n var self = this;\n if (!indicator) return fn.call(this);\n\n io.util.load(function () {\n fn.call(self);\n });\n };\n\n /**\n * Checks if browser supports this transport.\n *\n * @return {Boolean}\n * @api public\n */\n\n JSONPPolling.check = function () {\n return 'document' in global;\n };\n\n /**\n * Check if cross domain requests are supported\n *\n * @returns {Boolean}\n * @api public\n */\n\n JSONPPolling.xdomainCheck = function () {\n return true;\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('jsonp-polling');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\nif (typeof define === \"function\" && define.amd) {\n define([], function () { return io; });\n}\n})();","// based on https://github.com/ESTOS/strophe.jingle/\n// adds wildemitter support\nvar util = require('util');\nvar adapter = require('webrtc-adapter-test');\nvar WildEmitter = require('wildemitter');\n\nfunction dumpSDP(description) {\n return {\n type: description.type,\n sdp: description.sdp\n };\n}\n\nfunction dumpStream(stream) {\n var info = {\n label: stream.id,\n };\n if (stream.getAudioTracks().length) {\n info.audio = stream.getAudioTracks().map(function (track) {\n return track.id;\n });\n }\n if (stream.getVideoTracks().length) {\n info.video = stream.getVideoTracks().map(function (track) {\n return track.id;\n });\n }\n return info;\n}\n\nfunction TraceablePeerConnection(config, constraints) {\n var self = this;\n WildEmitter.call(this);\n\n this.peerconnection = new window.RTCPeerConnection(config, constraints);\n\n this.trace = function (what, info) {\n self.emit('PeerConnectionTrace', {\n time: new Date(),\n type: what,\n value: info || \"\"\n });\n };\n\n this.onicecandidate = null;\n this.peerconnection.onicecandidate = function (event) {\n self.trace('onicecandidate', event.candidate);\n if (self.onicecandidate !== null) {\n self.onicecandidate(event);\n }\n };\n this.onaddstream = null;\n this.peerconnection.onaddstream = function (event) {\n self.trace('onaddstream', dumpStream(event.stream));\n if (self.onaddstream !== null) {\n self.onaddstream(event);\n }\n };\n this.onremovestream = null;\n this.peerconnection.onremovestream = function (event) {\n self.trace('onremovestream', dumpStream(event.stream));\n if (self.onremovestream !== null) {\n self.onremovestream(event);\n }\n };\n this.onsignalingstatechange = null;\n this.peerconnection.onsignalingstatechange = function (event) {\n self.trace('onsignalingstatechange', self.signalingState);\n if (self.onsignalingstatechange !== null) {\n self.onsignalingstatechange(event);\n }\n };\n this.oniceconnectionstatechange = null;\n this.peerconnection.oniceconnectionstatechange = function (event) {\n self.trace('oniceconnectionstatechange', self.iceConnectionState);\n if (self.oniceconnectionstatechange !== null) {\n self.oniceconnectionstatechange(event);\n }\n };\n this.onnegotiationneeded = null;\n this.peerconnection.onnegotiationneeded = function (event) {\n self.trace('onnegotiationneeded');\n if (self.onnegotiationneeded !== null) {\n self.onnegotiationneeded(event);\n }\n };\n self.ondatachannel = null;\n this.peerconnection.ondatachannel = function (event) {\n self.trace('ondatachannel', event);\n if (self.ondatachannel !== null) {\n self.ondatachannel(event);\n }\n };\n this.getLocalStreams = this.peerconnection.getLocalStreams.bind(this.peerconnection);\n this.getRemoteStreams = this.peerconnection.getRemoteStreams.bind(this.peerconnection);\n}\n\nutil.inherits(TraceablePeerConnection, WildEmitter);\n\n['signalingState', 'iceConnectionState', 'localDescription', 'remoteDescription'].forEach(function (prop) {\n Object.defineProperty(TraceablePeerConnection.prototype, prop, {\n get: function () {\n return this.peerconnection[prop];\n }\n });\n});\n\nTraceablePeerConnection.prototype.addStream = function (stream) {\n this.trace('addStream', dumpStream(stream));\n this.peerconnection.addStream(stream);\n};\n\nTraceablePeerConnection.prototype.removeStream = function (stream) {\n this.trace('removeStream', dumpStream(stream));\n this.peerconnection.removeStream(stream);\n};\n\nTraceablePeerConnection.prototype.createDataChannel = function (label, opts) {\n this.trace('createDataChannel', label, opts);\n return this.peerconnection.createDataChannel(label, opts);\n};\n\nTraceablePeerConnection.prototype.setLocalDescription = function (description, successCallback, failureCallback) {\n var self = this;\n this.trace('setLocalDescription', dumpSDP(description));\n this.peerconnection.setLocalDescription(description,\n function () {\n self.trace('setLocalDescriptionOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('setLocalDescriptionOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.setRemoteDescription = function (description, successCallback, failureCallback) {\n var self = this;\n this.trace('setRemoteDescription', dumpSDP(description));\n this.peerconnection.setRemoteDescription(description,\n function () {\n self.trace('setRemoteDescriptionOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('setRemoteDescriptionOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.close = function () {\n this.trace('stop');\n if (this.peerconnection.signalingState != 'closed') {\n this.peerconnection.close();\n }\n};\n\nTraceablePeerConnection.prototype.createOffer = function (successCallback, failureCallback, constraints) {\n var self = this;\n this.trace('createOffer', constraints);\n this.peerconnection.createOffer(\n function (offer) {\n self.trace('createOfferOnSuccess', dumpSDP(offer));\n if (successCallback) successCallback(offer);\n },\n function (err) {\n self.trace('createOfferOnFailure', err);\n if (failureCallback) failureCallback(err);\n },\n constraints\n );\n};\n\nTraceablePeerConnection.prototype.createAnswer = function (successCallback, failureCallback, constraints) {\n var self = this;\n this.trace('createAnswer', constraints);\n this.peerconnection.createAnswer(\n function (answer) {\n self.trace('createAnswerOnSuccess', dumpSDP(answer));\n if (successCallback) successCallback(answer);\n },\n function (err) {\n self.trace('createAnswerOnFailure', err);\n if (failureCallback) failureCallback(err);\n },\n constraints\n );\n};\n\nTraceablePeerConnection.prototype.addIceCandidate = function (candidate, successCallback, failureCallback) {\n var self = this;\n this.trace('addIceCandidate', candidate);\n this.peerconnection.addIceCandidate(candidate,\n function () {\n //self.trace('addIceCandidateOnSuccess');\n if (successCallback) successCallback();\n },\n function (err) {\n self.trace('addIceCandidateOnFailure', err);\n if (failureCallback) failureCallback(err);\n }\n );\n};\n\nTraceablePeerConnection.prototype.getStats = function () {\n this.peerconnection.getStats.apply(this.peerconnection, arguments);\n};\n\nmodule.exports = TraceablePeerConnection;\n","/*\n * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n\n/* More information about these options at jshint.com/docs/options */\n/* jshint browser: true, camelcase: true, curly: true, devel: true,\n eqeqeq: true, forin: false, globalstrict: true, node: true,\n quotmark: single, undef: true, unused: strict */\n/* global mozRTCIceCandidate, mozRTCPeerConnection, Promise,\nmozRTCSessionDescription, webkitRTCPeerConnection, MediaStreamTrack */\n/* exported trace,requestUserMedia */\n\n'use strict';\n\nvar getUserMedia = null;\nvar attachMediaStream = null;\nvar reattachMediaStream = null;\nvar webrtcDetectedBrowser = null;\nvar webrtcDetectedVersion = null;\nvar webrtcMinimumVersion = null;\nvar webrtcUtils = {\n log: function() {\n // suppress console.log output when being included as a module.\n if (typeof module !== 'undefined' ||\n typeof require === 'function' && typeof define === 'function') {\n return;\n }\n console.log.apply(console, arguments);\n },\n extractVersion: function(uastring, expr, pos) {\n var match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos]);\n }\n};\n\nfunction trace(text) {\n // This function is used for logging.\n if (text[text.length - 1] === '\\n') {\n text = text.substring(0, text.length - 1);\n }\n if (window.performance) {\n var now = (window.performance.now() / 1000).toFixed(3);\n webrtcUtils.log(now + ': ' + text);\n } else {\n webrtcUtils.log(text);\n }\n}\n\nif (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n // If prefixed srcObject property exists, return it.\n // Otherwise use the shimmed property, _srcObject\n return 'mozSrcObject' in this ? this.mozSrcObject : this._srcObject;\n },\n set: function(stream) {\n if ('mozSrcObject' in this) {\n this.mozSrcObject = stream;\n } else {\n // Use _srcObject as a private property for this shim\n this._srcObject = stream;\n // TODO: revokeObjectUrl(this.src) when !stream to release resources?\n this.src = URL.createObjectURL(stream);\n }\n }\n });\n }\n // Proxy existing globals\n getUserMedia = window.navigator && window.navigator.getUserMedia;\n}\n\n// Attach a media stream to an element.\nattachMediaStream = function(element, stream) {\n element.srcObject = stream;\n};\n\nreattachMediaStream = function(to, from) {\n to.srcObject = from.srcObject;\n};\n\nif (typeof window === 'undefined' || !window.navigator) {\n webrtcUtils.log('This does not appear to be a browser');\n webrtcDetectedBrowser = 'not a browser';\n} else if (navigator.mozGetUserMedia && window.mozRTCPeerConnection) {\n webrtcUtils.log('This appears to be Firefox');\n\n webrtcDetectedBrowser = 'firefox';\n\n // the detected firefox version.\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Firefox\\/([0-9]+)\\./, 1);\n\n // the minimum firefox version still supported by adapter.\n webrtcMinimumVersion = 31;\n\n // The RTCPeerConnection object.\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (webrtcDetectedVersion < 38) {\n // .urls is not supported in FF < 38.\n // create RTCIceServers with a single url.\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (server.hasOwnProperty('urls')) {\n for (var j = 0; j < server.urls.length; j++) {\n var newServer = {\n url: server.urls[j]\n };\n if (server.urls[j].indexOf('turn') === 0) {\n newServer.username = server.username;\n newServer.credential = server.credential;\n }\n newIceServers.push(newServer);\n }\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n }\n return new mozRTCPeerConnection(pcConfig, pcConstraints); // jscs:ignore requireCapitalizedConstructors\n };\n\n // The RTCSessionDescription object.\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = mozRTCSessionDescription;\n }\n\n // The RTCIceCandidate object.\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = mozRTCIceCandidate;\n }\n\n // getUserMedia constraints shim.\n getUserMedia = function(constraints, onSuccess, onError) {\n var constraintsToFF37 = function(c) {\n if (typeof c !== 'object' || c.require) {\n return c;\n }\n var require = [];\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = c[key] = (typeof c[key] === 'object') ?\n c[key] : {ideal: c[key]};\n if (r.min !== undefined ||\n r.max !== undefined || r.exact !== undefined) {\n require.push(key);\n }\n if (r.exact !== undefined) {\n if (typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n } else {\n c[key] = r.exact;\n }\n delete r.exact;\n }\n if (r.ideal !== undefined) {\n c.advanced = c.advanced || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[key] = {min: r.ideal, max: r.ideal};\n } else {\n oc[key] = r.ideal;\n }\n c.advanced.push(oc);\n delete r.ideal;\n if (!Object.keys(r).length) {\n delete c[key];\n }\n }\n });\n if (require.length) {\n c.require = require;\n }\n return c;\n };\n if (webrtcDetectedVersion < 38) {\n webrtcUtils.log('spec: ' + JSON.stringify(constraints));\n if (constraints.audio) {\n constraints.audio = constraintsToFF37(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToFF37(constraints.video);\n }\n webrtcUtils.log('ff37: ' + JSON.stringify(constraints));\n }\n return navigator.mozGetUserMedia(constraints, onSuccess, onError);\n };\n\n navigator.getUserMedia = getUserMedia;\n\n // Shim for mediaDevices on older versions.\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: requestUserMedia,\n addEventListener: function() { },\n removeEventListener: function() { }\n };\n }\n navigator.mediaDevices.enumerateDevices =\n navigator.mediaDevices.enumerateDevices || function() {\n return new Promise(function(resolve) {\n var infos = [\n {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n ];\n resolve(infos);\n });\n };\n\n if (webrtcDetectedVersion < 41) {\n // Work around http://bugzil.la/1169665\n var orgEnumerateDevices =\n navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n navigator.mediaDevices.enumerateDevices = function() {\n return orgEnumerateDevices().then(undefined, function(e) {\n if (e.name === 'NotFoundError') {\n return [];\n }\n throw e;\n });\n };\n }\n} else if (navigator.webkitGetUserMedia && window.webkitRTCPeerConnection) {\n webrtcUtils.log('This appears to be Chrome');\n\n webrtcDetectedBrowser = 'chrome';\n\n // the detected chrome version.\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/([0-9]+)\\./, 2);\n\n // the minimum chrome version still supported by adapter.\n webrtcMinimumVersion = 38;\n\n // The RTCPeerConnection object.\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n // Translate iceTransportPolicy to iceTransports,\n // see https://code.google.com/p/webrtc/issues/detail?id=4869\n if (pcConfig && pcConfig.iceTransportPolicy) {\n pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n }\n\n var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints); // jscs:ignore requireCapitalizedConstructors\n var origGetStats = pc.getStats.bind(pc);\n pc.getStats = function(selector, successCallback, errorCallback) { // jshint ignore: line\n var self = this;\n var args = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats(selector, successCallback);\n }\n\n var fixChromeStats = function(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function(report) {\n var standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: report.type\n };\n report.names().forEach(function(name) {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper = function(response) {\n args[1](fixChromeStats(response));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper, arguments[0]]);\n }\n\n // promise-support\n return new Promise(function(resolve, reject) {\n if (args.length === 1 && selector === null) {\n origGetStats.apply(self, [\n function(response) {\n resolve.apply(null, [fixChromeStats(response)]);\n }, reject]);\n } else {\n origGetStats.apply(self, [resolve, reject]);\n }\n });\n };\n\n return pc;\n };\n\n // add promise support\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = webkitRTCPeerConnection.prototype[method];\n webkitRTCPeerConnection.prototype[method] = function() {\n var self = this;\n if (arguments.length < 1 || (arguments.length === 1 &&\n typeof(arguments[0]) === 'object')) {\n var opts = arguments.length === 1 ? arguments[0] : undefined;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(self, [resolve, reject, opts]);\n });\n } else {\n return nativeMethod.apply(this, arguments);\n }\n };\n });\n\n ['setLocalDescription', 'setRemoteDescription',\n 'addIceCandidate'].forEach(function(method) {\n var nativeMethod = webkitRTCPeerConnection.prototype[method];\n webkitRTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n var self = this;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(self, [args[0],\n function() {\n resolve();\n if (args.length >= 2) {\n args[1].apply(null, []);\n }\n },\n function(err) {\n reject(err);\n if (args.length >= 3) {\n args[2].apply(null, [err]);\n }\n }]\n );\n });\n };\n });\n\n // getUserMedia constraints shim.\n var constraintsToChrome = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n var oldname = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(function(mix) {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n getUserMedia = function(constraints, onSuccess, onError) {\n if (constraints.audio) {\n constraints.audio = constraintsToChrome(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToChrome(constraints.video);\n }\n webrtcUtils.log('chrome: ' + JSON.stringify(constraints));\n return navigator.webkitGetUserMedia(constraints, onSuccess, onError);\n };\n navigator.getUserMedia = getUserMedia;\n\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: requestUserMedia,\n enumerateDevices: function() {\n return new Promise(function(resolve) {\n var kinds = {audio: 'audioinput', video: 'videoinput'};\n return MediaStreamTrack.getSources(function(devices) {\n resolve(devices.map(function(device) {\n return {label: device.label,\n kind: kinds[device.kind],\n deviceId: device.id,\n groupId: ''};\n }));\n });\n });\n }};\n }\n\n // A shim for getUserMedia method on the mediaDevices object.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (!navigator.mediaDevices.getUserMedia) {\n navigator.mediaDevices.getUserMedia = function(constraints) {\n return requestUserMedia(constraints);\n };\n } else {\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n webrtcUtils.log('spec: ' + JSON.stringify(c)); // whitespace for alignment\n c.audio = constraintsToChrome(c.audio);\n c.video = constraintsToChrome(c.video);\n webrtcUtils.log('chrome: ' + JSON.stringify(c));\n return origGetUserMedia(c);\n };\n }\n\n // Dummy devicechange event methods.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n navigator.mediaDevices.addEventListener = function() {\n webrtcUtils.log('Dummy mediaDevices.addEventListener called.');\n };\n }\n if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n navigator.mediaDevices.removeEventListener = function() {\n webrtcUtils.log('Dummy mediaDevices.removeEventListener called.');\n };\n }\n\n // Attach a media stream to an element.\n attachMediaStream = function(element, stream) {\n if (webrtcDetectedVersion >= 43) {\n element.srcObject = stream;\n } else if (typeof element.src !== 'undefined') {\n element.src = URL.createObjectURL(stream);\n } else {\n webrtcUtils.log('Error attaching stream to element.');\n }\n };\n reattachMediaStream = function(to, from) {\n if (webrtcDetectedVersion >= 43) {\n to.srcObject = from.srcObject;\n } else {\n to.src = from.src;\n }\n };\n\n} else if (navigator.mediaDevices && navigator.userAgent.match(\n /Edge\\/(\\d+).(\\d+)$/)) {\n webrtcUtils.log('This appears to be Edge');\n webrtcDetectedBrowser = 'edge';\n\n webrtcDetectedVersion = webrtcUtils.extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n\n // the minimum version still supported by adapter.\n webrtcMinimumVersion = 12;\n} else {\n webrtcUtils.log('Browser does not appear to be WebRTC-capable');\n}\n\n// Returns the result of getUserMedia as a Promise.\nfunction requestUserMedia(constraints) {\n return new Promise(function(resolve, reject) {\n getUserMedia(constraints, resolve, reject);\n });\n}\n\nvar webrtcTesting = {};\ntry {\n Object.defineProperty(webrtcTesting, 'version', {\n set: function(version) {\n webrtcDetectedVersion = version;\n }\n });\n} catch (e) {}\n\nif (typeof module !== 'undefined') {\n var RTCPeerConnection;\n if (typeof window !== 'undefined') {\n RTCPeerConnection = window.RTCPeerConnection;\n }\n module.exports = {\n RTCPeerConnection: RTCPeerConnection,\n getUserMedia: getUserMedia,\n attachMediaStream: attachMediaStream,\n reattachMediaStream: reattachMediaStream,\n webrtcDetectedBrowser: webrtcDetectedBrowser,\n webrtcDetectedVersion: webrtcDetectedVersion,\n webrtcMinimumVersion: webrtcMinimumVersion,\n webrtcTesting: webrtcTesting,\n webrtcUtils: webrtcUtils\n //requestUserMedia: not exposed on purpose.\n //trace: not exposed on purpose.\n };\n} else if ((typeof require === 'function') && (typeof define === 'function')) {\n // Expose objects and functions when RequireJS is doing the loading.\n define([], function() {\n return {\n RTCPeerConnection: window.RTCPeerConnection,\n getUserMedia: getUserMedia,\n attachMediaStream: attachMediaStream,\n reattachMediaStream: reattachMediaStream,\n webrtcDetectedBrowser: webrtcDetectedBrowser,\n webrtcDetectedVersion: webrtcDetectedVersion,\n webrtcMinimumVersion: webrtcMinimumVersion,\n webrtcTesting: webrtcTesting,\n webrtcUtils: webrtcUtils\n //requestUserMedia: not exposed on purpose.\n //trace: not exposed on purpose.\n };\n });\n}\n","// created by @HenrikJoreteg\nvar prefix;\nvar version;\n\nif (window.mozRTCPeerConnection || navigator.mozGetUserMedia) {\n prefix = 'moz';\n version = parseInt(navigator.userAgent.match(/Firefox\\/([0-9]+)\\./)[1], 10);\n} else if (window.webkitRTCPeerConnection || navigator.webkitGetUserMedia) {\n prefix = 'webkit';\n version = navigator.userAgent.match(/Chrom(e|ium)/) && parseInt(navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n}\n\nvar PC = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;\nvar IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;\nvar SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;\nvar MediaStream = window.webkitMediaStream || window.MediaStream;\nvar screenSharing = window.location.protocol === 'https:' &&\n ((prefix === 'webkit' && version >= 26) ||\n (prefix === 'moz' && version >= 33))\nvar AudioContext = window.AudioContext || window.webkitAudioContext;\nvar videoEl = document.createElement('video');\nvar supportVp8 = videoEl && videoEl.canPlayType && videoEl.canPlayType('video/webm; codecs=\"vp8\", vorbis') === \"probably\";\nvar getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia || navigator.mozGetUserMedia;\n\n// export support flags and constructors.prototype && PC\nmodule.exports = {\n prefix: prefix,\n browserVersion: version,\n support: !!PC && supportVp8 && !!getUserMedia,\n // new support style\n supportRTCPeerConnection: !!PC,\n supportVp8: supportVp8,\n supportGetUserMedia: !!getUserMedia,\n supportDataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n supportWebAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n supportMediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n supportScreenSharing: !!screenSharing,\n // old deprecated style. Dont use this anymore\n dataChannel: !!(PC && PC.prototype && PC.prototype.createDataChannel),\n webAudio: !!(AudioContext && AudioContext.prototype.createMediaStreamSource),\n mediaStream: !!(MediaStream && MediaStream.prototype.removeTrack),\n screenSharing: !!screenSharing,\n // constructors\n AudioContext: AudioContext,\n PeerConnection: PC,\n SessionDescription: SessionDescription,\n IceCandidate: IceCandidate,\n MediaStream: MediaStream,\n getUserMedia: getUserMedia\n};\n","/*\r\nWildEmitter.js is a slim little event emitter by @henrikjoreteg largely based\r\non @visionmedia's Emitter from UI Kit.\r\n\r\nWhy? I wanted it standalone.\r\n\r\nI also wanted support for wildcard emitters like this:\r\n\r\nemitter.on('*', function (eventName, other, event, payloads) {\r\n\r\n});\r\n\r\nemitter.on('somenamespace*', function (eventName, payloads) {\r\n\r\n});\r\n\r\nPlease note that callbacks triggered by wildcard registered events also get\r\nthe event name as the first argument.\r\n*/\r\n\r\nmodule.exports = WildEmitter;\r\n\r\nfunction WildEmitter() { }\r\n\r\nWildEmitter.mixin = function (constructor) {\r\n var prototype = constructor.prototype || constructor;\r\n\r\n prototype.isWildEmitter= true;\r\n\r\n // Listen on the given `event` with `fn`. Store a group name if present.\r\n prototype.on = function (event, groupName, fn) {\r\n this.callbacks = this.callbacks || {};\r\n var hasGroup = (arguments.length === 3),\r\n group = hasGroup ? arguments[1] : undefined,\r\n func = hasGroup ? arguments[2] : arguments[1];\r\n func._groupName = group;\r\n (this.callbacks[event] = this.callbacks[event] || []).push(func);\r\n return this;\r\n };\r\n\r\n // Adds an `event` listener that will be invoked a single\r\n // time then automatically removed.\r\n prototype.once = function (event, groupName, fn) {\r\n var self = this,\r\n hasGroup = (arguments.length === 3),\r\n group = hasGroup ? arguments[1] : undefined,\r\n func = hasGroup ? arguments[2] : arguments[1];\r\n function on() {\r\n self.off(event, on);\r\n func.apply(this, arguments);\r\n }\r\n this.on(event, group, on);\r\n return this;\r\n };\r\n\r\n // Unbinds an entire group\r\n prototype.releaseGroup = function (groupName) {\r\n this.callbacks = this.callbacks || {};\r\n var item, i, len, handlers;\r\n for (item in this.callbacks) {\r\n handlers = this.callbacks[item];\r\n for (i = 0, len = handlers.length; i < len; i++) {\r\n if (handlers[i]._groupName === groupName) {\r\n //console.log('removing');\r\n // remove it and shorten the array we're looping through\r\n handlers.splice(i, 1);\r\n i--;\r\n len--;\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n // Remove the given callback for `event` or all\r\n // registered callbacks.\r\n prototype.off = function (event, fn) {\r\n this.callbacks = this.callbacks || {};\r\n var callbacks = this.callbacks[event],\r\n i;\r\n\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (arguments.length === 1) {\r\n delete this.callbacks[event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n i = callbacks.indexOf(fn);\r\n callbacks.splice(i, 1);\r\n if (callbacks.length === 0) {\r\n delete this.callbacks[event];\r\n }\r\n return this;\r\n };\r\n\r\n /// Emit `event` with the given args.\r\n // also calls any `*` handlers\r\n prototype.emit = function (event) {\r\n this.callbacks = this.callbacks || {};\r\n var args = [].slice.call(arguments, 1),\r\n callbacks = this.callbacks[event],\r\n specialCallbacks = this.getWildcardCallbacks(event),\r\n i,\r\n len,\r\n item,\r\n listeners;\r\n\r\n if (callbacks) {\r\n listeners = callbacks.slice();\r\n for (i = 0, len = listeners.length; i < len; ++i) {\r\n if (!listeners[i]) {\r\n break;\r\n }\r\n listeners[i].apply(this, args);\r\n }\r\n }\r\n\r\n if (specialCallbacks) {\r\n len = specialCallbacks.length;\r\n listeners = specialCallbacks.slice();\r\n for (i = 0, len = listeners.length; i < len; ++i) {\r\n if (!listeners[i]) {\r\n break;\r\n }\r\n listeners[i].apply(this, [event].concat(args));\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n // Helper for for finding special wildcard event handlers that match the event\r\n prototype.getWildcardCallbacks = function (eventName) {\r\n this.callbacks = this.callbacks || {};\r\n var item,\r\n split,\r\n result = [];\r\n\r\n for (item in this.callbacks) {\r\n split = item.split('*');\r\n if (item === '*' || (split.length === 2 && eventName.slice(0, split[0].length) === split[0])) {\r\n result = result.concat(this.callbacks[item]);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n};\r\n\r\nWildEmitter.mixin(WildEmitter);\r\n","/* global Y */\r\n'use strict'\r\n\r\nvar SimpleWebRTC = require('simplewebrtc')\r\n\r\nfunction extend (Y) {\r\n class WebRTC extends Y.AbstractConnector {\r\n constructor (y, options) {\r\n if (options === undefined) {\r\n throw new Error('Options must not be undefined!')\r\n }\r\n if (options.room == null) {\r\n throw new Error('You must define a room name!')\r\n }\r\n options.role = 'slave'\r\n super(y, options)\r\n this.webrtcOptions = {\r\n url: options.url || 'http://yatta.ninja:8888',\r\n room: options.room\r\n }\r\n var swr = new SimpleWebRTC(this.webrtcOptions)\r\n this.swr = swr\r\n var self = this\r\n swr.once('connectionReady', function (userId) {\r\n // SimpleWebRTC (swr) is initialized\r\n swr.joinRoom(self.webrtcOptions.room)\r\n\r\n swr.once('joinedRoom', function () {\r\n self.setUserId(userId)\r\n /*\r\n var i\r\n // notify the connector class about all the users that already\r\n // joined the session\r\n for(i in self.swr.webrtc.peers){\r\n self.userJoined(self.swr.webrtc.peers[i].id, \"master\")\r\n }*/\r\n swr.on('channelMessage', function (peer, room_, message) {\r\n // The client received a message\r\n // Check if the connector is already initialized,\r\n // only then forward the message to the connector class\r\n if (message.type != null) {\r\n self.receiveMessage(peer.id, message.payload)\r\n }\r\n })\r\n })\r\n\r\n swr.on('createdPeer', function (peer) {\r\n // a new peer/client joined the session.\r\n // Notify the connector class, if the connector\r\n // is already initialized\r\n self.userJoined(peer.id, 'master')\r\n })\r\n\r\n swr.on('peerStreamRemoved', function (peer) {\r\n // a client left the session.\r\n // Notify the connector class, if the connector\r\n // is already initialized\r\n self.userLeft(peer.id)\r\n })\r\n })\r\n }\r\n disconnect () {\r\n this.swr.leaveRoom()\r\n super.disconnect()\r\n }\r\n reconnect () {\r\n this.swr.joinRoom(this.webrtcOptions.room)\r\n super.reconnect()\r\n }\r\n send (uid, message) {\r\n var self = this\r\n // we have to make sure that the message is sent under all circumstances\r\n var send = function () {\r\n // check if the clients still exists\r\n var peer = self.swr.webrtc.getPeers(uid)[0]\r\n var success\r\n if (peer) {\r\n // success is true, if the message is successfully sent\r\n success = peer.sendDirectly('simplewebrtc', 'yjs', message)\r\n }\r\n if (!success) {\r\n // resend the message if it didn't work\r\n setTimeout(send, 500)\r\n }\r\n }\r\n // try to send the message\r\n send()\r\n }\r\n broadcast (message) {\r\n this.swr.sendDirectlyToAll('simplewebrtc', 'yjs', message)\r\n }\r\n isDisconnected () {\r\n return false\r\n }\r\n }\r\n Y.extend('webrtc', WebRTC)\r\n}\r\n\r\nmodule.exports = extend\r\nif (typeof Y !== 'undefined') {\r\n extend(Y)\r\n}\r\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n"],"sourceRoot":"/source/"}