diff --git a/History.md b/History.md index f2a345f74b19053f5aa7f48a223502c875eebbec..d2beb227c6262788375701c94a72da9efb1aff59 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,11 @@ New features are introduced and described in the [eyeson developer techblog](https://docs.eyeson.com/blog/) +# v1.8.8 / 2023-08-29 + +- new: esm module "eyeson-esm.js" +- new: SystemPressureMonitor (ComputePressure API) +- new: eyeson.core.comApi.getSnapshot(id, callback) + # v1.8.7 / 2023-07-11 - perf update: virtual background and canvas mixer diff --git a/dist/eyeson-esm.js b/dist/eyeson-esm.js index e8f4acbdac65774996f357736de460b5ec5e7dc2..4f0f64cdc5819f579b35e4d7126b473d68cd19ac 100644 --- a/dist/eyeson-esm.js +++ b/dist/eyeson-esm.js @@ -11,5 +11,5 @@ var e={795:function(e,t,n){var r; * (c) Sindre Sorhus; MIT License */ !function(){var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},n=e.exports,r=function(){for(var e,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],r=0,i=n.length,o={};r<i;r++)if((e=n[r])&&e[1]in t){for(r=0;r<e.length;r++)o[n[0][r]]=e[r];return o}return!1}(),i={change:r.fullscreenchange,error:r.fullscreenerror},o={request:function(e,n){return new Promise(function(i,o){var s=function(){this.off("change",s),i()}.bind(this);this.on("change",s);var a=(e=e||t.documentElement)[r.requestFullscreen](n);a instanceof Promise&&a.then(s).catch(o)}.bind(this))},exit:function(){return new Promise(function(e,n){if(this.isFullscreen){var i=function(){this.off("change",i),e()}.bind(this);this.on("change",i);var o=t[r.exitFullscreen]();o instanceof Promise&&o.then(i).catch(n)}else e()}.bind(this))},toggle:function(e,t){return this.isFullscreen?this.exit():this.request(e,t)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,n){var r=i[e];r&&t.addEventListener(r,n,!1)},off:function(e,n){var r=i[e];r&&t.removeEventListener(r,n,!1)},raw:r};r?(Object.defineProperties(o,{isFullscreen:{get:function(){return Boolean(t[r.fullscreenElement])}},element:{enumerable:!0,get:function(){return t[r.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return Boolean(t[r.fullscreenEnabled])}}}),n?e.exports=o:window.screenfull=o):n?e.exports={isEnabled:!1}:window.screenfull={isEnabled:!1}}()},539:e=>{const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},t.getDescription=function(e){const n=t.splitSections(e);return n&&n[0]},t.getMediaSections=function(e){const n=t.splitSections(e);return n.shift(),n},t.matchPrefix=function(e,n){return t.splitLines(e).filter((e=>0===e.indexOf(n)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let e=8;e<t.length;e+=2)switch(t[e]){case"raddr":n.relatedAddress=t[e+1];break;case"rport":n.relatedPort=parseInt(t[e+1],10);break;case"tcptype":n.tcpType=t[e+1];break;case"ufrag":n.ufrag=t[e+1],n.usernameFragment=t[e+1];break;default:void 0===n[t[e]]&&(n[t[e]]=t[e+1])}return n},t.writeCandidate=function(e){const t=[];t.push(e.foundation);const n=e.component;"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);const r=e.type;return t.push("typ"),t.push(r),"host"!==r&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},t.parseIceOptions=function(e){return e.substring(14).split(" ")},t.parseRtpMap=function(e){let t=e.substring(9).split(" ");const n={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),n.name=t[0],n.clockRate=parseInt(t[1],10),n.channels=3===t.length?parseInt(t[2],10):1,n.numChannels=n.channels,n},t.writeRtpMap=function(e){let t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);const n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},t.parseExtmap=function(e){const t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let n;const r=e.substring(e.indexOf(" ")+1).split(";");for(let e=0;e<r.length;e++)n=r[e].trim().split("="),t[n[0].trim()]=n[1];return t},t.writeFmtp=function(e){let t="",n=e.payloadType;if(void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){const r=[];Object.keys(e.parameters).forEach((t=>{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)})),t+="a=fmtp:"+n+" "+r.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const n=t.matchPrefix(e,"a=mid:")[0];if(n)return n.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let i=3;i<r.length;i++){const o=r[i],s=t.matchPrefix(e,"a=rtpmap:"+o+" ")[0];if(s){const r=t.parseRtpMap(s),i=t.matchPrefix(e,"a=fmtp:"+o+" ");switch(r.parameters=i.length?t.parseFmtp(i[0]):{},r.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+o+" ").map(t.parseRtcpFb),n.codecs.push(r),r.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(r.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const u=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));u.length>0&&u[0].length>1&&u[0][0]===a&&(c=u[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;i=e||t.generateSessionId();return"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let e=0;e<r.length;e++)switch(r[e]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[e].substring(2)}return n?t.getDirection(n):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const n=t.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}},t.parseOLine=function(e){const n=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:n[0],sessionId:n[1],sessionVersion:parseInt(n[2],10),netType:n[3],addressType:n[4],address:n[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const n=t.splitLines(e);for(let e=0;e<n.length;e++)if(n[e].length<2||"="!==n[e].charAt(1))return!1;return!0},e.exports=t},61:(e,t,n)=>{var r=n(698).default;function i(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ -e.exports=i=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,o=n.hasOwnProperty,s=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},c=a.iterator||"@@iterator",u=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag";function d(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(e){d=function(e,t,n){return e[t]=n}}function h(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,o=Object.create(i.prototype),a=new P(r||[]);return s(o,"_invoke",{value:x(e,n,a)}),o}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=h;var p={};function m(){}function v(){}function y(){}var g={};d(g,c,(function(){return this}));var b=Object.getPrototypeOf,S=b&&b(b(M([])));S&&S!==n&&o.call(S,c)&&(g=S);var k=y.prototype=m.prototype=Object.create(g);function w(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function C(e,t){function n(i,s,a,c){var u=f(e[i],e,s);if("throw"!==u.type){var l=u.arg,d=l.value;return d&&"object"==r(d)&&o.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,c)}),(function(e){n("throw",e,a,c)})):t.resolve(d).then((function(e){l.value=e,a(l)}),(function(e){return n("throw",e,a,c)}))}c(u.arg)}var i;s(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,i){n(e,r,t,i)}))}return i=i?i.then(o,o):o()}})}function x(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=T(s,n);if(a){if(a===p)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=f(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===p)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}function T(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,T(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),p;var i=f(r,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,p;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function R(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(R,this),this.reset(!0)}function M(e){if(e||""===e){var t=e[c];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n<e.length;)if(o.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}throw new TypeError(r(e)+" is not iterable")}return v.prototype=y,s(k,"constructor",{value:y,configurable:!0}),s(y,"constructor",{value:v,configurable:!0}),v.displayName=d(y,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,y):(e.__proto__=y,d(e,l,"GeneratorFunction")),e.prototype=Object.create(k),e},t.awrap=function(e){return{__await:e}},w(C.prototype),d(C.prototype,u,(function(){return this})),t.AsyncIterator=C,t.async=function(e,n,r,i,o){void 0===o&&(o=Promise);var s=new C(h(e,n,r,i),o);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},w(k),d(k,l,"Generator"),d(k,c,(function(){return this})),d(k,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=M,P.prototype={constructor:P,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(_),!e)for(var t in this)"t"===t.charAt(0)&&o.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,r){return s.type="throw",s.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r],s=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var a=o.call(i,"catchLoc"),c=o.call(i,"finallyLoc");if(a&&c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(a){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var s=i?i.completion:{};return s.type=e,s.arg=t,i?(this.method="next",this.next=i.finallyLoc,p):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;_(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:M(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},t}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},698:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},687:(e,t,n)=>{var r=n(61)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={id:r,loaded:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var r={};(()=>{n.d(r,{_$:()=>vo,Nr:()=>Bn,Lt:()=>Xe,JN:()=>Je,L0:()=>Uo,mM:()=>nt,Yd:()=>p,qG:()=>Ln,dm:()=>Fn,DX:()=>Ho,N2:()=>s,D:()=>zo,Ds:()=>li,ZP:()=>Go,j8:()=>qt,P2:()=>v});var e={};n.r(e),n.d(e,{fixNegotiationNeeded:()=>le,shimAddTrackRemoveTrack:()=>ce,shimAddTrackRemoveTrackWithNative:()=>ae,shimGetDisplayMedia:()=>te,shimGetSendersWithDtmf:()=>ie,shimGetStats:()=>oe,shimGetUserMedia:()=>ee,shimMediaStream:()=>ne,shimOnTrack:()=>re,shimPeerConnection:()=>ue,shimSenderReceiverGetStats:()=>se});var t={};n.r(t),n.d(t,{shimAddTransceiver:()=>be,shimCreateAnswer:()=>we,shimCreateOffer:()=>ke,shimGetDisplayMedia:()=>he,shimGetParameters:()=>Se,shimGetUserMedia:()=>de,shimOnTrack:()=>fe,shimPeerConnection:()=>pe,shimRTCDataChannel:()=>ge,shimReceiverGetStats:()=>ve,shimRemoveStream:()=>ye,shimSenderGetStats:()=>me});var i={};n.r(i),n.d(i,{shimAudioContext:()=>Oe,shimCallbacksAPI:()=>Te,shimConstraints:()=>_e,shimCreateOfferLegacy:()=>Ee,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>Ce,shimRTCIceServerUrls:()=>Pe,shimRemoteStreamsAPI:()=>xe,shimTrackEventTransceiver:()=>Me});var o={};n.r(o),n.d(o,{removeExtmapAllowMixed:()=>Ve,shimAddIceCandidateNullOrEmpty:()=>Ue,shimConnectionState:()=>je,shimMaxMessageSize:()=>Le,shimParameterlessSetLocalDescription:()=>Ne,shimRTCIceCandidate:()=>Ie,shimRTCIceCandidateRelayProtocol:()=>Be,shimSendThrowTypeError:()=>Fe});var s={};function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e){var t=function(e,t){if("object"!==a(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==a(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===a(t)?t:String(t)}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function d(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}n.r(s),n.d(s,{captureStream:()=>zt,createExternalStream:()=>Gt,disableAudio:()=>dt,disableCamera:()=>Et,enableAudio:()=>ht,enableCamera:()=>Ot,getCameraTracks:()=>_t,getCanvasTracks:()=>It,getFacingMode:()=>Ht,getScreenAsVideoTracks:()=>Rt,getScreenPresentationTracks:()=>Tt,getScreenTracks:()=>xt,getVbgTracks:()=>Pt,hasAudio:()=>ut,hasCameraVideo:()=>Wt,hasVideo:()=>lt,isCameraStream:()=>Vt,isCanvasPresentationStream:()=>Ut,isCanvasStream:()=>Ft,isNinjaStreamTrack:()=>kt,isPresentationStream:()=>Nt,isScreenAsVideoTrack:()=>bt,isScreenPresentationStream:()=>Lt,isScreenStream:()=>Bt,isVBGStream:()=>jt,isVbgStreamTrack:()=>wt,stopCamera:()=>Mt,stopStream:()=>vt,stopTrack:()=>mt,toggleAudio:()=>ft,toggleCamera:()=>Dt,toggleVbgTrack:()=>At,toggleVideo:()=>pt});const h={api:"https://api.eyeson.team",allowSafariSFU:!0,screencapture:!0},f={widescreen:!1},p={error:function(){var e;return(e=console).error.apply(e,arguments)},warn:function(){var e;return(e=console).warn.apply(e,arguments)},info:function(){var e;return(e=console).log.apply(e,arguments)},debug:function(){var e;return console.debug?(e=console).debug.apply(e,arguments):null}};const m=function(){function e(t,n){c(this,e),this.uri=t,this.token=n.replace(/\W+/g,""),this.cache={users:[]},this.errorCallback=null,this._handleError=this._handleError.bind(this)}return d(e,[{key:"_request",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return fetch(new Request(this.uri+e),t).then((function(e){var t=e.headers.get("content-type");if(t&&-1!==t.indexOf("application/json")&&e.ok)return e.json();if(e.ok)return e.text();throw new Error("ComApiError: ".concat(e.status))}))}},{key:"_objectToFormData",value:function(e,t,n){var r=t||new FormData,i=null;for(var o in e){if(!e.hasOwnProperty(o))return;if(n)i=n+"["+(isNaN(parseInt(o))?o:"")+"]";else i=o;"object"!==a(e[o])||e[o]instanceof File?r.append(i,e[o]):this._objectToFormData(e[o],r,o)}return r}},{key:"_post",value:function(e,t){return this._request(e,{method:"POST",body:this._objectToFormData(t)})}},{key:"_put",value:function(e,t){var n=new FormData;for(var r in t)n.append(r,t[r]);return this._request(e,{method:"PUT",body:n})}},{key:"_handleError",value:function(e){return p.error("ComApi::handleError",e),this.errorCallback&&this.errorCallback(e),!1}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"getRoom",value:function(e){return this._request("/rooms/".concat(this.token)).then(e).catch((function(t){return e?e({error:t}):{error:t}}))}},{key:"terminateMeeting",value:function(){return this._request("/rooms/".concat(this.token),{method:"DELETE"}).catch(this._handleError)}},{key:"getUser",value:function(e,t){var n=this,r=this.cache.users.find((function(t){return t.id===e}));return r?(t(r),null):this._request("/rooms/".concat(this.token,"/users/").concat(e)).then((function(r){var i=n.cache.users.filter((function(t){return t.id!==e})),o=n.addUserAttributes(r,e,e);i.push(o),n.cache.users=i,t(o)})).catch(this._handleError)}},{key:"addUserAttributes",value:function(e,t,n){var r=e.avatar;try{r="".concat(e.avatar,"?size=large")}catch(t){p.warn("ComApi::addUserAttributes missing",e)}return Object.assign(e,{id:t,apiId:e.id,clientId:n,sipId:n,largeAvatar:r})}},{key:"kickUser",value:function(e){var t=this;return this._request("/rooms/".concat(this.token,"/users/").concat(e),{method:"DELETE"}).then((function(){if(t.cache.users.find((function(t){return t.id===e}))){var n=t.cache.users.filter((function(t){return t.id!==e}));t.cache.users=n}})).catch(this._handleError)}},{key:"requestUser",value:function(e,t){return this._post("/guests/".concat(this.token),{name:e.name,email:e.email,custom_fields:{locale:e.locale||"en"}}).then(t).catch((function(e){return t({error:e})}))}},{key:"startBroadcast",value:function(e,t){return this._post("/rooms/".concat(this.token,"/broadcasts"),{platform:t,player_url:e.playerUrl||"",stream_url:e.streamUrl})}},{key:"publishBroadcast",value:function(e,t){return this._put("/rooms/".concat(this.token,"/broadcasts/").concat(t),{player_url:e.playerUrl})}},{key:"stopBroadcast",value:function(e){return this._request("/rooms/".concat(this.token,"/broadcasts/").concat(e),{method:"DELETE"})}},{key:"stopAllBroadcasts",value:function(){return this._request("/rooms/".concat(this.token,"/broadcasts"),{method:"DELETE"})}},{key:"startRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"POST"})}},{key:"stopRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"DELETE"}).catch(this._handleError)}},{key:"setLayout",value:function(e){return this._post("/rooms/".concat(this.token,"/layout"),e).catch(this._handleError)}},{key:"setLayer",value:function(e){return this._post("/rooms/".concat(this.token,"/layers"),e).catch(this._handleError)}},{key:"clearFrontLayer",value:function(){return this._request("/rooms/".concat(this.token,"/layers/1"),{method:"DELETE"}).catch(this._handleError)}},{key:"takeSnapshot",value:function(){return this._request("/rooms/".concat(this.token,"/snapshot"),{method:"POST"}).catch(this._handleError)}},{key:"getSnapshot",value:function(e,t){var n=this;return this._request("/rooms/".concat(this.token,"/snapshots/").concat(e)).then(t).catch((function(e){t?t({error:e}):n._handleError(e)}))}},{key:"startPlayback",value:function(e){return this._post("/rooms/".concat(this.token,"/playbacks"),{playback:e}).catch(this._handleError)}},{key:"stopPlayback",value:function(e){return this._request("/rooms/".concat(this.token,"/playbacks/").concat(e.play_id),{method:"DELETE"}).catch(this._handleError)}},{key:"lockMeeting",value:function(){return this._request("/rooms/".concat(this.token,"/lock"),{method:"POST"}).catch(this._handleError)}}]),e}(),v=function(e,t,n){var r,i,o,s=null,a=0;n||(n={});var c=function(){a=!1===n.leading?0:Date.now(),s=null,o=e.apply(r,i),s||(r=i=null)};return function(){var u=Date.now();a||!1!==n.leading||(a=u);var l=t-(u-a);return r=this,i=arguments,l<=0||l>t?(s&&(clearTimeout(s),s=null),a=u,o=e.apply(r,i),s||(r=i=null)):s||!1===n.trailing||(s=setTimeout(c,l)),o}};function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e,t){if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return b(e)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}const w=function(){function e(t){c(this,e),this.context=t}return d(e,[{key:"handle",value:function(e){p.error("BaseEvent::handle is not implemented",e)}}]),e}();function C(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var x=function(e){g(n,e);var t=C(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.startPlayback(e.playback)}}]),n}(w),T=function(e){g(n,e);var t=C(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopPlayback(e.playback)}}]),n}(w);function R(){return R="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=k(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},R.apply(this,arguments)}function _(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const P=function(e){g(n,e);var t=_(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){"client"!==e._src&&(Reflect.deleteProperty(e,"_src"),this.context.listeners.forEach((function(t){return t(e)})))}}]),n}(w);function M(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var E=function(e){g(n,e);var t=M(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context.annotationLoop=window.setInterval((function(){e.context._api.createAnnotation((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"annotation",annotation:t})}),(function(){window.clearInterval(e.context.annotationLoop)}))}),1e3)}}]),n}(P),O=function(e){g(n,e);var t=M(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){window.clearInterval(this.context.annotationLoop),this.context._api.stopAnnotation()}}]),n}(P);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const A=function(e){g(n,e);var t=D(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._rtConnection.send({type:"stfu"})}}]),n}(P);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const B=function(e){g(n,e);var t=I(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){}}]),n}(w);function L(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const F=function(e){g(n,e);var t=L(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context.listeners.forEach((function(t){return t(e)}))}}]),n}(w);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(e){if("string"==typeof e)return j(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}function U(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,s,a=[],c=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(a.push(r.value),a.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return a}}(e,t)||V(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}let N=!0,W=!0;function H(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function z(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function G(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(N=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function q(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(W=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function $(){if("object"==typeof window){if(N)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function J(e,t){W&&console.warn(e+" is deprecated, please use "+t+" instead.")}function K(e){return"[object Object]"===Object.prototype.toString.call(e)}function X(e){return K(e)?Object.keys(e).reduce((function(t,n){const r=K(e[n]),i=r?X(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function Y(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?Y(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{Y(e,e.get(t),n)}))})))}function Q(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&Y(e,n,i)}))})),i}const Z=$;function ee(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),Z("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return Z("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function te(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,o=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:o||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function ne(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function re(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else z(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function ie(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function oe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},o=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(o(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(o(i(t)))},n])})).then(n,r)}}function se(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ae(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function ce(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ae(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function ue(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function le(e,t){z(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}function de(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){J("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function he(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function fe(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function pe(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function me(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function ve(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function ye(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){J("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function ge(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function be(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function Se(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function ke(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function we(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function Ce(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function xe(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function Te(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function Re(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(_e(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function _e(e){return e&&void 0!==e.video?Object.assign({},e,{video:X(e.video)}):e}function Pe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;n<e.iceServers.length;n++){let r=e.iceServers[n];void 0===r.urls&&r.url?(J("RTCIceServer.url","RTCIceServer.urls"),r=JSON.parse(JSON.stringify(r)),r.urls=r.url,delete r.url,t.push(r)):t.push(e.iceServers[n])}e.iceServers=t}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function Me(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Ee(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Oe(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var De=n(539),Ae=n.n(De);function Ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=Ae().parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,z(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function Be(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||z(e,"icecandidate",(e=>{if(e.candidate){const t=Ae().parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function Le(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=Ae().splitSections(e.sdp);return t.shift(),t.some((e=>{const t=Ae().parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=Ae().matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function Fe(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},z(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function je(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function Ve(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function Ue(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function Ne(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const We=function({window:n}={},r={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const s=$,a=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=H(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=H(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=H(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(n),c={browserDetails:a,commonShim:o,extractVersion:H,disableLog:G,disableWarnings:q,sdp:De};switch(a.browser){case"chrome":if(!e||!ue||!r.shimChrome)return s("Chrome shim is not included in this adapter release."),c;if(null===a.version)return s("Chrome shim can not determine version, not shimming."),c;s("adapter.js shimming chrome."),c.browserShim=e,Ue(n,a),Ne(n),ee(n,a),ne(n),ue(n,a),re(n),ce(n,a),ie(n),oe(n),se(n),le(n,a),Ie(n),Be(n),je(n),Le(n,a),Fe(n),Ve(n,a);break;case"firefox":if(!t||!pe||!r.shimFirefox)return s("Firefox shim is not included in this adapter release."),c;s("adapter.js shimming firefox."),c.browserShim=t,Ue(n,a),Ne(n),de(n,a),pe(n,a),fe(n),ye(n),me(n),ve(n),ge(n),be(n),Se(n),ke(n),we(n),Ie(n),je(n),Le(n,a),Fe(n);break;case"safari":if(!i||!r.shimSafari)return s("Safari shim is not included in this adapter release."),c;s("adapter.js shimming safari."),c.browserShim=i,Ue(n,a),Ne(n),Pe(n),Ee(n),Te(n),Ce(n),xe(n),Me(n),Re(n),Oe(n),Ie(n),Be(n),Le(n,a),Fe(n),Ve(n,a);break;default:s("Unsupported browser!")}return c}({window:"undefined"==typeof window?void 0:window}),He=We;var ze=n(795),Ge=n.n(ze),qe=n(577),$e=n.n(qe);const Je=function(){function e(){c(this,e),this.onChange=this.onChange.bind(this),this.hasSupport=Boolean($e().isEnabled)}return d(e,[{key:"toggle",value:function(){return this.isFullscreen()?$e().exit():$e().request()}},{key:"canFullscreen",value:function(){return this.hasSupport}},{key:"isFullscreen",value:function(){return this.hasSupport&&$e().isFullscreen}},{key:"onChange",value:function(e){var t=this;this.hasSupport&&$e().on("change",(function(){return e(t.isFullscreen())}))}},{key:"off",value:function(){this.hasSupport&&$e().off("change")}}]),e}();var Ke=null;const Xe={environment:function(){return{canMix:this.canMix(),canPip:this.hasPipSupport(),canSFU:this.canSFU(),isPhone:this.isPhone(),inIframe:this.inIframe(),isIOSDevice:this.isIOSDevice(),canUseEyeson:this.canUseEyeson(),canFullscreen:this.canFullscreen(),hasMobileDevice:this.hasMobileDevice(),canToggleCamera:this.canToggleCamera(),canPresentFiles:this.canPresentFiles(),canScreenCapture:this.canScreenCapture(),canAdjustSettings:this.canAdjustDeviceSettings(),canStreamLocalMedia:this.canStreamLocalMedia(),isExperimentalBrowser:this.isExperimentalBrowser()}},platform:function(){return Ge()},canUseEyeson:function(){return!this.isWebView()&&this.hasGetUserMedia()&&this.canDataChannel()&&this.isMinimumRequiredBrowser()},hasGetUserMedia:function(){return"mediaDevices"in navigator&&"getUserMedia"in navigator.mediaDevices},hasGetDisplayMedia:function(){return"mediaDevices"in navigator&&"getDisplayMedia"in navigator.mediaDevices},hasPeerConnection:function(){return"RTCPeerConnection"in window},hasCaptureStream:function(){return"captureStream"in HTMLMediaElement.prototype||"mozCaptureStream"in HTMLMediaElement.prototype},hasCanvasCaptureSupport:function(){return"CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window},hasSenders:function(){return"RTCRtpSender"in window},hasTrackOnUnmute:function(){return!(this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())&&"onunmute"in MediaStreamTrack.prototype},hasWebpSupport:function(){return this.isChrome()?He.browserDetails.version>=70:!!this.isFF()&&He.browserDetails.version>=65},canChangeAudioOutput:function(){return!document||"setSinkId"in HTMLMediaElement.prototype},canChangeMicrophone:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canMultipleDifferentMicrophones:function(){return!(this.isFF()&&this.browserVersion()<101)},canChangeCamera:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canScreenCapture:function(){return!(!h.screencapture||this.isTestSuite()||!this.canUseEyeson()||this.hasMobileDevice())&&(this.hasGetDisplayMedia()||this.isFF()&&this.hasGetUserMedia())},canPresentFiles:function(){return!(this.isTestSuite()||!this.canUseEyeson()||this.isFF()&&He.browserDetails.version<=60||this.isIPhone()||this.isIOSDevice()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())},canStreamLocalMedia:function(){var e=window.AudioContext||window.webkitAudioContext;if("function"!=typeof e)return!1;var t=e.prototype;return["createGain","createMediaStreamSource","createMediaElementSource","createMediaStreamDestination"].every((function(e){return"function"==typeof t[e]}))&&this.hasCanvasCaptureSupport()},requiresLowerConstraints:function(){return this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser()},browserName:function(){return He.browserDetails.browser.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))},browserVersion:function(){return"safari"===He.browserDetails.browser?He.extractVersion(navigator.userAgent,/Version\/(\d+)\./,1):He.browserDetails.version},isEdge:function(){return"edge"===He.browserDetails.browser},isFF:function(){return"firefox"===He.browserDetails.browser},isChrome:function(){return"chrome"===He.browserDetails.browser},isSafari:function(){return"safari"===He.browserDetails.browser},isMinimumRequiredBrowser:function(){return this.isChrome()?this.isMinimumRequiredChrome():this.isFF()?this.isMinimumRequiredFF():!!this.isSafari()&&this.isMinimumRequiredSafari()},isMinimumRequiredEdge:function(){return!1},isMinimumRequiredFF:function(){return!!this.isFF()&&He.browserDetails.version>=52},isMinimumRequiredChrome:function(){return!!this.isChrome()&&He.browserDetails.version>=70},isMinimumRequiredSafari:function(){return!!this.isSafari()&&(this.browserVersion()>=10||this.isWorkingIOSBrowser())},isWorkingIOSBrowser:function(){var e=/ [a-zA-Z]+iOS\//.test(navigator.userAgent),t=navigator.userAgent.indexOf(" OPT/")>-1;return(e||t)&&this.hasGetUserMedia()},isExperimentalBrowser:function(){return["safari","edge"].includes(He.browserDetails.browser)},hasPipSupport:function(){return!document||Boolean("webkitSupportsPresentationMode"in HTMLVideoElement.prototype||"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled)},iOSPipCheck:function(){var e=this;return new Promise((function(t){var n=e.hasPipSupport();if(n&&e.isIOSDevice()){var r=document.createElement("video");r.preload="none",r.src="about:blank",r.onsuspend=function(){var e=r.webkitSupportsPresentationMode("picture-in-picture");t(e)}}else t(n)}))},isAndroidDevice:function(){return Boolean(navigator.userAgent.match(/Android/i))},isIOSDevice:function(){return(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!window.MSStream},isIPhone:function(){return(/iPhone/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1&&window.screen.height/window.screen.width>=1.5)&&!window.MSStream},isAndroidPhone:function(){var e=/(android)/i.test(navigator.userAgent),t=/(mobile)/i.test(navigator.userAgent);return e&&t},isMacOS:function(){return void 0!==navigator.userAgentData?"macOS"===navigator.userAgentData.platform:0===navigator.platform.indexOf("Mac")},inIframe:function(){try{return window.self!==window.top}catch(e){return!0}},isPhone:function(){return this.isIPhone()||this.isAndroidPhone()},hasMobileDevice:function(){return this.isIOSDevice()||this.isAndroidDevice()},isTouchDevice:function(){return Boolean("ontouchstart"in window||navigator.maxTouchPoints)},canDisplayTooltips:function(){return!this.isIOSDevice()&&!this.isTestSuite()},canAdjustDeviceSettings:function(){return!this.isIOSDevice()},canToggleCamera:function(){return!0},canDrawCamera:function(){return!this.isIOSDevice()},canMix:function(){return this.isChrome()&&this.canScreenCapture()&&this.hasCanvasCaptureSupport()},stopsDeviceActivityIndicatorOnDisable:function(){return!!this.isFF()},supportsBlurOnSVG:function(){return"undefined"!=typeof SVGElement&&void 0!==SVGElement.prototype.blur},hasLocalStorage:function(){try{var e="object"===a(window.localStorage)&&null!==window.localStorage;window.localStorage.setItem("eyeson.test","test");var t="test"===window.localStorage.getItem("eyeson.test");return e&&t}catch(e){return p.debug("FeatureDetector::hasLocalStorage:",e.message),!1}},canFullscreen:function(){return(new Je).canFullscreen()},isFullscreen:function(){return(new Je).isFullscreen()},canSFU:function(){var e=!1;if(this.isSafari()){if(!h.allowSafariSFU)return!1;if(this.isWorkingIOSBrowser())return!0;var t=navigator.userAgent.match(/Version\/(\d+).(\d+)/);t&&t.length>1&&(e=Number(t[1])<12||12===Number(t[1])&&Number(t[2])<1)}return!e&&!this.isTestSuite()},canDataChannel:function(){return this.hasPeerConnection()&&"function"==typeof RTCPeerConnection.prototype.createDataChannel&&"RTCDataChannel"in window},disallowAudioSyncSrcChange:function(){return this.isSafari()&&this.canSFU()},canShare:function(){return Boolean(navigator.share)},isWebView:function(){return/Version\/|wv/i.test(navigator.userAgent)&&this.isAndroidDevice()},isTestSuite:function(){return"test-suite"===He.browserDetails.browser},canVirtualBackground:function(){return!this.isIOSDevice()&&Boolean(window.WebAssembly)&&"function"==typeof WebAssembly.validate&&("function"==typeof WebAssembly.instantiateStreaming||"function"==typeof WebAssembly.instantiate)&&Boolean(window.CanvasRenderingContext2D)&&"function"==typeof window.ImageData&&"function"==typeof window.requestAnimationFrame},canvasBlurSupport:function(){if(null!==Ke)return Ke;if(!(window.CanvasRenderingContext2D&&"filter"in CanvasRenderingContext2D.prototype))return Ke=!1;var e=document.createElement("canvas"),t=document.createElement("canvas");e.width=10,e.height=10,t.width=10,t.height=10;var n=e.getContext("2d"),r=t.getContext("2d");n.filter="blur(5px)",n.fillStyle="#000000",n.fillRect(3,3,4,4),r.fillStyle="#000000",r.fillRect(3,3,4,4);var i=n.getImageData(5,5,1,1),o=r.getImageData(5,5,1,1);return Ke=i.data[3]!==o.data[3]},canStereo:function(){return!(this.isSafari()||this.isAndroidDevice())},canChooseDisplaySurface:function(){return this.hasGetDisplayMedia()&&navigator.mediaDevices.getSupportedConstraints().displaySurface},hasPipCamSupport:function(){return this.isChrome()&&this.hasPipSupport()},canMonitorSystemPressure:function(){return"function"==typeof window.PressureObserver&&Array.isArray(PressureObserver.supportedSources)&&PressureObserver.supportedSources.includes("cpu")}};function Ye(e,t,n,r,i,o,s){try{var a=e[o](s),c=a.value}catch(e){return void n(e)}a.done?t(c):Promise.resolve(c).then(r,i)}function Qe(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function s(e){Ye(o,r,i,s,a,"next",e)}function a(e){Ye(o,r,i,s,a,"throw",e)}s(void 0)}))}}var Ze=n(687),et=n.n(Ze);const tt=function(){function e(){c(this,e),this._stream=this.createStream()}return d(e,[{key:"stream",get:function(){return this._stream}},{key:"createStream",value:function(){var e=Object.assign(document.createElement("canvas"),{width:0,height:0});e.id="eyeson-ninja-stream",e.getContext("2d").fillRect(0,0,0,0);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return window.CanvasCaptureMediaStream&&t instanceof window.CanvasCaptureMediaStream&&(n.type="canvas-track",n.canvas=e),t}}]),e}(),nt=(rt="eyeson.",it={},ot=Xe.hasLocalStorage(),{store:function(e,t){if(!ot)return it[e]=t,!0;try{window.localStorage.setItem(rt+e,JSON.stringify(t))}catch(e){return p.error("LocalStorage::store",e),!1}return!0},load:function(e,t){var n=t;if("object"!==a(n)||Array.isArray(n)||(n=Object.assign({},n)),!ot)return it[e]||n;var r=window.localStorage.getItem(rt+e);if(!r)return n;try{return JSON.parse(r)}catch(t){return p.error("LocalStorage::load",e,t),n}}});var rt,it,ot,st,at,ct=window.CanvasCaptureMediaStream||window.CanvasCaptureMediaStreamTrack,ut=function(e){return Boolean(e&&e.getAudioTracks().length>0&&e.getAudioTracks()[0].enabled)},lt=function(e){return Boolean(e&&e.getVideoTracks().length>0&&e.getVideoTracks()[0].enabled)},dt=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!1})),e},ht=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!0})),e},ft=function(e,t){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=t})),e},pt=function(e,t){return e&&e.getVideoTracks().forEach((function(e){return e.enabled=t})),e},mt=function(e){return e.stop(),e.dispatchEvent(new Event("stopped"))},vt=function(e){e&&e.getTracks().forEach(mt)},yt=function(e){return/screen|monitor|window|web-contents-media-stream/i.test(e.label)||"screen-track"===e.type||"screen-video-track"===e.type},gt=function(e){return yt(e)&&"screen-video-track"!==e.type},bt=function(e){return yt(e)&&"screen-video-track"===e.type},St=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"!==e.canvas.id&&"eyeson-vbg-stream"!==e.canvas.id)},kt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"===e.canvas.id)},wt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-vbg-stream"===e.canvas.id)},Ct=function(e){return!St(e)&&!yt(e)&&!wt(e)},xt=function(e){return e?e.getVideoTracks().filter(yt):[]},Tt=function(e){return e?e.getVideoTracks().filter(gt):[]},Rt=function(e){return e?e.getVideoTracks().filter(bt):[]},_t=function(e){return e?e.getVideoTracks().filter(Ct):[]},Pt=function(e){return e?e.getVideoTracks().filter(wt):[]},Mt=function(e){_t(e).forEach(mt)},Et=function(e){return _t(e).forEach((function(e){return e.enabled=!1})),e},Ot=function(e){return _t(e).forEach((function(e){return e.enabled=!0})),e},Dt=function(e,t){return _t(e).forEach((function(e){return e.enabled=t})),e},At=function(e,t){return Pt(e).forEach((function(e){return e.enabled=t})),e},It=function(e){return e instanceof ct?e.getVideoTracks():e?e.getVideoTracks().filter(St):[]},Bt=function(e){return lt(e)&&e.getVideoTracks().some(yt)},Lt=function(e){return lt(e)&&e.getVideoTracks().some(gt)},Ft=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&e.getVideoTracks().some(St)},jt=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&(lt(e)&&e.getVideoTracks().some(wt))},Vt=function(e){return lt(e)&&!Bt(e)&&!Ft(e)&&!jt(e)},Ut=function(e){return!!e&&(Ft(e)&&e.getVideoTracks().some(St))},Nt=function(e){return Lt(e)||Ft(e)},Wt=function(e){return _t(e).some((function(e){return e.enabled}))},Ht=function(e){var t=_t(e);if(t.length>0){var n=U(t,1)[0];if("function"==typeof n.getSettings){var r=n.getSettings();if(r&&"facingMode"in r)return r.facingMode}}return null},zt=function(e){e.getContext("2d");var t=e.captureStream(20),n=U(t.getVideoTracks(),1)[0];return"requestFrame"in n||(n.type="canvas-track",n.canvas=e,n.requestFrame=function(){return t.requestFrame()}),t},Gt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&e instanceof MediaStream&&e.getTracks().length>0){var n=e.getAudioTracks().find((function(e){return"live"===e.readyState})),r=e.getVideoTracks().find((function(e){return"live"===e.readyState})),i=n||function(){try{var e=new(window.AudioContext||window.webkitAudioContext),t=e.createMediaStreamDestination().stream,n=U(t.getAudioTracks(),1)[0];return n.type="fake-audio",n.enabled=!1,vt(t),e.close(),n}catch(e){p.warn("StreamHelpers::createFakeAudioTrack Unable to create audio track",e)}return null}(),o=r||function(){try{var e=document.createElement("canvas");e.getContext("2d").fillRect(0,0,e.width,e.height);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return n.type="fake-video",n.enabled=!1,vt(t),n}catch(e){p.warn("StreamHelpers::createFakeVideoTrack Unable to create video track",e)}return null}(),s=[];return i&&s.push(i),o&&!t&&s.push(o),new MediaStream(s)}return!1};const qt=(st=[],at="com.eyeson.immediate",window.addEventListener("message",(function(e){if(e.source===window&&e.data===at){e.stopPropagation();var t=st.shift();t&&t()}})),function(e){st.push(e),window.postMessage(at,"*")});const $t=function(e,t){var n=null,r=!0,i=!1,o=0,s=1e3/t,a=function t(){var r=Date.now(),i=r-o;i<=s?n=requestAnimationFrame(t):(o=r-i%s,e())},c=function t(){var n=Date.now(),r=n-o;r<=s?qt(t):(o=n-r%s,i||e())},u={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){r?n=requestAnimationFrame(a):(i&&(i=!1),qt(c))})),cancelAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){i=!0,n&&(cancelAnimationFrame(n),n=null)}))};return document.addEventListener("visibilitychange",(function(){!(r="visible"===document.visibilityState)&&n&&(u.cancelAnimationFrame(),u.requestAnimationFrame())})),u};const Jt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return new Promise((function(n,r){var i=new URL(e,location.href),o=document.createElement("script");o.async=!0,o.onload=function(){o.parentNode&&o.remove(),n(o)},o.onerror=function(){o.parentNode&&o.remove(),r(new Error("Unable to initiate script "+e))},t&&(o.integrity=t.algo+"-"+t.hash),o.src=i,document.head.append(o)}))};var Kt="function"==typeof window.CacheStorage;const Xt={storeBlobURL:function(){var e=Qe(et().mark((function e(t,n){var r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,fetch(t);case 5:return r=e.sent,e.next=8,r.blob();case 8:return i=e.sent,e.next=11,caches.open("store");case 11:return o=e.sent,e.next=14,o.put(n,new Response(i));case 14:e.next=18;break;case 16:e.prev=16,e.t0=e.catch(2);case 18:case"end":return e.stop()}}),e,null,[[2,16]])})));return function(t,n){return e.apply(this,arguments)}}(),loadBlobURL:function(){var e=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Kt){e.next=16;break}return e.prev=1,e.next=4,caches.open("store");case 4:return n=e.sent,e.next=7,n.match(t);case 7:return r=e.sent,e.next=10,r.blob();case 10:return i=e.sent,e.abrupt("return",URL.createObjectURL(i));case 14:e.prev=14,e.t0=e.catch(1);case 16:return e.abrupt("return",!1);case 17:case"end":return e.stop()}}),e,null,[[1,14]])})));return function(t){return e.apply(this,arguments)}}(),deleteBlob:function(){var e=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,caches.open("store");case 5:return n=e.sent,e.next=8,n.delete(t);case 8:e.next=12;break;case 10:e.prev=10,e.t0=e.catch(2);case 12:case"end":return e.stop()}}),e,null,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()};var Yt=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],Qt=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];const Zt=function(){var e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null;return{run:function(c){if(n&&e)return n=!1,e;n=!0;var u=parseFloat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),l=c.width,d=c.height;e||(e=document.createElement("canvas"),t=e.getContext("2d",{alpha:!1,desynchronized:!0}),e.width=l,e.height=d),t.drawImage(c,0,0);var h=t.getImageData(0,0,l,d),f=h.data,p=l-1,m=d-1,v=u+1,y=Yt[u],g=Qt[u];r||(r=new Uint32Array(f.length/4),i=new Uint32Array(f.length/4),o=new Uint32Array(f.length/4),s=new Uint32Array(l),a=new Uint32Array(l));for(var b=2,S=0,k=0,w=0;b-- >0;){for(var C=0,x=0,T=0;T<d;T++){for(var R=f[C]*v,_=f[C+1]*v,P=f[C+2]*v,M=1;M<=u;M++)S=C+((M>p?p:M)<<2),R+=f[S++],_+=f[S++],P+=f[S++];for(var E=0;E<l;E++)r[x]=R,i[x]=_,o[x]=P,0===T&&(s[E]=((S=E+v)<p?S:p)<<2,a[E]=(S=E-u)>0?S<<2:0),k=C+s[E],w=C+a[E],R+=f[k++]-f[w++],_+=f[k++]-f[w++],P+=f[k++]-f[w++],x++;C+=l<<2}for(var O=0;O<l;O++){for(var D=O,A=r[D]*v,I=i[D]*v,B=o[D]*v,L=1;L<=u;L++)A+=r[D+=L>m?0:l],I+=i[D],B+=o[D];x=O<<2;for(var F=0;F<d;F++)f[x]=A*y>>>g,f[x+1]=I*y>>>g,f[x+2]=B*y>>>g,0===O&&(s[F]=((S=F+v)<m?S:m)*l,a[F]=(S=F-u)>0?S*l:0),k=O+s[F],w=O+a[F],A+=r[k]-r[w],I+=i[k]-i[w],B+=o[k]-o[w],x+=l<<2}}return t.putImageData(h,0,0),e},reset:function(){e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null}}};window.exports=window.exports||{};var en="function"==typeof window.OffscreenCanvas&&function(){try{return new OffscreenCanvas(1,1).getContext("2d"),!0}catch(e){}return!1}(),tn=en&&Boolean(window.OffscreenCanvasRenderingContext2D)&&"filter"in OffscreenCanvasRenderingContext2D.prototype,nn="function"==typeof window.createImageBitmap,rn="function"==typeof window.MediaStreamTrackProcessor,on=window.WebAssembly&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])),sn=function(){try{return new EventTarget,!0}catch(e){}return!1}(),an=Math.max,cn=sn?new EventTarget:document.createElement("i"),un="selfie_segmentation_landscape",ln=256,dn=144,hn=36864,fn=null,pn=!1,mn=!1,vn=null,yn=null,gn=null,bn=null,Sn=function(){var e=Qe(et().mark((function e(){var t,n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!fn){e.next=2;break}return e.abrupt("return");case 2:return mn=!0,cn.dispatchEvent(new Event("change")),e.next=6,Promise.all([Jt(on?"vendor/tflite/tflite-simd.js":"vendor/tflite/tflite.js"),fetch("vendor/tflite/models/".concat(un,".tflite"))]);case 6:return t=e.sent,e.next=9,window.exports[on?"createTFLiteSIMDModule":"createTFLiteModule"]();case 9:return fn=e.sent,e.next=12,t[1].arrayBuffer();case 12:n=e.sent,r=fn._getModelBufferMemoryOffset(),fn.HEAPU8.set(new Uint8Array(n),r),fn._loadModel(n.byteLength),vn=fn._getInputMemoryOffset()/4,yn=fn._getOutputMemoryOffset()/4,mn=!1,pn=!0,cn.dispatchEvent(new Event("change"));case 21:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),kn=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={canvas:null,ctx:null};return en&&("blur"===(arguments.length>3?arguments[3]:void 0)&&tn)?(r.canvas=new OffscreenCanvas(e,t),r.ctx=r.canvas.getContext("2d",n),r):(r.canvas=document.createElement("canvas"),r.canvas.width=e,r.canvas.height=t,r.ctx=r.canvas.getContext("2d",Object.assign({desynchronized:!0},n)),r)};Qe(et().mark((function e(){var t;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("image:blob"!==nt.load("virtualBackgroundType")){e.next=6;break}return e.next=4,Xt.loadBlobURL("/virtualBackgroundLocalImage");case 4:(t=e.sent)&&(gn=t);case 6:case"end":return e.stop()}}),e)})))();var wn,Cn=function(e,t){return new Promise((function(n){if(t&&"ready"===t.state&&t.emitLoading(!0),"blob"!==e||gn){var r=new Image;r.onerror=function(){return n(null)},r.onload=function(){return n(r)},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src="blob"===e&&gn?gn:e}else n(null)})).then((function(e){return t&&"ready"===t.state&&t.emitLoading(!1),e}))},xn=function(e){return new Promise((function(t,n){var r=new Image;r.onerror=function(){return n(new TypeError("Invalid image file"))},r.onload=function(){return t()},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src=e}))},Tn=(wn=null,function(e){wn||(wn=Object.assign(document.createElement("input"),{type:"file",accept:"image/*"})),wn.onchange=function(t){var n=t.target.files;if(n.length>0){var r=URL.createObjectURL(n[0]);xn(r).then((function(){gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=r,e()}),e)}wn.onchange=null,wn.value=""},wn.click()}),Rn=function(e,t,n){var r=t/e.width,i=n/e.height,o=an(r,i),s=e.width*o,a=e.height*o,c=(t-s)/2,u=(n-a)/2,l=kn(t,n,{alpha:!1});return l.ctx.drawImage(e,0,0,e.width,e.height,c,u,s,a),l.canvas},_n=function(e,t,n){var r=kn(t,n,{alpha:!1}),i=r.ctx;return i.fillStyle="#ffffff",i.fillRect(0,0,t,n),i.drawImage(e,15,15),r.canvas},Pn=function(e,t,n){var r=kn(e,t,{alpha:!1}),i=r.ctx,o=i.createLinearGradient(n.startX,n.startY,n.endX,n.endY);return o.addColorStop(0,n.color1),o.addColorStop(1,n.color2),i.fillStyle=o,i.fillRect(0,0,e,t),r.canvas},Mn=function(e,t,n,r){var i=2*(2*r),o=t+i,s=n+i;e.blurCanvas=kn(o,s,{alpha:!1},"blur"),e.imageCanvas=kn(o,s,{alpha:!1}),e.blurCanvas.ctx.filter="blur(".concat(r,"px)")},En=/^(off|eyeson|generali:.*|color:.+|image:.+|blur:\d+)/,On=function(){return pn?"ready":mn?"initialize":""},Dn=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";c(this,e),p.info("VirtualBackgroundMixer::constructor",n),this.name=n,this.canvas=null,this.ctx=null,this.originalStream=null,this.outStream=null,this.video=null,this.reader=null,this.size={width:0,height:0},this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.playPromise=null,this.abort=!1,this.paused=!1,this.raf=$t(this.drawVideo.bind(this),20),this.backgroundOld=null,this.backgroundType=null,this.backgroundValue=null,this.blurInit=!1,this.blurCanvas=null,this.canvasBlur=Zt(),this.imageCanvas=null,this.state=On(),this.loadingListener=[],this.handleStateChange=function(){var e=On();t.state=e,t.emitLoading("initialize"===e)},cn.addEventListener("change",this.handleStateChange)}var t,n,r;return d(e,[{key:"storeLocalImageFile",value:function(){gn&&(bn=gn)}},{key:"resetLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=bn,bn=null)}},{key:"saveLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(bn),bn=null)}},{key:"updateCache",value:function(e){"image:blob"===e?gn&&Xt.storeBlobURL(gn,"/virtualBackgroundLocalImage"):Xt.deleteBlob("/virtualBackgroundLocalImage")}},{key:"onLoading",value:function(e){this.loadingListener.push(e)}},{key:"offLoading",value:function(e){this.loadingListener=this.loadingListener.filter((function(t){return t!==e}))}},{key:"emitLoading",value:function(e){this.loadingListener.forEach((function(t){return t(e)}))}},{key:"initiateStream",value:function(e){var t=this;p.info("VirtualBackgroundMixer::initiate",this.name),Sn();var n=e.getVideoTracks();if(0===n.length)return p.warn("VirtualBackgroundMixer::initiate",this.name,"missing track"),e;var r=U(n,1)[0],i=r.getSettings();if("live"!==r.readyState||!i.width||!i.height)return p.warn("VirtualBackgroundMixer::initiate",this.name,"0 width or height, or not ready",r.readyState,i.width,i.height),e;this.originalStream&&(p.warn("VirtualBackgroundMixer::initiate",this.name,"existing originalStream!",this.originalStream.id,e.id),this.originalStream.id!==e.id&&this.stopOriginalStream(),this.terminate()),this.originalStream=e,this.canvas=document.createElement("canvas"),this.canvas.id="eyeson-vbg-stream",this.ctx=this.canvas.getContext("2d",{desynchronized:!0}),this.ctx.imageSmoothingEnabled=!1,this.size.width=i.width,this.size.height=i.height,this.canvas.width=i.width,this.canvas.height=i.height;var o=U(this.canvas.captureStream(20).getVideoTracks(),1)[0];o.canvas||(o.type="canvas-track",o.canvas=this.canvas);var s={};return"function"==typeof o.getSettings&&Object.assign(s,o.getSettings()),Object.assign(s,i),o.getSettings=function(){return s},o.srcLabel=r.label,o.srcDeviceId=i.deviceId,this.outStream=new MediaStream([o]),e.getAudioTracks().forEach((function(e){return t.outStream.addTrack(e)})),this.start(),this.outStream}},{key:"start",value:function(){var e=this;p.info("VirtualBackgroundMixer::start",this.name);var t=null,n=null,r=this.size,i=r.width,o=r.height;if(i&&o){if(rn)try{var s=U(this.originalStream.getVideoTracks(),1)[0],a=new MediaStreamTrackProcessor(s);this.reader=a.readable.getReader()}catch(e){}this.reader||((n=document.createElement("video")).playsInline=!0,n.muted=!0,n.width=i,n.height=o,n.srcObject=this.originalStream,this.video=n),this.segmentationMask=new ImageData(ln,dn),t=kn(ln,dn,{willReadFrequently:!0}),this.segmentationMaskCanvas=t.canvas,this.segmentationMaskCtx=t.ctx,this.segmentationMaskCtx.imageSmoothingEnabled=!1,n&&!nn&&(t=kn(i,o),this.videoCanvas=t.canvas,this.videoCtx=t.ctx),this.abort=!1,this.paused=!1,this.blurInit=!1,this.canvasBlur.reset(),this.initBackground(),this.reader?(p.info("VirtualBackgroundMixer::start::videoTrackProcessor",this.name),this.raf.requestAnimationFrame()):(n.onloadeddata=function(){p.info("VirtualBackgroundMixer::start::video.loadeddata",e.name),e.raf.requestAnimationFrame()},this.playPromise=n.play(),this.playPromise.catch((function(t){p.error("VirtualBackgroundMixer::start::video.play",e.name,t)})))}else p.warn("VirtualBackgroundMixer::start 0 width or height",this.name,i,o)}},{key:"drawVideo",value:(r=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c,u,l,d,h,f,p,m,v,y,g,b;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=null,!this.abort){e.next=3;break}return e.abrupt("return");case 3:if(n=this.ctx,r=this.size,i=this.paused,o=this.segmentationMask,s=this.segmentationMaskCtx,a=this.segmentationMaskCanvas,!this.reader){e.next=15;break}return e.prev=5,e.next=8,this.reader.read();case 8:c=e.sent,(u=c.value)&&(u.width=u.displayWidth,u.height=u.displayHeight,t=u),e.next=15;break;case 13:e.prev=13,e.t0=e.catch(5);case 15:if(pn&&!i){e.next=19;break}n.drawImage(t||this.video,0,0),e.next=36;break;case 19:if(t){e.next=33;break}if(!nn){e.next=31;break}return e.prev=21,e.next=24,createImageBitmap(this.video);case 24:t=e.sent,e.next=29;break;case 27:e.prev=27,e.t1=e.catch(21);case 29:e.next=33;break;case 31:this.videoCtx.drawImage(this.video,0,0),t=this.videoCanvas;case 33:if(!this.abort){e.next=35;break}return e.abrupt("return");case 35:if(t&&t.width>0&&t.height>0){for(s.drawImage(t,0,0,t.width,t.height,0,0,ln,dn),l=s.getImageData(0,0,ln,dn),d=l.data,h=fn.HEAPF32,f=o.data,p=hn,m=0,v=0,y=0;y<p;y++)v=4*y,h[m=vn+3*y]=d[v]/255,h[m+1]=d[v+1]/255,h[m+2]=d[v+2]/255;for(fn._runInference(),g=0,b=0;g<p;g++)b=h[yn+g],f[4*g+3]=255*b;s.putImageData(o,0,0),n.globalCompositeOperation="copy",n.filter="blur(2px)",n.drawImage(a,0,0,ln,dn,0,0,r.width,r.height),n.globalCompositeOperation="source-in",n.filter="none",n.drawImage(t,0,0),this.backgroundType&&this.drawBackground(t)}case 36:!i&&this.paused&&(n.filter="none",n.globalCompositeOperation="source-over"),t&&"function"==typeof t.close&&t.close(),this.abort||this.raf.requestAnimationFrame();case 39:case"end":return e.stop()}}),e,this,[[5,13],[21,27]])}))),function(){return r.apply(this,arguments)})},{key:"suspend",value:function(){var e=this.ctx;this.paused=!0,e&&(e.filter="none",e.globalCompositeOperation="source-over")}},{key:"resume",value:function(){this.paused=!1}},{key:"drawBackground",value:function(e){var t=this.backgroundType,n=this.ctx,r=this.blurCanvas,i=this.imageCanvas,o=this.backgroundValue,s=this.size;if(t&&n)if(n.globalCompositeOperation="destination-over","blur"===t)if(Xe.canvasBlurSupport()){var a=2*Number(o),c=2*a;this.blurInit||(i.ctx.drawImage(e,0,0,s.width,s.height,0,0,s.width+c,s.height+c),this.blurInit=!0),i.ctx.drawImage(e,0,0,s.width,s.height,a,a,s.width,s.height),r.ctx.drawImage(i.canvas,0,0),n.drawImage(r.canvas,a,a,s.width,s.height,0,0,s.width,s.height)}else{var u=this.canvasBlur.run(e,o);n.drawImage(u,0,0)}else"color"===t?(n.fillStyle=o,n.fillRect(0,0,s.width,s.height)):i?n.drawImage(i,0,0):n.drawImage(e,0,0)}},{key:"initBackground",value:(n=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.backgroundType,n=this.backgroundValue,r=this.size,i=r.width,o=r.height,s=!1,i&&o){e.next=5;break}return e.abrupt("return");case 5:if("eyeson"!==t){e.next=10;break}this.imageCanvas=Pn(i,o,{startX:0,startY:0,endX:i,endY:50,color1:"#ff7676",color2:"#9e206c"}),s=!0,e.next=27;break;case 10:if("generali"!==t){e.next=18;break}return this.setBackgroundFallback(),e.next=14,Cn(n,this);case 14:(a=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=_n(a,i,o),s=!0),e.next=27;break;case 18:if("image"!==t){e.next=26;break}return this.setBackgroundFallback(),e.next=22,Cn(n,this);case 22:(c=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=Rn(c,i,o),s=!0),e.next=27;break;case 26:"blur"===t?(this.blurInit=!1,Mn(this,i,o,Number(n)),this.canvasBlur.reset(),s=!0):(this.imageCanvas=null,s=!0);case 27:s&&(this.backgroundOld={type:t,value:n});case 28:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setBackgroundFallback",value:function(){var e=this.backgroundOld;if(e)this.backgroundType=e.type,this.backgroundValue=e.value;else{if(!this.imageCanvas){var t=this.size,n=t.width,r=t.height;this.blurInit=!1,Mn(this,n,r,8)}this.backgroundType="blur",this.backgroundValue="8"}}},{key:"changeBackground",value:function(e){if(p.info("VirtualBackgroundMixer::changeBackground",this.name,e),"string"==typeof e){var t=e.indexOf(":");-1===t?(this.backgroundType="off"===e?null:e,this.backgroundValue=null):(this.backgroundType=e.substring(0,t),this.backgroundValue=e.substring(t+1)),this.abort||this.initBackground()}}},{key:"stop",value:function(){if(p.info("VirtualBackgroundMixer::stop",this.name),this.abort=!0,this.raf&&this.raf.cancelAnimationFrame(),this.video){var e=this.video,t=this.playPromise;t&&e&&t.then((function(){return e.pause()})),this.video.onloadeddata=null,this.video=null,this.playPromise=null}this.reader&&(this.reader=null),this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.backgroundOld=null,this.imageCanvas=null,this.blurCanvas=null,this.canvasBlur.reset()}},{key:"stopOriginalStream",value:function(){p.info("VirtualBackgroundMixer::stopOriginalStream",this.name,this.originalStream),this.stop(),vt(this.originalStream)}},{key:"terminate",value:function(){var e=this;p.info("VirtualBackgroundMixer::terminate",this.name),this.stop(),this.outStream&&Pt(this.outStream).forEach((function(t){mt(t),p.info("VirtualBackgroundMixer::terminate stop track",e.name,t)})),this.originalStream=null,this.outStream=null,this.canvas=null,this.ctx=null,this.video=null}},{key:"destroy",value:function(){p.info("VirtualBackgroundMixer::destroy",this.name),cn.removeEventListener("change",this.handleStateChange),this.loadingListener.length=0,this.canvasBlur=null}}],[{key:"isTypeAllowed",value:function(e){return En.test(e)}},{key:"checkExternalImage",value:(t=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^image:([\w]+:)?\/\//i.test(t)){e.next=4;break}return n=t.substring(6),e.next=4,xn(n);case 4:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImage",value:function(e){Tn(e)}},{key:"getImageBlobOrFallback",value:function(){return gn&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])?"image:blob":"blur:8"}}]),e}();const An=Dn;var In=function(e,t){if(e.length!==t.length)return!0;for(var n,r=function(n,r){if(n=e[a],!(r=t.find((function(e){return n.deviceId===e.deviceId&&n.groupId===e.groupId&&n.label===e.label&&n.kind===e.kind}))))return{v:!0};i=n,o=r},i=null,o=!1,s=e.length,a=0;a<s;a++)if(n=r(i,o))return n.v;return!1};const Bn=function(){function e(t){var n=this;c(this,e),this.sinkId="default",this.options=t||{audio:!0,video:!0,eco:!1},this.stream=null,this.cameras=[],this.listeners=[],this.speakers=[],this.microphones=[],this.constraints={},this.terminationInProgress=!1,this.virtualBackground=new An("DeviceManager"),this.virtualBackgroundType="off",e.getSinkId().then((function(e){return n.sinkId=e})),this.setStream=this.setStream.bind(this),this.handleError=this.handleError.bind(this),this.verifyStream=this.verifyStream.bind(this),this.storeConstraints=this.storeConstraints.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.initiateVirtualBackground=this.initiateVirtualBackground.bind(this)}var t;return d(e,[{key:"setVirtualBackgroundType",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(An.isTypeAllowed(t)){e.next=3;break}return p.warn("DeviceManage::setVirtualBackgroundType type not allowed",t),e.abrupt("return");case 3:return e.next=5,An.checkExternalImage(t);case 5:n="off"===this.virtualBackgroundType,r="off"===t,this.virtualBackgroundType=t,this.virtualBackground.changeBackground(t),this.stream&&(n&&!r||!n&&r)&&this.update();case 10:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImageForVirtualBackground",value:function(e){var t=this;An.loadLocalImage((function(n){n||t.setVirtualBackgroundType("image:blob"),e(n)}))}},{key:"start",value:function(){var t=this;return this.watchForNewDevices(),e.fetchDevices().then((function(e){return t.setDevices(e)})).then((function(){return e.getConstraints(t.options)})).then((function(e){return t.constraints=e,navigator.mediaDevices.getUserMedia({video:!t.options.eco&&t.constraints.video,audio:t.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"stopStream",value:function(){this.stream&&(this.virtualBackground.originalStream?(this.virtualBackground.stopOriginalStream(),this.virtualBackground.terminate()):vt(this.stream),this.stream=null)}},{key:"stop",value:function(){this.stopStream()}},{key:"terminate",value:function(){var e=this;navigator.mediaDevices.ondevicechange=null,this.terminationInProgress=!0,window.setTimeout((function(){e.stop(),e.virtualBackground.destroy()}),10)}},{key:"setDevices",value:function(e){var t=In(this.cameras,e.cameras),n=In(this.microphones,e.microphones),r=In(this.speakers,e.speakers);this.cameras=e.cameras,this.microphones=e.microphones,this.speakers=e.speakers,this.options.audio=this.microphones.length>0&&this.options.audio,this.options.video=this.cameras.length>0&&this.options.video,(t||n||r)&&this.emit(e)}},{key:"watchForNewDevices",value:function(){var t=this;navigator.mediaDevices.ondevicechange=function(){e.fetchDevices().then((function(e){return t.setDevices(e)})).catch(t.handleError)}}},{key:"onChange",value:function(e){this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"update",value:function(e){return this.constraints=e||this.constraints,this.stop(),this.watchForNewDevices(),navigator.mediaDevices.getUserMedia(this.constraints).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"updateWithOptions",value:function(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.options=t||this.options,this.stop(),this.watchForNewDevices(),e[r?"getMobileConstraints":"getConstraints"](this.options).then((function(e){return n.constraints=e,navigator.mediaDevices.getUserMedia({video:!n.options.eco&&n.constraints.video,audio:n.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"adjustAudioTrack",value:function(e){return 1===e.getAudioTracks().length&&(e.getAudioTracks()[0].enabled=this.options.audio),e}},{key:"initiateVirtualBackground",value:function(e){return"off"!==this.virtualBackgroundType&&e&&1===e.getVideoTracks().length?this.virtualBackground.initiateStream(e):e}},{key:"storeConstraints",value:function(){var e=this.constraints,t=e.video,n=e.audio;p.debug("DeviceManager::storeConstraints",e),nt.store("mediaConstraints",e),nt.store("sinkId",this.sinkId),nt.store("virtualBackgroundType",this.virtualBackgroundType),t&&t.deviceId&&t.deviceId.exact&&nt.store("videoId",t.deviceId.exact),n&&n.deviceId&&n.deviceId.exact&&nt.store("audioId",n.deviceId.exact),this.virtualBackground.updateCache(this.virtualBackgroundType)}},{key:"setStream",value:function(t){var n=this,r=null===this.stream;if(this.stream=t,this.terminationInProgress)return this.stop(),Promise.resolve();var i=function(){n.emit({stream:n.stream,constraints:n.constraints,options:n.options}),n.verifyStream()};return r?e.fetchDevices().then((function(e){n.setDevices(e),i()})):(i(),Promise.resolve())}},{key:"verifyStream",value:function(){this.constraints.video&&this.stream&&0===this.stream.getVideoTracks().length&&!this.options.eco&&this.handleError({name:"EyesonCameraError"}),this.constraints.audio&&this.stream&&0===this.stream.getAudioTracks().length&&this.handleError({name:"EyesonMicrophoneError"})}},{key:"setVideoInput",value:function(e){var t={};return Object.assign(t,this.constraints.video,{deviceId:{exact:e}}),this.constraints.video=t,this.update()}},{key:"setAudioInput",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={};return Object.assign(n,this.constraints.audio,{deviceId:{exact:e}}),this.constraints.audio=n,!0===t.preventUpdate?Promise.resolve():this.update()}},{key:"setAudioOutput",value:function(e){this.sinkId=e||"default",nt.store("sinkId",this.sinkId),this.emit({sinkId:this.sinkId})}},{key:"handleError",value:function(e){p.error("DeviceManager::",e),this.emit({error:e,constraints:this.constraints})}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}],[{key:"getDevices",value:function(){return"mediaDevices"in navigator?navigator.mediaDevices.enumerateDevices().then((function(e){return 2===e.length&&e.every((function(e){return"audioinput"===e.kind&&""===e.deviceId}))?[{deviceId:"",groupId:"",kind:"audioinput",label:""},{deviceId:"",groupId:"",kind:"videoinput",label:""}]:e})):Promise.resolve([])}},{key:"getConstraints",value:function(t){var n=t||{audio:!0,video:!0};return e.getDevices().then((function(t){return e.determineConstraintsForDevices(t,n)})).catch((function(e){p.error("DeviceManager::getConstraints ",e)}))}},{key:"determineConstraintsForDevices",value:function(t,n){var r=nt.load("mediaConstraints",n),i={channelCount:Xe.canStereo()&&!n.eco?2:1};if("video"in r||(r.video=!0),"audio"in r||(r.audio=i),r.video.deviceId){var o=r.video.deviceId.exact;t.find((function(e){return e.deviceId===o}))||(r.video=n.video)}if(r.audio.deviceId){var s=r.audio.deviceId.exact;t.find((function(e){return e.deviceId===s}))||(r.audio=!!n.audio&&i)}return!1!==n.video||n.eco||(r.video=!1),!0===n.video&&!1===r.video&&(r.video=!0),(!0===n.audio&&!1===r.audio||!0===r.audio)&&(r.audio=i),r.audio&&r.audio.channelCount!==i.channelCount&&(r.audio.channelCount=i.channelCount),0===t.filter((function(e){return"videoinput"===e.kind})).length&&(r.video=!1),e.applyLastUsedDevices(r,t),e.applyWidescreen(r),r}},{key:"applyLastUsedDevices",value:function(e,t){var n=nt.load("videoId"),r=nt.load("audioId");!0===e.video&&n&&t.find((function(e){return e.deviceId===n}))&&(e.video={deviceId:{exact:n}}),e.audio&&r&&t.find((function(e){return e.deviceId===r}))&&(e.audio.deviceId={exact:r})}},{key:"applyWidescreen",value:function(e){f.widescreen?(!0===e.video&&(e.video={}),e.video&&Object.assign(e.video,{width:640,height:360})):"object"===a(e.video)&&("width"in e.video||"height"in e.video)&&(Reflect.deleteProperty(e.video,"width"),Reflect.deleteProperty(e.video,"height"))}},{key:"getMobileConstraints",value:function(t){var n=Object.assign({audio:!0,video:!0},t);return e.applyWidescreen(n),Promise.resolve(n)}},{key:"getSinkId",value:function(){var t=nt.load("sinkId","");return e.getDevices().then((function(e){return e.find((function(e){return e.deviceId===t}))||(t="default"),t}))}},{key:"fetchDevices",value:function(){return e.getDevices().then((function(e){var t=e.filter((function(e){return"audiooutput"===e.kind}));return t.length>0&&-1===t.findIndex((function(e){return"default"===e.deviceId}))&&t.unshift({deviceId:"default",kind:"audiooutput",groupId:"default",label:"System default"}),{cameras:e.filter((function(e){return"videoinput"===e.kind})),microphones:e.filter((function(e){return"audioinput"===e.kind})),speakers:t}}))}},{key:"fetchInputDevices",value:function(){return e.getDevices().then((function(e){return e.filter((function(e){return e.kind.includes("input")}))}))}},{key:"getStoredVirtualBackgroundType",value:function(e){var t=nt.load("virtualBackgroundType","off");return"image:blob"===t?An.getImageBlobOrFallback(e):t}}]),e}();const Ln=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{eco:!1,audio:!0,video:!0,screen:!1,surface:null,screenStream:null,canvas:null,existingStream:null,micMixer:null,vbgMixer:null,isPresentation:!1,virtualBackground:!1,deviceMonitor:null};c(this,e),this.options=t,this.tempStream=null,this.brokenTrackCallback=null,this.bindMethods()}var t;return d(e,[{key:"bindMethods",value:function(){this.getMediaStream=this.getMediaStream.bind(this),this.addNinjaTrack=this.addNinjaTrack.bind(this),this.addCanvasTrack=this.addCanvasTrack.bind(this),this.addScreenTrack=this.addScreenTrack.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.adjustVideoTrack=this.adjustVideoTrack.bind(this),this.addScreenStreamTrack=this.addScreenStreamTrack.bind(this),this.initializeVirtualBackground=this.initializeVirtualBackground.bind(this)}},{key:"start",value:function(){var e=this;p.debug("MediaStreamBuilder::start",this.options);var t=this.options,n=t.existingStream,r=t.video,i=t.audio,o=t.screen,s=t.canvas,a=t.micMixer,c=t.screenStream;return Xe.isIOSDevice()&&n&&"boolean"==typeof r&&n.active&&_t(n).length>0&&"ended"!==_t(n)[0].readyState?new Promise((function(t){var o=U(_t(n),1)[0];if(o.enabled=r,o.onended=r&&e.brokenTrackCallback?function(){p.error("iOS video track broken"),n.getTracks().forEach((function(e){return e.stop()})),e.brokenTrackCallback()}:null,"boolean"==typeof i&&ft(n,i),s){var a=new MediaStream(n.getTracks()),c=zt(s),u=U(It(c),1)[0];return a.addTrack(u),void t(a)}t(n)})):Xe.isSafari()&&o&&a&&!s?(c?Promise.resolve(c):this.getDisplayMedia()).then((function(t){return Bn.getConstraints().then((function(n){var r=new MediaStream;return e.addScreenStreamTrack(r,t),e.tempStream=new MediaStream(t.getTracks()),navigator.mediaDevices.getUserMedia({audio:n.audio}).then((function(n){return e.adjustAudioTrack(n),n.getTracks().forEach((function(t){return e.tempStream.addTrack(t)})),a.mixScreenshareAudio(n,t,r),a.active&&a.setMicOnlyStream(n,t),r}))}))})).then((function(t){return e.tempStream=null,t})).catch((function(t){return e.tempStream&&(vt(e.tempStream),e.tempStream=null),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)})):Bn.fetchInputDevices().then(this.getMediaStream).then(this.adjustVideoTrack).then(this.adjustAudioTrack).then(this.initializeVirtualBackground).then(this.addCanvasTrack).then(this.addScreenTrack).then(this.addNinjaTrack).then((function(t){return e.tempStream=null,e.options.deviceMonitor&&e.options.deviceMonitor.applyTempTracks(),t})).catch((function(t){return e.cleanupTempStream(),e.options.deviceMonitor&&e.options.deviceMonitor.discardTempTracks(),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)}))}},{key:"getMediaStream",value:function(e){var t=this;if(0===e.length)return this.options={audio:!1,video:!1},this.tempStream=(new tt).stream,this.tempStream;var n=this.options,r=n.eco,i=n.video,o=n.existingStream,s={video:!Xe.hasCanvasCaptureSupport()&&!r||i,audio:!0};!1===i&&!r&&Xe.isIOSDevice()&&(s.video=!0);var a=Bn.getConstraints;return Xe.canMultipleDifferentMicrophones()||vt(o),(Xe.isPhone()||Xe.isIOSDevice())&&(vt(o),a=Bn.getMobileConstraints),a(s).then((function(e){return navigator.mediaDevices.getUserMedia(e).then((function(e){return t.tempStream=e,e}))}))}},{key:"adjustVideoTrack",value:function(e){if(1===e.getVideoTracks().length){var t=U(e.getVideoTracks(),1)[0];t.enabled=this.options.video,!1!==this.options.video||Xe.isIOSDevice()||mt(t),this.options.deviceMonitor&&this.options.deviceMonitor.addVideoTrack(t)}return e}},{key:"initializeVirtualBackground",value:function(e){var t=this.options,n=t.screen,r=t.virtualBackground,i=t.vbgMixer;return!n&&r&&e&&1===e.getVideoTracks().length?i.initiateStream(e):e}},{key:"adjustAudioTrack",value:function(e){if(1===e.getAudioTracks().length){var t=U(e.getAudioTracks(),1)[0];t.enabled=this.options.audio,this.options.deviceMonitor&&this.options.deviceMonitor.addAudioTrack(t)}return e}},{key:"addCanvasTrack",value:function(e){var t=this.options,n=t.canvas,r=t.existingStream;if(n){var i=zt(n),o=U(It(i),1)[0];e.addTrack(o)}if(Ut(r)){var s=U(It(r),1)[0];e.addTrack(s)}return e}},{key:"addScreenTrack",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options.screenStream,r=this.options,i=r.screen,o=r.existingStream,s=r.micMixer,!i||!s){e.next=13;break}if(null!=n){e.next=7;break}return e.next=6,this.getDisplayMedia();case 6:n=e.sent;case 7:return a=new MediaStream,this.addScreenStreamTrack(a,n),s.mixScreenshareAudio(t,n,a),s.active&&s.setMicOnlyStream(t,n),this.tempStream=new MediaStream(t.getTracks().concat(n.getTracks())),e.abrupt("return",a);case 13:return Lt(o)&&(c=Tt(o),u=U(c,1),l=u[0],t.addTrack(l)),e.abrupt("return",t);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"addScreenStreamTrack",value:function(e,t){var n=U(t.getVideoTracks(),1)[0];n.type=this.options.isPresentation?"screen-track":"screen-video-track",e&&e.addTrack(n)}},{key:"getDisplayMedia",value:function(){if(Xe.hasGetDisplayMedia()){var e={channelCount:Xe.canStereo()&&!this.options.eco?2:1},t={height:{max:1080},frameRate:{max:15}};return Xe.isChrome()&&Xe.isMacOS()&&(e.echoCancellation=!1),this.options.surface&&Xe.canChooseDisplaySurface()&&(t.displaySurface=this.options.surface),navigator.mediaDevices.getDisplayMedia({audio:e,video:t,surfaceSwitching:"include",selfBrowserSurface:"include",systemAudio:"include"})}return navigator.mediaDevices.getUserMedia({video:{mediaSource:"screen",width:{max:1920},height:{max:1040},frameRate:{max:15}}})}},{key:"addNinjaTrack",value:function(e){var t=this.options,n=t.eco,r=t.video;if(n||!Xe.hasCanvasCaptureSupport())return e;if(0===e.getVideoTracks().length){var i=U((new tt).stream.getVideoTracks(),1)[0];i.enabled=r,e.addTrack(i)}return e}},{key:"cleanupTempStream",value:function(){var e=this.tempStream;if(e){var t=this.options,n=t.existingStream,r=t.screenStream;if(Ut(n)){var i=U(It(n),1)[0];e.removeTrack(i)}if(Bt(n)){var o=U(xt(n),1)[0];e.removeTrack(o)}if(Lt(r)){var s=U(Tt(r),1)[0];e.removeTrack(s)}vt(e),this.tempStream=null}}},{key:"onBrokenTrackError",value:function(e){return this.brokenTrackCallback=e,this}}]),e}();const Fn=function(){function e(){c(this,e),this.active=!1,this.audioContext=null,this.acOut=null,this.micOnlyStream=null,this.originalStream=null}return d(e,[{key:"setMicOnlyStream",value:function(e,t){this.micOnlyStream=new MediaStream;var n=e.getAudioTracks(),r=t.getVideoTracks();return n.length>0&&this.micOnlyStream.addTrack(n[0]),r.length>0&&this.micOnlyStream.addTrack(r[0]),this.micOnlyStream}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"getOriginalStream",value:function(){return this.originalStream}},{key:"stopOriginalStream",value:function(){vt(this.originalStream)}},{key:"noMix",value:function(e,t){var n=e.getAudioTracks();n.length>0&&t.addTrack(n[0])}},{key:"initMixScreenshareMix",value:function(e,t,n){this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.acOut=this.audioContext.createMediaStreamDestination(),this.audioContext.createMediaStreamSource(t).connect(this.acOut),this.audioContext.createMediaStreamSource(e).connect(this.acOut),n.addTrack(this.acOut.stream.getAudioTracks()[0])}},{key:"mixScreenshareAudio",value:function(e,t,n){this.originalStream=t;var r=t.getAudioTracks();if(0===r.length)this.noMix(e,n);else try{this.initMixScreenshareMix(e,t,n),this.active=!0}catch(t){p.error("MicMixer::mixScreenshareAudio",t),mt(r[0]),this.noMix(e,n)}}},{key:"destroy",value:function(){var e=this;if(this.stopOriginalStream(),this.micOnlyStream=null,this.originalStream=null,this.audioContext)return vt(this.acOut.stream),void this.audioContext.close().then((function(){e.audioContext=null,e.acOut=null,e.active=!1}));this.active=!1}}]),e}();function jn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vn=function(e,t,n){e.getAudioTracks().forEach((function(e){return e.enabled=t})),e.getVideoTracks().forEach((function(e){return e.enabled=n}))};const Un=function(e){g(n,e);var t=jn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.screen,i=void 0!==r&&r,o=e.surface;p.debug("ChangeLocalStreamEvent::handle");var s=this.context._session;if(!s)throw new Error("Session does not exist");var a=s.localStream,c=s.vbgMixer,u=Boolean(s.micMixer);if(Xe.isIOSDevice()||Xe.stopsDeviceActivityIndicatorOnDisable()&&!u&&!a.wasScreenAsVideo)return c&&(n?c.resume():c.suspend(),c.originalStream&&c.originalStream!==a&&Vn(c.originalStream,t,n)),Vn(a,t,n),a.locallyChanged=!0,void s.emit({type:"stream_update",localStream:a});s.micMixer&&(s.micMixer.destroy(),s.micMixer=null),c&&(c.stopOriginalStream(),c.terminate());var l={audio:t,video:n,virtualBackground:s.options.virtualBackground,existingStream:a,vbgMixer:c,deviceMonitor:s.deviceMonitor};i&&(s.micMixer=new Fn,l.video=!1,l.screen=!0,l.surface=o,l.virtualBackground=!1,l.micMixer=s.micMixer),new Ln(l).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){s.emit({type:"stop_screen_video"})})),e})).then((function(e){e.locallyChanged=!0,e.wasScreenAsVideo=u,s.setStream(e)})).catch((function(e){if(p.error("ChangeLocalStreamEvent",e),i){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"screen_capture_error",name:t}),s.emit({type:"stop_screen_video"})}}))}}]),n}(w);function Nn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Wn=function(e){g(n,e);var t=Nn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){p.debug("PodiumEvent::handle",e);var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=t.localStream;e.hasPresenter||!Nt(n)||t.stopPresentingSet||t.emit({type:"stop_presenting"}),t&&!t.externalStream&&this.scanMessageForLocalStreamOptimization(n,e),new F(this.context).handle(e)}},{key:"scanMessageForLocalStreamOptimization",value:function(e,t){var n=t.video,r=t.isSource,i=t.isPresenter,o=t.hasPresenter,s=t.hasDesktopSources;if(e){if(r&&(!n&&(Vt(e)||jt(e))||n&&!lt(e)&&e.locallyChanged&&!o)){var a={audio:ut(e),video:n};e.wasScreenAsVideo&&(a.video=!1,a.screen=!0),new Un(this.context).handle(a)}n&&!i&&s&&new Un(this.context).handle({audio:ut(e),video:!1})}}}]),n}(w);function Hn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const zn=function(e){g(n,e);var t=Hn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.takeSnapshot()}}]),n}(w);function Gn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const qn=function(e){g(n,e);var t=Gn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayer(e.params)}}]),n}(w);function $n(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Jn=function(e){g(n,e);var t=$n(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(!this.context._session)throw new Error("Session does not exist");this.context._session.send({type:"chat",content:e.content})}}]),n}(w);function Kn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Xn=function(e){g(n,e);var t=Kn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopBroadcast("generic").then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})})).catch((function(e){return p.warn(e)}))}}]),n}(P);function Yn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Qn=function(e){g(n,e);var t=Yn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayout(e.params)}}]),n}(w);function Zn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const er=function(e){g(n,e);var t=Zn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t,n=this.context,r=n._api,i=n._session,o=((t=e.url).endsWith("/")?t:t+"/")+e.key;r.startBroadcast({streamUrl:o},"generic").catch((function(e){i.emit({type:"start_broadcast_error",platform:"generic",error:e})}))}}]),n}(w);var tr=function(){try{return new EventTarget,!0}catch(e){}return!1}();const nr=function(){function e(){c(this,e),this.listeners=new Map,this.target=tr?new EventTarget:document.createElement("i")}return d(e,[{key:"onEvent",value:function(e){var t=function(t){var n=t.detail;return e(n)};this.target.addEventListener("event",t),this.listeners.set(e,t)}},{key:"offEvent",value:function(e){var t=this.listeners.get(e);t&&(this.target.removeEventListener("event",t),this.listeners.delete(e))}},{key:"removeAllListeners",value:function(){var e=this.listeners,t=this.target;e.forEach((function(e){return t.removeEventListener("event",e)})),e.clear()}},{key:"emit",value:function(e){var t=new CustomEvent("event",{detail:e});this.target.dispatchEvent(t)}}]),e}();function rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ir=function(e){g(n,e);var t=rr(n);function n(e){var r;return c(this,n),(r=t.call(this)).connection=null,r.options=e,r.wasOpen=!1,r}return d(n,[{key:"connect",value:function(){var e=this,t=this.options;this.wasOpen=!1;var n=new WebSocket("".concat(t.endpoint,"?auth_token=").concat(t.auth_token));n.onopen=function(){e.wasOpen=!0,e.emit({type:"connected"})},n.onmessage=function(t){var n=t.data;e.emit({type:"message",message:n})},n.onerror=function(){e.emit({type:"transportError"})},n.onclose=function(){e.destroy()},this.connection=n}},{key:"isConnected",value:function(){var e=this.connection;return!!e&&e.readyState===WebSocket.OPEN}},{key:"send",value:function(e){var t=this.connection;return!!t&&(t.send(e),!0)}},{key:"destroy",value:function(){var e=this.connection,t=this.wasOpen;e&&(this.connection=null,e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.readyState<=WebSocket.OPEN&&e.close(),this.emit({type:"disconnected",was_open:t})),this.removeAllListeners()}}]),n}(nr);var or=/\r\n|\r(?!\n)|\n/g;const sr=function(e){return e.replace(or,"\r\n")};const ar=function(e){try{return JSON.parse(atob(e.split(".")[1]))}catch(e){return!1}};var cr="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID;const ur=function(){if(cr)return crypto.randomUUID();var e=0,t=crypto.getRandomValues(new Uint8Array(31));return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(function(n){var r=t[e];return e+=1,(n^r&15>>n/4).toString(16)}))};function lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var dr=function(e){g(o,e);var t,n,r,i=lr(o);function o(e){var t;return c(this,o),t=i.call(this),function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="";if(["client_id","conf_id","client_name","sessionDescriptionHandlerFactory","transportOptions"].some((function(n){return!!e[n]||(t=n,!1)})),t||["auth_token","endpoint"].some((function(n){return!!e.transportOptions[n]||(t="transportOptions.".concat(n),!1)})),t)throw new Error("Invalid options - ".concat(t))}(e),t.callId=null,t.sessionDescriptionHandler=null,t.options=e,t.initAuthToken(),t.debouncedHandleSDPUpdate=function(e,t,n){var r=[],i=!1;return function o(){for(var s=arguments.length,a=new Array(s),c=0;c<s;c++)a[c]=arguments[c];i?r.push(a):(i=!0,setTimeout((function(){if(i=!1,r.length>0){var e=r.shift();Reflect.apply(o,null,e)}}),t),Reflect.apply(e,n,a))}}(t.handleSdpUpdate,250,b(t)),t}return d(o,[{key:"onMessage",value:(r=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=JSON.parse(t),r=n.type,i=n.data,this.verifySender(n),"call_accepted"!==r){e.next=10;break}return this.setCallId(i.call_id),e.next=7,this.sessionDescriptionHandler.setDescription(i.sdp);case 7:this.emit({type:"accepted"}),e.next=11;break;case 10:"call_resumed"===r?(this.sessionDescriptionHandler.setDescription(i.sdp),this.emit({type:"resumed"})):"call_rejected"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"reject",code:i.reject_code}),this.terminate()):"call_terminated"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"bye",code:i.term_code}),this.terminate()):"sdp_update"===r?this.debouncedHandleSDPUpdate(i):(i.type=r,this.emit({type:"message",data:i}));case 11:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"initAuthToken",value:function(){var e=this.options,t=ar(e.transportOptions.auth_token);if(!1===t||t.client_id!==e.client_id||t.conf_id!==e.conf_id||!t.exp)throw new Error("Invalid auth token")}},{key:"setCallId",value:function(e){this.callId=e}},{key:"verifySender",value:function(e){var t=this.options;e.from===t.conf_id&&e.to===t.client_id||console.error(new Error("Invalid message sender",e))}},{key:"handleSdpUpdate",value:(n=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.callId,r=t.sdp,n&&n===t.call_id){e.next=4;break}throw new Error("Invalid call id");case 4:return this.emit({type:"sdp_update",sdp:r}),e.next=7,this.sessionDescriptionHandler.updateDescription(r);case 7:i=e.sent,"offer"===r.type&&i&&(o={type:i.type,sdp:sr(i.sdp)},this.message("sdp_update",{call_id:n,sdp:o}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"message",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"message",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.options,r=JSON.stringify({type:e,msg_id:ur(),from:n.client_id,to:n.conf_id,data:t});this.transport.send(r)}},{key:"connect",value:function(){var e=this,t=this.options,n=new ir(t.transportOptions);this.transport=n,this.termination=!1,this.emit({type:"transportCreated",transport:n}),n.onEvent((function(n){var r=n.type;"connected"===r?e.sessionDescriptionHandler||(e.sessionDescriptionHandler=t.sessionDescriptionHandlerFactory(t.sessionDescriptionHandlerFactoryOptions),e.emit({type:"registered"})):"message"===r?e.onMessage(n.message):"disconnected"===r&&(e.termination||e.emit({type:"terminated",reason:"disconnect",code:n.was_open?0:-1}))})),n.connect()}},{key:"call",value:(t=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.sessionDescriptionHandler,n=this.options,t){e.next=3;break}throw new Error("Invalid sessionDescriptionHandler");case 3:return e.next=5,t.getDescription();case 5:r=e.sent,i={type:r.type,sdp:sr(r.sdp)},this.message("call_start",{sdp:i,display_name:n.client_name,mute_video:n.mute_video});case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"resume",value:function(e){var t=this;if(!this.callId)throw new Error("Session was already closed");this.options.transportOptions.auth_token=e;try{this.initAuthToken()}catch(e){return void this.emit({type:"terminated",reason:"disconnect",code:-1})}this.onEvent((function e(n){"transportCreated"===n.type&&(t.offEvent(e),t.transport.onEvent(function(){var e=Qe(et().mark((function e(n){var r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("connected"!==n.type){e.next=17;break}if(r=t.transport,i=t.sessionDescriptionHandler,t.callId){e.next=5;break}throw r.destroy(),new Error("Session was already closed");case 5:return e.prev=5,e.next=8,i.getDescription();case 8:o=e.sent,s={type:o.type,sdp:sr(o.sdp)},t.message("call_resume",{call_id:t.callId,sdp:s}),e.next=17;break;case 13:throw e.prev=13,e.t0=e.catch(5),r.destroy(),new Error("Unable to reconnect");case 17:case"end":return e.stop()}}),e,null,[[5,13]])})));return function(t){return e.apply(this,arguments)}}()))})),this.connect()}},{key:"terminate",value:function(){var e=this.sessionDescriptionHandler,t=this.transport,n=this.callId;this.callId=null,e&&e.close(),t&&(t.isConnected()&&n&&(this.termination=!0,this.message("call_terminate",{call_id:n,term_code:0}),this.emit({type:"terminated",reason:"terminate",code:0})),this.transport=null,t.destroy())}}]),o}(nr);const hr={UserAgent:dr},fr=["chat","recording","memberlist","source_update","voice_activity"];const pr=function(){function e(t,n){c(this,e);var r=t.src,i=void 0===r?[]:r,o=t.psrc,s=t.asrc,a=t.vsrc,u=t.dsrc,l=t.dims;this.clientId=n,this.sources=i,this.presenterIdx=o,this.audioSources=s,this.videoSources=a,this.desktopSources=u,this.dimensions=l,this.userSourceIndex=i.indexOf(n)}return d(e,[{key:"isSolo",get:function(){return 1===Array.from(new Set(this.sources)).length&&this.sources[0]===this.clientId}},{key:"isSource",get:function(){return this.sources.includes(this.clientId)}},{key:"isPresenter",get:function(){return this.hasPresenter&&this.presenter===this.clientId}},{key:"presenter",get:function(){return this.hasPresenter&&this.sources[this.presenterIdx]}},{key:"hasMedia",get:function(){return this.sources.some((function(e){return/media/.test(e)}))}},{key:"hasPresenter",get:function(){return Number.isInteger(this.presenterIdx)&&this.presenterIdx>-1}},{key:"hasVideoSources",get:function(){return Boolean(this.videoSources)}},{key:"hasDesktopSources",get:function(){return Number.isInteger(this.desktopSources)&&this.desktopSources>-1}},{key:"hasAudioPosition",get:function(){return this.audioSources.includes(this.userSourceIndex)}},{key:"hasVideoPosition",get:function(){return this.videoSources.includes(this.userSourceIndex)}},{key:"hasMutedVideoPeers",get:function(){var e=this;return!this.hasDesktopSources&&0===this.videoSources.filter((function(t){return t!==e.userSourceIndex})).length}},{key:"userDimensions",get:function(){var e=this.videoSources.indexOf(this.userSourceIndex);return e>-1?this.dimensions[e]:null}}]),e}();const mr=function(){function e(t){c(this,e),this.clientId=t,this.stamp=this.stamp.bind(this),this.default=this.default.bind(this),this.process=this.process.bind(this),this.sourceUpdate=this.sourceUpdate.bind(this),this.voiceActivity=this.voiceActivity.bind(this)}return d(e,[{key:"stamp",value:function(e){return Object.assign({_src:"sig"},e)}},{key:"process",value:function(e){return({source_update:this.sourceUpdate,voice_activity:this.voiceActivity}[e.type]||this.default)(this.stamp(e))}},{key:"default",value:function(e){return p.debug("SipMessageTransformer::default",e),e}},{key:"sourceUpdate",value:function(e){p.debug("SipMessageTransformer::sourceUpdate",e);var t=new pr(e,this.clientId);return{type:"podium",solo:t.isSolo,audio:t.hasAudioPosition,video:t.hasVideoPosition,media:t.hasMedia,sources:t.sources,isSource:t.isSource,presenter:t.presenter,isPresenter:t.isPresenter,hasPresenter:t.hasPresenter,videoSources:t.videoSources,userDimensions:t.userDimensions,hasVideoSources:t.hasVideoSources,hasDesktopSources:t.hasDesktopSources,hasMutedVideoPeers:t.hasMutedVideoPeers}}},{key:"voiceActivity",value:function(e){return p.debug("SipMessageTransformer::voiceActivity",e),Object.assign({type:"voice_activity_raw",on:e.on,userId:e.cid})}}]),e}();var vr=function(){function e(t){c(this,e),this.datachannel=null,this.peerConnection=null,this.localStream=null,this.remoteStream=null,this.connected=!1,this.iceCheckingTimer=null,this.peerConnectionReady=null,this.options=t||{},this.connection=t.connection,this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.initPeerConnection()}var t,n,r;return d(e,[{key:"getDescription",value:(r=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.options,n=this.peerConnection,p.debug("SessionDescriptionHandler::getDescription:",t),this.localStream=t.stream,e.next=5,n.createOffer(t.RTCOfferOptions);case 5:return r=e.sent,t.SDPModifiers.active.forEach((function(e){r.sdp=e(r.sdp)})),e.next=9,n.setLocalDescription(r);case 9:return e.next=11,this.peerConnectionReady;case 11:return i=n.localDescription.sdp,t.SDPModifiers.passive.forEach((function(e){i=e(i)})),p.debug("SessionDescriptionHandler::getDescription offer",i),e.abrupt("return",{type:"offer",sdp:i});case 15:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"setDescription",value:(n=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.datachannel,p.debug("SessionDescriptionHandler::setDescription:",t),t&&t.sdp&&(this.connection.seppMessaging=t.sdp.includes("a=eyeson-sepp-messaging")),e.next=5,this.peerConnection.setRemoteDescription(new RTCSessionDescription(t));case 5:if(this.options.remoteDescriptionUpdate(t),"connecting"!==n.readyState){e.next=9;break}return e.next=9,new Promise((function(e){n.onopen=function(){n.onopen=null,e()}}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateDescription",value:(t=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options,r=this.peerConnection,p.debug("SessionDescriptionHandler::updateDescription:",t),"offer"!==t.type){e.next=24;break}return e.prev=3,e.next=6,r.setRemoteDescription(new RTCSessionDescription(t));case 6:return e.next=8,r.createAnswer();case 8:return i=e.sent,n.SDPModifiers.active.forEach((function(e){i.sdp=e(i.sdp)})),e.next=12,r.setLocalDescription(i);case 12:return this.options.remoteDescriptionUpdate(t),o=r.localDescription.sdp,n.SDPModifiers.passive.forEach((function(e){o=e(o)})),p.debug("SessionDescriptionHandler::updateDescription answer",o),e.abrupt("return",{type:"answer",sdp:o});case 19:e.prev=19,e.t0=e.catch(3),p.error("SessionDescriptionHandler::updateDescription",e.t0);case 22:e.next=28;break;case 24:if("answer"!==t.type){e.next=28;break}return e.next=27,r.setRemoteDescription(new RTCSessionDescription(t));case 27:this.options.remoteDescriptionUpdate(t);case 28:return e.abrupt("return",null);case 29:case"end":return e.stop()}}),e,this,[[3,19]])}))),function(e){return t.apply(this,arguments)})},{key:"close",value:function(){p.debug("SessionDescriptionHandler::close"),clearTimeout(this.iceCheckingTimer),this.peerConnection&&(this.stopAllTracks(),this.peerConnection.close(),this.peerConnection=null,this.datachannel&&["connecting","open"].includes(this.datachannel.readyState)&&(this.datachannel.close(),this.datachannel=null),p.debug("SessionDescriptionHandler::close Stopped streams and closed peerConnection."))}},{key:"initPeerConnection",value:function(){var e=this.options,t=this.buildPeerConnectionOptions();p.debug("SessionDescriptionHandler::initPeerConnection with",t);var n=null;this.peerConnectionReady=new Promise((function(e){return n=e}));try{var r=new RTCPeerConnection(t);this.peerConnection=r,e.stream.getTracks().forEach((function(t){r.addTrack(t,e.stream)}));var i=r.createDataChannel("data",{negotiated:!0,id:0});this.handleDatachannel(i),r.onicecandidate=function(e){var t=e.candidate;t?p.debug("SessionDescriptionHandler::gotIceCandidate",t.candidate):n()},r.onicegatheringstatechange=function(){"complete"===r.iceGatheringState&&n()},!0===e.sendOnly?r.addEventListener("connectionstatechange",this.handleConnectionStateChange):r.ontrack=this.handleOntrack.bind(this),this.iceCheckingTimer=setTimeout((function(){return n()}),3e3)}catch(e){p.error("SessionDescriptionHandler::initPeerConnection failed:",e,this.connection.uaOptions)}}},{key:"handleOntrack",value:function(e){var t=e.track,n=e.streams,r=this.options,i=U(n,1);this.remoteStream=i[0],p.debug("SessionDescriptionHandler::handleOntrack:",t.kind),t.onunmute=function(){return r.handleUnmute(t)},r.handleAccept(this.remoteStream)}},{key:"handleConnectionStateChange",value:function(){"connected"!==this.peerConnection.connectionState||this.connected||(this.connected=!0,this.options.handleAccept())}},{key:"handleDatachannel",value:function(e){this.datachannel=e,this.connection.initDatachannel(e)}},{key:"buildPeerConnectionOptions",value:function(){var e=this.options,t=[{urls:e.stun_servers}];return e.turn_servers.forEach((function(e){e.credential=e.password,t.push(e)})),{sdpSemantics:"unified-plan",iceServers:t}}},{key:"getLocalStream",value:function(){return this.localStream}},{key:"getRemoteStream",value:function(){return this.remoteStream}},{key:"setStream",value:function(e){var t=this;return new Promise((function(n,r){var i=t.getLocalStream();t.localStream=e,t.stopUnusedTracks(i,e);var o=U(e.getAudioTracks(),1)[0],s=U(Ut(e)?It(e):e.getVideoTracks(),1)[0];if(t.tracksExist()){var a=t.peerConnection.getSenders(),c=a.find((function(e){return e.track&&"audio"===e.track.kind})),u=a.find((function(e){return e.track&&"video"===e.track.kind}));Promise.all([c?c.replaceTrack(o):null,u?u.replaceTrack(s):null]).then((function(){n({newStream:e,remoteStream:t.remoteStream})})).catch(r)}else n({newStream:e,remoteStream:t.remoteStream})}))}},{key:"stopUnusedTracks",value:function(e,t){this.connection.hasExternalStream||e.getTracks().filter((function(e){return!t.getTracks().includes(e)})).forEach(mt)}},{key:"tracksExist",value:function(){return Boolean(this.peerConnection.getSenders().find((function(e){return null!==e.track})))}},{key:"scaleResolution",value:function(e){try{var t=Math.max(1/Math.max(e,.1),1),n=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),r=n.getParameters();r.encodings||(r.encodings=[{}]),r.encodings[0].scaleResolutionDownBy!==t&&(r.encodings[0].scaleResolutionDownBy=t,n.setParameters(r))}catch(e){p.error("SessionDescriptionHandler::scaleResolution failed:",e)}}},{key:"limitFramerate",value:function(e){try{var t=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),n=t.getParameters();n.encodings||(n.encodings=[{}]),n.encodings[0].maxFramerate!==e&&(e?n.encodings[0].maxFramerate=e:Reflect.deleteProperty(n.encodings[0],"maxFramerate"),t.setParameters(n))}catch(e){p.error("SessionDescriptionHandler::limitFramerate failed:",e)}}},{key:"stopAllTracks",value:function(){p.debug("SessionDescriptionHandler::stopAllTracks");var e=this.peerConnection.getReceivers?this.peerConnection.getReceivers():[];this.peerConnection.getSenders().concat(e).forEach((function(e){e.track&&mt(e.track)}))}}]),e}();const yr=vr;var gr=32768;const br=function(){function e(t,n){c(this,e),this.listeners=[],this.messageListener=[],this.datachannel=null,this.uaOptions=this.initUserAgentOptions(t,n),this.clientId=this.uaOptions.client_id,this.userAgent=null,this.transformer=new mr(this.clientId),this.seppMessaging=!1}return d(e,[{key:"initUserAgentOptions",value:function(e,t){if("sepp"!==e.type)return{client_id:null};var n=e.options;return{client_id:n.client_id,conf_id:n.conf_id,client_name:t.name,mute_video:!1,sessionDescriptionHandlerFactory:function(e){return new yr(e)},sessionDescriptionHandlerFactoryOptions:{stun_servers:n.stun_servers,turn_servers:n.turn_servers},transportOptions:{auth_token:n.auth_token,endpoint:n.endpoint}}}},{key:"start",value:function(){var e=this;return new Promise((function(t){if(!e.uaOptions.client_id)throw new TypeError("Invalid signaling data");e.userAgent=new hr.UserAgent(e.uaOptions),t()}))}},{key:"startSession",value:function(e){var t=this;return Object.assign(this.uaOptions.sessionDescriptionHandlerFactoryOptions,e),e.mediaOptions&&(this.uaOptions.mute_video=!e.mediaOptions.video),this.userAgent.onEvent((function(e){var n=e.type,r=e.data;"registered"===n?t.userAgent.call():"message"===n&&t.handleMessage(r)})),this.userAgent.connect(),this.userAgent}},{key:"updateAuthAndRestartSession",value:function(e){p.debug("updateAuthAndRestartSession",e),e.error||(this.uaOptions.transportOptions.auth_token=e.signaling.options.auth_token),this.userAgent.connect()}},{key:"updateAuthAndResume",value:function(e){p.debug("updateAuthAndResume",e),this.userAgent?e.error?this.userAgent.resume(null):this.userAgent.resume(e.signaling.options.auth_token):p.warn("updateAuthAndResume","userAgent already gone")}},{key:"initDatachannel",value:function(e){var t=this;this.datachannel=e,p.debug("SigConnection::initDatachannel",e),e.onmessage=function(n){if('{"type":"ping"}'!==n.data||"open"!==e.readyState){p.debug("SigConnection::dataChannelMessage",n.data);var r=JSON.parse(n.data);"ack"!==r.type&&t.handleMessage(r)}else e.send('{"type":"pong"}')}}},{key:"close",value:function(){var e=this.datachannel,t=this.userAgent;this.datachannel=null,this.userAgent=null,e&&"open"===e.readyState&&e.close(),t&&(t.removeAllListeners(),t.terminate())}},{key:"onMessage",value:function(e){this.messageListener.push(e)}},{key:"handleMessage",value:function(e){if(fr.includes(e.type)){var t=this.transformer.process(e);this.messageListener.forEach((function(e){return e(t)}))}else p.debug('SigConnection::handleMessage ignoring "'.concat(e.type,'" message.'))}},{key:"send",value:function(e){if(!this.seppMessaging){var t=this.datachannel;e.cid=this.uaOptions.client_id;var n=JSON.stringify(e);return"chat"===e.type&&n.length>=gr?(p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"})):t&&"open"===t.readyState&&n.length<gr?(p.debug("SigConnection::send datachannel",n),void t.send(n)):void p.error("SigConnection::send failed",e)}this.sendSeppMessage(e)}},{key:"sendSeppMessage",value:function(e){var t=this.userAgent;if(t&&t.callId){e.cid=this.uaOptions.client_id,e.call_id=t.callId;var n=JSON.stringify(e);if("chat"===e.type&&n.length>=gr)return p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"});if(n.length<gr)return p.debug("SigConnection::send sepp",e),void t.message(e.type,e);p.error("SigConnection::send failed",e)}}},{key:"onError",value:function(e){return this.listeners.push(e),this}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}]),e}();function Sr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const kr=function(e){g(n,e);var t=Sr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(R(k(n.prototype),"handle",this).call(this,e),this.context.rtData=e.content,!0===e.content.ready){var t=e.content,r=t.user,i=t.room,o=t.signaling,s=t.links,a=t.options;this.context._eyeson.room=i,this.context._eyeson.user=this.context._api.addUserAttributes(r,r.id,o.options.client_id),this.context._eyeson.links=s,f.widescreen=Boolean(a.widescreen),this.context._connection?p.debug("RoomReceived double room_ready"):function(e,t,n){e.connection=new br(t,n),e._connection.onError((function(t){return e.send(t)})).start().then((function(){return e.send({type:"connection",connectionStatus:"ready"})})).catch((function(){return e.send({type:"connection",connectionStatus:"transport_error"})}))}(this.context,o,r)}else p.debug("RoomReceived not ready:",e.content)}}]),n}(P);function wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Cr=function(e){g(n,e);var t=wr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context._api.getRoom((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"fetch_room",room:t})}))}}]),n}(P);function xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Tr=function(e){g(n,e);var t=xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.deleteFile(e.file)}}]),n}(w);function Rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const _r=function(e){g(n,e);var t=Rr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.uploadFile(e.file,this.addFile.bind(this))}},{key:"addFile",value:function(e){R(k(n.prototype),"handle",this).call(this,{type:"add_file",file:e})}}]),n}(P);function Pr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Mr=function(e){g(n,e);var t=Pr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.cid.split("@").shift();this.msg=e,this.context._api.getUser(t,this.forwardMessage.bind(this))}},{key:"forwardMessage",value:function(e){var t=Date.parse(this.msg.ts||this.msg.created_at);R(k(n.prototype),"handle",this).call(this,{type:this.msg.type,user:e,timestamp:new Date(t),content:this.msg.content})}}]),n}(P);function Er(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Or=function(e){g(n,e);var t=Er(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.virtualBackground,s=void 0!==o&&o,a=e.screen,c=void 0!==a&&a,u=e.surface,l=void 0===u?null:u;p.debug("StartStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(c));var d=this.context,h=d._session,f=d._connection;if(!h)throw new Error("Session does not exist");if(h.micMixer&&(h.micMixer.destroy(),h.micMixer=null),h.options.virtualBackground=s,h.vbgMixer){var m=Bn.getStoredVirtualBackgroundType();h.vbgMixer.stopOriginalStream(),h.vbgMixer.terminate(),h.vbgMixer.changeBackground(m)}h.localStream&&!Xe.canMultipleDifferentMicrophones()&&vt(h.localStream);var v={audio:n,video:i,virtualBackground:h.options.virtualBackground,vbgMixer:h.vbgMixer,deviceMonitor:h.deviceMonitor};return c&&(h.micMixer=new Fn,v.video=!1,v.screen=!0,v.surface=l,v.virtualBackground=!1,v.micMixer=h.micMixer),new Ln(v).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_screen_video"})})),e})).then(h.setStream).then((function(){return h.send({type:"mute_video",on:!(i||c)})})).then((function(){h.externalStream&&(h.externalStream=null,f.hasExternalStream=!1)})).catch((function(e){if(p.error("StartStreamEvent",e),c){h.micMixer&&(h.micMixer.destroy(),h.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),h.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Dr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Ar=function(e){g(n,e);var t=Dr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.screen,s=void 0!==o&&o,a=e.surface;p.debug("ChangeStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(s));var c=this.context._session;if(!c)throw new Error("Session does not exist");c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);return c.externalStream?(ft(c.externalStream,n),pt(c.externalStream,i),c.send({type:"mute_video",on:!i}),Promise.resolve()):new Promise((function(e,t){if(Xe.stopsDeviceActivityIndicatorOnDisable()&&!s){var r=U(c.localStream.getVideoTracks(),1)[0],o=U(c.localStream.getAudioTracks(),1)[0];if(!(i&&kt(r)||"ended"===r.readyState||"ended"===o.readyState||bt(r)))return c.vbgMixer&&c.vbgMixer.originalStream?(c.vbgMixer[i?"start":"stop"](),At(c.localStream,i),Dt(c.vbgMixer.originalStream,i)):Dt(c.localStream,i),ft(c.localStream,n),void e(c.localStream)}c.vbgMixer&&(c.vbgMixer.stopOriginalStream(),c.vbgMixer.terminate());var u={audio:n,video:i,virtualBackground:c.options.virtualBackground,existingStream:c.localStream,vbgMixer:c.vbgMixer,deviceMonitor:c.deviceMonitor};s&&(c.micMixer=new Fn,u.screen=!0,u.video=!1,u.surface=a,u.virtualBackground=!1,u.vbgMixer=null,u.micMixer=c.micMixer),new Ln(u).onBrokenTrackError((function(){c.emit({type:"broken_track_error"})})).start().then(e).catch(t)})).then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){c.emit({type:"stop_screen_video"})})),e})).then(c.setStream).then((function(e){Ut(e)?c.canvasMixer.setStream(e):c.send({type:"mute_video",on:!(i||s)})})).catch((function(e){if(p.error(e),e instanceof Error&&["NotReadableError","DevicesNotFoundError","NotFoundError"].includes(e.name)&&c.emit({type:"warning",name:"error_"+e.name}),s){c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),c.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ir(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Br=function(e){g(n,e);var t=Ir(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=Gt(e.stream);if(!t)return p.error("ReplaceStreamEvent::handle invalid stream",e.stream),Promise.reject(new TypeError("Invalid stream"));var n=this.context,r=n._session,i=n._connection;if(!r)throw new Error("Session does not exist");return r.micMixer&&(r.micMixer.destroy(),r.micMixer=null),r.vbgMixer&&(r.vbgMixer.stopOriginalStream(),r.vbgMixer.terminate()),r.options.audio=ut(t),r.options.video=lt(t),r.setStream(t).then((function(){r.externalStream=t,i.hasExternalStream=!0,r.send({type:"mute_video",on:!lt(t)})})).catch((function(e){r.externalStream=null,i.hasExternalStream=!1,p.error(e)}))}}]),n}(w);function Lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fr=function(e){g(n,e);var t=Lr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.facingMode;p.debug("ToggleCameraEvent::handle",t);var n=this.context._session;if(!n)throw new Error("Session does not exist");new Ln({audio:n.localStream.getAudioTracks()[0].enabled,video:{facingMode:t},existingStream:n.localStream,deviceMonitor:n.deviceMonitor}).start().then(n.setStream).catch(p.error)}}]),n}(w);function jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Vr=function(e){g(n,e);var t=jr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.type,r=e.session.sessionDescriptionHandler,i=r.getLocalStream(),o=r.getRemoteStream();R(k(n.prototype),"handle",this).call(this,{type:t,localStream:i,remoteStream:o})}}]),n}(P);function Ur(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Nr=function(e){g(n,e);var t=Ur(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopRecording(e)}}]),n}(P);function Wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hr=function(e){g(n,e);var t=Wr(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n){t.context._api.getUser(e,n)}))}},{key:"handle",value:function(e){var t=this;this.getUser(e.userId).then((function(n){t.context.send({type:"voice_activity",user:n,on:e.on})}),(function(e){p.error("VoiceActivityEvent::handle",e)}))}}]),n}(w);function zr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Gr=function(e){g(n,e);var t=zr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context,n=t._api,r=t._session;n.startRecording(e).catch((function(e){return r.emit({type:"recording_error",error:e})}))}}]),n}(P);function qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const $r=function(e){g(n,e);var t=qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.screen,r=void 0!==n&&n,i=e.screenStream,o=e.surface,s=this.context._session;if(!s)throw new Error("Session does not exist");s.micMixer&&s.micMixer.destroy(),s.micMixer=new Fn;new Ln({audio:t,video:!1,screen:r,surface:o,screenStream:i,existingStream:s.localStream,micMixer:s.micMixer,isPresentation:!0,deviceMonitor:s.deviceMonitor}).start().then((function(e){var t="screen",n=U(Tt(e),1)[0];if(n){n.addEventListener("ended",(function(){s.emit({type:"stop_presenting"})}));var r=function(e){if(e&&"function"==typeof e.getSettings){var t=e.getSettings();if(Reflect.apply(Object.prototype.hasOwnProperty,t,["displaySurface"]))return t.displaySurface}return""}(n);r&&(t="screen-".concat(r))}s.emit({type:"start_presenting",stream:e,present:t})})).catch((function(e){if(p.error("ScreenCaptureEvent",e),r){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"capture_error",name:t})}s.emit({type:"stop_presenting"})}))}}]),n}(w);function Jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Kr=function(e){g(r,e);var t,n=Jr(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"streamVideo",value:function(){var e=this,t=this.context._session;new Ln({audio:t.localStream.getAudioTracks()[0].enabled,video:!1,deviceMonitor:t.deviceMonitor}).start().then((function(n){var r=t.videoPlayer.invokeStream(n);return e.handle({stream:r})})).catch((function(e){p.error("StartPresentingEvent",e),e.name.match(/notallowed|permission/i)||t.emit({type:"capture_error",name:"error_".concat(e.name)}),t.emit({type:"stop_presenting"})}))}},{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.stream,r=void 0===n?null:n,i=t.present,o=void 0===i?"":i,s=this.context._session){e.next=4;break}throw new Error("Session does not exist");case 4:if(s.vbgMixer&&(s.vbgMixer.stopOriginalStream(),s.vbgMixer.terminate()),!s.videoPlayer||s.videoPlayer.isStreaming()){e.next=9;break}this.streamVideo(),e.next=16;break;case 9:return a=r||s.localStream,s.canvasMixer&&s.canvasMixer.stream&&(a=s.canvasMixer.stream),e.next=13,s.setStream(a);case 13:s.send({type:"set_presenter",on:!0}),s.send({type:"desktopstreaming",on:!0}),s.emit({type:"presentation_started",present:o});case 16:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Yr=function(e){g(n,e);var t=Xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.canvasMixer&&(e.canvasMixer.vbgMixer&&(e.canvasMixer.vbgMixer.stopOriginalStream(),e.canvasMixer.vbgMixer.terminate(),e.canvasMixer.vbgMixer=null),e.canvasMixer.stop(),e.canvasMixer=null),e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.videoPlayer&&(e.videoPlayer.destroy(),e.videoPlayer=null),e.send({type:"desktopstreaming",on:!1}),e.send({type:"set_presenter",on:!1}),e.emit({type:"presentation_ended"}),e.stopPresentingSet=!0}}]),n}(w);function Qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Zr=function(e){g(n,e);var t=Qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopAllBroadcasts().then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})}))}}]),n}(P);function ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ti=function(e){g(n,e);var t=ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.clearFrontLayer()}}]),n}(w);function ni(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ri=function(e){g(n,e);var t=ni(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;return new m(e.api,e.token).requestUser({name:e.name,email:e.email,locale:e.locale},(function(e){if(!e.access_key){var r=e.locked;return e.error&&"ComApiError: 423"===e.error.message&&(r=!0),void R(k(n.prototype),"handle",t).call(t,{type:"error",content:"Request guest user failed",locked:r})}R(k(n.prototype),"handle",t).call(t,{type:"guest_user",token:e.access_key})}))}}]),n}(P);function ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const oi=function(e){g(n,e);var t=ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._eyeson.destroy()}}]),n}(w);function si(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ai=function(e){g(n,e);var t=si(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n,r){if(t.context._api)try{t.context._api.getUser(e,n)}catch(e){r(e)}else r(new Error("missing ComAPI"))}))}},{key:"handle",value:function(e){var t=this;(e.add||[]).forEach((function(e,n,r){var i=e.cid,o=t.context._connection.clientId,s=Boolean(r.find((function(e){return e.cid===o})));t.getUser(i).then((function(e){t.context.send({type:"add_user",user:e,initial:s})})).catch((function(e){return p.error(e)}))})),(e.del||[]).forEach((function(e){var n=e;t.getUser(n).then((function(e){t.context.send({type:"remove_user",userId:n,user:e})})).catch((function(e){return p.error(e)}))})),this.context.send({type:"playback_update",playing:e.media||[]})}}]),n}(w);var ci=function(e){return Number(parseFloat(e).toFixed(2))};const ui=function(e,t,n){var r=Math.min(n.width/e,n.height/t);return{width:ci(e*r),height:ci(t*r)}},li=function(e,t,n){var r;return function(){var i=this,o=arguments,s=n&&!r;clearTimeout(r),r=setTimeout((function(){r=null,n||e.apply(i,o)}),t),s&&e.apply(i,o)}};var di=1e3/15,hi={width:220,height:140},fi={width:320,height:240},pi={width:420,height:340},mi={width:0,height:0},vi="function"==typeof window.MediaStreamTrackProcessor,yi={getSettings:function(){return{width:0,height:0}},addEventListener:function(){return null}},gi=Xe.isIOSDevice(),bi=function(e){var t=U(e.getVideoTracks(),1)[0];if(!t)return null;if(vi)return new MediaStreamTrackProcessor(t).readable.getReader();var n=t.getSettings(),r=n.width,i=n.height,o=document.createElement("video");return o.playsInline=!0,o.muted=!0,o.width=r,o.height=i,o.srcObject=e,t.addEventListener("stopped",(function(){o.srcObject=null})),o.play().catch((function(e){return p.warn("bindVideoToStream: play",e,e.message)})),o},Si=function(){function e(t,n){c(this,e),this.canvas=t,this.stream=n,this.camera=null,this.screen=null,this.canvasTrack=null,this.context=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),this.xPos=0,this.camSize=fi,this.isCanvasCapture=!1,this.draw=this.draw.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.onError=this.onError.bind(this),this.onRedraw=this.onRedraw.bind(this),this.setStream=this.setStream.bind(this),this.setCamera=this.setCamera.bind(this),this.drawFrame=this.drawFrame.bind(this),this.calcSizesAndPositions=this.calcSizesAndPositions.bind(this),this.bouncedDraw=li(this.draw,di)}var t;return d(e,[{key:"onError",value:function(e){this.errorCallback=e}},{key:"onRedraw",value:function(e){this.redrawCallback=e}},{key:"start",value:function(){var e,t=U(It(this.stream),1)[0];this.canvasTrack=t,gi?((e=this).cameraStream={getVideoTracks:function(){return[]}},e.screenStream={getVideoTracks:function(){return[]}},this.setCamera({horizontal:"right",vertical:"bottom"},"none")):(this.setCamera({horizontal:"right",vertical:"bottom"},"medium"),this.setStream(this.stream)),this.draw()}},{key:"stop",value:function(){this.stream&&(vt(this.stream),this.stream=null,this.camera=null,this.screen=null,this.screenStream=null,this.cameraStream=null,this.canvasTrack=null)}},{key:"setStream",value:function(e){this.stream=e,this.cameraStream=new MediaStream(jt(e)?Pt(e):_t(e)),this.screenStream=new MediaStream(Tt(this.stream));var t=function(e){if(e&&e.getVideoTracks().length>0){var t=U(e.getVideoTracks(),1)[0];if("canvas"in t)return t.canvas}return null}(this.cameraStream);t?(this.isCanvasCapture=!0,this.camera=t):(this.isCanvasCapture=!1,this.camera=bi(this.cameraStream)),this.screen=bi(this.screenStream),this.calcSizesAndPositions(),this.redrawQueued=!0}},{key:"setCamera",value:function(e,t){this.cameraPosition=e||this.cameraPosition,this.cameraSizeInWords=t||this.cameraSizeInWords,this.redrawQueued=!0}},{key:"calcSizesAndPositions",value:function(){var e,t,n,r,i,o,s,a,c=U(this.screenStream.getVideoTracks(),1)[0],u=(void 0===c?yi:c).getSettings(),l=(e=this.canvas,n=(t=u).width/t.height,r=e.width/e.height,i=e.width,o=e.height,s=0,a=0,n<r&&(i=t.width*(o/t.height),s=(e.width-i)/2),n>r&&(o=t.height*(i/t.width),a=(e.height-o)/2),{x:s,y:a,width:i,height:o}),d=U(this.cameraStream.getVideoTracks(),1)[0],h=(void 0===d?yi:d).getSettings();this.camSize={small:hi,medium:fi,large:pi,none:mi}[this.cameraSizeInWords];var f=ui(h.width,h.height,this.camSize);this.sizes={screen:{width:l.width,height:l.height},camera:{width:f.width,height:f.height}};var p={x:"right"===this.cameraPosition.horizontal?this.canvas.width-this.sizes.camera.width:0,y:"bottom"===this.cameraPosition.vertical?this.canvas.height-this.sizes.camera.height:0};this.positions={screen:{x:l.x,y:l.y},camera:{x:p.x,y:p.y}}}},{key:"draw",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,this.stream&&this.stream.active){e.next=3;break}return e.abrupt("return");case 3:if(this.calcSizesAndPositions(),this.redrawCallback&&this.redrawQueued&&(this.redrawCallback(),this.redrawQueued=!1),t=performance.now(),!this.screen){e.next=14;break}if(n=this.screen,!(vi&&this.screen instanceof ReadableStreamDefaultReader)){e.next=13;break}return e.next=11,this.screen.read();case 11:r=e.sent,n=r.value;case 13:this.drawFrame(n,this.positions.screen,this.sizes.screen,!1,!0);case 14:if(i=this.camera,!(vi&&this.camera instanceof ReadableStreamDefaultReader)){e.next=20;break}return e.next=18,this.camera.read();case 18:o=e.sent,i=o.value;case 20:this.drawFrame(i,this.positions.camera,this.sizes.camera,this.isCanvasCapture,!1),(s=performance.now())-t>=di&&p.warn("Mixer::drawFrame took ".concat(s-t,"ms."));try{this.canvasTrack&&this.canvasTrack.requestFrame()}catch(e){p.warn("CanvasMixer draw requestFrame error - ".concat(e.message))}this.bouncedDraw(),e.next=31;break;case 27:e.prev=27,e.t0=e.catch(0),p.error(e.t0),this.errorCallback(e.t0);case 31:case"end":return e.stop()}}),e,this,[[0,27]])}))),function(){return t.apply(this,arguments)})},{key:"drawFrame",value:function(e,t,n,r,i){var o=this.context,s=this.canvas;if(e&&(r||!(e instanceof HTMLVideoElement)||e.srcObject&&e.srcObject.active))i&&!r&&o.clearRect(0,0,s.width,s.height),o.drawImage(e,t.x,t.y,n.width,n.height),vi&&"function"==typeof e.close&&e.close();else{var a=o.createImageData(1,1);o.putImageData(a,0,0)}}}]),e}();const ki=Si;function wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ci=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.canvas,i=e.screen,o=void 0!==i&&i,s=e.surface,a=e.onRedraw,c=e.changeStream,u=void 0!==c&&c,l=e.present,d=void 0===l?"mixer":l,h=this.context._session;if(!h)throw new Error("Session does not exist");var f=Bn.getStoredVirtualBackgroundType(),m=new An("canvasmixer");m.changeBackground(f);var v=function(e){p.error("StartMixerEvent",e),!h.canvasMixer&&m&&m.terminate(),!e.name.match(/notallowed|permission/i)&&o&&h.emit({type:"capture_error",name:"error_".concat(e.name)}),h.emit({type:"stop_presenting"})};new Ln({audio:t,video:n,virtualBackground:h.options.virtualBackground,screen:o,surface:s,canvas:r,existingStream:h.localStream,vbgMixer:m,deviceMonitor:h.deviceMonitor}).start().then((function(e){var t=U(Tt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_presenting"}),mt(t)})),h.canvasMixer=new ki(r,e),h.canvasMixer.vbgMixer=m,h.canvasMixer.onError(v),h.canvasMixer.onRedraw(a),h.canvasMixer.start(),e})).then((function(e){u?h.emit({type:"start_presenting",stream:e,present:d}):h.emit({type:"stream_update",presentationStream:e})})).catch(v)}}]),n}(w),xi=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.position,n=e.size,r=this.context._session;if(!r)throw new Error("Session does not exist");try{r.canvasMixer.setCamera(t,n)}catch(e){p.error(e)}}}]),n}(w),Ti="function"==typeof HTMLVideoElement.prototype.requestVideoFrameCallback,Ri=Xe.isIOSDevice();const _i=function(){function e(t){var n=t.canvas,r=t.file,i=t.onReady,o=t.onDuration,s=t.onTimeUpdate,a=t.onEnd,u=t.performAction;c(this,e),this.ac=null,this.acOut=null,this.gainNode=null,this.timer=null,this.canvas=n,this.url=URL.createObjectURL(r),this.ctx=n.getContext("2d"),this.video=document.createElement("video"),this.callback={onReady:i,onDuration:o,onTimeUpdate:s,onEnd:a,performAction:u},this.errorCallback=null,this.boundDrawVideoFrame=this.drawVideoFrame.bind(this),this.boundInitCanvasStream=this.initCanvasStream.bind(this),this.isPlaying=!1,this.blockTimeUpdate=!1,this.micOnlyStream=null,this.userMediaStream=null,this.initTimeout=null,this.invokationTimer=null,this.initVideo()}return d(e,[{key:"drawVideoFrame",value:function(){this.ctx.drawImage(this.video,0,0),this.timer=Ti?this.video.requestVideoFrameCallback(this.boundDrawVideoFrame):requestAnimationFrame(this.boundDrawVideoFrame)}},{key:"initVideo",value:function(){var e=this,t=this.video;t.playsInline=!0,t.autoplay=Boolean(Ri),t.preload="",t.onplaying=this.onVideoPlay.bind(this),t.onpause=this.onVideoPause.bind(this),t.onseeked=this.onVideoSeeked.bind(this),t.ontimeupdate=this.onVideoTimeUpdate.bind(this),t.onloadeddata=this.onVideoReady.bind(this),t.onerror=this.onVideoError.bind(this),t.onended=this.onVideoEnd.bind(this),this.initTimeout=setTimeout((function(){return e.onVideoError()}),6e3),t.src=this.url}},{key:"onVideoReady",value:function(){var e=this.video,t=this.canvas;clearTimeout(this.initTimeout),this.callback.onDuration(e.duration),t.width=e.videoWidth,t.height=e.videoHeight,this.ac=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.ac.createGain(),this.ac.createMediaElementSource(e).connect(this.gainNode),this.gainNode.connect(this.ac.destination),Ti&&(this.timer=e.requestVideoFrameCallback(this.boundDrawVideoFrame)),this.callback.performAction(this.onVideoAction.bind(this));try{this.ctx.drawImage(e,0,0)}catch(e){return void(this.errorCallback&&this.errorCallback(e))}this.callback.onReady(),e.autoplay&&setTimeout((function(){e.pause(),e.currentTime=0}))}},{key:"onVideoAction",value:function(e,t){return"play"===e?this.onPlayAction():"pause"===e?this.onPauseAction():("time"===e?this.onTimeAction(t):"volume"===e&&this.onVolumeAction(t),Promise.resolve())}},{key:"onPlayAction",value:function(){var e=this.video;return e.paused&&!this.isPlaying?e.play().then((function(){return e.paused}),(function(){return e.paused})):Promise.resolve(e.paused)}},{key:"onPauseAction",value:function(){var e=this.video;return!e.paused&&this.isPlaying&&e.pause(),Promise.resolve(e.paused)}},{key:"onTimeAction",value:function(e){var t=this.video;this.blockTimeUpdate=!0,e>=t.duration?t.currentTime=t.duration-.1:t.currentTime=e,this.blockTimeUpdate=!1}},{key:"onVolumeAction",value:function(e){this.gainNode&&(this.gainNode.gain.value=e)}},{key:"onVideoPlay",value:function(){this.isPlaying=!0,Ti||(this.timer=requestAnimationFrame(this.boundDrawVideoFrame)),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null)}},{key:"onVideoPause",value:function(){this.isPlaying=!1,!Ti&&this.timer&&cancelAnimationFrame(this.timer)}},{key:"onVideoSeeked",value:function(){Ti||this.isPlaying||this.ctx.drawImage(this.video,0,0)}},{key:"onVideoTimeUpdate",value:function(){this.blockTimeUpdate||this.callback.onTimeUpdate(this.video.currentTime)}},{key:"onVideoError",value:function(){var e=this.video,t=e&&e.error?e.error:new TypeError("VideoPlayer failed");p.error("VideoPlayer failed",t),this.errorCallback&&this.errorCallback(t)}},{key:"onVideoEnd",value:function(){this.callback.onEnd()}},{key:"initCanvasStream",value:function(){this.ctx.drawImage(this.video,0,0),this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)}},{key:"invokeStream",value:function(e){var t=U(this.canvas.captureStream(25).getVideoTracks(),1)[0];t.canvas||(t.type="canvas-track",t.canvas=this.canvas);var n=new MediaStream([t]);return this.acOut=this.ac.createMediaStreamDestination(),this.gainNode.connect(this.acOut),this.ac.createMediaStreamSource(e).connect(this.acOut),this.acOut.stream.getAudioTracks().forEach((function(e){return n.addTrack(e)})),this.userMediaStream=e,this.micOnlyStream=new MediaStream(e.getAudioTracks().concat(t)),this.isPlaying||(this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)),n}},{key:"isStreaming",value:function(){return Boolean(this.micOnlyStream)}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"destroy",value:function(){var e=this,t=this.video;clearTimeout(this.initTimeout),this.url&&(URL.revokeObjectURL(this.url),this.url=null),this.timer&&(Ti?t.cancelVideoFrameCallback(this.timer):cancelAnimationFrame(this.timer),this.timer=null),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null),this.userMediaStream&&(vt(this.userMediaStream),this.userMediaStream=null),this.micOnlyStream&&(vt(this.micOnlyStream),this.micOnlyStream=null),this.acOut&&(vt(this.acOut.stream),this.acOut=null),this.ac&&(this.gainNode.disconnect(),this.ac.close().then((function(){e.ac=null,e.gainNode=null}))),t&&(t.pause(),t.onplaying=null,t.onpause=null,t.ontimeupdate=null,t.onloadeddata=null,t.onseeked=null,t.onerror=null,t.onended=null,this.video=null),this.callback=null,this.errorCallback=null,this.ctx=null,this.canvas=null,this.boundDrawVideoFrame=null}}]),e}();function Pi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Mi=function(e){g(n,e);var t=Pi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=function(e){p.error("StartMediaEvent",e);var n=e&&(e instanceof MediaError||e instanceof DOMException)?"error_VideoError":"error_TypeError";t.emit({type:"warning",name:n}),t.emit({type:"stop_presenting"})};try{t.videoPlayer=new _i(e),t.videoPlayer.onError(n)}catch(e){n(e)}}}]),n}(w);function Ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Oi=function(e){g(n,e);var t=Ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.lockMeeting()}}]),n}(w);function Di(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Ai=function(e){g(n,e);var t=Di(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.terminateMeeting()}}]),n}(w);function Ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Bi=function(e){g(n,e);var t=Ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.kickUser(e.userId)}}]),n}(w);function Li(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fi=function(e){g(n,e);var t=Li(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");t.vbgMixer&&("suspend"===e.state?(t.vbgMixer.suspend(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.suspend()):"resume"===e.state&&(t.vbgMixer.resume(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.resume()))}}]),n}(w);function ji(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vi=function(e){e.micMixer&&(e.micMixer.destroy(),e.micMixer=null)},Ui=function(e){var t="error_Screen_".concat(e.name);return e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),t};const Ni=function(e){g(r,e);var t,n=ji(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.surface,r=null,i=this.context._session){e.next=5;break}throw new Error("Session does not exist");case 5:return e.prev=5,o=new Ln({surface:n}),e.next=9,o.getDisplayMedia();case 9:r=e.sent,e.next=17;break;case 12:return e.prev=12,e.t0=e.catch(5),p.error("ScreenVideoChangeEvent",e.t0),i.emit({type:"warning",name:Ui(e.t0)}),e.abrupt("return");case 17:return Vi(i),i.micMixer=new Fn,s={audio:i.localStream.getAudioTracks()[0].enabled,video:!1,screen:!0,surface:n,micMixer:i.micMixer,screenStream:r},e.prev=20,e.next=23,new Ln(s).start();case 23:a=e.sent,c=Rt(a),u=U(c,1),(l=u[0])&&l.addEventListener("ended",(function(){i.emit({type:"stop_screen_video"})})),i.setStream(a),e.next=35;break;case 29:e.prev=29,e.t1=e.catch(20),p.error("ScreenVideoChangeEvent",e.t1),Vi(i),i.emit({type:"screen_capture_error",name:Ui(e.t1)}),i.emit({type:"screen_video_ended"});case 35:case"end":return e.stop()}}),e,this,[[5,12],[20,29]])}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hi=function(e){g(n,e);var t=Wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.emit({type:"screen_video_ended"})}}]),n}(w);var zi=Xe.isIOSDevice();const Gi=function(){function e(){c(this,e),this.tempAudioTrack=null,this.tempVideoTrack=null,this.audioTrack=null,this.videoTrack=null,this.audioEnded=null,this.videoEnded=null,this.boundOnAudioEnd=this.onAudioEnd.bind(this),this.boundOnVideoEnd=this.onVideoEnd.bind(this),this.listeners=[]}return d(e,[{key:"addAudioTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempAudioTrack=e)}},{key:"addVideoTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempVideoTrack=e)}},{key:"applyTempTracks",value:function(){this.clearTracks(),this.tempAudioTrack&&(this.audioTrack=this.tempAudioTrack,this.tempAudioTrack=null,this.audioTrack.addEventListener("ended",this.boundOnAudioEnd)),this.tempVideoTrack&&(this.videoTrack=this.tempVideoTrack,this.tempVideoTrack=null,this.videoTrack.addEventListener("ended",this.boundOnVideoEnd))}},{key:"discardTempTracks",value:function(){this.tempAudioTrack=null,this.tempVideoTrack=null}},{key:"onAudioEnd",value:function(){var e=this;if(this.videoEnded)return clearTimeout(this.videoEnded),void this.emit({type:"all_devices_ended"});this.audioEnded=setTimeout((function(){e.videoEnded?(clearTimeout(e.videoEnded),e.emit({type:"all_devices_ended"})):e.emit({type:"audio_device_ended"})}),1e3)}},{key:"onVideoEnd",value:function(){var e=this;this.videoEnded=setTimeout((function(){e.audioEnded||e.emit({type:"video_device_ended"})}),1e3)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"clearTracks",value:function(){clearTimeout(this.audioEnded),clearTimeout(this.videoEnded),this.audioTrack&&(this.audioTrack.removeEventListener("ended",this.boundOnAudioEnd),this.audioTrack=null),this.videoTrack&&(this.videoTrack.removeEventListener("ended",this.boundOnVideoEnd),this.videoTrack=null),this.audioEnded=null,this.videoEnded=null}},{key:"destroy",value:function(){this.listeners.length=0,this.discardTempTracks(),this.clearTracks()}}]),e}();const qi=function(){function e(t){c(this,e),this.video=null,this.stream=null,this.canvasStream=null,this.vbgMixer=null,this.deviceMonitor=null,this.session=t,this.isActive=!1,this.startTimer=null}var t,n,r,i,o,s;return d(e,[{key:"start",value:(s=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.session,Xe.hasPipCamSupport()){e.next=4;break}return t.emit({type:"pip_cam_warning_unsupported"}),e.abrupt("return");case 4:return e.prev=4,this.startTimer=setTimeout((function(){return n.onError(new Error("Starting timeout 5s"))}),5e3),this.initFakeStream(),e.next=9,this.initVideoAndPip();case 9:return e.next=11,this.initCamera();case 11:clearTimeout(this.startTimer),this.isActive=!0,t.emit({type:"pip_cam",active:!0}),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return s.apply(this,arguments)})},{key:"onError",value:function(e){var t=this.session;clearTimeout(this.startTimer),p.error("PipCam error",e),t?(t.emit({type:"pip_cam_error"}),t.emit({type:"stop_pip_cam"})):this.stop()}},{key:"updateCamera",value:(o=Qe(et().mark((function e(){var t,n,r,i,o,s=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.isActive){e.next=2;break}return e.abrupt("return");case 2:return t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,this.startTimer=setTimeout((function(){return s.onError(new Error("Starting timeout 5s"))}),5e3),e.prev=4,t.srcObject=r,e.next=8,t.play();case 8:return o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),e.next=13,this.initCamera();case 13:clearTimeout(this.startTimer),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return o.apply(this,arguments)})},{key:"initFakeStream",value:function(){var e=f.widescreen,t=document.createElement("canvas"),n=t.getContext("2d",{alpha:!1});t.width=640,t.height=e?360:480,n.fillStyle="#404040",n.fillRect(0,0,t.width,t.height);var r=new Path2D(e?"M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z":"M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z");n.fillStyle="#212121",n.fill(r),this.canvasStream=t.captureStream()}},{key:"initVideoAndPip",value:(i=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=document.createElement("video"),this.video=t,t.muted=!0,t.playsInline=!0,t.onleavepictureinpicture=function(){return n.onExitPip()},t.onpause=function(e){var t=e.target;return n.onVideoPause(t)},t.srcObject=this.canvasStream,e.next=9,t.play();case 9:return e.next=11,t.requestPictureInPicture();case 11:case"end":return e.stop()}}),e,this)}))),function(){return i.apply(this,arguments)})},{key:"initCamera",value:(r=Qe(et().mark((function e(){var t,n,r,i=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(t=this.session.options.virtualBackground)&&(n=Bn.getStoredVirtualBackgroundType(),this.vbgMixer=new An("PipCam"),this.vbgMixer.changeBackground(n)),this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(e){return i.onDeviceEvent(e)})),r={audio:!1,video:!0,virtualBackground:t,vbgMixer:this.vbgMixer,deviceMonitor:this.deviceMonitor},e.next=7,new Ln(r).start();case 7:return this.stream=e.sent,this.video.srcObject=this.stream,e.next=11,this.video.play();case 11:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"onExitPip",value:function(){this.session?this.session.emit({type:"stop_pip_cam"}):this.stop()}},{key:"onVideoPause",value:function(e){setTimeout((function(){return e.play().catch((function(){}))}))}},{key:"onDeviceEvent",value:function(e){e.type.endsWith("_ended")&&(clearTimeout(this.startTimer),this.session?(this.session.emit({type:"pip_cam_warning_video_ended"}),this.session.emit({type:"stop_pip_cam"})):this.stop())}},{key:"stop",value:(n=Qe(et().mark((function e(){var t,n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,clearTimeout(this.startTimer),!t){e.next=15;break}if(t.onpause=null,t.onleavepictureinpicture=null,document.pictureInPictureElement!==t){e.next=13;break}return e.prev=6,e.next=9,document.exitPictureInPicture();case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(6);case 13:t.srcObject=null,this.video=null;case 15:o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),r&&(vt(r),this.canvasStream=null),this.isActive&&(this.session&&this.session.emit({type:"pip_cam",active:!1}),this.isActive=!1);case 20:case"end":return e.stop()}}),e,this,[[6,11]])}))),function(){return n.apply(this,arguments)})},{key:"destroy",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.stop();case 2:this.session=null;case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}();function $i(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ji=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?e.emit({type:"pip_cam",active:e.pipCam.isActive}):(e.pipCam=new qi(e),e.pipCam.start())}}]),n}(w),Ki=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?(e.pipCam.destroy(),e.pipCam=null):e.emit({type:"pip_cam",active:!1})}}]),n}(w),Xi=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam&&e.pipCam.updateCamera()}}]),n}(w);function Yi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Qi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h,f;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),o=lt(n.localStream),e.next=6,new Ar(this.context).handle({audio:i,video:o});case 6:if(!((s=n.localStream.getAudioTracks())&&s.length>0)){e.next=16;break}return a=U(s,1),c=a[0],e.next=11,Bn.fetchInputDevices();case 11:u=e.sent,l=c.getSettings(),d=l.deviceId,h=u.find((function(e){return e.deviceId===d})),Xe.canMultipleDifferentMicrophones()||((f=nt.load("mediaConstraints")).audio={deviceId:{exact:d}},nt.store("mediaConstraints",f),nt.store("audioId",d)),h&&(t.newAudioDevice=h.label);case 16:e.next=21;break;case 18:e.prev=18,e.t0=e.catch(1),p.error("AudioDeviceEndEvent",e.t0);case 21:R(k(r.prototype),"handle",this).call(this,t);case 22:case"end":return e.stop()}}),e,this,[[1,18]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),Zi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Ar(this.context).handle({audio:i,video:!1});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(1),p.error("VideoDeviceEndEvent",e.t0);case 10:R(k(r.prototype),"handle",this).call(this,t);case 11:case"end":return e.stop()}}),e,this,[[1,7]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),eo=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Ar(this.context).handle({audio:i,video:!1});case 5:if(!((o=n.localStream.getAudioTracks())&&o.length>0)){e.next=15;break}return s=U(o,1),a=s[0],e.next=10,Bn.fetchInputDevices();case 10:c=e.sent,u=a.getSettings(),l=u.deviceId,d=c.find((function(e){return e.deviceId===l})),Xe.canMultipleDifferentMicrophones()||((h=nt.load("mediaConstraints")).audio={deviceId:{exact:l}},nt.store("mediaConstraints",h),nt.store("audioId",l)),d&&(t.newAudioDevice=d.label);case 15:e.next=20;break;case 17:e.prev=17,e.t0=e.catch(1),p.error("AllDevicesEndEvent",e.t0);case 20:R(k(r.prototype),"handle",this).call(this,t);case 21:case"end":return e.stop()}}),e,this,[[1,17]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),to=function(){function e(){c(this,e),this.listeners=[],this._eyeson=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null,this.send=this.send.bind(this)}return d(e,[{key:"destroy",value:function(){this._monitor&&this._monitor.destroy(),this._connection&&this._connection.close(),this._rtConnection&&this._rtConnection.close(),this._session&&(this._session.vbgMixer&&(this._session.vbgMixer.stopOriginalStream(),this._session.vbgMixer.terminate(),this._session.vbgMixer.destroy()),this._session.end()),this._api=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null}},{key:"connection",get:function(){return null},set:function(e){this._connection?p.error("A connection is already set. If you are trying to start a new session you have to end the current one first."):(this._connection=e,this._connection.onMessage(this.send))}},{key:"rtConnection",get:function(){return null},set:function(e){this._rtConnection?p.error("A real-time connection is already set. If you are trying to start a new session you have the close the current before."):(this._rtConnection=e,this._rtConnection.onMessage(this.send))}},{key:"monitor",get:function(){return this._monitor},set:function(e){this._monitor?p.error("A monitor is already set. If you are trying to start a new session you have to end the current one first."):(this._monitor=e,this._monitor.onEvent(this.send))}},{key:"session",get:function(){return null},set:function(e){this._session?p.error("A session is already set. If you are trying to start a new session you have to end the current one first."):(this._session=e,this._session.onEvent(this.send))}},{key:"api",get:function(){return null},set:function(e){this._api=e}},{key:"rtData",get:function(){return null},set:function(e){this._rtData=e}},{key:"eyeson",get:function(){return null},set:function(e){this._eyeson=e}},{key:"onReceive",value:function(e){p.debug("EventHandler::onReceive"),this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"send",value:function(e){e.silenced||p.debug("EventHandler::send",e),new({stfu:F,chat:Mr,accept:Vr,podium:Wn,snapshot:zn,send_chat:Jn,set_layer:qn,set_layout:Qn,fetch_room:Cr,room_ready:kr,room_setup:kr,memberlist:ai,upload_file:_r,delete_file:Tr,request_stfu:A,change_stream:Ar,replace_stream:Br,toggle_camera:Fr,stop_playback:T,playback_update:F,start_playback:x,start_stream:Or,stop_recording:Nr,start_screen_capture:$r,stop_broadcasts:Zr,start_recording:Gr,stop_presenting:Yr,start_presenting:Kr,stop_annotation:O,start_annotation:E,clear_front_layer:ti,request_guest_user:ri,voice_activity_raw:Hr,start_mixer:Ci,update_mixer:xi,lock_meeting:Oi,terminate_meeting:Ai,kick_user:Bi,session_termination:oi,start_media:Mi,change_screen_video:Ni,stop_screen_video:Hi,stop_rtmp:Xn,start_rtmp:er,suspend_virtual_background:Fi,audio_device_ended:Qi,video_device_ended:Zi,all_devices_ended:eo,start_pip_cam:Ji,stop_pip_cam:Ki,update_pip_cam:Xi,capture_error:F,voice_activity:F,options_update:F,ext_not_installed:F,broadcasts_update:F,presentation_ended:F,recording:B,ext_cancel:B,ext_installed:B,message_status:B,moderator_info:B}[e.type]||P)(this).handle(e)}}]),e}();const no=to;var ro=function(e){return e.replace("o=-","o=Visoweb")},io=function(e){var t=e.split("\r\n"),n=t.findIndex((function(e){return e.startsWith("t=")})),r=1;return Xe.canSFU()&&(t.splice(n+r,0,"a=sfu-capable"),r++,Xe.disallowAudioSyncSrcChange()&&(t.splice(n+r,0,"a=disallow-audio-ssrc-change"),r++)),Xe.canDataChannel()&&t.splice(n+r,0,"a=eyeson-datachan-capable","a=eyeson-datachan-keepalive","a=eyeson-sepp-messaging"),t.join("\r\n")},oo=function(e){var t=Xe.canStereo(),n=e.match(/^a=rtpmap:(\d+) opus/m);if(n){var r=new RegExp("^a=fmtp:".concat(n[1]," (.+)$"),"m"),i=e.match(r);if(i){var o={};i[1].split(";").forEach((function(e){var t=U(e.split("="),2),n=t[0],r=t[1];o[n]=r})),o.stereo=t?"1":"0";var s=Object.entries(o).map((function(e){var t=U(e,2),n=t[0],r=t[1];return"".concat(n,"=").concat(r)})).join(";");return e.replace(r,"a=fmtp:".concat(n[1]," ").concat(s))}}return e},so=function(e){var t=e.split("\r\n"),n=!1;return t.forEach((function(e,r){e.startsWith("m=audio")||e.startsWith("m=video")?n=!0:e.startsWith("m=application")?n=!1:"a=sendrecv"===e&&n&&(t[r]="a=sendonly")})),t.join("\r\n")},ao=function(e){var t={active:[oo],passive:[ro,io]};return!0===e.sendOnly&&t.active.push(so),t};const co=function(){function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};c(this,e),this.options=r,this.options.RTCConstraints=Object.assign({},this.defaultRTCConstraints,{offerToReceiveVideo:!this.options.eco}),this.accepted=!1,this.listeners=[],this.restarting=!1,this.connection=t,this.comApi=n,this.sipSession=null,this.startAttempts=0,this.maxStartAttempts=3,this.tryAuthUpdate=!0,this.tryResume=!0,this.tryWaitResume=!0,this.resumeTimer=null,this.waitResumeTimer=null,this.end=this.end.bind(this),this.emit=this.emit.bind(this),this.setStream=this.setStream.bind(this),this.endSession=this.endSession.bind(this),this.initSession=this.initSession.bind(this),this.handleFailed=this.handleFailed.bind(this),this.handleAccept=this.handleAccept.bind(this),this.handleUnmute=this.handleUnmute.bind(this),this.restartSession=this.restartSession.bind(this),this.tryRecoveryFrom=this.tryRecoveryFrom.bind(this),this.terminateSession=this.terminateSession.bind(this),this.remoteDescriptionUpdate=this.remoteDescriptionUpdate.bind(this)}var t;return d(e,[{key:"peerConnection",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.peerConnection:null}},{key:"localStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.localStream:null}},{key:"remoteStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.remoteStream:null}},{key:"defaultRTCConstraints",get:function(){return{offerToReceiveAudio:!0,offerToReceiveVideo:!0}}},{key:"start",value:function(){this.options.stream?this.initExternalStream():(this.initDeviceMonitor(),this.initVirtualBackground(),new Ln(this.options).start().then(this.initSession).catch(this.handleFailed))}},{key:"initExternalStream",value:function(){var e=!lt(this.options.stream)&&this.options.eco,t=Gt(this.options.stream,e);t?(this.externalStream=t,this.options.audio=ut(t),this.options.video=lt(t),this.initSession(this.externalStream)):this.handleFailed({name:"invalid_stream"})}},{key:"initVirtualBackground",value:function(){var e=Bn.getStoredVirtualBackgroundType();this.vbgMixer=new An,this.vbgMixer.changeBackground(e),this.options.vbgMixer=this.vbgMixer}},{key:"initDeviceMonitor",value:function(){var e=this;this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(t){return e.emit(t)})),this.options.deviceMonitor=this.deviceMonitor}},{key:"buildSessionOptions",value:function(e){var t=this.options;return!0===t.sendOnly&&(t.RTCConstraints={}),{stream:e,sendOnly:t.sendOnly,SDPModifiers:ao({sendOnly:t.sendOnly}),connection:this.connection,handleAccept:this.handleAccept,handleUnmute:this.handleUnmute,RTCConstraints:t.RTCConstraints,remoteDescriptionUpdate:this.remoteDescriptionUpdate,mediaOptions:{audio:t.audio,video:t.video}}}},{key:"initSession",value:function(e){var t=this;this.tryResume=!0,this.tryAuthUpdate=!0,this.tryWaitResume=!0;var n=this.buildSessionOptions(e);this.sipSession=this.connection.startSession(n),this.onUnmute(e),this.sipSession.onEvent((function(e){"accepted"===e.type?t.adjustVideoPodium():"resumed"===e.type?(clearTimeout(t.resumeTimer),clearTimeout(t.waitResumeTimer),t.tryResume=!0,t.tryAuthUpdate=!0,t.tryWaitResume=!0):"terminated"===e.type&&t.handleTermination(e.reason,e.code)})),this.externalStream&&(this.connection.hasExternalStream=!0),window&&window.addEventListener(Xe.isIOSDevice()?"pagehide":"beforeunload",this.endSession)}},{key:"end",value:function(){this.listeners=[],this.endSession(),this.accepted=!1,this.sipSession=null,this.connection=null}},{key:"endSession",value:function(){p.debug("ConferenceSession::endSession"),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),this.sipSession&&(this.sipSession.removeAllListeners(),this.terminateSession()),this.connection&&this.connection.close(),this.deviceMonitor&&this.deviceMonitor.destroy()}},{key:"terminateSession",value:function(){p.debug("ConferenceSession::terminateSession");try{this.sipSession.terminate()}catch(e){p.error(e)}}},{key:"setStream",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.sipSession){e.next=2;break}return e.abrupt("return",null);case 2:return e.prev=2,n=this.sipSession.sessionDescriptionHandler,e.next=6,n.setStream(t);case 6:return r=e.sent,this.stopPresentingSet=!1,this.micMixer&&this.micMixer.active&&(r.newStream=this.micMixer.getMicOnlyStream(),n.localStream=r.newStream),this.videoPlayer&&this.videoPlayer.isStreaming()&&(r.newStream=this.videoPlayer.getMicOnlyStream(),n.localStream=r.newStream),this.onUnmute(r.newStream),this.emit({type:"stream_update",localStream:r.newStream,stream:r.remoteStream}),e.abrupt("return",r.newStream);case 15:return e.prev=15,e.t0=e.catch(2),p.error("ConferenceSession::setStream",e.t0),this.emit({type:"stream_update",localStream:this.localStream,stream:this.remoteStream}),e.abrupt("return",this.localStream);case 20:case"end":return e.stop()}}),e,this,[[2,15]])}))),function(e){return t.apply(this,arguments)})},{key:"onUnmute",value:function(e){var t=this;e&&e.getTracks().forEach((function(e){e.onunmute=function(){return t.emit({type:"local_track_unmuted",track:e})}}))}},{key:"setMonitor",value:function(e){this.monitor=e}},{key:"handleAccept",value:function(e){this.monitor&&this.monitor.observe(this.peerConnection),this.accepted||(this.emit({type:"accept",session:this.sipSession}),this.accepted=!0),e&&this.emit({type:"stream_update",stream:e})}},{key:"handleUnmute",value:function(e){this.emit({type:"track_unmuted",track:e})}},{key:"remoteDescriptionUpdate",value:function(e){p.debug("ConferenceSession::remoteDescriptionUpdate",e.sdp);var t=!1,n=e.sdp.split("\r\n").find((function(e){return e.startsWith("a=sfu-mode")}));n&&(t=n.includes("on")),this.emit({type:"remote_description_update",update:{sfu:t}})}},{key:"adjustVideoPodium",value:function(){this.send({type:"mute_video",on:!this.options.video})}},{key:"handleTermination",value:function(e,t){var n=this;if(p.debug("ConfSession::handleTermination",e,t),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),"bye"===e&&200===t||"terminate"===e)this.handleExit();else if("disconnect"===e)if(-1===t){if(this.tryAuthUpdate)return this.tryAuthUpdate=!1,void this.comApi.getRoom((function(e){return n.connection.updateAuthAndRestartSession(e)}));if(this.tryWaitResume&&this.connection)return this.tryWaitResume=!1,this.waitResumeTimer=setTimeout((function(){n.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)}))}),5e3),void(this.resumeTimer=setTimeout((function(){n.handleFailed({name:503})}),15e3));this.handleFailed({name:503})}else{if(this.tryResume&&this.connection)return this.tryResume=!1,this.tryAuthUpdate=!1,this.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)})),void(this.resumeTimer=setTimeout((function(){return n.handleFailed({name:410})}),1e4));this.handleFailed({name:410})}else this.handleFailed({name:t});this.restarting||this.emit({type:"session_termination"})}},{key:"handleExit",value:function(){this.emit({type:"exit",reason:"bye"})}},{key:"handleFailed",value:function(e){p.warn("ConferenceSession::handleFailed: ",e),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer);var t="Desert";if(e&&e.name&&(t=e.name),!this.tryRecoveryFrom(t)){var n={NotFoundError:"devices",NotAllowedError:"permission",DevicesNotFoundError:"devices",PermissionDeniedError:"permission",NotReadableError:"not_readable",403:"session_in_use",410:"abrupt_disconnect",413:"request_too_large",426:"ice_error",486:"session_in_use",607:"meeting_locked"}[t]||"session_failed";this.emit({type:"error",name:n,code:this.errorCodeName(t,n)})}}},{key:"errorCodeName",value:function(e,t){return["permission","devices","not_readable","meeting_locked","session_in_use","transport_error"].includes(t)?"":String(e)}},{key:"tryRecoveryFrom",value:function(e){var t=this;p.debug("ConferenceSession::tryRecoveryFrom: ",e);var n={404:{condition:function(){return t.startAttempts<t.maxStartAttempts},action:function(){return t.restartSession()}}}[e];return this.startAttempts>=this.maxStartAttempts?(this.restarting=!1,!1):Boolean(n&&n.condition()&&n.action())}},{key:"restartSession",value:function(){var e=this;return p.debug("ConferenceSession::restartSession: ",this.startAttempts),this.restarting=!0,this.startAttempts+=1,setTimeout((function(){e.endSession(),e.start()}),1e3),!0}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"send",value:function(e){return this.connection.send(e)}}]),e}();function uo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return lo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return lo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function lo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ho={NO_CONNECTION:3,BAD:2,OK:1,GOOD:0},fo=function(e,t){e.length<3?e.push(Object.assign({},t)):Object.assign(function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time<t.time&&(t=e[r]);return t}(e),t)},po=function(e){var t,n=e.length,r={jitter:0,packetLoss:0,roundTripTime:0,nack:0,bitrateSend:0,bitrateRecv:0,status:ho.GOOD},i=function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time>t.time&&(t=e[r]);return t}(e),o=uo(e);try{for(o.s();!(t=o.n()).done;){var s=t.value;r.jitter+=s.jitter,r.packetLoss+=s.packetLoss,r.roundTripTime+=s.roundTripTime,r.nack+=s.nack,r.bitrateSend+=s.bitrateSend,r.bitrateRecv+=s.bitrateRecv}}catch(e){o.e(e)}finally{o.f()}return r.jitter=null===i.jitter?null:r.jitter/n,r.packetLoss=null===i.packetLoss?null:r.packetLoss/n,r.roundTripTime=null===i.roundTripTime?null:r.roundTripTime/n,r.nack=null===i.nack?null:r.nack/n,r.bitrateSend/=n,r.bitrateRecv/=n,r.status=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n>1||e>.2||t>.5||r>.2?ho.BAD:n>.3||e>.1||t>.3||r>.1?ho.OK:ho.GOOD}(r.packetLoss,r.jitter,r.roundTripTime,r.nack),r},mo=function(){function e(){c(this,e),this.peerConnection=null,this.timer=null,this.listeners=[],this.history=[],this.entry={jitter:0,packetLoss:0,roundTripTime:0,nack:0,time:0,bitrateSend:0,bitrateRecv:0},this.lastStat={time:null,bytesSent:null,bytesReceived:null,audio:{out:{packetsSent:null,packetsLost:null,bytesSent:null},in:{packetsReceived:null}},video:{out:{packetsSent:null,packetsLost:null,bytesSent:null,nackCount:null},in:{bytesReceived:null}}},this.boundPrintStats=this.printStats.bind(this)}var t;return d(e,[{key:"init",value:function(e){this.peerConnection=e}},{key:"printStats",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.peerConnection,n=this.entry,r=this.lastStat,i=this.history,e.next=3,t.getStats();case 3:o=e.sent,s=Date.now(),a=null,Object.keys(n).forEach((function(e){n[e]=0})),n.jitter=null,n.packetLoss=null,n.roundTripTime=null,n.nack=null,n.time=s,o.forEach((function(e){if("inbound-rtp"===e.type){var t=e.kind||e.mediaType;if(r.time){var i=(s-r.time)/1e3,c=Math.max(e.bytesReceived-r[t].in.bytesReceived,0);n.bitrateRecv+=8*c/i}r[t].in.bytesReceived=e.bytesReceived}else if("outbound-rtp"===e.type){var u=e.kind||e.mediaType;if(r.time){var l=(s-r.time)/1e3,d=e.bytesSent-r[u].out.bytesSent;n.bitrateSend+=8*d/l}r[u].out.bytesSent=e.bytesSent}else if("remote-inbound-rtp"===e.type){var h=e.kind||e.mediaType;if(r[h]){var f=o.get(e.localId),p=void 0!==e.roundTripTime,m=void 0!==e.jitter,v=void 0!==e.packetsLost,y=void 0!==f.nackCount;if(r.time){var g=e.packetsLost-r[h].out.packetsLost,b=f.packetsSent-r[h].out.packetsSent,S=b>0?g/b:0;if(n.jitter=m?Math.max(n.jitter,b>0?e.jitter:0):null,n.packetLoss=v?Math.max(n.packetLoss,S):null,n.roundTripTime=p?Math.max(n.roundTripTime,e.roundTripTime):null,"video"===h){var k=f.nackCount-r[h].out.nackCount,w=b>0?k/b:0;n.nack=y?Math.max(n.nack,w):null}}"video"===h&&(r[h].out.nackCount=f.nackCount),r[h].out.packetsSent=f.packetsSent,r[h].out.packetsLost=e.packetsLost}}else"candidate-pair"===e.type&&"succeeded"===e.state&&"currentRoundTripTime"in e&&(a=e.currentRoundTripTime)})),null===n.roundTripTime&&null!==a&&(n.roundTripTime=a),fo(i,n),c=po(i),!1===navigator.onLine&&(c.status=ho.BAD),["disconnected","failed","closed"].includes(t.iceConnectionState)&&(c.status=ho.NO_CONNECTION),this.emit(c),r.time=s;case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"getCurrentStatistics",value:function(){return po(this.history)}},{key:"onUpdate",value:function(e){var t=this.listeners,n=this.timer;0===t.length&&null===n&&(this.timer=setInterval(this.boundPrintStats,1e3),this.peerConnection.addEventListener("iceconnectionstatechange",this.boundPrintStats),window.addEventListener("offline",this.boundPrintStats)),t.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){try{t(e)}catch(e){p.error("ConnectionStatistics::emit",e)}}))}},{key:"destroy",value:function(){clearInterval(this.timer),window.removeEventListener("offline",this.boundPrintStats),this.peerConnection&&(this.peerConnection.removeEventListener("iceconnectionstatechange",this.boundPrintStats),this.peerConnection=null),this.timer=null,this.history.length=0,this.listeners.length=0}}]),e}();mo.Status=ho;const vo=mo;const yo=function(){function e(){c(this,e),this.pc=null,this.statistics=new vo,this.listeners=[],this.disconnectTimer=null,this.prevIceState="initial",this.onOffline=this.onOffline.bind(this),this.handleIceStateChange=this.handleIceStateChange.bind(this),this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.addEventListeners()}return d(e,[{key:"addEventListeners",value:function(){window.addEventListener("offline",this.onOffline)}},{key:"onOffline",value:function(){this.emit({type:"offline"})}},{key:"observe",value:function(e){this.pc||(this.pc=e,this.pc.oniceconnectionstatechange=this.handleIceStateChange,this.pc.onconnectionstatechange=this.handleConnectionStateChange,this.statistics.init(e),this.emit({type:"statistics_ready",statistics:this.statistics}))}},{key:"destroy",value:function(){var e=this.pc,t=this.statistics;clearTimeout(this.disconnectTimer),t&&(t.destroy(),this.statistics=null),e&&(e.onconnectionstatechange=null,e.oniceconnectionstatechange=null,this.pc=null),window.removeEventListener("offline",this.onOffline)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"handleConnectionStateChange",value:function(e){e.currentTarget&&p.warn("connectionStateChange: ",e.currentTarget.connectionState)}},{key:"handleIceStateChange",value:function(e){var t=this;if(e.currentTarget){var n=e.currentTarget.iceConnectionState;"disconnected"===n&&(this.emit({type:"warning",name:"ice_disconnected"}),clearTimeout(this.disconnectTimer),this.disconnectTimer=window.setTimeout((function(){t.pc&&"connected"!==t.pc.iceConnectionState&&t.emit({type:"error",name:"ice_failed",code:"Goldfinger"})}),2e3)),"failed"===n&&this.emit({type:"error",name:"ice_failed",code:"Thunderball"}),"disconnected"===this.prevIceState&&["completed","connected"].includes(n)&&this.emit({type:"clear_warning",name:"ice_disconnected"}),this.prevIceState=n}}}]),e}();var go={logger:self.console,WebSocket:self.WebSocket},bo={log(...e){this.enabled&&(e.push(Date.now()),go.logger.log("[ActionCable]",...e))}};const So=()=>(new Date).getTime(),ko=e=>(So()-e)/1e3;class wo{constructor(e){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=e,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=So(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),bo.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=So(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),bo.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=So()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,bo.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=So(),bo.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout((()=>{this.reconnectIfStale(),this.poll()}),this.getPollInterval())}getPollInterval(){const{staleThreshold:e,reconnectionBackoffRate:t}=this.constructor;return 1e3*e*Math.pow(1+t,Math.min(this.reconnectAttempts,10))*(1+(0===this.reconnectAttempts?1:t)*Math.random())}reconnectIfStale(){this.connectionIsStale()&&(bo.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${ko(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?bo.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${ko(this.disconnectedAt)} s`):(bo.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return ko(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&ko(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){"visible"===document.visibilityState&&setTimeout((()=>{!this.connectionIsStale()&&this.connection.isOpen()||(bo.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())}),200)}}wo.staleThreshold=6,wo.reconnectionBackoffRate=.15;var Co={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:xo,protocols:To}=Co,Ro=To.slice(0,To.length-1),_o=[].indexOf;class Po{constructor(e){this.open=this.open.bind(this),this.consumer=e,this.subscriptions=this.consumer.subscriptions,this.monitor=new wo(this),this.disconnected=!0}send(e){return!!this.isOpen()&&(this.webSocket.send(JSON.stringify(e)),!0)}open(){return this.isActive()?(bo.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1):(bo.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${To}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new go.WebSocket(this.consumer.url,To),this.installEventHandlers(),this.monitor.start(),!0)}close({allowReconnect:e}={allowReconnect:!0}){if(e||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(bo.log(`Reopening WebSocket, current state is ${this.getState()}`),!this.isActive())return this.open();try{return this.close()}catch(e){bo.log("Failed to reopen WebSocket",e)}finally{bo.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}isProtocolSupported(){return _o.call(Ro,this.getProtocol())>=0}isState(...e){return _o.call(e,this.getState())>=0}getState(){if(this.webSocket)for(let e in go.WebSocket)if(go.WebSocket[e]===this.webSocket.readyState)return e.toLowerCase();return null}installEventHandlers(){for(let e in this.events){const t=this.events[e].bind(this);this.webSocket[`on${e}`]=t}}uninstallEventHandlers(){for(let e in this.events)this.webSocket[`on${e}`]=function(){}}}Po.reopenDelay=500,Po.prototype.events={message(e){if(!this.isProtocolSupported())return;const{identifier:t,message:n,reason:r,reconnect:i,type:o}=JSON.parse(e.data);switch(o){case xo.welcome:return this.monitor.recordConnect(),this.subscriptions.reload();case xo.disconnect:return bo.log(`Disconnecting. Reason: ${r}`),this.close({allowReconnect:i});case xo.ping:return this.monitor.recordPing();case xo.confirmation:return this.subscriptions.confirmSubscription(t),this.subscriptions.notify(t,"connected");case xo.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",n)}},open(){if(bo.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return bo.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(e){if(bo.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){bo.log("WebSocket onerror event")}};class Mo{constructor(e,t={},n){this.consumer=e,this.identifier=JSON.stringify(t),function(e,t){if(null!=t)for(let n in t){const r=t[n];e[n]=r}}(this,n)}perform(e,t={}){return t.action=e,this.send(t)}send(e){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(e)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class Eo{constructor(e){this.subscriptions=e,this.pendingSubscriptions=[]}guarantee(e){-1==this.pendingSubscriptions.indexOf(e)?(bo.log(`SubscriptionGuarantor guaranteeing ${e.identifier}`),this.pendingSubscriptions.push(e)):bo.log(`SubscriptionGuarantor already guaranteeing ${e.identifier}`),this.startGuaranteeing()}forget(e){bo.log(`SubscriptionGuarantor forgetting ${e.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter((t=>t!==e))}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout((()=>{this.subscriptions&&"function"==typeof this.subscriptions.subscribe&&this.pendingSubscriptions.map((e=>{bo.log(`SubscriptionGuarantor resubscribing ${e.identifier}`),this.subscriptions.subscribe(e)}))}),500)}}class Oo{constructor(e){this.consumer=e,this.guarantor=new Eo(this),this.subscriptions=[]}create(e,t){const n="object"==typeof e?e:{channel:e},r=new Mo(this.consumer,n,t);return this.add(r)}add(e){return this.subscriptions.push(e),this.consumer.ensureActiveConnection(),this.notify(e,"initialized"),this.subscribe(e),e}remove(e){return this.forget(e),this.findAll(e.identifier).length||this.sendCommand(e,"unsubscribe"),e}reject(e){return this.findAll(e).map((e=>(this.forget(e),this.notify(e,"rejected"),e)))}forget(e){return this.guarantor.forget(e),this.subscriptions=this.subscriptions.filter((t=>t!==e)),e}findAll(e){return this.subscriptions.filter((t=>t.identifier===e))}reload(){return this.subscriptions.map((e=>this.subscribe(e)))}notifyAll(e,...t){return this.subscriptions.map((n=>this.notify(n,e,...t)))}notify(e,t,...n){let r;return r="string"==typeof e?this.findAll(e):[e],r.map((e=>"function"==typeof e[t]?e[t](...n):void 0))}subscribe(e){this.sendCommand(e,"subscribe")&&this.guarantor.guarantee(e)}confirmSubscription(e){bo.log(`Subscription confirmed ${e}`),this.findAll(e).map((e=>this.guarantor.forget(e)))}sendCommand(e,t){const{identifier:n}=e;return this.consumer.send({command:t,identifier:n})}}class Do{constructor(e){this._url=e,this.subscriptions=new Oo(this),this.connection=new Po(this)}get url(){return function(e){"function"==typeof e&&(e=e());if(e&&!/^wss?:/i.test(e)){const t=document.createElement("a");return t.href=e,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}return e}(this._url)}send(e){return this.connection.send(e)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}}function Ao(e=function(e){const t=document.head.querySelector(`meta[name='action-cable-${e}']`);if(t)return t.getAttribute("content")}("url")||Co.default_mount_path){return new Do(e)}const Io=function(){function e(t){c(this,e),this.channels={},this.onMessageHandler=this.defaultMessageHandler,this.onReceived=this.onReceived.bind(this),this.offMessage=this.offMessage.bind(this),this.onConnected=this.onConnected.bind(this),this.startSession=this.startSession.bind(this),this.onDisconnected=this.onDisconnected.bind(this),this.cable=Ao(t)}return d(e,[{key:"startSession",value:function(){this.channels.RoomChannel=this.cable.subscriptions.create({channel:"RoomChannel"},{connected:this.onConnected,received:this.onReceived,disconnected:this.onDisconnected}),this.channels.UserChannel=this.cable.subscriptions.create({channel:"UserChannel"},{received:this.onReceived})}},{key:"onConnected",value:function(){this.disconnectTimestamp&&this.handleReconnect(),p.debug("ActionCableConnection::onConnected")}},{key:"handleReconnect",value:function(){this.onMessageHandler({type:"reconnect"})}},{key:"onReceived",value:function(e){p.debug("ActionCableConnection::onReceived",e),e._src="actioncable",this.onMessageHandler(e)}},{key:"onDisconnected",value:function(){p.debug("ActionCableConnection::onDisconnected"),this.disconnectTimestamp=Date.now(),this.onMessageHandler({type:"disconnect"})}},{key:"onMessage",value:function(e){"function"==typeof e&&(this.onMessageHandler=e)}},{key:"offMessage",value:function(){this.onMessageHandler=this.defaultMessageHandler}},{key:"defaultMessageHandler",value:function(e){p.debug("ActionCableConnection::defaultMessageHandler: ",e)}},{key:"send",value:function(e){var t=e.channel,n=void 0===t?"RoomChannel":t,r=e.type,i=void 0===r?"ping":r,o=this.channels[n];o?o.perform(i):p.warn("ActionCableConnection::send no subscription found! ",n)}},{key:"close",value:function(){this.cable.disconnect(),this.offMessage(),this.channels={},this.cable=null}}]),e}();var Bo=function(e,t){return e.core.eventHandler.send({type:"connection",connectionStatus:t})},Lo=function(e){var t=e.core;Bo(e,"fetch_room"),t.eventHandler.eyeson=e,t.comApi.onError((function(){return t.eventHandler.send({type:"warning",name:"error:comapi"})})),t.comApi.getRoom((function(n){if(n.error)return p.warn("eyeson::prepareConnection",n.error),void Bo(e,"access_denied");Bo(e,"received_room"),t.rtConnection=new Io(n.links.websocket),t.eventHandler.rtConnection=t.rtConnection,t.rtConnection.startSession(),t.eventHandler.monitor=new yo,t.eventHandler.api=t.comApi,function(e){e.core.keepRoomAlive=setInterval((function(){e.core.rtConnection.send({type:"user_joins"})}),3e4)}(e),function(e){var t=1;e.core.pollingFallbackInterval=setInterval((function(){var n=e.core;return 200===t?(p.debug("eyeson::pollingFallback: max count exceeded, clearing interval."),void clearInterval(n.pollingFallbackInterval)):n.eventHandler._connection?(p.debug("eyeson::pollingFallback: connection set, clearing interval."),void clearInterval(n.pollingFallbackInterval)):void n.comApi.getRoom((function(e){if(!0===e.ready)return p.debug("eyeson::pollingFallback: room ready"),void n.eventHandler.send({type:"room_ready",content:e});p.debug("eyeson::pollingFallback: room not ready",t),t+=1}))}),5e3)}(e)}))},Fo=function(){function e(){c(this,e),this.config=h,this.core={eventHandler:new no},this.room={},this.user={},this.links={},this.options=f}return d(e,[{key:"onEvent",value:function(e){"function"==typeof e?this.core.eventHandler.onReceive(e):p.error("A listener to eyeson events has to be of type function. The argument passed to onEvent is of type "+a(e)+".")}},{key:"offEvent",value:function(e){this.core.eventHandler.removeListener(e)}},{key:"connect",value:function(e){p.debug("eyeson::connect",e),this.core.comApi=new m(this.config.api,e),Lo(this)}},{key:"join",value:function(e){p.debug("eyeson::join",e),function(e,t){var n=e.core;if(n.eventHandler._connection){var r=new co(n.eventHandler._connection,n.comApi,t);r.setMonitor(n.eventHandler.monitor),n.eventHandler.session=r,r.start(),function(e){var t=e.core,n=t.eventHandler._rtData.broadcasts;n&&t.eventHandler.send({type:"broadcasts_update",broadcasts:n})}(e),clearInterval(n.keepRoomAlive),e.session=r}else p.error("You tried to join a session that is not yet available. Before calling join, a connection status of connected has to be received.")}(this,e)}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{audio:!0,video:!0};p.debug("eyeson::start");this.onEvent((function e(r){"ready"===r.connectionStatus&&(t.offEvent(e),t.join(n))})),this.connect(e)}},{key:"destroy",value:function(){var e=this.core;p.debug("eyeson::destroy"),clearInterval(e.keepRoomAlive),clearInterval(e.pollingFallbackInterval),e.eventHandler.destroy(),e.eventHandler=new no}},{key:"send",value:function(e){return e._src="client",this.core.eventHandler.send(e)}},{key:"throttledSend",value:function(e){var t=this;return this._throttledSend||(this._throttledSend=v((function(e){return t.send(e)}),500)),this._throttledSend(e)}},{key:"createInstance",value:function(){return new e}}]),e}();const jo=new Fo;function Vo(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||V(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const Uo=function(){function e(t){c(this,e),this.roomUrl=t}return d(e,[{key:"search",value:function(e){return this.request("".concat(this.roomUrl,"/search?q=").concat(e)).then((function(e){return e.data}))}},{key:"random",value:function(){return this.request("".concat(this.roomUrl,"/random")).then((function(e){return e.data}))}},{key:"trending",value:function(){var e=this;return this.request("".concat(this.roomUrl,"/trending?limit=9")).then((function(t){var n=t.data;return e.staff().then((function(e){return[].concat(Vo(n),Vo(e))}))}))}},{key:"staff",value:function(){return this.request("".concat(this.roomUrl,"/staff")).then((function(e){return e.data}))}},{key:"randomForQuery",value:function(e){var t=this;return new Promise((function(n,r){t.search(e).then((function(e){return Array.isArray(e)?e.filter((function(e){return e.images.original_mp4.mp4_size>=4e4})):[]})).then((function(e){if(0===e.length)throw new TypeError("No data found");n(e[Math.floor(Math.random()*e.length)])})).catch(r)}))}},{key:"request",value:function(e){return fetch(new Request(e)).then((function(e){return e.json()})).catch((function(t){return p.warn("GiphyApi",e,t),{data:[]}}))}}]),e}();function No(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return Wo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Wo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Wo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const Ho=function(){function e(){c(this,e),this.level=0,this.instant=0,this.silenceDuration=0,this.intervalCounter=0,this.track=null,this.context=null,this.source=null,this.analyser=null,this.volumes=null,this.listener=[],this.timer=null,this.errorTimer=null,this.boundOnTrackEnded=this.onTrackEnded.bind(this),this.initError=!1,this.init()}return d(e,[{key:"init",value:function(){var e=window.AudioContext||window.webkitAudioContext;void 0!==e?(this.context=new e,this.context.onstatechange=function(e){var t=e.target;"suspended"===t.state&&p.error("SoundMeter::init AudioContext: ",t.state)}):p.error("AudioContext is not available. Probably the current user agent does not support this feature. Use the feature detector to hide not supported elements. Any call on onUpdate will not send values.")}},{key:"connectToSource",value:function(e){var t=this;if(!this.context)return this;if(!e||e.getAudioTracks().length<1)return this.initError=!0,this.onTrackEnded(),this;p.debug("SoundMeter::connectToSource",e);var n=U(e.getAudioTracks(),1);if(this.track=n[0],"live"!==this.track.readyState)return this.initError=!0,this.onTrackEnded(),this;this.track.addEventListener("ended",this.boundOnTrackEnded),this.source=this.context.createMediaStreamSource(e);var r=this.context.createAnalyser();return r.fftSize=512,r.minDecibels=-127,r.maxDecibels=0,r.smoothingTimeConstant=.5,this.source.connect(r),this.analyser=r,this.volumes=new Uint8Array(r.frequencyBinCount),!this.running&&this.listener.length>0&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100)),this}},{key:"analyse",value:function(){var e=this,t=this.analyser,n=this.volumes,r=this.level;if(t){t.getByteFrequencyData(n);var i,o=0,s=No(n);try{for(s.s();!(i=s.n()).done;){o+=i.value}}catch(e){s.e(e)}finally{s.f()}var a=o/n.length,c=Math.min(Math.round(100*a/127),100);if(0===r&&0===c&&10===this.intervalCounter&&(this.silenceDuration++,this.silenceDuration>30&&!this.errorTimer&&(this.errorTimer=setTimeout((function(){e.emit({warning:"MicrophoneSilenceWarning"}),e.resetSilenceCounter()}),1e3))),r!==c)this.silenceDuration>0&&this.resetSilenceCounter(),Math.abs(r-c)>=1&&(this.level=c,this.emit({value:c}));this.intervalCounter<10&&this.intervalCounter++}}},{key:"resetSilenceCounter",value:function(){clearTimeout(this.errorTimer),this.errorTimer=null,this.silenceDuration=0}},{key:"stop",value:function(){this.offUpdate(),this.track&&(this.track.removeEventListener("ended",this.boundOnTrackEnded),this.track=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.source&&(this.source.disconnect(),this.source=null),this.volumes=null,this.context&&this.context.stop&&"closed"!==this.context.state&&(this.context.onstatechange=null,this.context.close(),this.context=null)}},{key:"onUpdate",value:function(e){var t=this;this.listener.push(e),this.initError?this.onTrackEnded():!this.running&&this.context&&this.track&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100))}},{key:"offUpdate",value:function(){clearTimeout(this.errorTimer),this.listener.length=0,this.running&&(clearInterval(this.timer),this.running=!1)}},{key:"onTrackEnded",value:function(){this.emit({error:"EyesonMicrophoneError"}),this.stop()}},{key:"emit",value:function(e){this.listener.forEach((function(t){return t(e)}))}}]),e}();const zo=function(){function e(){c(this,e),this._listener=[],this._monitor=null,this._running=!1,this.state=null}var t;return d(e,[{key:"onUpdate",value:function(e){"function"==typeof e&&this._listener.push(e)}},{key:"offUpdate",value:function(e){"function"==typeof e?this._listener=this._listener.filter((function(t){return t!==e})):this._listener.length=0}},{key:"_emit",value:function(e){var t=e[e.length-1].state;t!==this.state&&(this.state=t,p.debug("SystemPressureMonitor::emit",t),this._listener.forEach((function(e){try{e(t)}catch(e){p.error("SystemPressureMonitor::emit",e)}})))}},{key:"start",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==Xe.canMonitorSystemPressure()){e.next=3;break}return p.error("SystemPressureMonitor is not supported"),e.abrupt("return");case 3:if(e.prev=3,this._monitor||(this._monitor=new PressureObserver(this._emit.bind(this),{sampleRate:1})),this._running){e.next=9;break}return e.next=8,this._monitor.observe("cpu");case 8:this._running=!0;case 9:null===this.state&&this._emit([{state:"nominal"}]),p.debug("SystemPressureMonitor::start"),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(3),p.error("SystemPressureMonitor::start",e.t0);case 16:case"end":return e.stop()}}),e,this,[[3,13]])}))),function(){return t.apply(this,arguments)})},{key:"stop",value:function(){this._monitor&&this._running&&(this._monitor.disconnect(),this._running=!1)}},{key:"destroy",value:function(){this.stop(),this.offUpdate(),this.state=null,this._monitor=null}}]),e}(),Go=jo})();var i=r._$,o=r.Nr,s=r.Lt,a=r.JN,c=r.L0,u=r.mM,l=r.Yd,d=r.qG,h=r.dm,f=r.DX,p=r.N2,m=r.D,v=r.Ds,y=r.ZP,g=r.j8,b=r.P2;export{i as ConnectionStatistics,o as DeviceManager,s as FeatureDetector,a as FullscreenHelper,c as GiphyApi,u as LocalStorage,l as Logger,d as MediaStreamBuilder,h as MicMixer,f as SoundMeter,p as StreamHelpers,m as SystemPressureMonitor,v as debounce,y as default,g as immediate,b as throttle}; +e.exports=i=function(){return n},e.exports.__esModule=!0,e.exports.default=e.exports;var t,n={},o=Object.prototype,s=o.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},c="function"==typeof Symbol?Symbol:{},u=c.iterator||"@@iterator",l=c.asyncIterator||"@@asyncIterator",d=c.toStringTag||"@@toStringTag";function h(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{h({},"")}catch(t){h=function(e,t,n){return e[t]=n}}function f(e,t,n,r){var i=t&&t.prototype instanceof S?t:S,o=Object.create(i.prototype),s=new A(r||[]);return a(o,"_invoke",{value:M(e,n,s)}),o}function p(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}n.wrap=f;var m="suspendedStart",v="suspendedYield",y="executing",g="completed",b={};function S(){}function k(){}function w(){}var C={};h(C,u,(function(){return this}));var x=Object.getPrototypeOf,T=x&&x(x(I([])));T&&T!==o&&s.call(T,u)&&(C=T);var R=w.prototype=S.prototype=Object.create(C);function _(e){["next","throw","return"].forEach((function(t){h(e,t,(function(e){return this._invoke(t,e)}))}))}function P(e,t){function n(i,o,a,c){var u=p(e[i],e,o);if("throw"!==u.type){var l=u.arg,d=l.value;return d&&"object"==r(d)&&s.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,c)}),(function(e){n("throw",e,a,c)})):t.resolve(d).then((function(e){l.value=e,a(l)}),(function(e){return n("throw",e,a,c)}))}c(u.arg)}var i;a(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,i){n(e,r,t,i)}))}return i=i?i.then(o,o):o()}})}function M(e,n,r){var i=m;return function(o,s){if(i===y)throw new Error("Generator is already running");if(i===g){if("throw"===o)throw s;return{value:t,done:!0}}for(r.method=o,r.arg=s;;){var a=r.delegate;if(a){var c=E(a,r);if(c){if(c===b)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(i===m)throw i=g,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);i=y;var u=p(e,n,r);if("normal"===u.type){if(i=r.done?g:v,u.arg===b)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(i=g,r.method="throw",r.arg=u.arg)}}}function E(e,n){var r=n.method,i=e.iterator[r];if(i===t)return n.delegate=null,"throw"===r&&e.iterator.return&&(n.method="return",n.arg=t,E(e,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),b;var o=p(i,e.iterator,n.arg);if("throw"===o.type)return n.method="throw",n.arg=o.arg,n.delegate=null,b;var s=o.arg;return s?s.done?(n[e.resultName]=s.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,b):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,b)}function O(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function D(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(O,this),this.reset(!0)}function I(e){if(e||""===e){var n=e[u];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function n(){for(;++i<e.length;)if(s.call(e,i))return n.value=e[i],n.done=!1,n;return n.value=t,n.done=!0,n};return o.next=o}}throw new TypeError(r(e)+" is not iterable")}return k.prototype=w,a(R,"constructor",{value:w,configurable:!0}),a(w,"constructor",{value:k,configurable:!0}),k.displayName=h(w,d,"GeneratorFunction"),n.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===k||"GeneratorFunction"===(t.displayName||t.name))},n.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,w):(e.__proto__=w,h(e,d,"GeneratorFunction")),e.prototype=Object.create(R),e},n.awrap=function(e){return{__await:e}},_(P.prototype),h(P.prototype,l,(function(){return this})),n.AsyncIterator=P,n.async=function(e,t,r,i,o){void 0===o&&(o=Promise);var s=new P(f(e,t,r,i),o);return n.isGeneratorFunction(t)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},_(R),h(R,d,"Generator"),h(R,u,(function(){return this})),h(R,"toString",(function(){return"[object Generator]"})),n.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},n.values=I,A.prototype={constructor:A,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(D),!e)for(var n in this)"t"===n.charAt(0)&&s.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function r(r,i){return a.type="throw",a.arg=e,n.next=r,i&&(n.method="next",n.arg=t),!!i}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var c=s.call(o,"catchLoc"),u=s.call(o,"finallyLoc");if(c&&u){if(this.prev<o.catchLoc)return r(o.catchLoc,!0);if(this.prev<o.finallyLoc)return r(o.finallyLoc)}else if(c){if(this.prev<o.catchLoc)return r(o.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return r(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&s.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,b):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),b},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),D(n),b}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;D(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:I(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),b}},n}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},698:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},687:(e,t,n)=>{var r=n(61)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={id:r,loaded:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var r={};(()=>{n.d(r,{_$:()=>vo,Nr:()=>Bn,Lt:()=>Xe,JN:()=>Je,L0:()=>Uo,mM:()=>nt,Yd:()=>p,qG:()=>Ln,dm:()=>Fn,DX:()=>Ho,N2:()=>s,D:()=>zo,Ds:()=>li,ZP:()=>Go,j8:()=>qt,P2:()=>v});var e={};n.r(e),n.d(e,{fixNegotiationNeeded:()=>le,shimAddTrackRemoveTrack:()=>ce,shimAddTrackRemoveTrackWithNative:()=>ae,shimGetDisplayMedia:()=>te,shimGetSendersWithDtmf:()=>ie,shimGetStats:()=>oe,shimGetUserMedia:()=>ee,shimMediaStream:()=>ne,shimOnTrack:()=>re,shimPeerConnection:()=>ue,shimSenderReceiverGetStats:()=>se});var t={};n.r(t),n.d(t,{shimAddTransceiver:()=>be,shimCreateAnswer:()=>we,shimCreateOffer:()=>ke,shimGetDisplayMedia:()=>he,shimGetParameters:()=>Se,shimGetUserMedia:()=>de,shimOnTrack:()=>fe,shimPeerConnection:()=>pe,shimRTCDataChannel:()=>ge,shimReceiverGetStats:()=>ve,shimRemoveStream:()=>ye,shimSenderGetStats:()=>me});var i={};n.r(i),n.d(i,{shimAudioContext:()=>Oe,shimCallbacksAPI:()=>Te,shimConstraints:()=>_e,shimCreateOfferLegacy:()=>Ee,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>Ce,shimRTCIceServerUrls:()=>Pe,shimRemoteStreamsAPI:()=>xe,shimTrackEventTransceiver:()=>Me});var o={};n.r(o),n.d(o,{removeExtmapAllowMixed:()=>Ve,shimAddIceCandidateNullOrEmpty:()=>Ue,shimConnectionState:()=>je,shimMaxMessageSize:()=>Le,shimParameterlessSetLocalDescription:()=>Ne,shimRTCIceCandidate:()=>Ie,shimRTCIceCandidateRelayProtocol:()=>Be,shimSendThrowTypeError:()=>Fe});var s={};function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e){var t=function(e,t){if("object"!==a(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==a(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===a(t)?t:String(t)}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function d(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}n.r(s),n.d(s,{captureStream:()=>zt,createExternalStream:()=>Gt,disableAudio:()=>dt,disableCamera:()=>Et,enableAudio:()=>ht,enableCamera:()=>Ot,getCameraTracks:()=>_t,getCanvasTracks:()=>It,getFacingMode:()=>Ht,getScreenAsVideoTracks:()=>Rt,getScreenPresentationTracks:()=>Tt,getScreenTracks:()=>xt,getVbgTracks:()=>Pt,hasAudio:()=>ut,hasCameraVideo:()=>Wt,hasVideo:()=>lt,isCameraStream:()=>Vt,isCanvasPresentationStream:()=>Ut,isCanvasStream:()=>Ft,isNinjaStreamTrack:()=>kt,isPresentationStream:()=>Nt,isScreenAsVideoTrack:()=>bt,isScreenPresentationStream:()=>Lt,isScreenStream:()=>Bt,isVBGStream:()=>jt,isVbgStreamTrack:()=>wt,stopCamera:()=>Mt,stopStream:()=>vt,stopTrack:()=>mt,toggleAudio:()=>ft,toggleCamera:()=>Dt,toggleVbgTrack:()=>At,toggleVideo:()=>pt});const h={api:"https://api.eyeson.team",allowSafariSFU:!0,screencapture:!0},f={widescreen:!1},p={error:function(){var e;return(e=console).error.apply(e,arguments)},warn:function(){var e;return(e=console).warn.apply(e,arguments)},info:function(){var e;return(e=console).log.apply(e,arguments)},debug:function(){var e;return console.debug?(e=console).debug.apply(e,arguments):null}};const m=function(){function e(t,n){c(this,e),this.uri=t,this.token=n.replace(/\W+/g,""),this.cache={users:[]},this.errorCallback=null,this._handleError=this._handleError.bind(this)}return d(e,[{key:"_request",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return fetch(new Request(this.uri+e),t).then((function(e){var t=e.headers.get("content-type");if(t&&-1!==t.indexOf("application/json")&&e.ok)return e.json();if(e.ok)return e.text();throw new Error("ComApiError: ".concat(e.status))}))}},{key:"_objectToFormData",value:function(e,t,n){var r=t||new FormData,i=null;for(var o in e){if(!e.hasOwnProperty(o))return;if(n)i=n+"["+(isNaN(parseInt(o))?o:"")+"]";else i=o;"object"!==a(e[o])||e[o]instanceof File?r.append(i,e[o]):this._objectToFormData(e[o],r,o)}return r}},{key:"_post",value:function(e,t){return this._request(e,{method:"POST",body:this._objectToFormData(t)})}},{key:"_put",value:function(e,t){var n=new FormData;for(var r in t)n.append(r,t[r]);return this._request(e,{method:"PUT",body:n})}},{key:"_handleError",value:function(e){return p.error("ComApi::handleError",e),this.errorCallback&&this.errorCallback(e),!1}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"getRoom",value:function(e){return this._request("/rooms/".concat(this.token)).then(e).catch((function(t){return e?e({error:t}):{error:t}}))}},{key:"terminateMeeting",value:function(){return this._request("/rooms/".concat(this.token),{method:"DELETE"}).catch(this._handleError)}},{key:"getUser",value:function(e,t){var n=this,r=this.cache.users.find((function(t){return t.id===e}));return r?(t(r),null):this._request("/rooms/".concat(this.token,"/users/").concat(e)).then((function(r){var i=n.cache.users.filter((function(t){return t.id!==e})),o=n.addUserAttributes(r,e,e);i.push(o),n.cache.users=i,t(o)})).catch(this._handleError)}},{key:"addUserAttributes",value:function(e,t,n){var r=e.avatar;try{r="".concat(e.avatar,"?size=large")}catch(t){p.warn("ComApi::addUserAttributes missing",e)}return Object.assign(e,{id:t,apiId:e.id,clientId:n,sipId:n,largeAvatar:r})}},{key:"kickUser",value:function(e){var t=this;return this._request("/rooms/".concat(this.token,"/users/").concat(e),{method:"DELETE"}).then((function(){if(t.cache.users.find((function(t){return t.id===e}))){var n=t.cache.users.filter((function(t){return t.id!==e}));t.cache.users=n}})).catch(this._handleError)}},{key:"requestUser",value:function(e,t){return this._post("/guests/".concat(this.token),{name:e.name,email:e.email,custom_fields:{locale:e.locale||"en"}}).then(t).catch((function(e){return t({error:e})}))}},{key:"startBroadcast",value:function(e,t){return this._post("/rooms/".concat(this.token,"/broadcasts"),{platform:t,player_url:e.playerUrl||"",stream_url:e.streamUrl})}},{key:"publishBroadcast",value:function(e,t){return this._put("/rooms/".concat(this.token,"/broadcasts/").concat(t),{player_url:e.playerUrl})}},{key:"stopBroadcast",value:function(e){return this._request("/rooms/".concat(this.token,"/broadcasts/").concat(e),{method:"DELETE"})}},{key:"stopAllBroadcasts",value:function(){return this._request("/rooms/".concat(this.token,"/broadcasts"),{method:"DELETE"})}},{key:"startRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"POST"})}},{key:"stopRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"DELETE"}).catch(this._handleError)}},{key:"setLayout",value:function(e){return this._post("/rooms/".concat(this.token,"/layout"),e).catch(this._handleError)}},{key:"setLayer",value:function(e){return this._post("/rooms/".concat(this.token,"/layers"),e).catch(this._handleError)}},{key:"clearFrontLayer",value:function(){return this._request("/rooms/".concat(this.token,"/layers/1"),{method:"DELETE"}).catch(this._handleError)}},{key:"takeSnapshot",value:function(){return this._request("/rooms/".concat(this.token,"/snapshot"),{method:"POST"}).catch(this._handleError)}},{key:"getSnapshot",value:function(e,t){var n=this;return this._request("/rooms/".concat(this.token,"/snapshots/").concat(e)).then(t).catch((function(e){t?t({error:e}):n._handleError(e)}))}},{key:"startPlayback",value:function(e){return this._post("/rooms/".concat(this.token,"/playbacks"),{playback:e}).catch(this._handleError)}},{key:"stopPlayback",value:function(e){return this._request("/rooms/".concat(this.token,"/playbacks/").concat(e.play_id),{method:"DELETE"}).catch(this._handleError)}},{key:"lockMeeting",value:function(){return this._request("/rooms/".concat(this.token,"/lock"),{method:"POST"}).catch(this._handleError)}}]),e}(),v=function(e,t,n){var r,i,o,s=null,a=0;n||(n={});var c=function(){a=!1===n.leading?0:Date.now(),s=null,o=e.apply(r,i),s||(r=i=null)};return function(){var u=Date.now();a||!1!==n.leading||(a=u);var l=t-(u-a);return r=this,i=arguments,l<=0||l>t?(s&&(clearTimeout(s),s=null),a=u,o=e.apply(r,i),s||(r=i=null)):s||!1===n.trailing||(s=setTimeout(c,l)),o}};function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e,t){if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return b(e)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}const w=function(){function e(t){c(this,e),this.context=t}return d(e,[{key:"handle",value:function(e){p.error("BaseEvent::handle is not implemented",e)}}]),e}();function C(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var x=function(e){g(n,e);var t=C(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.startPlayback(e.playback)}}]),n}(w),T=function(e){g(n,e);var t=C(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopPlayback(e.playback)}}]),n}(w);function R(){return R="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=k(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},R.apply(this,arguments)}function _(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const P=function(e){g(n,e);var t=_(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){"client"!==e._src&&(Reflect.deleteProperty(e,"_src"),this.context.listeners.forEach((function(t){return t(e)})))}}]),n}(w);function M(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var E=function(e){g(n,e);var t=M(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context.annotationLoop=window.setInterval((function(){e.context._api.createAnnotation((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"annotation",annotation:t})}),(function(){window.clearInterval(e.context.annotationLoop)}))}),1e3)}}]),n}(P),O=function(e){g(n,e);var t=M(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){window.clearInterval(this.context.annotationLoop),this.context._api.stopAnnotation()}}]),n}(P);function D(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const A=function(e){g(n,e);var t=D(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._rtConnection.send({type:"stfu"})}}]),n}(P);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const B=function(e){g(n,e);var t=I(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){}}]),n}(w);function L(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const F=function(e){g(n,e);var t=L(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context.listeners.forEach((function(t){return t(e)}))}}]),n}(w);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(e){if("string"==typeof e)return j(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}function U(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,s,a=[],c=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(a.push(r.value),a.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return a}}(e,t)||V(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}let N=!0,W=!0;function H(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function z(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function G(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(N=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function q(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(W=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function $(){if("object"==typeof window){if(N)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function J(e,t){W&&console.warn(e+" is deprecated, please use "+t+" instead.")}function K(e){return"[object Object]"===Object.prototype.toString.call(e)}function X(e){return K(e)?Object.keys(e).reduce((function(t,n){const r=K(e[n]),i=r?X(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function Y(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?Y(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{Y(e,e.get(t),n)}))})))}function Q(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&Y(e,n,i)}))})),i}const Z=$;function ee(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),Z("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return Z("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function te(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,o=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:o||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function ne(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function re(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else z(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function ie(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function oe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},o=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(o(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(o(i(t)))},n])})).then(n,r)}}function se(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ae(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function ce(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ae(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function ue(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function le(e,t){z(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}function de(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){J("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function he(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function fe(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function pe(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function me(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function ve(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function ye(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){J("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function ge(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function be(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function Se(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function ke(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function we(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function Ce(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function xe(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function Te(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function Re(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(_e(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function _e(e){return e&&void 0!==e.video?Object.assign({},e,{video:X(e.video)}):e}function Pe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;n<e.iceServers.length;n++){let r=e.iceServers[n];void 0===r.urls&&r.url?(J("RTCIceServer.url","RTCIceServer.urls"),r=JSON.parse(JSON.stringify(r)),r.urls=r.url,delete r.url,t.push(r)):t.push(e.iceServers[n])}e.iceServers=t}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function Me(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Ee(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Oe(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var De=n(539),Ae=n.n(De);function Ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=Ae().parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,z(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function Be(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||z(e,"icecandidate",(e=>{if(e.candidate){const t=Ae().parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function Le(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=Ae().splitSections(e.sdp);return t.shift(),t.some((e=>{const t=Ae().parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=Ae().matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function Fe(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},z(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function je(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function Ve(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function Ue(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function Ne(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const We=function({window:n}={},r={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const s=$,a=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=H(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=H(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=H(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(n),c={browserDetails:a,commonShim:o,extractVersion:H,disableLog:G,disableWarnings:q,sdp:De};switch(a.browser){case"chrome":if(!e||!ue||!r.shimChrome)return s("Chrome shim is not included in this adapter release."),c;if(null===a.version)return s("Chrome shim can not determine version, not shimming."),c;s("adapter.js shimming chrome."),c.browserShim=e,Ue(n,a),Ne(n),ee(n,a),ne(n),ue(n,a),re(n),ce(n,a),ie(n),oe(n),se(n),le(n,a),Ie(n),Be(n),je(n),Le(n,a),Fe(n),Ve(n,a);break;case"firefox":if(!t||!pe||!r.shimFirefox)return s("Firefox shim is not included in this adapter release."),c;s("adapter.js shimming firefox."),c.browserShim=t,Ue(n,a),Ne(n),de(n,a),pe(n,a),fe(n),ye(n),me(n),ve(n),ge(n),be(n),Se(n),ke(n),we(n),Ie(n),je(n),Le(n,a),Fe(n);break;case"safari":if(!i||!r.shimSafari)return s("Safari shim is not included in this adapter release."),c;s("adapter.js shimming safari."),c.browserShim=i,Ue(n,a),Ne(n),Pe(n),Ee(n),Te(n),Ce(n),xe(n),Me(n),Re(n),Oe(n),Ie(n),Be(n),Le(n,a),Fe(n),Ve(n,a);break;default:s("Unsupported browser!")}return c}({window:"undefined"==typeof window?void 0:window}),He=We;var ze=n(795),Ge=n.n(ze),qe=n(577),$e=n.n(qe);const Je=function(){function e(){c(this,e),this.onChange=this.onChange.bind(this),this.hasSupport=Boolean($e().isEnabled)}return d(e,[{key:"toggle",value:function(){return this.isFullscreen()?$e().exit():$e().request()}},{key:"canFullscreen",value:function(){return this.hasSupport}},{key:"isFullscreen",value:function(){return this.hasSupport&&$e().isFullscreen}},{key:"onChange",value:function(e){var t=this;this.hasSupport&&$e().on("change",(function(){return e(t.isFullscreen())}))}},{key:"off",value:function(){this.hasSupport&&$e().off("change")}}]),e}();var Ke=null;const Xe={environment:function(){return{canMix:this.canMix(),canPip:this.hasPipSupport(),canSFU:this.canSFU(),isPhone:this.isPhone(),inIframe:this.inIframe(),isIOSDevice:this.isIOSDevice(),canUseEyeson:this.canUseEyeson(),canFullscreen:this.canFullscreen(),hasMobileDevice:this.hasMobileDevice(),canToggleCamera:this.canToggleCamera(),canPresentFiles:this.canPresentFiles(),canScreenCapture:this.canScreenCapture(),canAdjustSettings:this.canAdjustDeviceSettings(),canStreamLocalMedia:this.canStreamLocalMedia(),isExperimentalBrowser:this.isExperimentalBrowser()}},platform:function(){return Ge()},canUseEyeson:function(){return!this.isWebView()&&this.hasGetUserMedia()&&this.canDataChannel()&&this.isMinimumRequiredBrowser()},hasGetUserMedia:function(){return"mediaDevices"in navigator&&"getUserMedia"in navigator.mediaDevices},hasGetDisplayMedia:function(){return"mediaDevices"in navigator&&"getDisplayMedia"in navigator.mediaDevices},hasPeerConnection:function(){return"RTCPeerConnection"in window},hasCaptureStream:function(){return"captureStream"in HTMLMediaElement.prototype||"mozCaptureStream"in HTMLMediaElement.prototype},hasCanvasCaptureSupport:function(){return"CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window},hasSenders:function(){return"RTCRtpSender"in window},hasTrackOnUnmute:function(){return!(this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())&&"onunmute"in MediaStreamTrack.prototype},hasWebpSupport:function(){return this.isChrome()?He.browserDetails.version>=70:!!this.isFF()&&He.browserDetails.version>=65},canChangeAudioOutput:function(){return!document||"setSinkId"in HTMLMediaElement.prototype},canChangeMicrophone:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canMultipleDifferentMicrophones:function(){return!(this.isFF()&&this.browserVersion()<101)},canChangeCamera:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canScreenCapture:function(){return!(!h.screencapture||this.isTestSuite()||!this.canUseEyeson()||this.hasMobileDevice())&&(this.hasGetDisplayMedia()||this.isFF()&&this.hasGetUserMedia())},canPresentFiles:function(){return!(this.isTestSuite()||!this.canUseEyeson()||this.isFF()&&He.browserDetails.version<=60||this.isIPhone()||this.isIOSDevice()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())},canStreamLocalMedia:function(){var e=window.AudioContext||window.webkitAudioContext;if("function"!=typeof e)return!1;var t=e.prototype;return["createGain","createMediaStreamSource","createMediaElementSource","createMediaStreamDestination"].every((function(e){return"function"==typeof t[e]}))&&this.hasCanvasCaptureSupport()},requiresLowerConstraints:function(){return this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser()},browserName:function(){return He.browserDetails.browser.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))},browserVersion:function(){return"safari"===He.browserDetails.browser?He.extractVersion(navigator.userAgent,/Version\/(\d+)\./,1):He.browserDetails.version},isEdge:function(){return"edge"===He.browserDetails.browser},isFF:function(){return"firefox"===He.browserDetails.browser},isChrome:function(){return"chrome"===He.browserDetails.browser},isSafari:function(){return"safari"===He.browserDetails.browser},isMinimumRequiredBrowser:function(){return this.isChrome()?this.isMinimumRequiredChrome():this.isFF()?this.isMinimumRequiredFF():!!this.isSafari()&&this.isMinimumRequiredSafari()},isMinimumRequiredEdge:function(){return!1},isMinimumRequiredFF:function(){return!!this.isFF()&&He.browserDetails.version>=52},isMinimumRequiredChrome:function(){return!!this.isChrome()&&He.browserDetails.version>=70},isMinimumRequiredSafari:function(){return!!this.isSafari()&&(this.browserVersion()>=10||this.isWorkingIOSBrowser())},isWorkingIOSBrowser:function(){var e=/ [a-zA-Z]+iOS\//.test(navigator.userAgent),t=navigator.userAgent.indexOf(" OPT/")>-1;return(e||t)&&this.hasGetUserMedia()},isExperimentalBrowser:function(){return["safari","edge"].includes(He.browserDetails.browser)},hasPipSupport:function(){return!document||Boolean("webkitSupportsPresentationMode"in HTMLVideoElement.prototype||"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled)},iOSPipCheck:function(){var e=this;return new Promise((function(t){var n=e.hasPipSupport();if(n&&e.isIOSDevice()){var r=document.createElement("video");r.preload="none",r.src="about:blank",r.onsuspend=function(){var e=r.webkitSupportsPresentationMode("picture-in-picture");t(e)}}else t(n)}))},isAndroidDevice:function(){return Boolean(navigator.userAgent.match(/Android/i))},isIOSDevice:function(){return(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!window.MSStream},isIPhone:function(){return(/iPhone/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1&&window.screen.height/window.screen.width>=1.5)&&!window.MSStream},isAndroidPhone:function(){var e=/(android)/i.test(navigator.userAgent),t=/(mobile)/i.test(navigator.userAgent);return e&&t},isMacOS:function(){return void 0!==navigator.userAgentData?"macOS"===navigator.userAgentData.platform:0===navigator.platform.indexOf("Mac")},inIframe:function(){try{return window.self!==window.top}catch(e){return!0}},isPhone:function(){return this.isIPhone()||this.isAndroidPhone()},hasMobileDevice:function(){return this.isIOSDevice()||this.isAndroidDevice()},isTouchDevice:function(){return Boolean("ontouchstart"in window||navigator.maxTouchPoints)},canDisplayTooltips:function(){return!this.isIOSDevice()&&!this.isTestSuite()},canAdjustDeviceSettings:function(){return!this.isIOSDevice()},canToggleCamera:function(){return!0},canDrawCamera:function(){return!this.isIOSDevice()},canMix:function(){return this.isChrome()&&this.canScreenCapture()&&this.hasCanvasCaptureSupport()},stopsDeviceActivityIndicatorOnDisable:function(){return!!this.isFF()},supportsBlurOnSVG:function(){return"undefined"!=typeof SVGElement&&void 0!==SVGElement.prototype.blur},hasLocalStorage:function(){try{var e="object"===a(window.localStorage)&&null!==window.localStorage;window.localStorage.setItem("eyeson.test","test");var t="test"===window.localStorage.getItem("eyeson.test");return e&&t}catch(e){return p.debug("FeatureDetector::hasLocalStorage:",e.message),!1}},canFullscreen:function(){return(new Je).canFullscreen()},isFullscreen:function(){return(new Je).isFullscreen()},canSFU:function(){var e=!1;if(this.isSafari()){if(!h.allowSafariSFU)return!1;if(this.isWorkingIOSBrowser())return!0;var t=navigator.userAgent.match(/Version\/(\d+).(\d+)/);t&&t.length>1&&(e=Number(t[1])<12||12===Number(t[1])&&Number(t[2])<1)}return!e&&!this.isTestSuite()},canDataChannel:function(){return this.hasPeerConnection()&&"function"==typeof RTCPeerConnection.prototype.createDataChannel&&"RTCDataChannel"in window},disallowAudioSyncSrcChange:function(){return this.isSafari()&&this.canSFU()},canShare:function(){return Boolean(navigator.share)},isWebView:function(){return/Version\/|wv/i.test(navigator.userAgent)&&this.isAndroidDevice()},isTestSuite:function(){return"test-suite"===He.browserDetails.browser},canVirtualBackground:function(){return!this.isIOSDevice()&&Boolean(window.WebAssembly)&&"function"==typeof WebAssembly.validate&&("function"==typeof WebAssembly.instantiateStreaming||"function"==typeof WebAssembly.instantiate)&&Boolean(window.CanvasRenderingContext2D)&&"function"==typeof window.ImageData&&"function"==typeof window.requestAnimationFrame},canvasBlurSupport:function(){if(null!==Ke)return Ke;if(!(window.CanvasRenderingContext2D&&"filter"in CanvasRenderingContext2D.prototype))return Ke=!1;var e=document.createElement("canvas"),t=document.createElement("canvas");e.width=10,e.height=10,t.width=10,t.height=10;var n=e.getContext("2d"),r=t.getContext("2d");n.filter="blur(5px)",n.fillStyle="#000000",n.fillRect(3,3,4,4),r.fillStyle="#000000",r.fillRect(3,3,4,4);var i=n.getImageData(5,5,1,1),o=r.getImageData(5,5,1,1);return Ke=i.data[3]!==o.data[3]},canStereo:function(){return!(this.isSafari()||this.isAndroidDevice())},canChooseDisplaySurface:function(){return this.hasGetDisplayMedia()&&navigator.mediaDevices.getSupportedConstraints().displaySurface},hasPipCamSupport:function(){return this.isChrome()&&this.hasPipSupport()},canMonitorSystemPressure:function(){return"function"==typeof window.PressureObserver&&Array.isArray(PressureObserver.supportedSources)&&PressureObserver.supportedSources.includes("cpu")}};function Ye(e,t,n,r,i,o,s){try{var a=e[o](s),c=a.value}catch(e){return void n(e)}a.done?t(c):Promise.resolve(c).then(r,i)}function Qe(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function s(e){Ye(o,r,i,s,a,"next",e)}function a(e){Ye(o,r,i,s,a,"throw",e)}s(void 0)}))}}var Ze=n(687),et=n.n(Ze);const tt=function(){function e(){c(this,e),this._stream=this.createStream()}return d(e,[{key:"stream",get:function(){return this._stream}},{key:"createStream",value:function(){var e=Object.assign(document.createElement("canvas"),{width:0,height:0});e.id="eyeson-ninja-stream",e.getContext("2d").fillRect(0,0,0,0);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return window.CanvasCaptureMediaStream&&t instanceof window.CanvasCaptureMediaStream&&(n.type="canvas-track",n.canvas=e),t}}]),e}(),nt=(rt="eyeson.",it={},ot=Xe.hasLocalStorage(),{store:function(e,t){if(!ot)return it[e]=t,!0;try{window.localStorage.setItem(rt+e,JSON.stringify(t))}catch(e){return p.error("LocalStorage::store",e),!1}return!0},load:function(e,t){var n=t;if("object"!==a(n)||Array.isArray(n)||(n=Object.assign({},n)),!ot)return it[e]||n;var r=window.localStorage.getItem(rt+e);if(!r)return n;try{return JSON.parse(r)}catch(t){return p.error("LocalStorage::load",e,t),n}}});var rt,it,ot,st,at,ct=window.CanvasCaptureMediaStream||window.CanvasCaptureMediaStreamTrack,ut=function(e){return Boolean(e&&e.getAudioTracks().length>0&&e.getAudioTracks()[0].enabled)},lt=function(e){return Boolean(e&&e.getVideoTracks().length>0&&e.getVideoTracks()[0].enabled)},dt=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!1})),e},ht=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!0})),e},ft=function(e,t){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=t})),e},pt=function(e,t){return e&&e.getVideoTracks().forEach((function(e){return e.enabled=t})),e},mt=function(e){return e.stop(),e.dispatchEvent(new Event("stopped"))},vt=function(e){e&&e.getTracks().forEach(mt)},yt=function(e){return/screen|monitor|window|web-contents-media-stream/i.test(e.label)||"screen-track"===e.type||"screen-video-track"===e.type},gt=function(e){return yt(e)&&"screen-video-track"!==e.type},bt=function(e){return yt(e)&&"screen-video-track"===e.type},St=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"!==e.canvas.id&&"eyeson-vbg-stream"!==e.canvas.id)},kt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"===e.canvas.id)},wt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-vbg-stream"===e.canvas.id)},Ct=function(e){return!St(e)&&!yt(e)&&!wt(e)},xt=function(e){return e?e.getVideoTracks().filter(yt):[]},Tt=function(e){return e?e.getVideoTracks().filter(gt):[]},Rt=function(e){return e?e.getVideoTracks().filter(bt):[]},_t=function(e){return e?e.getVideoTracks().filter(Ct):[]},Pt=function(e){return e?e.getVideoTracks().filter(wt):[]},Mt=function(e){_t(e).forEach(mt)},Et=function(e){return _t(e).forEach((function(e){return e.enabled=!1})),e},Ot=function(e){return _t(e).forEach((function(e){return e.enabled=!0})),e},Dt=function(e,t){return _t(e).forEach((function(e){return e.enabled=t})),e},At=function(e,t){return Pt(e).forEach((function(e){return e.enabled=t})),e},It=function(e){return e instanceof ct?e.getVideoTracks():e?e.getVideoTracks().filter(St):[]},Bt=function(e){return lt(e)&&e.getVideoTracks().some(yt)},Lt=function(e){return lt(e)&&e.getVideoTracks().some(gt)},Ft=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&e.getVideoTracks().some(St)},jt=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&(lt(e)&&e.getVideoTracks().some(wt))},Vt=function(e){return lt(e)&&!Bt(e)&&!Ft(e)&&!jt(e)},Ut=function(e){return!!e&&(Ft(e)&&e.getVideoTracks().some(St))},Nt=function(e){return Lt(e)||Ft(e)},Wt=function(e){return _t(e).some((function(e){return e.enabled}))},Ht=function(e){var t=_t(e);if(t.length>0){var n=U(t,1)[0];if("function"==typeof n.getSettings){var r=n.getSettings();if(r&&"facingMode"in r)return r.facingMode}}return null},zt=function(e){e.getContext("2d");var t=e.captureStream(20),n=U(t.getVideoTracks(),1)[0];return"requestFrame"in n||(n.type="canvas-track",n.canvas=e,n.requestFrame=function(){return t.requestFrame()}),t},Gt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&e instanceof MediaStream&&e.getTracks().length>0){var n=e.getAudioTracks().find((function(e){return"live"===e.readyState})),r=e.getVideoTracks().find((function(e){return"live"===e.readyState})),i=n||function(){try{var e=new(window.AudioContext||window.webkitAudioContext),t=e.createMediaStreamDestination().stream,n=U(t.getAudioTracks(),1)[0];return n.type="fake-audio",n.enabled=!1,vt(t),e.close(),n}catch(e){p.warn("StreamHelpers::createFakeAudioTrack Unable to create audio track",e)}return null}(),o=r||function(){try{var e=document.createElement("canvas");e.getContext("2d").fillRect(0,0,e.width,e.height);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return n.type="fake-video",n.enabled=!1,vt(t),n}catch(e){p.warn("StreamHelpers::createFakeVideoTrack Unable to create video track",e)}return null}(),s=[];return i&&s.push(i),o&&!t&&s.push(o),new MediaStream(s)}return!1};const qt=(st=[],at="com.eyeson.immediate",window.addEventListener("message",(function(e){if(e.source===window&&e.data===at){e.stopPropagation();var t=st.shift();t&&t()}})),function(e){st.push(e),window.postMessage(at,"*")});const $t=function(e,t){var n=null,r=!0,i=!1,o=0,s=1e3/t,a=function t(){var r=Date.now(),i=r-o;i<=s?n=requestAnimationFrame(t):(o=r-i%s,e())},c=function t(){var n=Date.now(),r=n-o;r<=s?qt(t):(o=n-r%s,i||e())},u={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){r?n=requestAnimationFrame(a):(i&&(i=!1),qt(c))})),cancelAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){i=!0,n&&(cancelAnimationFrame(n),n=null)}))};return document.addEventListener("visibilitychange",(function(){!(r="visible"===document.visibilityState)&&n&&(u.cancelAnimationFrame(),u.requestAnimationFrame())})),u};const Jt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return new Promise((function(n,r){var i=new URL(e,location.href),o=document.createElement("script");o.async=!0,o.onload=function(){o.parentNode&&o.remove(),n(o)},o.onerror=function(){o.parentNode&&o.remove(),r(new Error("Unable to initiate script "+e))},t&&(o.integrity=t.algo+"-"+t.hash),o.src=i,document.head.append(o)}))};var Kt="function"==typeof window.CacheStorage;const Xt={storeBlobURL:function(){var e=Qe(et().mark((function e(t,n){var r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,fetch(t);case 5:return r=e.sent,e.next=8,r.blob();case 8:return i=e.sent,e.next=11,caches.open("store");case 11:return o=e.sent,e.next=14,o.put(n,new Response(i));case 14:e.next=18;break;case 16:e.prev=16,e.t0=e.catch(2);case 18:case"end":return e.stop()}}),e,null,[[2,16]])})));return function(t,n){return e.apply(this,arguments)}}(),loadBlobURL:function(){var e=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Kt){e.next=16;break}return e.prev=1,e.next=4,caches.open("store");case 4:return n=e.sent,e.next=7,n.match(t);case 7:return r=e.sent,e.next=10,r.blob();case 10:return i=e.sent,e.abrupt("return",URL.createObjectURL(i));case 14:e.prev=14,e.t0=e.catch(1);case 16:return e.abrupt("return",!1);case 17:case"end":return e.stop()}}),e,null,[[1,14]])})));return function(t){return e.apply(this,arguments)}}(),deleteBlob:function(){var e=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,caches.open("store");case 5:return n=e.sent,e.next=8,n.delete(t);case 8:e.next=12;break;case 10:e.prev=10,e.t0=e.catch(2);case 12:case"end":return e.stop()}}),e,null,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()};var Yt=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],Qt=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];const Zt=function(){var e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null;return{run:function(c){if(n&&e)return n=!1,e;n=!0;var u=parseFloat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),l=c.width,d=c.height;e||(e=document.createElement("canvas"),t=e.getContext("2d",{alpha:!1,desynchronized:!0}),e.width=l,e.height=d),t.drawImage(c,0,0);var h=t.getImageData(0,0,l,d),f=h.data,p=l-1,m=d-1,v=u+1,y=Yt[u],g=Qt[u];r||(r=new Uint32Array(f.length/4),i=new Uint32Array(f.length/4),o=new Uint32Array(f.length/4),s=new Uint32Array(l),a=new Uint32Array(l));for(var b=2,S=0,k=0,w=0;b-- >0;){for(var C=0,x=0,T=0;T<d;T++){for(var R=f[C]*v,_=f[C+1]*v,P=f[C+2]*v,M=1;M<=u;M++)S=C+((M>p?p:M)<<2),R+=f[S++],_+=f[S++],P+=f[S++];for(var E=0;E<l;E++)r[x]=R,i[x]=_,o[x]=P,0===T&&(s[E]=((S=E+v)<p?S:p)<<2,a[E]=(S=E-u)>0?S<<2:0),k=C+s[E],w=C+a[E],R+=f[k++]-f[w++],_+=f[k++]-f[w++],P+=f[k++]-f[w++],x++;C+=l<<2}for(var O=0;O<l;O++){for(var D=O,A=r[D]*v,I=i[D]*v,B=o[D]*v,L=1;L<=u;L++)A+=r[D+=L>m?0:l],I+=i[D],B+=o[D];x=O<<2;for(var F=0;F<d;F++)f[x]=A*y>>>g,f[x+1]=I*y>>>g,f[x+2]=B*y>>>g,0===O&&(s[F]=((S=F+v)<m?S:m)*l,a[F]=(S=F-u)>0?S*l:0),k=O+s[F],w=O+a[F],A+=r[k]-r[w],I+=i[k]-i[w],B+=o[k]-o[w],x+=l<<2}}return t.putImageData(h,0,0),e},reset:function(){e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null}}};window.exports=window.exports||{};var en="function"==typeof window.OffscreenCanvas&&function(){try{return new OffscreenCanvas(1,1).getContext("2d"),!0}catch(e){}return!1}(),tn=en&&Boolean(window.OffscreenCanvasRenderingContext2D)&&"filter"in OffscreenCanvasRenderingContext2D.prototype,nn="function"==typeof window.createImageBitmap,rn="function"==typeof window.MediaStreamTrackProcessor,on=window.WebAssembly&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])),sn=function(){try{return new EventTarget,!0}catch(e){}return!1}(),an=Math.max,cn=sn?new EventTarget:document.createElement("i"),un="selfie_segmentation_landscape",ln=256,dn=144,hn=36864,fn=null,pn=!1,mn=!1,vn=null,yn=null,gn=null,bn=null,Sn=function(){var e=Qe(et().mark((function e(){var t,n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!fn){e.next=2;break}return e.abrupt("return");case 2:return mn=!0,cn.dispatchEvent(new Event("change")),e.next=6,Promise.all([Jt(on?"vendor/tflite/tflite-simd.js":"vendor/tflite/tflite.js"),fetch("vendor/tflite/models/".concat(un,".tflite"))]);case 6:return t=e.sent,e.next=9,window.exports[on?"createTFLiteSIMDModule":"createTFLiteModule"]();case 9:return fn=e.sent,e.next=12,t[1].arrayBuffer();case 12:n=e.sent,r=fn._getModelBufferMemoryOffset(),fn.HEAPU8.set(new Uint8Array(n),r),fn._loadModel(n.byteLength),vn=fn._getInputMemoryOffset()/4,yn=fn._getOutputMemoryOffset()/4,mn=!1,pn=!0,cn.dispatchEvent(new Event("change"));case 21:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),kn=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={canvas:null,ctx:null};return en&&("blur"===(arguments.length>3?arguments[3]:void 0)&&tn)?(r.canvas=new OffscreenCanvas(e,t),r.ctx=r.canvas.getContext("2d",n),r):(r.canvas=document.createElement("canvas"),r.canvas.width=e,r.canvas.height=t,r.ctx=r.canvas.getContext("2d",Object.assign({desynchronized:!0},n)),r)};Qe(et().mark((function e(){var t;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("image:blob"!==nt.load("virtualBackgroundType")){e.next=6;break}return e.next=4,Xt.loadBlobURL("/virtualBackgroundLocalImage");case 4:(t=e.sent)&&(gn=t);case 6:case"end":return e.stop()}}),e)})))();var wn,Cn=function(e,t){return new Promise((function(n){if(t&&"ready"===t.state&&t.emitLoading(!0),"blob"!==e||gn){var r=new Image;r.onerror=function(){return n(null)},r.onload=function(){return n(r)},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src="blob"===e&&gn?gn:e}else n(null)})).then((function(e){return t&&"ready"===t.state&&t.emitLoading(!1),e}))},xn=function(e){return new Promise((function(t,n){var r=new Image;r.onerror=function(){return n(new TypeError("Invalid image file"))},r.onload=function(){return t()},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src=e}))},Tn=(wn=null,function(e){wn||(wn=Object.assign(document.createElement("input"),{type:"file",accept:"image/*"})),wn.onchange=function(t){var n=t.target.files;if(n.length>0){var r=URL.createObjectURL(n[0]);xn(r).then((function(){gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=r,e()}),e)}wn.onchange=null,wn.value=""},wn.click()}),Rn=function(e,t,n){var r=t/e.width,i=n/e.height,o=an(r,i),s=e.width*o,a=e.height*o,c=(t-s)/2,u=(n-a)/2,l=kn(t,n,{alpha:!1});return l.ctx.drawImage(e,0,0,e.width,e.height,c,u,s,a),l.canvas},_n=function(e,t,n){var r=kn(t,n,{alpha:!1}),i=r.ctx;return i.fillStyle="#ffffff",i.fillRect(0,0,t,n),i.drawImage(e,15,15),r.canvas},Pn=function(e,t,n){var r=kn(e,t,{alpha:!1}),i=r.ctx,o=i.createLinearGradient(n.startX,n.startY,n.endX,n.endY);return o.addColorStop(0,n.color1),o.addColorStop(1,n.color2),i.fillStyle=o,i.fillRect(0,0,e,t),r.canvas},Mn=function(e,t,n,r){var i=2*(2*r),o=t+i,s=n+i;e.blurCanvas=kn(o,s,{alpha:!1},"blur"),e.imageCanvas=kn(o,s,{alpha:!1}),e.blurCanvas.ctx.filter="blur(".concat(r,"px)")},En=/^(off|eyeson|generali:.*|color:.+|image:.+|blur:\d+)/,On=function(){return pn?"ready":mn?"initialize":""},Dn=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";c(this,e),p.info("VirtualBackgroundMixer::constructor",n),this.name=n,this.canvas=null,this.ctx=null,this.originalStream=null,this.outStream=null,this.video=null,this.reader=null,this.size={width:0,height:0},this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.playPromise=null,this.abort=!1,this.paused=!1,this.raf=$t(this.drawVideo.bind(this),20),this.backgroundOld=null,this.backgroundType=null,this.backgroundValue=null,this.blurInit=!1,this.blurCanvas=null,this.canvasBlur=Zt(),this.imageCanvas=null,this.state=On(),this.loadingListener=[],this.handleStateChange=function(){var e=On();t.state=e,t.emitLoading("initialize"===e)},cn.addEventListener("change",this.handleStateChange)}var t,n,r;return d(e,[{key:"storeLocalImageFile",value:function(){gn&&(bn=gn)}},{key:"resetLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=bn,bn=null)}},{key:"saveLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(bn),bn=null)}},{key:"updateCache",value:function(e){"image:blob"===e?gn&&Xt.storeBlobURL(gn,"/virtualBackgroundLocalImage"):Xt.deleteBlob("/virtualBackgroundLocalImage")}},{key:"onLoading",value:function(e){this.loadingListener.push(e)}},{key:"offLoading",value:function(e){this.loadingListener=this.loadingListener.filter((function(t){return t!==e}))}},{key:"emitLoading",value:function(e){this.loadingListener.forEach((function(t){return t(e)}))}},{key:"initiateStream",value:function(e){var t=this;p.info("VirtualBackgroundMixer::initiate",this.name),Sn();var n=e.getVideoTracks();if(0===n.length)return p.warn("VirtualBackgroundMixer::initiate",this.name,"missing track"),e;var r=U(n,1)[0],i=r.getSettings();if("live"!==r.readyState||!i.width||!i.height)return p.warn("VirtualBackgroundMixer::initiate",this.name,"0 width or height, or not ready",r.readyState,i.width,i.height),e;this.originalStream&&(p.warn("VirtualBackgroundMixer::initiate",this.name,"existing originalStream!",this.originalStream.id,e.id),this.originalStream.id!==e.id&&this.stopOriginalStream(),this.terminate()),this.originalStream=e,this.canvas=document.createElement("canvas"),this.canvas.id="eyeson-vbg-stream",this.ctx=this.canvas.getContext("2d",{desynchronized:!0}),this.ctx.imageSmoothingEnabled=!1,this.size.width=i.width,this.size.height=i.height,this.canvas.width=i.width,this.canvas.height=i.height;var o=U(this.canvas.captureStream(20).getVideoTracks(),1)[0];o.canvas||(o.type="canvas-track",o.canvas=this.canvas);var s={};return"function"==typeof o.getSettings&&Object.assign(s,o.getSettings()),Object.assign(s,i),o.getSettings=function(){return s},o.srcLabel=r.label,o.srcDeviceId=i.deviceId,this.outStream=new MediaStream([o]),e.getAudioTracks().forEach((function(e){return t.outStream.addTrack(e)})),this.start(),this.outStream}},{key:"start",value:function(){var e=this;p.info("VirtualBackgroundMixer::start",this.name);var t=null,n=null,r=this.size,i=r.width,o=r.height;if(i&&o){if(rn)try{var s=U(this.originalStream.getVideoTracks(),1)[0],a=new MediaStreamTrackProcessor(s);this.reader=a.readable.getReader()}catch(e){}this.reader||((n=document.createElement("video")).playsInline=!0,n.muted=!0,n.width=i,n.height=o,n.srcObject=this.originalStream,this.video=n),this.segmentationMask=new ImageData(ln,dn),t=kn(ln,dn,{willReadFrequently:!0}),this.segmentationMaskCanvas=t.canvas,this.segmentationMaskCtx=t.ctx,this.segmentationMaskCtx.imageSmoothingEnabled=!1,n&&!nn&&(t=kn(i,o),this.videoCanvas=t.canvas,this.videoCtx=t.ctx),this.abort=!1,this.paused=!1,this.blurInit=!1,this.canvasBlur.reset(),this.initBackground(),this.reader?(p.info("VirtualBackgroundMixer::start::videoTrackProcessor",this.name),this.raf.requestAnimationFrame()):(n.onloadeddata=function(){p.info("VirtualBackgroundMixer::start::video.loadeddata",e.name),e.raf.requestAnimationFrame()},this.playPromise=n.play(),this.playPromise.catch((function(t){p.error("VirtualBackgroundMixer::start::video.play",e.name,t)})))}else p.warn("VirtualBackgroundMixer::start 0 width or height",this.name,i,o)}},{key:"drawVideo",value:(r=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c,u,l,d,h,f,p,m,v,y,g,b;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=null,!this.abort){e.next=3;break}return e.abrupt("return");case 3:if(n=this.ctx,r=this.size,i=this.paused,o=this.segmentationMask,s=this.segmentationMaskCtx,a=this.segmentationMaskCanvas,!this.reader){e.next=15;break}return e.prev=5,e.next=8,this.reader.read();case 8:c=e.sent,(u=c.value)&&(u.width=u.displayWidth,u.height=u.displayHeight,t=u),e.next=15;break;case 13:e.prev=13,e.t0=e.catch(5);case 15:if(pn&&!i){e.next=19;break}n.drawImage(t||this.video,0,0),e.next=36;break;case 19:if(t){e.next=33;break}if(!nn){e.next=31;break}return e.prev=21,e.next=24,createImageBitmap(this.video);case 24:t=e.sent,e.next=29;break;case 27:e.prev=27,e.t1=e.catch(21);case 29:e.next=33;break;case 31:this.videoCtx.drawImage(this.video,0,0),t=this.videoCanvas;case 33:if(!this.abort){e.next=35;break}return e.abrupt("return");case 35:if(t&&t.width>0&&t.height>0){for(s.drawImage(t,0,0,t.width,t.height,0,0,ln,dn),l=s.getImageData(0,0,ln,dn),d=l.data,h=fn.HEAPF32,f=o.data,p=hn,m=0,v=0,y=0;y<p;y++)v=4*y,h[m=vn+3*y]=d[v]/255,h[m+1]=d[v+1]/255,h[m+2]=d[v+2]/255;for(fn._runInference(),g=0,b=0;g<p;g++)b=h[yn+g],f[4*g+3]=255*b;s.putImageData(o,0,0),n.globalCompositeOperation="copy",n.filter="blur(2px)",n.drawImage(a,0,0,ln,dn,0,0,r.width,r.height),n.globalCompositeOperation="source-in",n.filter="none",n.drawImage(t,0,0),this.backgroundType&&this.drawBackground(t)}case 36:!i&&this.paused&&(n.filter="none",n.globalCompositeOperation="source-over"),t&&"function"==typeof t.close&&t.close(),this.abort||this.raf.requestAnimationFrame();case 39:case"end":return e.stop()}}),e,this,[[5,13],[21,27]])}))),function(){return r.apply(this,arguments)})},{key:"suspend",value:function(){var e=this.ctx;this.paused=!0,e&&(e.filter="none",e.globalCompositeOperation="source-over")}},{key:"resume",value:function(){this.paused=!1}},{key:"drawBackground",value:function(e){var t=this.backgroundType,n=this.ctx,r=this.blurCanvas,i=this.imageCanvas,o=this.backgroundValue,s=this.size;if(t&&n)if(n.globalCompositeOperation="destination-over","blur"===t)if(Xe.canvasBlurSupport()){var a=2*Number(o),c=2*a;this.blurInit||(i.ctx.drawImage(e,0,0,s.width,s.height,0,0,s.width+c,s.height+c),this.blurInit=!0),i.ctx.drawImage(e,0,0,s.width,s.height,a,a,s.width,s.height),r.ctx.drawImage(i.canvas,0,0),n.drawImage(r.canvas,a,a,s.width,s.height,0,0,s.width,s.height)}else{var u=this.canvasBlur.run(e,o);n.drawImage(u,0,0)}else"color"===t?(n.fillStyle=o,n.fillRect(0,0,s.width,s.height)):i?n.drawImage(i,0,0):n.drawImage(e,0,0)}},{key:"initBackground",value:(n=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.backgroundType,n=this.backgroundValue,r=this.size,i=r.width,o=r.height,s=!1,i&&o){e.next=5;break}return e.abrupt("return");case 5:if("eyeson"!==t){e.next=10;break}this.imageCanvas=Pn(i,o,{startX:0,startY:0,endX:i,endY:50,color1:"#ff7676",color2:"#9e206c"}),s=!0,e.next=27;break;case 10:if("generali"!==t){e.next=18;break}return this.setBackgroundFallback(),e.next=14,Cn(n,this);case 14:(a=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=_n(a,i,o),s=!0),e.next=27;break;case 18:if("image"!==t){e.next=26;break}return this.setBackgroundFallback(),e.next=22,Cn(n,this);case 22:(c=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=Rn(c,i,o),s=!0),e.next=27;break;case 26:"blur"===t?(this.blurInit=!1,Mn(this,i,o,Number(n)),this.canvasBlur.reset(),s=!0):(this.imageCanvas=null,s=!0);case 27:s&&(this.backgroundOld={type:t,value:n});case 28:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setBackgroundFallback",value:function(){var e=this.backgroundOld;if(e)this.backgroundType=e.type,this.backgroundValue=e.value;else{if(!this.imageCanvas){var t=this.size,n=t.width,r=t.height;this.blurInit=!1,Mn(this,n,r,8)}this.backgroundType="blur",this.backgroundValue="8"}}},{key:"changeBackground",value:function(e){if(p.info("VirtualBackgroundMixer::changeBackground",this.name,e),"string"==typeof e){var t=e.indexOf(":");-1===t?(this.backgroundType="off"===e?null:e,this.backgroundValue=null):(this.backgroundType=e.substring(0,t),this.backgroundValue=e.substring(t+1)),this.abort||this.initBackground()}}},{key:"stop",value:function(){if(p.info("VirtualBackgroundMixer::stop",this.name),this.abort=!0,this.raf&&this.raf.cancelAnimationFrame(),this.video){var e=this.video,t=this.playPromise;t&&e&&t.then((function(){return e.pause()})),this.video.onloadeddata=null,this.video=null,this.playPromise=null}this.reader&&(this.reader=null),this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.backgroundOld=null,this.imageCanvas=null,this.blurCanvas=null,this.canvasBlur.reset()}},{key:"stopOriginalStream",value:function(){p.info("VirtualBackgroundMixer::stopOriginalStream",this.name,this.originalStream),this.stop(),vt(this.originalStream)}},{key:"terminate",value:function(){var e=this;p.info("VirtualBackgroundMixer::terminate",this.name),this.stop(),this.outStream&&Pt(this.outStream).forEach((function(t){mt(t),p.info("VirtualBackgroundMixer::terminate stop track",e.name,t)})),this.originalStream=null,this.outStream=null,this.canvas=null,this.ctx=null,this.video=null}},{key:"destroy",value:function(){p.info("VirtualBackgroundMixer::destroy",this.name),cn.removeEventListener("change",this.handleStateChange),this.loadingListener.length=0,this.canvasBlur=null}}],[{key:"isTypeAllowed",value:function(e){return En.test(e)}},{key:"checkExternalImage",value:(t=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^image:([\w]+:)?\/\//i.test(t)){e.next=4;break}return n=t.substring(6),e.next=4,xn(n);case 4:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImage",value:function(e){Tn(e)}},{key:"getImageBlobOrFallback",value:function(){return gn&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])?"image:blob":"blur:8"}}]),e}();const An=Dn;var In=function(e,t){if(e.length!==t.length)return!0;for(var n,r=function(n,r){if(n=e[a],!(r=t.find((function(e){return n.deviceId===e.deviceId&&n.groupId===e.groupId&&n.label===e.label&&n.kind===e.kind}))))return{v:!0};i=n,o=r},i=null,o=!1,s=e.length,a=0;a<s;a++)if(n=r(i,o))return n.v;return!1};const Bn=function(){function e(t){var n=this;c(this,e),this.sinkId="default",this.options=t||{audio:!0,video:!0,eco:!1},this.stream=null,this.cameras=[],this.listeners=[],this.speakers=[],this.microphones=[],this.constraints={},this.terminationInProgress=!1,this.virtualBackground=new An("DeviceManager"),this.virtualBackgroundType="off",e.getSinkId().then((function(e){return n.sinkId=e})),this.setStream=this.setStream.bind(this),this.handleError=this.handleError.bind(this),this.verifyStream=this.verifyStream.bind(this),this.storeConstraints=this.storeConstraints.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.initiateVirtualBackground=this.initiateVirtualBackground.bind(this)}var t;return d(e,[{key:"setVirtualBackgroundType",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(An.isTypeAllowed(t)){e.next=3;break}return p.warn("DeviceManage::setVirtualBackgroundType type not allowed",t),e.abrupt("return");case 3:return e.next=5,An.checkExternalImage(t);case 5:n="off"===this.virtualBackgroundType,r="off"===t,this.virtualBackgroundType=t,this.virtualBackground.changeBackground(t),this.stream&&(n&&!r||!n&&r)&&this.update();case 10:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImageForVirtualBackground",value:function(e){var t=this;An.loadLocalImage((function(n){n||t.setVirtualBackgroundType("image:blob"),e(n)}))}},{key:"start",value:function(){var t=this;return this.watchForNewDevices(),e.fetchDevices().then((function(e){return t.setDevices(e)})).then((function(){return e.getConstraints(t.options)})).then((function(e){return t.constraints=e,navigator.mediaDevices.getUserMedia({video:!t.options.eco&&t.constraints.video,audio:t.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"stopStream",value:function(){this.stream&&(this.virtualBackground.originalStream?(this.virtualBackground.stopOriginalStream(),this.virtualBackground.terminate()):vt(this.stream),this.stream=null)}},{key:"stop",value:function(){this.stopStream()}},{key:"terminate",value:function(){var e=this;navigator.mediaDevices.ondevicechange=null,this.terminationInProgress=!0,window.setTimeout((function(){e.stop(),e.virtualBackground.destroy()}),10)}},{key:"setDevices",value:function(e){var t=In(this.cameras,e.cameras),n=In(this.microphones,e.microphones),r=In(this.speakers,e.speakers);this.cameras=e.cameras,this.microphones=e.microphones,this.speakers=e.speakers,this.options.audio=this.microphones.length>0&&this.options.audio,this.options.video=this.cameras.length>0&&this.options.video,(t||n||r)&&this.emit(e)}},{key:"watchForNewDevices",value:function(){var t=this;navigator.mediaDevices.ondevicechange=function(){e.fetchDevices().then((function(e){return t.setDevices(e)})).catch(t.handleError)}}},{key:"onChange",value:function(e){this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"update",value:function(e){return this.constraints=e||this.constraints,this.stop(),this.watchForNewDevices(),navigator.mediaDevices.getUserMedia(this.constraints).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"updateWithOptions",value:function(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.options=t||this.options,this.stop(),this.watchForNewDevices(),e[r?"getMobileConstraints":"getConstraints"](this.options).then((function(e){return n.constraints=e,navigator.mediaDevices.getUserMedia({video:!n.options.eco&&n.constraints.video,audio:n.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"adjustAudioTrack",value:function(e){return 1===e.getAudioTracks().length&&(e.getAudioTracks()[0].enabled=this.options.audio),e}},{key:"initiateVirtualBackground",value:function(e){return"off"!==this.virtualBackgroundType&&e&&1===e.getVideoTracks().length?this.virtualBackground.initiateStream(e):e}},{key:"storeConstraints",value:function(){var e=this.constraints,t=e.video,n=e.audio;p.debug("DeviceManager::storeConstraints",e),nt.store("mediaConstraints",e),nt.store("sinkId",this.sinkId),nt.store("virtualBackgroundType",this.virtualBackgroundType),t&&t.deviceId&&t.deviceId.exact&&nt.store("videoId",t.deviceId.exact),n&&n.deviceId&&n.deviceId.exact&&nt.store("audioId",n.deviceId.exact),this.virtualBackground.updateCache(this.virtualBackgroundType)}},{key:"setStream",value:function(t){var n=this,r=null===this.stream;if(this.stream=t,this.terminationInProgress)return this.stop(),Promise.resolve();var i=function(){n.emit({stream:n.stream,constraints:n.constraints,options:n.options}),n.verifyStream()};return r?e.fetchDevices().then((function(e){n.setDevices(e),i()})):(i(),Promise.resolve())}},{key:"verifyStream",value:function(){this.constraints.video&&this.stream&&0===this.stream.getVideoTracks().length&&!this.options.eco&&this.handleError({name:"EyesonCameraError"}),this.constraints.audio&&this.stream&&0===this.stream.getAudioTracks().length&&this.handleError({name:"EyesonMicrophoneError"})}},{key:"setVideoInput",value:function(e){var t={};return Object.assign(t,this.constraints.video,{deviceId:{exact:e}}),this.constraints.video=t,this.update()}},{key:"setAudioInput",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={};return Object.assign(n,this.constraints.audio,{deviceId:{exact:e}}),this.constraints.audio=n,!0===t.preventUpdate?Promise.resolve():this.update()}},{key:"setAudioOutput",value:function(e){this.sinkId=e||"default",nt.store("sinkId",this.sinkId),this.emit({sinkId:this.sinkId})}},{key:"handleError",value:function(e){p.error("DeviceManager::",e),this.emit({error:e,constraints:this.constraints})}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}],[{key:"getDevices",value:function(){return"mediaDevices"in navigator?navigator.mediaDevices.enumerateDevices().then((function(e){return 2===e.length&&e.every((function(e){return"audioinput"===e.kind&&""===e.deviceId}))?[{deviceId:"",groupId:"",kind:"audioinput",label:""},{deviceId:"",groupId:"",kind:"videoinput",label:""}]:e})):Promise.resolve([])}},{key:"getConstraints",value:function(t){var n=t||{audio:!0,video:!0};return e.getDevices().then((function(t){return e.determineConstraintsForDevices(t,n)})).catch((function(e){p.error("DeviceManager::getConstraints ",e)}))}},{key:"determineConstraintsForDevices",value:function(t,n){var r=nt.load("mediaConstraints",n),i={channelCount:Xe.canStereo()&&!n.eco?2:1};if("video"in r||(r.video=!0),"audio"in r||(r.audio=i),r.video.deviceId){var o=r.video.deviceId.exact;t.find((function(e){return e.deviceId===o}))||(r.video=n.video)}if(r.audio.deviceId){var s=r.audio.deviceId.exact;t.find((function(e){return e.deviceId===s}))||(r.audio=!!n.audio&&i)}return!1!==n.video||n.eco||(r.video=!1),!0===n.video&&!1===r.video&&(r.video=!0),(!0===n.audio&&!1===r.audio||!0===r.audio)&&(r.audio=i),r.audio&&r.audio.channelCount!==i.channelCount&&(r.audio.channelCount=i.channelCount),0===t.filter((function(e){return"videoinput"===e.kind})).length&&(r.video=!1),e.applyLastUsedDevices(r,t),e.applyWidescreen(r),r}},{key:"applyLastUsedDevices",value:function(e,t){var n=nt.load("videoId"),r=nt.load("audioId");!0===e.video&&n&&t.find((function(e){return e.deviceId===n}))&&(e.video={deviceId:{exact:n}}),e.audio&&r&&t.find((function(e){return e.deviceId===r}))&&(e.audio.deviceId={exact:r})}},{key:"applyWidescreen",value:function(e){f.widescreen?(!0===e.video&&(e.video={}),e.video&&Object.assign(e.video,{width:640,height:360})):"object"===a(e.video)&&("width"in e.video||"height"in e.video)&&(Reflect.deleteProperty(e.video,"width"),Reflect.deleteProperty(e.video,"height"))}},{key:"getMobileConstraints",value:function(t){var n=Object.assign({audio:!0,video:!0},t);return e.applyWidescreen(n),Promise.resolve(n)}},{key:"getSinkId",value:function(){var t=nt.load("sinkId","");return e.getDevices().then((function(e){return e.find((function(e){return e.deviceId===t}))||(t="default"),t}))}},{key:"fetchDevices",value:function(){return e.getDevices().then((function(e){var t=e.filter((function(e){return"audiooutput"===e.kind}));return t.length>0&&-1===t.findIndex((function(e){return"default"===e.deviceId}))&&t.unshift({deviceId:"default",kind:"audiooutput",groupId:"default",label:"System default"}),{cameras:e.filter((function(e){return"videoinput"===e.kind})),microphones:e.filter((function(e){return"audioinput"===e.kind})),speakers:t}}))}},{key:"fetchInputDevices",value:function(){return e.getDevices().then((function(e){return e.filter((function(e){return e.kind.includes("input")}))}))}},{key:"getStoredVirtualBackgroundType",value:function(e){var t=nt.load("virtualBackgroundType","off");return"image:blob"===t?An.getImageBlobOrFallback(e):t}}]),e}();const Ln=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{eco:!1,audio:!0,video:!0,screen:!1,surface:null,screenStream:null,canvas:null,existingStream:null,micMixer:null,vbgMixer:null,isPresentation:!1,virtualBackground:!1,deviceMonitor:null};c(this,e),this.options=t,this.tempStream=null,this.brokenTrackCallback=null,this.bindMethods()}var t;return d(e,[{key:"bindMethods",value:function(){this.getMediaStream=this.getMediaStream.bind(this),this.addNinjaTrack=this.addNinjaTrack.bind(this),this.addCanvasTrack=this.addCanvasTrack.bind(this),this.addScreenTrack=this.addScreenTrack.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.adjustVideoTrack=this.adjustVideoTrack.bind(this),this.addScreenStreamTrack=this.addScreenStreamTrack.bind(this),this.initializeVirtualBackground=this.initializeVirtualBackground.bind(this)}},{key:"start",value:function(){var e=this;p.debug("MediaStreamBuilder::start",this.options);var t=this.options,n=t.existingStream,r=t.video,i=t.audio,o=t.screen,s=t.canvas,a=t.micMixer,c=t.screenStream;return Xe.isIOSDevice()&&n&&"boolean"==typeof r&&n.active&&_t(n).length>0&&"ended"!==_t(n)[0].readyState?new Promise((function(t){var o=U(_t(n),1)[0];if(o.enabled=r,o.onended=r&&e.brokenTrackCallback?function(){p.error("iOS video track broken"),n.getTracks().forEach((function(e){return e.stop()})),e.brokenTrackCallback()}:null,"boolean"==typeof i&&ft(n,i),s){var a=new MediaStream(n.getTracks()),c=zt(s),u=U(It(c),1)[0];return a.addTrack(u),void t(a)}t(n)})):Xe.isSafari()&&o&&a&&!s?(c?Promise.resolve(c):this.getDisplayMedia()).then((function(t){return Bn.getConstraints().then((function(n){var r=new MediaStream;return e.addScreenStreamTrack(r,t),e.tempStream=new MediaStream(t.getTracks()),navigator.mediaDevices.getUserMedia({audio:n.audio}).then((function(n){return e.adjustAudioTrack(n),n.getTracks().forEach((function(t){return e.tempStream.addTrack(t)})),a.mixScreenshareAudio(n,t,r),a.active&&a.setMicOnlyStream(n,t),r}))}))})).then((function(t){return e.tempStream=null,t})).catch((function(t){return e.tempStream&&(vt(e.tempStream),e.tempStream=null),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)})):Bn.fetchInputDevices().then(this.getMediaStream).then(this.adjustVideoTrack).then(this.adjustAudioTrack).then(this.initializeVirtualBackground).then(this.addCanvasTrack).then(this.addScreenTrack).then(this.addNinjaTrack).then((function(t){return e.tempStream=null,e.options.deviceMonitor&&e.options.deviceMonitor.applyTempTracks(),t})).catch((function(t){return e.cleanupTempStream(),e.options.deviceMonitor&&e.options.deviceMonitor.discardTempTracks(),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)}))}},{key:"getMediaStream",value:function(e){var t=this;if(0===e.length)return this.options={audio:!1,video:!1},this.tempStream=(new tt).stream,this.tempStream;var n=this.options,r=n.eco,i=n.video,o=n.existingStream,s={video:!Xe.hasCanvasCaptureSupport()&&!r||i,audio:!0};!1===i&&!r&&Xe.isIOSDevice()&&(s.video=!0);var a=Bn.getConstraints;return Xe.canMultipleDifferentMicrophones()||vt(o),(Xe.isPhone()||Xe.isIOSDevice())&&(vt(o),a=Bn.getMobileConstraints),a(s).then((function(e){return navigator.mediaDevices.getUserMedia(e).then((function(e){return t.tempStream=e,e}))}))}},{key:"adjustVideoTrack",value:function(e){if(1===e.getVideoTracks().length){var t=U(e.getVideoTracks(),1)[0];t.enabled=this.options.video,!1!==this.options.video||Xe.isIOSDevice()||mt(t),this.options.deviceMonitor&&this.options.deviceMonitor.addVideoTrack(t)}return e}},{key:"initializeVirtualBackground",value:function(e){var t=this.options,n=t.screen,r=t.virtualBackground,i=t.vbgMixer;return!n&&r&&e&&1===e.getVideoTracks().length?i.initiateStream(e):e}},{key:"adjustAudioTrack",value:function(e){if(1===e.getAudioTracks().length){var t=U(e.getAudioTracks(),1)[0];t.enabled=this.options.audio,this.options.deviceMonitor&&this.options.deviceMonitor.addAudioTrack(t)}return e}},{key:"addCanvasTrack",value:function(e){var t=this.options,n=t.canvas,r=t.existingStream;if(n){var i=zt(n),o=U(It(i),1)[0];e.addTrack(o)}if(Ut(r)){var s=U(It(r),1)[0];e.addTrack(s)}return e}},{key:"addScreenTrack",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options.screenStream,r=this.options,i=r.screen,o=r.existingStream,s=r.micMixer,!i||!s){e.next=13;break}if(null!=n){e.next=7;break}return e.next=6,this.getDisplayMedia();case 6:n=e.sent;case 7:return a=new MediaStream,this.addScreenStreamTrack(a,n),s.mixScreenshareAudio(t,n,a),s.active&&s.setMicOnlyStream(t,n),this.tempStream=new MediaStream(t.getTracks().concat(n.getTracks())),e.abrupt("return",a);case 13:return Lt(o)&&(c=Tt(o),u=U(c,1),l=u[0],t.addTrack(l)),e.abrupt("return",t);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"addScreenStreamTrack",value:function(e,t){var n=U(t.getVideoTracks(),1)[0];n.type=this.options.isPresentation?"screen-track":"screen-video-track",e&&e.addTrack(n)}},{key:"getDisplayMedia",value:function(){if(Xe.hasGetDisplayMedia()){var e={channelCount:Xe.canStereo()&&!this.options.eco?2:1},t={height:{max:1080},frameRate:{max:15}};return Xe.isChrome()&&Xe.isMacOS()&&(e.echoCancellation=!1),this.options.surface&&Xe.canChooseDisplaySurface()&&(t.displaySurface=this.options.surface),navigator.mediaDevices.getDisplayMedia({audio:e,video:t,surfaceSwitching:"include",selfBrowserSurface:"include",systemAudio:"include"})}return navigator.mediaDevices.getUserMedia({video:{mediaSource:"screen",width:{max:1920},height:{max:1040},frameRate:{max:15}}})}},{key:"addNinjaTrack",value:function(e){var t=this.options,n=t.eco,r=t.video;if(n||!Xe.hasCanvasCaptureSupport())return e;if(0===e.getVideoTracks().length){var i=U((new tt).stream.getVideoTracks(),1)[0];i.enabled=r,e.addTrack(i)}return e}},{key:"cleanupTempStream",value:function(){var e=this.tempStream;if(e){var t=this.options,n=t.existingStream,r=t.screenStream;if(Ut(n)){var i=U(It(n),1)[0];e.removeTrack(i)}if(Bt(n)){var o=U(xt(n),1)[0];e.removeTrack(o)}if(Lt(r)){var s=U(Tt(r),1)[0];e.removeTrack(s)}vt(e),this.tempStream=null}}},{key:"onBrokenTrackError",value:function(e){return this.brokenTrackCallback=e,this}}]),e}();const Fn=function(){function e(){c(this,e),this.active=!1,this.audioContext=null,this.acOut=null,this.micOnlyStream=null,this.originalStream=null}return d(e,[{key:"setMicOnlyStream",value:function(e,t){this.micOnlyStream=new MediaStream;var n=e.getAudioTracks(),r=t.getVideoTracks();return n.length>0&&this.micOnlyStream.addTrack(n[0]),r.length>0&&this.micOnlyStream.addTrack(r[0]),this.micOnlyStream}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"getOriginalStream",value:function(){return this.originalStream}},{key:"stopOriginalStream",value:function(){vt(this.originalStream)}},{key:"noMix",value:function(e,t){var n=e.getAudioTracks();n.length>0&&t.addTrack(n[0])}},{key:"initMixScreenshareMix",value:function(e,t,n){this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.acOut=this.audioContext.createMediaStreamDestination(),this.audioContext.createMediaStreamSource(t).connect(this.acOut),this.audioContext.createMediaStreamSource(e).connect(this.acOut),n.addTrack(this.acOut.stream.getAudioTracks()[0])}},{key:"mixScreenshareAudio",value:function(e,t,n){this.originalStream=t;var r=t.getAudioTracks();if(0===r.length)this.noMix(e,n);else try{this.initMixScreenshareMix(e,t,n),this.active=!0}catch(t){p.error("MicMixer::mixScreenshareAudio",t),mt(r[0]),this.noMix(e,n)}}},{key:"destroy",value:function(){var e=this;if(this.stopOriginalStream(),this.micOnlyStream=null,this.originalStream=null,this.audioContext)return vt(this.acOut.stream),void this.audioContext.close().then((function(){e.audioContext=null,e.acOut=null,e.active=!1}));this.active=!1}}]),e}();function jn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vn=function(e,t,n){e.getAudioTracks().forEach((function(e){return e.enabled=t})),e.getVideoTracks().forEach((function(e){return e.enabled=n}))};const Un=function(e){g(n,e);var t=jn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.screen,i=void 0!==r&&r,o=e.surface;p.debug("ChangeLocalStreamEvent::handle");var s=this.context._session;if(!s)throw new Error("Session does not exist");var a=s.localStream,c=s.vbgMixer,u=Boolean(s.micMixer);if(Xe.isIOSDevice()||Xe.stopsDeviceActivityIndicatorOnDisable()&&!u&&!a.wasScreenAsVideo)return c&&(n?c.resume():c.suspend(),c.originalStream&&c.originalStream!==a&&Vn(c.originalStream,t,n)),Vn(a,t,n),a.locallyChanged=!0,void s.emit({type:"stream_update",localStream:a});s.micMixer&&(s.micMixer.destroy(),s.micMixer=null),c&&(c.stopOriginalStream(),c.terminate());var l={audio:t,video:n,virtualBackground:s.options.virtualBackground,existingStream:a,vbgMixer:c,deviceMonitor:s.deviceMonitor};i&&(s.micMixer=new Fn,l.video=!1,l.screen=!0,l.surface=o,l.virtualBackground=!1,l.micMixer=s.micMixer),new Ln(l).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){s.emit({type:"stop_screen_video"})})),e})).then((function(e){e.locallyChanged=!0,e.wasScreenAsVideo=u,s.setStream(e)})).catch((function(e){if(p.error("ChangeLocalStreamEvent",e),i){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"screen_capture_error",name:t}),s.emit({type:"stop_screen_video"})}}))}}]),n}(w);function Nn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Wn=function(e){g(n,e);var t=Nn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){p.debug("PodiumEvent::handle",e);var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=t.localStream;e.hasPresenter||!Nt(n)||t.stopPresentingSet||t.emit({type:"stop_presenting"}),t&&!t.externalStream&&this.scanMessageForLocalStreamOptimization(n,e),new F(this.context).handle(e)}},{key:"scanMessageForLocalStreamOptimization",value:function(e,t){var n=t.video,r=t.isSource,i=t.isPresenter,o=t.hasPresenter,s=t.hasDesktopSources;if(e){if(r&&(!n&&(Vt(e)||jt(e))||n&&!lt(e)&&e.locallyChanged&&!o)){var a={audio:ut(e),video:n};e.wasScreenAsVideo&&(a.video=!1,a.screen=!0),new Un(this.context).handle(a)}n&&!i&&s&&new Un(this.context).handle({audio:ut(e),video:!1})}}}]),n}(w);function Hn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const zn=function(e){g(n,e);var t=Hn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.takeSnapshot()}}]),n}(w);function Gn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const qn=function(e){g(n,e);var t=Gn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayer(e.params)}}]),n}(w);function $n(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Jn=function(e){g(n,e);var t=$n(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(!this.context._session)throw new Error("Session does not exist");this.context._session.send({type:"chat",content:e.content})}}]),n}(w);function Kn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Xn=function(e){g(n,e);var t=Kn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopBroadcast("generic").then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})})).catch((function(e){return p.warn(e)}))}}]),n}(P);function Yn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Qn=function(e){g(n,e);var t=Yn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayout(e.params)}}]),n}(w);function Zn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const er=function(e){g(n,e);var t=Zn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t,n=this.context,r=n._api,i=n._session,o=((t=e.url).endsWith("/")?t:t+"/")+e.key;r.startBroadcast({streamUrl:o},"generic").catch((function(e){i.emit({type:"start_broadcast_error",platform:"generic",error:e})}))}}]),n}(w);var tr=function(){try{return new EventTarget,!0}catch(e){}return!1}();const nr=function(){function e(){c(this,e),this.listeners=new Map,this.target=tr?new EventTarget:document.createElement("i")}return d(e,[{key:"onEvent",value:function(e){var t=function(t){var n=t.detail;return e(n)};this.target.addEventListener("event",t),this.listeners.set(e,t)}},{key:"offEvent",value:function(e){var t=this.listeners.get(e);t&&(this.target.removeEventListener("event",t),this.listeners.delete(e))}},{key:"removeAllListeners",value:function(){var e=this.listeners,t=this.target;e.forEach((function(e){return t.removeEventListener("event",e)})),e.clear()}},{key:"emit",value:function(e){var t=new CustomEvent("event",{detail:e});this.target.dispatchEvent(t)}}]),e}();function rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ir=function(e){g(n,e);var t=rr(n);function n(e){var r;return c(this,n),(r=t.call(this)).connection=null,r.options=e,r.wasOpen=!1,r}return d(n,[{key:"connect",value:function(){var e=this,t=this.options;this.wasOpen=!1;var n=new WebSocket("".concat(t.endpoint,"?auth_token=").concat(t.auth_token));n.onopen=function(){e.wasOpen=!0,e.emit({type:"connected"})},n.onmessage=function(t){var n=t.data;e.emit({type:"message",message:n})},n.onerror=function(){e.emit({type:"transportError"})},n.onclose=function(){e.destroy()},this.connection=n}},{key:"isConnected",value:function(){var e=this.connection;return!!e&&e.readyState===WebSocket.OPEN}},{key:"send",value:function(e){var t=this.connection;return!!t&&(t.send(e),!0)}},{key:"destroy",value:function(){var e=this.connection,t=this.wasOpen;e&&(this.connection=null,e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.readyState<=WebSocket.OPEN&&e.close(),this.emit({type:"disconnected",was_open:t})),this.removeAllListeners()}}]),n}(nr);var or=/\r\n|\r(?!\n)|\n/g;const sr=function(e){return e.replace(or,"\r\n")};const ar=function(e){try{return JSON.parse(atob(e.split(".")[1]))}catch(e){return!1}};var cr="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID;const ur=function(){if(cr)return crypto.randomUUID();var e=0,t=crypto.getRandomValues(new Uint8Array(31));return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(function(n){var r=t[e];return e+=1,(n^r&15>>n/4).toString(16)}))};function lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var dr=function(e){g(o,e);var t,n,r,i=lr(o);function o(e){var t;return c(this,o),t=i.call(this),function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="";if(["client_id","conf_id","client_name","sessionDescriptionHandlerFactory","transportOptions"].some((function(n){return!!e[n]||(t=n,!1)})),t||["auth_token","endpoint"].some((function(n){return!!e.transportOptions[n]||(t="transportOptions.".concat(n),!1)})),t)throw new Error("Invalid options - ".concat(t))}(e),t.callId=null,t.sessionDescriptionHandler=null,t.options=e,t.initAuthToken(),t.debouncedHandleSDPUpdate=function(e,t,n){var r=[],i=!1;return function o(){for(var s=arguments.length,a=new Array(s),c=0;c<s;c++)a[c]=arguments[c];i?r.push(a):(i=!0,setTimeout((function(){if(i=!1,r.length>0){var e=r.shift();Reflect.apply(o,null,e)}}),t),Reflect.apply(e,n,a))}}(t.handleSdpUpdate,250,b(t)),t}return d(o,[{key:"onMessage",value:(r=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=JSON.parse(t),r=n.type,i=n.data,this.verifySender(n),"call_accepted"!==r){e.next=10;break}return this.setCallId(i.call_id),e.next=7,this.sessionDescriptionHandler.setDescription(i.sdp);case 7:this.emit({type:"accepted"}),e.next=11;break;case 10:"call_resumed"===r?(this.sessionDescriptionHandler.setDescription(i.sdp),this.emit({type:"resumed"})):"call_rejected"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"reject",code:i.reject_code}),this.terminate()):"call_terminated"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"bye",code:i.term_code}),this.terminate()):"sdp_update"===r?this.debouncedHandleSDPUpdate(i):(i.type=r,this.emit({type:"message",data:i}));case 11:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"initAuthToken",value:function(){var e=this.options,t=ar(e.transportOptions.auth_token);if(!1===t||t.client_id!==e.client_id||t.conf_id!==e.conf_id||!t.exp)throw new Error("Invalid auth token")}},{key:"setCallId",value:function(e){this.callId=e}},{key:"verifySender",value:function(e){var t=this.options;e.from===t.conf_id&&e.to===t.client_id||console.error(new Error("Invalid message sender",e))}},{key:"handleSdpUpdate",value:(n=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.callId,r=t.sdp,n&&n===t.call_id){e.next=4;break}throw new Error("Invalid call id");case 4:return this.emit({type:"sdp_update",sdp:r}),e.next=7,this.sessionDescriptionHandler.updateDescription(r);case 7:i=e.sent,"offer"===r.type&&i&&(o={type:i.type,sdp:sr(i.sdp)},this.message("sdp_update",{call_id:n,sdp:o}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"message",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"message",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.options,r=JSON.stringify({type:e,msg_id:ur(),from:n.client_id,to:n.conf_id,data:t});this.transport.send(r)}},{key:"connect",value:function(){var e=this,t=this.options,n=new ir(t.transportOptions);this.transport=n,this.termination=!1,this.emit({type:"transportCreated",transport:n}),n.onEvent((function(n){var r=n.type;"connected"===r?e.sessionDescriptionHandler||(e.sessionDescriptionHandler=t.sessionDescriptionHandlerFactory(t.sessionDescriptionHandlerFactoryOptions),e.emit({type:"registered"})):"message"===r?e.onMessage(n.message):"disconnected"===r&&(e.termination||e.emit({type:"terminated",reason:"disconnect",code:n.was_open?0:-1}))})),n.connect()}},{key:"call",value:(t=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.sessionDescriptionHandler,n=this.options,t){e.next=3;break}throw new Error("Invalid sessionDescriptionHandler");case 3:return e.next=5,t.getDescription();case 5:r=e.sent,i={type:r.type,sdp:sr(r.sdp)},this.message("call_start",{sdp:i,display_name:n.client_name,mute_video:n.mute_video});case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"resume",value:function(e){var t=this;if(!this.callId)throw new Error("Session was already closed");this.options.transportOptions.auth_token=e;try{this.initAuthToken()}catch(e){return void this.emit({type:"terminated",reason:"disconnect",code:-1})}this.onEvent((function e(n){"transportCreated"===n.type&&(t.offEvent(e),t.transport.onEvent(function(){var e=Qe(et().mark((function e(n){var r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("connected"!==n.type){e.next=17;break}if(r=t.transport,i=t.sessionDescriptionHandler,t.callId){e.next=5;break}throw r.destroy(),new Error("Session was already closed");case 5:return e.prev=5,e.next=8,i.getDescription();case 8:o=e.sent,s={type:o.type,sdp:sr(o.sdp)},t.message("call_resume",{call_id:t.callId,sdp:s}),e.next=17;break;case 13:throw e.prev=13,e.t0=e.catch(5),r.destroy(),new Error("Unable to reconnect");case 17:case"end":return e.stop()}}),e,null,[[5,13]])})));return function(t){return e.apply(this,arguments)}}()))})),this.connect()}},{key:"terminate",value:function(){var e=this.sessionDescriptionHandler,t=this.transport,n=this.callId;this.callId=null,e&&e.close(),t&&(t.isConnected()&&n&&(this.termination=!0,this.message("call_terminate",{call_id:n,term_code:0}),this.emit({type:"terminated",reason:"terminate",code:0})),this.transport=null,t.destroy())}}]),o}(nr);const hr={UserAgent:dr},fr=["chat","recording","memberlist","source_update","voice_activity"];const pr=function(){function e(t,n){c(this,e);var r=t.src,i=void 0===r?[]:r,o=t.psrc,s=t.asrc,a=t.vsrc,u=t.dsrc,l=t.dims;this.clientId=n,this.sources=i,this.presenterIdx=o,this.audioSources=s,this.videoSources=a,this.desktopSources=u,this.dimensions=l,this.userSourceIndex=i.indexOf(n)}return d(e,[{key:"isSolo",get:function(){return 1===Array.from(new Set(this.sources)).length&&this.sources[0]===this.clientId}},{key:"isSource",get:function(){return this.sources.includes(this.clientId)}},{key:"isPresenter",get:function(){return this.hasPresenter&&this.presenter===this.clientId}},{key:"presenter",get:function(){return this.hasPresenter&&this.sources[this.presenterIdx]}},{key:"hasMedia",get:function(){return this.sources.some((function(e){return/media/.test(e)}))}},{key:"hasPresenter",get:function(){return Number.isInteger(this.presenterIdx)&&this.presenterIdx>-1}},{key:"hasVideoSources",get:function(){return Boolean(this.videoSources)}},{key:"hasDesktopSources",get:function(){return Number.isInteger(this.desktopSources)&&this.desktopSources>-1}},{key:"hasAudioPosition",get:function(){return this.audioSources.includes(this.userSourceIndex)}},{key:"hasVideoPosition",get:function(){return this.videoSources.includes(this.userSourceIndex)}},{key:"hasMutedVideoPeers",get:function(){var e=this;return!this.hasDesktopSources&&0===this.videoSources.filter((function(t){return t!==e.userSourceIndex})).length}},{key:"userDimensions",get:function(){var e=this.videoSources.indexOf(this.userSourceIndex);return e>-1?this.dimensions[e]:null}}]),e}();const mr=function(){function e(t){c(this,e),this.clientId=t,this.stamp=this.stamp.bind(this),this.default=this.default.bind(this),this.process=this.process.bind(this),this.sourceUpdate=this.sourceUpdate.bind(this),this.voiceActivity=this.voiceActivity.bind(this)}return d(e,[{key:"stamp",value:function(e){return Object.assign({_src:"sig"},e)}},{key:"process",value:function(e){return({source_update:this.sourceUpdate,voice_activity:this.voiceActivity}[e.type]||this.default)(this.stamp(e))}},{key:"default",value:function(e){return p.debug("SipMessageTransformer::default",e),e}},{key:"sourceUpdate",value:function(e){p.debug("SipMessageTransformer::sourceUpdate",e);var t=new pr(e,this.clientId);return{type:"podium",solo:t.isSolo,audio:t.hasAudioPosition,video:t.hasVideoPosition,media:t.hasMedia,sources:t.sources,isSource:t.isSource,presenter:t.presenter,isPresenter:t.isPresenter,hasPresenter:t.hasPresenter,videoSources:t.videoSources,userDimensions:t.userDimensions,hasVideoSources:t.hasVideoSources,hasDesktopSources:t.hasDesktopSources,hasMutedVideoPeers:t.hasMutedVideoPeers}}},{key:"voiceActivity",value:function(e){return p.debug("SipMessageTransformer::voiceActivity",e),Object.assign({type:"voice_activity_raw",on:e.on,userId:e.cid})}}]),e}();var vr=function(){function e(t){c(this,e),this.datachannel=null,this.peerConnection=null,this.localStream=null,this.remoteStream=null,this.connected=!1,this.iceCheckingTimer=null,this.peerConnectionReady=null,this.options=t||{},this.connection=t.connection,this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.initPeerConnection()}var t,n,r;return d(e,[{key:"getDescription",value:(r=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.options,n=this.peerConnection,p.debug("SessionDescriptionHandler::getDescription:",t),this.localStream=t.stream,e.next=5,n.createOffer(t.RTCOfferOptions);case 5:return r=e.sent,t.SDPModifiers.active.forEach((function(e){r.sdp=e(r.sdp)})),e.next=9,n.setLocalDescription(r);case 9:return e.next=11,this.peerConnectionReady;case 11:return i=n.localDescription.sdp,t.SDPModifiers.passive.forEach((function(e){i=e(i)})),p.debug("SessionDescriptionHandler::getDescription offer",i),e.abrupt("return",{type:"offer",sdp:i});case 15:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"setDescription",value:(n=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.datachannel,p.debug("SessionDescriptionHandler::setDescription:",t),t&&t.sdp&&(this.connection.seppMessaging=t.sdp.includes("a=eyeson-sepp-messaging")),e.next=5,this.peerConnection.setRemoteDescription(new RTCSessionDescription(t));case 5:if(this.options.remoteDescriptionUpdate(t),"connecting"!==n.readyState){e.next=9;break}return e.next=9,new Promise((function(e){n.onopen=function(){n.onopen=null,e()}}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateDescription",value:(t=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options,r=this.peerConnection,p.debug("SessionDescriptionHandler::updateDescription:",t),"offer"!==t.type){e.next=24;break}return e.prev=3,e.next=6,r.setRemoteDescription(new RTCSessionDescription(t));case 6:return e.next=8,r.createAnswer();case 8:return i=e.sent,n.SDPModifiers.active.forEach((function(e){i.sdp=e(i.sdp)})),e.next=12,r.setLocalDescription(i);case 12:return this.options.remoteDescriptionUpdate(t),o=r.localDescription.sdp,n.SDPModifiers.passive.forEach((function(e){o=e(o)})),p.debug("SessionDescriptionHandler::updateDescription answer",o),e.abrupt("return",{type:"answer",sdp:o});case 19:e.prev=19,e.t0=e.catch(3),p.error("SessionDescriptionHandler::updateDescription",e.t0);case 22:e.next=28;break;case 24:if("answer"!==t.type){e.next=28;break}return e.next=27,r.setRemoteDescription(new RTCSessionDescription(t));case 27:this.options.remoteDescriptionUpdate(t);case 28:return e.abrupt("return",null);case 29:case"end":return e.stop()}}),e,this,[[3,19]])}))),function(e){return t.apply(this,arguments)})},{key:"close",value:function(){p.debug("SessionDescriptionHandler::close"),clearTimeout(this.iceCheckingTimer),this.peerConnection&&(this.stopAllTracks(),this.peerConnection.close(),this.peerConnection=null,this.datachannel&&["connecting","open"].includes(this.datachannel.readyState)&&(this.datachannel.close(),this.datachannel=null),p.debug("SessionDescriptionHandler::close Stopped streams and closed peerConnection."))}},{key:"initPeerConnection",value:function(){var e=this.options,t=this.buildPeerConnectionOptions();p.debug("SessionDescriptionHandler::initPeerConnection with",t);var n=null;this.peerConnectionReady=new Promise((function(e){return n=e}));try{var r=new RTCPeerConnection(t);this.peerConnection=r,e.stream.getTracks().forEach((function(t){r.addTrack(t,e.stream)}));var i=r.createDataChannel("data",{negotiated:!0,id:0});this.handleDatachannel(i),r.onicecandidate=function(e){var t=e.candidate;t?p.debug("SessionDescriptionHandler::gotIceCandidate",t.candidate):n()},r.onicegatheringstatechange=function(){"complete"===r.iceGatheringState&&n()},!0===e.sendOnly?r.addEventListener("connectionstatechange",this.handleConnectionStateChange):r.ontrack=this.handleOntrack.bind(this),this.iceCheckingTimer=setTimeout((function(){return n()}),3e3)}catch(e){p.error("SessionDescriptionHandler::initPeerConnection failed:",e,this.connection.uaOptions)}}},{key:"handleOntrack",value:function(e){var t=e.track,n=e.streams,r=this.options,i=U(n,1);this.remoteStream=i[0],p.debug("SessionDescriptionHandler::handleOntrack:",t.kind),t.onunmute=function(){return r.handleUnmute(t)},r.handleAccept(this.remoteStream)}},{key:"handleConnectionStateChange",value:function(){"connected"!==this.peerConnection.connectionState||this.connected||(this.connected=!0,this.options.handleAccept())}},{key:"handleDatachannel",value:function(e){this.datachannel=e,this.connection.initDatachannel(e)}},{key:"buildPeerConnectionOptions",value:function(){var e=this.options,t=[{urls:e.stun_servers}];return e.turn_servers.forEach((function(e){e.credential=e.password,t.push(e)})),{sdpSemantics:"unified-plan",iceServers:t}}},{key:"getLocalStream",value:function(){return this.localStream}},{key:"getRemoteStream",value:function(){return this.remoteStream}},{key:"setStream",value:function(e){var t=this;return new Promise((function(n,r){var i=t.getLocalStream();t.localStream=e,t.stopUnusedTracks(i,e);var o=U(e.getAudioTracks(),1)[0],s=U(Ut(e)?It(e):e.getVideoTracks(),1)[0];if(t.tracksExist()){var a=t.peerConnection.getSenders(),c=a.find((function(e){return e.track&&"audio"===e.track.kind})),u=a.find((function(e){return e.track&&"video"===e.track.kind}));Promise.all([c?c.replaceTrack(o):null,u?u.replaceTrack(s):null]).then((function(){n({newStream:e,remoteStream:t.remoteStream})})).catch(r)}else n({newStream:e,remoteStream:t.remoteStream})}))}},{key:"stopUnusedTracks",value:function(e,t){this.connection.hasExternalStream||e.getTracks().filter((function(e){return!t.getTracks().includes(e)})).forEach(mt)}},{key:"tracksExist",value:function(){return Boolean(this.peerConnection.getSenders().find((function(e){return null!==e.track})))}},{key:"scaleResolution",value:function(e){try{var t=Math.max(1/Math.max(e,.1),1),n=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),r=n.getParameters();r.encodings||(r.encodings=[{}]),r.encodings[0].scaleResolutionDownBy!==t&&(r.encodings[0].scaleResolutionDownBy=t,n.setParameters(r))}catch(e){p.error("SessionDescriptionHandler::scaleResolution failed:",e)}}},{key:"limitFramerate",value:function(e){try{var t=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),n=t.getParameters();n.encodings||(n.encodings=[{}]),n.encodings[0].maxFramerate!==e&&(e?n.encodings[0].maxFramerate=e:Reflect.deleteProperty(n.encodings[0],"maxFramerate"),t.setParameters(n))}catch(e){p.error("SessionDescriptionHandler::limitFramerate failed:",e)}}},{key:"stopAllTracks",value:function(){p.debug("SessionDescriptionHandler::stopAllTracks");var e=this.peerConnection.getReceivers?this.peerConnection.getReceivers():[];this.peerConnection.getSenders().concat(e).forEach((function(e){e.track&&mt(e.track)}))}}]),e}();const yr=vr;var gr=32768;const br=function(){function e(t,n){c(this,e),this.listeners=[],this.messageListener=[],this.datachannel=null,this.uaOptions=this.initUserAgentOptions(t,n),this.clientId=this.uaOptions.client_id,this.userAgent=null,this.transformer=new mr(this.clientId),this.seppMessaging=!1}return d(e,[{key:"initUserAgentOptions",value:function(e,t){if("sepp"!==e.type)return{client_id:null};var n=e.options;return{client_id:n.client_id,conf_id:n.conf_id,client_name:t.name,mute_video:!1,sessionDescriptionHandlerFactory:function(e){return new yr(e)},sessionDescriptionHandlerFactoryOptions:{stun_servers:n.stun_servers,turn_servers:n.turn_servers},transportOptions:{auth_token:n.auth_token,endpoint:n.endpoint}}}},{key:"start",value:function(){var e=this;return new Promise((function(t){if(!e.uaOptions.client_id)throw new TypeError("Invalid signaling data");e.userAgent=new hr.UserAgent(e.uaOptions),t()}))}},{key:"startSession",value:function(e){var t=this;return Object.assign(this.uaOptions.sessionDescriptionHandlerFactoryOptions,e),e.mediaOptions&&(this.uaOptions.mute_video=!e.mediaOptions.video),this.userAgent.onEvent((function(e){var n=e.type,r=e.data;"registered"===n?t.userAgent.call():"message"===n&&t.handleMessage(r)})),this.userAgent.connect(),this.userAgent}},{key:"updateAuthAndRestartSession",value:function(e){p.debug("updateAuthAndRestartSession",e),e.error||(this.uaOptions.transportOptions.auth_token=e.signaling.options.auth_token),this.userAgent.connect()}},{key:"updateAuthAndResume",value:function(e){p.debug("updateAuthAndResume",e),this.userAgent?e.error?this.userAgent.resume(null):this.userAgent.resume(e.signaling.options.auth_token):p.warn("updateAuthAndResume","userAgent already gone")}},{key:"initDatachannel",value:function(e){var t=this;this.datachannel=e,p.debug("SigConnection::initDatachannel",e),e.onmessage=function(n){if('{"type":"ping"}'!==n.data||"open"!==e.readyState){p.debug("SigConnection::dataChannelMessage",n.data);var r=JSON.parse(n.data);"ack"!==r.type&&t.handleMessage(r)}else e.send('{"type":"pong"}')}}},{key:"close",value:function(){var e=this.datachannel,t=this.userAgent;this.datachannel=null,this.userAgent=null,e&&"open"===e.readyState&&e.close(),t&&(t.removeAllListeners(),t.terminate())}},{key:"onMessage",value:function(e){this.messageListener.push(e)}},{key:"handleMessage",value:function(e){if(fr.includes(e.type)){var t=this.transformer.process(e);this.messageListener.forEach((function(e){return e(t)}))}else p.debug('SigConnection::handleMessage ignoring "'.concat(e.type,'" message.'))}},{key:"send",value:function(e){if(!this.seppMessaging){var t=this.datachannel;e.cid=this.uaOptions.client_id;var n=JSON.stringify(e);return"chat"===e.type&&n.length>=gr?(p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"})):t&&"open"===t.readyState&&n.length<gr?(p.debug("SigConnection::send datachannel",n),void t.send(n)):void p.error("SigConnection::send failed",e)}this.sendSeppMessage(e)}},{key:"sendSeppMessage",value:function(e){var t=this.userAgent;if(t&&t.callId){e.cid=this.uaOptions.client_id,e.call_id=t.callId;var n=JSON.stringify(e);if("chat"===e.type&&n.length>=gr)return p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"});if(n.length<gr)return p.debug("SigConnection::send sepp",e),void t.message(e.type,e);p.error("SigConnection::send failed",e)}}},{key:"onError",value:function(e){return this.listeners.push(e),this}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}]),e}();function Sr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const kr=function(e){g(n,e);var t=Sr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(R(k(n.prototype),"handle",this).call(this,e),this.context.rtData=e.content,!0===e.content.ready){var t=e.content,r=t.user,i=t.room,o=t.signaling,s=t.links,a=t.options;this.context._eyeson.room=i,this.context._eyeson.user=this.context._api.addUserAttributes(r,r.id,o.options.client_id),this.context._eyeson.links=s,f.widescreen=Boolean(a.widescreen),this.context._connection?p.debug("RoomReceived double room_ready"):function(e,t,n){e.connection=new br(t,n),e._connection.onError((function(t){return e.send(t)})).start().then((function(){return e.send({type:"connection",connectionStatus:"ready"})})).catch((function(){return e.send({type:"connection",connectionStatus:"transport_error"})}))}(this.context,o,r)}else p.debug("RoomReceived not ready:",e.content)}}]),n}(P);function wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Cr=function(e){g(n,e);var t=wr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context._api.getRoom((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"fetch_room",room:t})}))}}]),n}(P);function xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Tr=function(e){g(n,e);var t=xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.deleteFile(e.file)}}]),n}(w);function Rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const _r=function(e){g(n,e);var t=Rr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.uploadFile(e.file,this.addFile.bind(this))}},{key:"addFile",value:function(e){R(k(n.prototype),"handle",this).call(this,{type:"add_file",file:e})}}]),n}(P);function Pr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Mr=function(e){g(n,e);var t=Pr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.cid.split("@").shift();this.msg=e,this.context._api.getUser(t,this.forwardMessage.bind(this))}},{key:"forwardMessage",value:function(e){var t=Date.parse(this.msg.ts||this.msg.created_at);R(k(n.prototype),"handle",this).call(this,{type:this.msg.type,user:e,timestamp:new Date(t),content:this.msg.content})}}]),n}(P);function Er(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Or=function(e){g(n,e);var t=Er(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.virtualBackground,s=void 0!==o&&o,a=e.screen,c=void 0!==a&&a,u=e.surface,l=void 0===u?null:u;p.debug("StartStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(c));var d=this.context,h=d._session,f=d._connection;if(!h)throw new Error("Session does not exist");if(h.micMixer&&(h.micMixer.destroy(),h.micMixer=null),h.options.virtualBackground=s,h.vbgMixer){var m=Bn.getStoredVirtualBackgroundType();h.vbgMixer.stopOriginalStream(),h.vbgMixer.terminate(),h.vbgMixer.changeBackground(m)}h.localStream&&!Xe.canMultipleDifferentMicrophones()&&vt(h.localStream);var v={audio:n,video:i,virtualBackground:h.options.virtualBackground,vbgMixer:h.vbgMixer,deviceMonitor:h.deviceMonitor};return c&&(h.micMixer=new Fn,v.video=!1,v.screen=!0,v.surface=l,v.virtualBackground=!1,v.micMixer=h.micMixer),new Ln(v).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_screen_video"})})),e})).then(h.setStream).then((function(){return h.send({type:"mute_video",on:!(i||c)})})).then((function(){h.externalStream&&(h.externalStream=null,f.hasExternalStream=!1)})).catch((function(e){if(p.error("StartStreamEvent",e),c){h.micMixer&&(h.micMixer.destroy(),h.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),h.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Dr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Ar=function(e){g(n,e);var t=Dr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.screen,s=void 0!==o&&o,a=e.surface;p.debug("ChangeStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(s));var c=this.context._session;if(!c)throw new Error("Session does not exist");c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);return c.externalStream?(ft(c.externalStream,n),pt(c.externalStream,i),c.send({type:"mute_video",on:!i}),Promise.resolve()):new Promise((function(e,t){if(Xe.stopsDeviceActivityIndicatorOnDisable()&&!s){var r=U(c.localStream.getVideoTracks(),1)[0],o=U(c.localStream.getAudioTracks(),1)[0];if(!(i&&kt(r)||"ended"===r.readyState||"ended"===o.readyState||bt(r)))return c.vbgMixer&&c.vbgMixer.originalStream?(c.vbgMixer[i?"start":"stop"](),At(c.localStream,i),Dt(c.vbgMixer.originalStream,i)):Dt(c.localStream,i),ft(c.localStream,n),void e(c.localStream)}c.vbgMixer&&(c.vbgMixer.stopOriginalStream(),c.vbgMixer.terminate());var u={audio:n,video:i,virtualBackground:c.options.virtualBackground,existingStream:c.localStream,vbgMixer:c.vbgMixer,deviceMonitor:c.deviceMonitor};s&&(c.micMixer=new Fn,u.screen=!0,u.video=!1,u.surface=a,u.virtualBackground=!1,u.vbgMixer=null,u.micMixer=c.micMixer),new Ln(u).onBrokenTrackError((function(){c.emit({type:"broken_track_error"})})).start().then(e).catch(t)})).then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){c.emit({type:"stop_screen_video"})})),e})).then(c.setStream).then((function(e){Ut(e)?c.canvasMixer.setStream(e):c.send({type:"mute_video",on:!(i||s)})})).catch((function(e){if(p.error(e),e instanceof Error&&["NotReadableError","DevicesNotFoundError","NotFoundError"].includes(e.name)&&c.emit({type:"warning",name:"error_"+e.name}),s){c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),c.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ir(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Br=function(e){g(n,e);var t=Ir(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=Gt(e.stream);if(!t)return p.error("ReplaceStreamEvent::handle invalid stream",e.stream),Promise.reject(new TypeError("Invalid stream"));var n=this.context,r=n._session,i=n._connection;if(!r)throw new Error("Session does not exist");return r.micMixer&&(r.micMixer.destroy(),r.micMixer=null),r.vbgMixer&&(r.vbgMixer.stopOriginalStream(),r.vbgMixer.terminate()),r.options.audio=ut(t),r.options.video=lt(t),r.setStream(t).then((function(){r.externalStream=t,i.hasExternalStream=!0,r.send({type:"mute_video",on:!lt(t)})})).catch((function(e){r.externalStream=null,i.hasExternalStream=!1,p.error(e)}))}}]),n}(w);function Lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fr=function(e){g(n,e);var t=Lr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.facingMode;p.debug("ToggleCameraEvent::handle",t);var n=this.context._session;if(!n)throw new Error("Session does not exist");new Ln({audio:n.localStream.getAudioTracks()[0].enabled,video:{facingMode:t},existingStream:n.localStream,deviceMonitor:n.deviceMonitor}).start().then(n.setStream).catch(p.error)}}]),n}(w);function jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Vr=function(e){g(n,e);var t=jr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.type,r=e.session.sessionDescriptionHandler,i=r.getLocalStream(),o=r.getRemoteStream();R(k(n.prototype),"handle",this).call(this,{type:t,localStream:i,remoteStream:o})}}]),n}(P);function Ur(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Nr=function(e){g(n,e);var t=Ur(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopRecording(e)}}]),n}(P);function Wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hr=function(e){g(n,e);var t=Wr(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n){t.context._api.getUser(e,n)}))}},{key:"handle",value:function(e){var t=this;this.getUser(e.userId).then((function(n){t.context.send({type:"voice_activity",user:n,on:e.on})}),(function(e){p.error("VoiceActivityEvent::handle",e)}))}}]),n}(w);function zr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Gr=function(e){g(n,e);var t=zr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context,n=t._api,r=t._session;n.startRecording(e).catch((function(e){return r.emit({type:"recording_error",error:e})}))}}]),n}(P);function qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const $r=function(e){g(n,e);var t=qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.screen,r=void 0!==n&&n,i=e.screenStream,o=e.surface,s=this.context._session;if(!s)throw new Error("Session does not exist");s.micMixer&&s.micMixer.destroy(),s.micMixer=new Fn;new Ln({audio:t,video:!1,screen:r,surface:o,screenStream:i,existingStream:s.localStream,micMixer:s.micMixer,isPresentation:!0,deviceMonitor:s.deviceMonitor}).start().then((function(e){var t="screen",n=U(Tt(e),1)[0];if(n){n.addEventListener("ended",(function(){s.emit({type:"stop_presenting"})}));var r=function(e){if(e&&"function"==typeof e.getSettings){var t=e.getSettings();if(Reflect.apply(Object.prototype.hasOwnProperty,t,["displaySurface"]))return t.displaySurface}return""}(n);r&&(t="screen-".concat(r))}s.emit({type:"start_presenting",stream:e,present:t})})).catch((function(e){if(p.error("ScreenCaptureEvent",e),r){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"capture_error",name:t})}s.emit({type:"stop_presenting"})}))}}]),n}(w);function Jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Kr=function(e){g(r,e);var t,n=Jr(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"streamVideo",value:function(){var e=this,t=this.context._session;new Ln({audio:t.localStream.getAudioTracks()[0].enabled,video:!1,deviceMonitor:t.deviceMonitor}).start().then((function(n){var r=t.videoPlayer.invokeStream(n);return e.handle({stream:r})})).catch((function(e){p.error("StartPresentingEvent",e),e.name.match(/notallowed|permission/i)||t.emit({type:"capture_error",name:"error_".concat(e.name)}),t.emit({type:"stop_presenting"})}))}},{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.stream,r=void 0===n?null:n,i=t.present,o=void 0===i?"":i,s=this.context._session){e.next=4;break}throw new Error("Session does not exist");case 4:if(s.vbgMixer&&(s.vbgMixer.stopOriginalStream(),s.vbgMixer.terminate()),!s.videoPlayer||s.videoPlayer.isStreaming()){e.next=9;break}this.streamVideo(),e.next=16;break;case 9:return a=r||s.localStream,s.canvasMixer&&s.canvasMixer.stream&&(a=s.canvasMixer.stream),e.next=13,s.setStream(a);case 13:s.send({type:"set_presenter",on:!0}),s.send({type:"desktopstreaming",on:!0}),s.emit({type:"presentation_started",present:o});case 16:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Yr=function(e){g(n,e);var t=Xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.canvasMixer&&(e.canvasMixer.vbgMixer&&(e.canvasMixer.vbgMixer.stopOriginalStream(),e.canvasMixer.vbgMixer.terminate(),e.canvasMixer.vbgMixer=null),e.canvasMixer.stop(),e.canvasMixer=null),e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.videoPlayer&&(e.videoPlayer.destroy(),e.videoPlayer=null),e.send({type:"desktopstreaming",on:!1}),e.send({type:"set_presenter",on:!1}),e.emit({type:"presentation_ended"}),e.stopPresentingSet=!0}}]),n}(w);function Qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Zr=function(e){g(n,e);var t=Qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopAllBroadcasts().then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})}))}}]),n}(P);function ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ti=function(e){g(n,e);var t=ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.clearFrontLayer()}}]),n}(w);function ni(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ri=function(e){g(n,e);var t=ni(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;return new m(e.api,e.token).requestUser({name:e.name,email:e.email,locale:e.locale},(function(e){if(!e.access_key){var r=e.locked;return e.error&&"ComApiError: 423"===e.error.message&&(r=!0),void R(k(n.prototype),"handle",t).call(t,{type:"error",content:"Request guest user failed",locked:r})}R(k(n.prototype),"handle",t).call(t,{type:"guest_user",token:e.access_key})}))}}]),n}(P);function ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const oi=function(e){g(n,e);var t=ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._eyeson.destroy()}}]),n}(w);function si(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ai=function(e){g(n,e);var t=si(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n,r){if(t.context._api)try{t.context._api.getUser(e,n)}catch(e){r(e)}else r(new Error("missing ComAPI"))}))}},{key:"handle",value:function(e){var t=this;(e.add||[]).forEach((function(e,n,r){var i=e.cid,o=t.context._connection.clientId,s=Boolean(r.find((function(e){return e.cid===o})));t.getUser(i).then((function(e){t.context.send({type:"add_user",user:e,initial:s})})).catch((function(e){return p.error(e)}))})),(e.del||[]).forEach((function(e){var n=e;t.getUser(n).then((function(e){t.context.send({type:"remove_user",userId:n,user:e})})).catch((function(e){return p.error(e)}))})),this.context.send({type:"playback_update",playing:e.media||[]})}}]),n}(w);var ci=function(e){return Number(parseFloat(e).toFixed(2))};const ui=function(e,t,n){var r=Math.min(n.width/e,n.height/t);return{width:ci(e*r),height:ci(t*r)}},li=function(e,t,n){var r;return function(){var i=this,o=arguments,s=n&&!r;clearTimeout(r),r=setTimeout((function(){r=null,n||e.apply(i,o)}),t),s&&e.apply(i,o)}};var di=1e3/15,hi={width:220,height:140},fi={width:320,height:240},pi={width:420,height:340},mi={width:0,height:0},vi="function"==typeof window.MediaStreamTrackProcessor,yi={getSettings:function(){return{width:0,height:0}},addEventListener:function(){return null}},gi=Xe.isIOSDevice(),bi=function(e){var t=U(e.getVideoTracks(),1)[0];if(!t)return null;if(vi)return new MediaStreamTrackProcessor(t).readable.getReader();var n=t.getSettings(),r=n.width,i=n.height,o=document.createElement("video");return o.playsInline=!0,o.muted=!0,o.width=r,o.height=i,o.srcObject=e,t.addEventListener("stopped",(function(){o.srcObject=null})),o.play().catch((function(e){return p.warn("bindVideoToStream: play",e,e.message)})),o},Si=function(){function e(t,n){c(this,e),this.canvas=t,this.stream=n,this.camera=null,this.screen=null,this.canvasTrack=null,this.context=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),this.xPos=0,this.camSize=fi,this.isCanvasCapture=!1,this.draw=this.draw.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.onError=this.onError.bind(this),this.onRedraw=this.onRedraw.bind(this),this.setStream=this.setStream.bind(this),this.setCamera=this.setCamera.bind(this),this.drawFrame=this.drawFrame.bind(this),this.calcSizesAndPositions=this.calcSizesAndPositions.bind(this),this.bouncedDraw=li(this.draw,di)}var t;return d(e,[{key:"onError",value:function(e){this.errorCallback=e}},{key:"onRedraw",value:function(e){this.redrawCallback=e}},{key:"start",value:function(){var e,t=U(It(this.stream),1)[0];this.canvasTrack=t,gi?((e=this).cameraStream={getVideoTracks:function(){return[]}},e.screenStream={getVideoTracks:function(){return[]}},this.setCamera({horizontal:"right",vertical:"bottom"},"none")):(this.setCamera({horizontal:"right",vertical:"bottom"},"medium"),this.setStream(this.stream)),this.draw()}},{key:"stop",value:function(){this.stream&&(vt(this.stream),this.stream=null,this.camera=null,this.screen=null,this.screenStream=null,this.cameraStream=null,this.canvasTrack=null)}},{key:"setStream",value:function(e){this.stream=e,this.cameraStream=new MediaStream(jt(e)?Pt(e):_t(e)),this.screenStream=new MediaStream(Tt(this.stream));var t=function(e){if(e&&e.getVideoTracks().length>0){var t=U(e.getVideoTracks(),1)[0];if("canvas"in t)return t.canvas}return null}(this.cameraStream);t?(this.isCanvasCapture=!0,this.camera=t):(this.isCanvasCapture=!1,this.camera=bi(this.cameraStream)),this.screen=bi(this.screenStream),this.calcSizesAndPositions(),this.redrawQueued=!0}},{key:"setCamera",value:function(e,t){this.cameraPosition=e||this.cameraPosition,this.cameraSizeInWords=t||this.cameraSizeInWords,this.redrawQueued=!0}},{key:"calcSizesAndPositions",value:function(){var e,t,n,r,i,o,s,a,c=U(this.screenStream.getVideoTracks(),1)[0],u=(void 0===c?yi:c).getSettings(),l=(e=this.canvas,n=(t=u).width/t.height,r=e.width/e.height,i=e.width,o=e.height,s=0,a=0,n<r&&(i=t.width*(o/t.height),s=(e.width-i)/2),n>r&&(o=t.height*(i/t.width),a=(e.height-o)/2),{x:s,y:a,width:i,height:o}),d=U(this.cameraStream.getVideoTracks(),1)[0],h=(void 0===d?yi:d).getSettings();this.camSize={small:hi,medium:fi,large:pi,none:mi}[this.cameraSizeInWords];var f=ui(h.width,h.height,this.camSize);this.sizes={screen:{width:l.width,height:l.height},camera:{width:f.width,height:f.height}};var p={x:"right"===this.cameraPosition.horizontal?this.canvas.width-this.sizes.camera.width:0,y:"bottom"===this.cameraPosition.vertical?this.canvas.height-this.sizes.camera.height:0};this.positions={screen:{x:l.x,y:l.y},camera:{x:p.x,y:p.y}}}},{key:"draw",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,this.stream&&this.stream.active){e.next=3;break}return e.abrupt("return");case 3:if(this.calcSizesAndPositions(),this.redrawCallback&&this.redrawQueued&&(this.redrawCallback(),this.redrawQueued=!1),t=performance.now(),!this.screen){e.next=14;break}if(n=this.screen,!(vi&&this.screen instanceof ReadableStreamDefaultReader)){e.next=13;break}return e.next=11,this.screen.read();case 11:r=e.sent,n=r.value;case 13:this.drawFrame(n,this.positions.screen,this.sizes.screen,!1,!0);case 14:if(i=this.camera,!(vi&&this.camera instanceof ReadableStreamDefaultReader)){e.next=20;break}return e.next=18,this.camera.read();case 18:o=e.sent,i=o.value;case 20:this.drawFrame(i,this.positions.camera,this.sizes.camera,this.isCanvasCapture,!1),(s=performance.now())-t>=di&&p.warn("Mixer::drawFrame took ".concat(s-t,"ms."));try{this.canvasTrack&&this.canvasTrack.requestFrame()}catch(e){p.warn("CanvasMixer draw requestFrame error - ".concat(e.message))}this.bouncedDraw(),e.next=31;break;case 27:e.prev=27,e.t0=e.catch(0),p.error(e.t0),this.errorCallback(e.t0);case 31:case"end":return e.stop()}}),e,this,[[0,27]])}))),function(){return t.apply(this,arguments)})},{key:"drawFrame",value:function(e,t,n,r,i){var o=this.context,s=this.canvas;if(e&&(r||!(e instanceof HTMLVideoElement)||e.srcObject&&e.srcObject.active))i&&!r&&o.clearRect(0,0,s.width,s.height),o.drawImage(e,t.x,t.y,n.width,n.height),vi&&"function"==typeof e.close&&e.close();else{var a=o.createImageData(1,1);o.putImageData(a,0,0)}}}]),e}();const ki=Si;function wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ci=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.canvas,i=e.screen,o=void 0!==i&&i,s=e.surface,a=e.onRedraw,c=e.changeStream,u=void 0!==c&&c,l=e.present,d=void 0===l?"mixer":l,h=this.context._session;if(!h)throw new Error("Session does not exist");var f=Bn.getStoredVirtualBackgroundType(),m=new An("canvasmixer");m.changeBackground(f);var v=function(e){p.error("StartMixerEvent",e),!h.canvasMixer&&m&&m.terminate(),!e.name.match(/notallowed|permission/i)&&o&&h.emit({type:"capture_error",name:"error_".concat(e.name)}),h.emit({type:"stop_presenting"})};new Ln({audio:t,video:n,virtualBackground:h.options.virtualBackground,screen:o,surface:s,canvas:r,existingStream:h.localStream,vbgMixer:m,deviceMonitor:h.deviceMonitor}).start().then((function(e){var t=U(Tt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_presenting"}),mt(t)})),h.canvasMixer=new ki(r,e),h.canvasMixer.vbgMixer=m,h.canvasMixer.onError(v),h.canvasMixer.onRedraw(a),h.canvasMixer.start(),e})).then((function(e){u?h.emit({type:"start_presenting",stream:e,present:d}):h.emit({type:"stream_update",presentationStream:e})})).catch(v)}}]),n}(w),xi=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.position,n=e.size,r=this.context._session;if(!r)throw new Error("Session does not exist");try{r.canvasMixer.setCamera(t,n)}catch(e){p.error(e)}}}]),n}(w),Ti="function"==typeof HTMLVideoElement.prototype.requestVideoFrameCallback,Ri=Xe.isIOSDevice();const _i=function(){function e(t){var n=t.canvas,r=t.file,i=t.onReady,o=t.onDuration,s=t.onTimeUpdate,a=t.onEnd,u=t.performAction;c(this,e),this.ac=null,this.acOut=null,this.gainNode=null,this.timer=null,this.canvas=n,this.url=URL.createObjectURL(r),this.ctx=n.getContext("2d"),this.video=document.createElement("video"),this.callback={onReady:i,onDuration:o,onTimeUpdate:s,onEnd:a,performAction:u},this.errorCallback=null,this.boundDrawVideoFrame=this.drawVideoFrame.bind(this),this.boundInitCanvasStream=this.initCanvasStream.bind(this),this.isPlaying=!1,this.blockTimeUpdate=!1,this.micOnlyStream=null,this.userMediaStream=null,this.initTimeout=null,this.invokationTimer=null,this.initVideo()}return d(e,[{key:"drawVideoFrame",value:function(){this.ctx.drawImage(this.video,0,0),this.timer=Ti?this.video.requestVideoFrameCallback(this.boundDrawVideoFrame):requestAnimationFrame(this.boundDrawVideoFrame)}},{key:"initVideo",value:function(){var e=this,t=this.video;t.playsInline=!0,t.autoplay=Boolean(Ri),t.preload="",t.onplaying=this.onVideoPlay.bind(this),t.onpause=this.onVideoPause.bind(this),t.onseeked=this.onVideoSeeked.bind(this),t.ontimeupdate=this.onVideoTimeUpdate.bind(this),t.onloadeddata=this.onVideoReady.bind(this),t.onerror=this.onVideoError.bind(this),t.onended=this.onVideoEnd.bind(this),this.initTimeout=setTimeout((function(){return e.onVideoError()}),6e3),t.src=this.url}},{key:"onVideoReady",value:function(){var e=this.video,t=this.canvas;clearTimeout(this.initTimeout),this.callback.onDuration(e.duration),t.width=e.videoWidth,t.height=e.videoHeight,this.ac=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.ac.createGain(),this.ac.createMediaElementSource(e).connect(this.gainNode),this.gainNode.connect(this.ac.destination),Ti&&(this.timer=e.requestVideoFrameCallback(this.boundDrawVideoFrame)),this.callback.performAction(this.onVideoAction.bind(this));try{this.ctx.drawImage(e,0,0)}catch(e){return void(this.errorCallback&&this.errorCallback(e))}this.callback.onReady(),e.autoplay&&setTimeout((function(){e.pause(),e.currentTime=0}))}},{key:"onVideoAction",value:function(e,t){return"play"===e?this.onPlayAction():"pause"===e?this.onPauseAction():("time"===e?this.onTimeAction(t):"volume"===e&&this.onVolumeAction(t),Promise.resolve())}},{key:"onPlayAction",value:function(){var e=this.video;return e.paused&&!this.isPlaying?e.play().then((function(){return e.paused}),(function(){return e.paused})):Promise.resolve(e.paused)}},{key:"onPauseAction",value:function(){var e=this.video;return!e.paused&&this.isPlaying&&e.pause(),Promise.resolve(e.paused)}},{key:"onTimeAction",value:function(e){var t=this.video;this.blockTimeUpdate=!0,e>=t.duration?t.currentTime=t.duration-.1:t.currentTime=e,this.blockTimeUpdate=!1}},{key:"onVolumeAction",value:function(e){this.gainNode&&(this.gainNode.gain.value=e)}},{key:"onVideoPlay",value:function(){this.isPlaying=!0,Ti||(this.timer=requestAnimationFrame(this.boundDrawVideoFrame)),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null)}},{key:"onVideoPause",value:function(){this.isPlaying=!1,!Ti&&this.timer&&cancelAnimationFrame(this.timer)}},{key:"onVideoSeeked",value:function(){Ti||this.isPlaying||this.ctx.drawImage(this.video,0,0)}},{key:"onVideoTimeUpdate",value:function(){this.blockTimeUpdate||this.callback.onTimeUpdate(this.video.currentTime)}},{key:"onVideoError",value:function(){var e=this.video,t=e&&e.error?e.error:new TypeError("VideoPlayer failed");p.error("VideoPlayer failed",t),this.errorCallback&&this.errorCallback(t)}},{key:"onVideoEnd",value:function(){this.callback.onEnd()}},{key:"initCanvasStream",value:function(){this.ctx.drawImage(this.video,0,0),this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)}},{key:"invokeStream",value:function(e){var t=U(this.canvas.captureStream(25).getVideoTracks(),1)[0];t.canvas||(t.type="canvas-track",t.canvas=this.canvas);var n=new MediaStream([t]);return this.acOut=this.ac.createMediaStreamDestination(),this.gainNode.connect(this.acOut),this.ac.createMediaStreamSource(e).connect(this.acOut),this.acOut.stream.getAudioTracks().forEach((function(e){return n.addTrack(e)})),this.userMediaStream=e,this.micOnlyStream=new MediaStream(e.getAudioTracks().concat(t)),this.isPlaying||(this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)),n}},{key:"isStreaming",value:function(){return Boolean(this.micOnlyStream)}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"destroy",value:function(){var e=this,t=this.video;clearTimeout(this.initTimeout),this.url&&(URL.revokeObjectURL(this.url),this.url=null),this.timer&&(Ti?t.cancelVideoFrameCallback(this.timer):cancelAnimationFrame(this.timer),this.timer=null),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null),this.userMediaStream&&(vt(this.userMediaStream),this.userMediaStream=null),this.micOnlyStream&&(vt(this.micOnlyStream),this.micOnlyStream=null),this.acOut&&(vt(this.acOut.stream),this.acOut=null),this.ac&&(this.gainNode.disconnect(),this.ac.close().then((function(){e.ac=null,e.gainNode=null}))),t&&(t.pause(),t.onplaying=null,t.onpause=null,t.ontimeupdate=null,t.onloadeddata=null,t.onseeked=null,t.onerror=null,t.onended=null,this.video=null),this.callback=null,this.errorCallback=null,this.ctx=null,this.canvas=null,this.boundDrawVideoFrame=null}}]),e}();function Pi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Mi=function(e){g(n,e);var t=Pi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=function(e){p.error("StartMediaEvent",e);var n=e&&(e instanceof MediaError||e instanceof DOMException)?"error_VideoError":"error_TypeError";t.emit({type:"warning",name:n}),t.emit({type:"stop_presenting"})};try{t.videoPlayer=new _i(e),t.videoPlayer.onError(n)}catch(e){n(e)}}}]),n}(w);function Ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Oi=function(e){g(n,e);var t=Ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.lockMeeting()}}]),n}(w);function Di(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Ai=function(e){g(n,e);var t=Di(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.terminateMeeting()}}]),n}(w);function Ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Bi=function(e){g(n,e);var t=Ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.kickUser(e.userId)}}]),n}(w);function Li(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fi=function(e){g(n,e);var t=Li(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");t.vbgMixer&&("suspend"===e.state?(t.vbgMixer.suspend(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.suspend()):"resume"===e.state&&(t.vbgMixer.resume(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.resume()))}}]),n}(w);function ji(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vi=function(e){e.micMixer&&(e.micMixer.destroy(),e.micMixer=null)},Ui=function(e){var t="error_Screen_".concat(e.name);return e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),t};const Ni=function(e){g(r,e);var t,n=ji(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.surface,r=null,i=this.context._session){e.next=5;break}throw new Error("Session does not exist");case 5:return e.prev=5,o=new Ln({surface:n}),e.next=9,o.getDisplayMedia();case 9:r=e.sent,e.next=17;break;case 12:return e.prev=12,e.t0=e.catch(5),p.error("ScreenVideoChangeEvent",e.t0),i.emit({type:"warning",name:Ui(e.t0)}),e.abrupt("return");case 17:return Vi(i),i.micMixer=new Fn,s={audio:i.localStream.getAudioTracks()[0].enabled,video:!1,screen:!0,surface:n,micMixer:i.micMixer,screenStream:r},e.prev=20,e.next=23,new Ln(s).start();case 23:a=e.sent,c=Rt(a),u=U(c,1),(l=u[0])&&l.addEventListener("ended",(function(){i.emit({type:"stop_screen_video"})})),i.setStream(a),e.next=35;break;case 29:e.prev=29,e.t1=e.catch(20),p.error("ScreenVideoChangeEvent",e.t1),Vi(i),i.emit({type:"screen_capture_error",name:Ui(e.t1)}),i.emit({type:"screen_video_ended"});case 35:case"end":return e.stop()}}),e,this,[[5,12],[20,29]])}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hi=function(e){g(n,e);var t=Wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.emit({type:"screen_video_ended"})}}]),n}(w);var zi=Xe.isIOSDevice();const Gi=function(){function e(){c(this,e),this.tempAudioTrack=null,this.tempVideoTrack=null,this.audioTrack=null,this.videoTrack=null,this.audioEnded=null,this.videoEnded=null,this.boundOnAudioEnd=this.onAudioEnd.bind(this),this.boundOnVideoEnd=this.onVideoEnd.bind(this),this.listeners=[]}return d(e,[{key:"addAudioTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempAudioTrack=e)}},{key:"addVideoTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempVideoTrack=e)}},{key:"applyTempTracks",value:function(){this.clearTracks(),this.tempAudioTrack&&(this.audioTrack=this.tempAudioTrack,this.tempAudioTrack=null,this.audioTrack.addEventListener("ended",this.boundOnAudioEnd)),this.tempVideoTrack&&(this.videoTrack=this.tempVideoTrack,this.tempVideoTrack=null,this.videoTrack.addEventListener("ended",this.boundOnVideoEnd))}},{key:"discardTempTracks",value:function(){this.tempAudioTrack=null,this.tempVideoTrack=null}},{key:"onAudioEnd",value:function(){var e=this;if(this.videoEnded)return clearTimeout(this.videoEnded),void this.emit({type:"all_devices_ended"});this.audioEnded=setTimeout((function(){e.videoEnded?(clearTimeout(e.videoEnded),e.emit({type:"all_devices_ended"})):e.emit({type:"audio_device_ended"})}),1e3)}},{key:"onVideoEnd",value:function(){var e=this;this.videoEnded=setTimeout((function(){e.audioEnded||e.emit({type:"video_device_ended"})}),1e3)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"clearTracks",value:function(){clearTimeout(this.audioEnded),clearTimeout(this.videoEnded),this.audioTrack&&(this.audioTrack.removeEventListener("ended",this.boundOnAudioEnd),this.audioTrack=null),this.videoTrack&&(this.videoTrack.removeEventListener("ended",this.boundOnVideoEnd),this.videoTrack=null),this.audioEnded=null,this.videoEnded=null}},{key:"destroy",value:function(){this.listeners.length=0,this.discardTempTracks(),this.clearTracks()}}]),e}();const qi=function(){function e(t){c(this,e),this.video=null,this.stream=null,this.canvasStream=null,this.vbgMixer=null,this.deviceMonitor=null,this.session=t,this.isActive=!1,this.startTimer=null}var t,n,r,i,o,s;return d(e,[{key:"start",value:(s=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.session,Xe.hasPipCamSupport()){e.next=4;break}return t.emit({type:"pip_cam_warning_unsupported"}),e.abrupt("return");case 4:return e.prev=4,this.startTimer=setTimeout((function(){return n.onError(new Error("Starting timeout 5s"))}),5e3),this.initFakeStream(),e.next=9,this.initVideoAndPip();case 9:return e.next=11,this.initCamera();case 11:clearTimeout(this.startTimer),this.isActive=!0,t.emit({type:"pip_cam",active:!0}),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return s.apply(this,arguments)})},{key:"onError",value:function(e){var t=this.session;clearTimeout(this.startTimer),p.error("PipCam error",e),t?(t.emit({type:"pip_cam_error"}),t.emit({type:"stop_pip_cam"})):this.stop()}},{key:"updateCamera",value:(o=Qe(et().mark((function e(){var t,n,r,i,o,s=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.isActive){e.next=2;break}return e.abrupt("return");case 2:return t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,this.startTimer=setTimeout((function(){return s.onError(new Error("Starting timeout 5s"))}),5e3),e.prev=4,t.srcObject=r,e.next=8,t.play();case 8:return o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),e.next=13,this.initCamera();case 13:clearTimeout(this.startTimer),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return o.apply(this,arguments)})},{key:"initFakeStream",value:function(){var e=f.widescreen,t=document.createElement("canvas"),n=t.getContext("2d",{alpha:!1});t.width=640,t.height=e?360:480,n.fillStyle="#404040",n.fillRect(0,0,t.width,t.height);var r=new Path2D(e?"M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z":"M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z");n.fillStyle="#212121",n.fill(r),this.canvasStream=t.captureStream()}},{key:"initVideoAndPip",value:(i=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=document.createElement("video"),this.video=t,t.muted=!0,t.playsInline=!0,t.onleavepictureinpicture=function(){return n.onExitPip()},t.onpause=function(e){var t=e.target;return n.onVideoPause(t)},t.srcObject=this.canvasStream,e.next=9,t.play();case 9:return e.next=11,t.requestPictureInPicture();case 11:case"end":return e.stop()}}),e,this)}))),function(){return i.apply(this,arguments)})},{key:"initCamera",value:(r=Qe(et().mark((function e(){var t,n,r,i=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(t=this.session.options.virtualBackground)&&(n=Bn.getStoredVirtualBackgroundType(),this.vbgMixer=new An("PipCam"),this.vbgMixer.changeBackground(n)),this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(e){return i.onDeviceEvent(e)})),r={audio:!1,video:!0,virtualBackground:t,vbgMixer:this.vbgMixer,deviceMonitor:this.deviceMonitor},e.next=7,new Ln(r).start();case 7:return this.stream=e.sent,this.video.srcObject=this.stream,e.next=11,this.video.play();case 11:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"onExitPip",value:function(){this.session?this.session.emit({type:"stop_pip_cam"}):this.stop()}},{key:"onVideoPause",value:function(e){setTimeout((function(){return e.play().catch((function(){}))}))}},{key:"onDeviceEvent",value:function(e){e.type.endsWith("_ended")&&(clearTimeout(this.startTimer),this.session?(this.session.emit({type:"pip_cam_warning_video_ended"}),this.session.emit({type:"stop_pip_cam"})):this.stop())}},{key:"stop",value:(n=Qe(et().mark((function e(){var t,n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,clearTimeout(this.startTimer),!t){e.next=15;break}if(t.onpause=null,t.onleavepictureinpicture=null,document.pictureInPictureElement!==t){e.next=13;break}return e.prev=6,e.next=9,document.exitPictureInPicture();case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(6);case 13:t.srcObject=null,this.video=null;case 15:o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),r&&(vt(r),this.canvasStream=null),this.isActive&&(this.session&&this.session.emit({type:"pip_cam",active:!1}),this.isActive=!1);case 20:case"end":return e.stop()}}),e,this,[[6,11]])}))),function(){return n.apply(this,arguments)})},{key:"destroy",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.stop();case 2:this.session=null;case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}();function $i(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ji=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?e.emit({type:"pip_cam",active:e.pipCam.isActive}):(e.pipCam=new qi(e),e.pipCam.start())}}]),n}(w),Ki=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?(e.pipCam.destroy(),e.pipCam=null):e.emit({type:"pip_cam",active:!1})}}]),n}(w),Xi=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam&&e.pipCam.updateCamera()}}]),n}(w);function Yi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Qi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h,f;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),o=lt(n.localStream),e.next=6,new Ar(this.context).handle({audio:i,video:o});case 6:if(!((s=n.localStream.getAudioTracks())&&s.length>0)){e.next=16;break}return a=U(s,1),c=a[0],e.next=11,Bn.fetchInputDevices();case 11:u=e.sent,l=c.getSettings(),d=l.deviceId,h=u.find((function(e){return e.deviceId===d})),Xe.canMultipleDifferentMicrophones()||((f=nt.load("mediaConstraints")).audio={deviceId:{exact:d}},nt.store("mediaConstraints",f),nt.store("audioId",d)),h&&(t.newAudioDevice=h.label);case 16:e.next=21;break;case 18:e.prev=18,e.t0=e.catch(1),p.error("AudioDeviceEndEvent",e.t0);case 21:R(k(r.prototype),"handle",this).call(this,t);case 22:case"end":return e.stop()}}),e,this,[[1,18]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),Zi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Ar(this.context).handle({audio:i,video:!1});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(1),p.error("VideoDeviceEndEvent",e.t0);case 10:R(k(r.prototype),"handle",this).call(this,t);case 11:case"end":return e.stop()}}),e,this,[[1,7]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),eo=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Ar(this.context).handle({audio:i,video:!1});case 5:if(!((o=n.localStream.getAudioTracks())&&o.length>0)){e.next=15;break}return s=U(o,1),a=s[0],e.next=10,Bn.fetchInputDevices();case 10:c=e.sent,u=a.getSettings(),l=u.deviceId,d=c.find((function(e){return e.deviceId===l})),Xe.canMultipleDifferentMicrophones()||((h=nt.load("mediaConstraints")).audio={deviceId:{exact:l}},nt.store("mediaConstraints",h),nt.store("audioId",l)),d&&(t.newAudioDevice=d.label);case 15:e.next=20;break;case 17:e.prev=17,e.t0=e.catch(1),p.error("AllDevicesEndEvent",e.t0);case 20:R(k(r.prototype),"handle",this).call(this,t);case 21:case"end":return e.stop()}}),e,this,[[1,17]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),to=function(){function e(){c(this,e),this.listeners=[],this._eyeson=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null,this.send=this.send.bind(this)}return d(e,[{key:"destroy",value:function(){this._monitor&&this._monitor.destroy(),this._connection&&this._connection.close(),this._rtConnection&&this._rtConnection.close(),this._session&&(this._session.vbgMixer&&(this._session.vbgMixer.stopOriginalStream(),this._session.vbgMixer.terminate(),this._session.vbgMixer.destroy()),this._session.end()),this._api=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null}},{key:"connection",get:function(){return null},set:function(e){this._connection?p.error("A connection is already set. If you are trying to start a new session you have to end the current one first."):(this._connection=e,this._connection.onMessage(this.send))}},{key:"rtConnection",get:function(){return null},set:function(e){this._rtConnection?p.error("A real-time connection is already set. If you are trying to start a new session you have the close the current before."):(this._rtConnection=e,this._rtConnection.onMessage(this.send))}},{key:"monitor",get:function(){return this._monitor},set:function(e){this._monitor?p.error("A monitor is already set. If you are trying to start a new session you have to end the current one first."):(this._monitor=e,this._monitor.onEvent(this.send))}},{key:"session",get:function(){return null},set:function(e){this._session?p.error("A session is already set. If you are trying to start a new session you have to end the current one first."):(this._session=e,this._session.onEvent(this.send))}},{key:"api",get:function(){return null},set:function(e){this._api=e}},{key:"rtData",get:function(){return null},set:function(e){this._rtData=e}},{key:"eyeson",get:function(){return null},set:function(e){this._eyeson=e}},{key:"onReceive",value:function(e){p.debug("EventHandler::onReceive"),this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"send",value:function(e){e.silenced||p.debug("EventHandler::send",e),new({stfu:F,chat:Mr,accept:Vr,podium:Wn,snapshot:zn,send_chat:Jn,set_layer:qn,set_layout:Qn,fetch_room:Cr,room_ready:kr,room_setup:kr,memberlist:ai,upload_file:_r,delete_file:Tr,request_stfu:A,change_stream:Ar,replace_stream:Br,toggle_camera:Fr,stop_playback:T,playback_update:F,start_playback:x,start_stream:Or,stop_recording:Nr,start_screen_capture:$r,stop_broadcasts:Zr,start_recording:Gr,stop_presenting:Yr,start_presenting:Kr,stop_annotation:O,start_annotation:E,clear_front_layer:ti,request_guest_user:ri,voice_activity_raw:Hr,start_mixer:Ci,update_mixer:xi,lock_meeting:Oi,terminate_meeting:Ai,kick_user:Bi,session_termination:oi,start_media:Mi,change_screen_video:Ni,stop_screen_video:Hi,stop_rtmp:Xn,start_rtmp:er,suspend_virtual_background:Fi,audio_device_ended:Qi,video_device_ended:Zi,all_devices_ended:eo,start_pip_cam:Ji,stop_pip_cam:Ki,update_pip_cam:Xi,capture_error:F,voice_activity:F,options_update:F,ext_not_installed:F,broadcasts_update:F,presentation_ended:F,recording:B,ext_cancel:B,ext_installed:B,message_status:B,moderator_info:B}[e.type]||P)(this).handle(e)}}]),e}();const no=to;var ro=function(e){return e.replace("o=-","o=Visoweb")},io=function(e){var t=e.split("\r\n"),n=t.findIndex((function(e){return e.startsWith("t=")})),r=1;return Xe.canSFU()&&(t.splice(n+r,0,"a=sfu-capable"),r++,Xe.disallowAudioSyncSrcChange()&&(t.splice(n+r,0,"a=disallow-audio-ssrc-change"),r++)),Xe.canDataChannel()&&t.splice(n+r,0,"a=eyeson-datachan-capable","a=eyeson-datachan-keepalive","a=eyeson-sepp-messaging"),t.join("\r\n")},oo=function(e){var t=Xe.canStereo(),n=e.match(/^a=rtpmap:(\d+) opus/m);if(n){var r=new RegExp("^a=fmtp:".concat(n[1]," (.+)$"),"m"),i=e.match(r);if(i){var o={};i[1].split(";").forEach((function(e){var t=U(e.split("="),2),n=t[0],r=t[1];o[n]=r})),o.stereo=t?"1":"0";var s=Object.entries(o).map((function(e){var t=U(e,2),n=t[0],r=t[1];return"".concat(n,"=").concat(r)})).join(";");return e.replace(r,"a=fmtp:".concat(n[1]," ").concat(s))}}return e},so=function(e){var t=e.split("\r\n"),n=!1;return t.forEach((function(e,r){e.startsWith("m=audio")||e.startsWith("m=video")?n=!0:e.startsWith("m=application")?n=!1:"a=sendrecv"===e&&n&&(t[r]="a=sendonly")})),t.join("\r\n")},ao=function(e){var t={active:[oo],passive:[ro,io]};return!0===e.sendOnly&&t.active.push(so),t};const co=function(){function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};c(this,e),this.options=r,this.options.RTCConstraints=Object.assign({},this.defaultRTCConstraints,{offerToReceiveVideo:!this.options.eco}),this.accepted=!1,this.listeners=[],this.restarting=!1,this.connection=t,this.comApi=n,this.sipSession=null,this.startAttempts=0,this.maxStartAttempts=3,this.tryAuthUpdate=!0,this.tryResume=!0,this.tryWaitResume=!0,this.resumeTimer=null,this.waitResumeTimer=null,this.end=this.end.bind(this),this.emit=this.emit.bind(this),this.setStream=this.setStream.bind(this),this.endSession=this.endSession.bind(this),this.initSession=this.initSession.bind(this),this.handleFailed=this.handleFailed.bind(this),this.handleAccept=this.handleAccept.bind(this),this.handleUnmute=this.handleUnmute.bind(this),this.restartSession=this.restartSession.bind(this),this.tryRecoveryFrom=this.tryRecoveryFrom.bind(this),this.terminateSession=this.terminateSession.bind(this),this.remoteDescriptionUpdate=this.remoteDescriptionUpdate.bind(this)}var t;return d(e,[{key:"peerConnection",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.peerConnection:null}},{key:"localStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.localStream:null}},{key:"remoteStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.remoteStream:null}},{key:"defaultRTCConstraints",get:function(){return{offerToReceiveAudio:!0,offerToReceiveVideo:!0}}},{key:"start",value:function(){this.options.stream?this.initExternalStream():(this.initDeviceMonitor(),this.initVirtualBackground(),new Ln(this.options).start().then(this.initSession).catch(this.handleFailed))}},{key:"initExternalStream",value:function(){var e=!lt(this.options.stream)&&this.options.eco,t=Gt(this.options.stream,e);t?(this.externalStream=t,this.options.audio=ut(t),this.options.video=lt(t),this.initSession(this.externalStream)):this.handleFailed({name:"invalid_stream"})}},{key:"initVirtualBackground",value:function(){var e=Bn.getStoredVirtualBackgroundType();this.vbgMixer=new An,this.vbgMixer.changeBackground(e),this.options.vbgMixer=this.vbgMixer}},{key:"initDeviceMonitor",value:function(){var e=this;this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(t){return e.emit(t)})),this.options.deviceMonitor=this.deviceMonitor}},{key:"buildSessionOptions",value:function(e){var t=this.options;return!0===t.sendOnly&&(t.RTCConstraints={}),{stream:e,sendOnly:t.sendOnly,SDPModifiers:ao({sendOnly:t.sendOnly}),connection:this.connection,handleAccept:this.handleAccept,handleUnmute:this.handleUnmute,RTCConstraints:t.RTCConstraints,remoteDescriptionUpdate:this.remoteDescriptionUpdate,mediaOptions:{audio:t.audio,video:t.video}}}},{key:"initSession",value:function(e){var t=this;this.tryResume=!0,this.tryAuthUpdate=!0,this.tryWaitResume=!0;var n=this.buildSessionOptions(e);this.sipSession=this.connection.startSession(n),this.onUnmute(e),this.sipSession.onEvent((function(e){"accepted"===e.type?t.adjustVideoPodium():"resumed"===e.type?(clearTimeout(t.resumeTimer),clearTimeout(t.waitResumeTimer),t.tryResume=!0,t.tryAuthUpdate=!0,t.tryWaitResume=!0):"terminated"===e.type&&t.handleTermination(e.reason,e.code)})),this.externalStream&&(this.connection.hasExternalStream=!0),window&&window.addEventListener(Xe.isIOSDevice()?"pagehide":"beforeunload",this.endSession)}},{key:"end",value:function(){this.listeners=[],this.endSession(),this.accepted=!1,this.sipSession=null,this.connection=null}},{key:"endSession",value:function(){p.debug("ConferenceSession::endSession"),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),this.sipSession&&(this.sipSession.removeAllListeners(),this.terminateSession()),this.connection&&this.connection.close(),this.deviceMonitor&&this.deviceMonitor.destroy()}},{key:"terminateSession",value:function(){p.debug("ConferenceSession::terminateSession");try{this.sipSession.terminate()}catch(e){p.error(e)}}},{key:"setStream",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.sipSession){e.next=2;break}return e.abrupt("return",null);case 2:return e.prev=2,n=this.sipSession.sessionDescriptionHandler,e.next=6,n.setStream(t);case 6:return r=e.sent,this.stopPresentingSet=!1,this.micMixer&&this.micMixer.active&&(r.newStream=this.micMixer.getMicOnlyStream(),n.localStream=r.newStream),this.videoPlayer&&this.videoPlayer.isStreaming()&&(r.newStream=this.videoPlayer.getMicOnlyStream(),n.localStream=r.newStream),this.onUnmute(r.newStream),this.emit({type:"stream_update",localStream:r.newStream,stream:r.remoteStream}),e.abrupt("return",r.newStream);case 15:return e.prev=15,e.t0=e.catch(2),p.error("ConferenceSession::setStream",e.t0),this.emit({type:"stream_update",localStream:this.localStream,stream:this.remoteStream}),e.abrupt("return",this.localStream);case 20:case"end":return e.stop()}}),e,this,[[2,15]])}))),function(e){return t.apply(this,arguments)})},{key:"onUnmute",value:function(e){var t=this;e&&e.getTracks().forEach((function(e){e.onunmute=function(){return t.emit({type:"local_track_unmuted",track:e})}}))}},{key:"setMonitor",value:function(e){this.monitor=e}},{key:"handleAccept",value:function(e){this.monitor&&this.monitor.observe(this.peerConnection),this.accepted||(this.emit({type:"accept",session:this.sipSession}),this.accepted=!0),e&&this.emit({type:"stream_update",stream:e})}},{key:"handleUnmute",value:function(e){this.emit({type:"track_unmuted",track:e})}},{key:"remoteDescriptionUpdate",value:function(e){p.debug("ConferenceSession::remoteDescriptionUpdate",e.sdp);var t=!1,n=e.sdp.split("\r\n").find((function(e){return e.startsWith("a=sfu-mode")}));n&&(t=n.includes("on")),this.emit({type:"remote_description_update",update:{sfu:t}})}},{key:"adjustVideoPodium",value:function(){this.send({type:"mute_video",on:!this.options.video})}},{key:"handleTermination",value:function(e,t){var n=this;if(p.debug("ConfSession::handleTermination",e,t),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),"bye"===e&&200===t||"terminate"===e)this.handleExit();else if("disconnect"===e)if(-1===t){if(this.tryAuthUpdate)return this.tryAuthUpdate=!1,void this.comApi.getRoom((function(e){return n.connection.updateAuthAndRestartSession(e)}));if(this.tryWaitResume&&this.connection)return this.tryWaitResume=!1,this.waitResumeTimer=setTimeout((function(){n.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)}))}),5e3),void(this.resumeTimer=setTimeout((function(){n.handleFailed({name:503})}),15e3));this.handleFailed({name:503})}else{if(this.tryResume&&this.connection)return this.tryResume=!1,this.tryAuthUpdate=!1,this.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)})),void(this.resumeTimer=setTimeout((function(){return n.handleFailed({name:410})}),1e4));this.handleFailed({name:410})}else this.handleFailed({name:t});this.restarting||this.emit({type:"session_termination"})}},{key:"handleExit",value:function(){this.emit({type:"exit",reason:"bye"})}},{key:"handleFailed",value:function(e){p.warn("ConferenceSession::handleFailed: ",e),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer);var t="Desert";if(e&&e.name&&(t=e.name),!this.tryRecoveryFrom(t)){var n={NotFoundError:"devices",NotAllowedError:"permission",DevicesNotFoundError:"devices",PermissionDeniedError:"permission",NotReadableError:"not_readable",403:"session_in_use",410:"abrupt_disconnect",413:"request_too_large",426:"ice_error",486:"session_in_use",607:"meeting_locked"}[t]||"session_failed";this.emit({type:"error",name:n,code:this.errorCodeName(t,n)})}}},{key:"errorCodeName",value:function(e,t){return["permission","devices","not_readable","meeting_locked","session_in_use","transport_error"].includes(t)?"":String(e)}},{key:"tryRecoveryFrom",value:function(e){var t=this;p.debug("ConferenceSession::tryRecoveryFrom: ",e);var n={404:{condition:function(){return t.startAttempts<t.maxStartAttempts},action:function(){return t.restartSession()}}}[e];return this.startAttempts>=this.maxStartAttempts?(this.restarting=!1,!1):Boolean(n&&n.condition()&&n.action())}},{key:"restartSession",value:function(){var e=this;return p.debug("ConferenceSession::restartSession: ",this.startAttempts),this.restarting=!0,this.startAttempts+=1,setTimeout((function(){e.endSession(),e.start()}),1e3),!0}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"send",value:function(e){return this.connection.send(e)}}]),e}();function uo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return lo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return lo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function lo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ho={NO_CONNECTION:3,BAD:2,OK:1,GOOD:0},fo=function(e,t){e.length<3?e.push(Object.assign({},t)):Object.assign(function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time<t.time&&(t=e[r]);return t}(e),t)},po=function(e){var t,n=e.length,r={jitter:0,packetLoss:0,roundTripTime:0,nack:0,bitrateSend:0,bitrateRecv:0,status:ho.GOOD},i=function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time>t.time&&(t=e[r]);return t}(e),o=uo(e);try{for(o.s();!(t=o.n()).done;){var s=t.value;r.jitter+=s.jitter,r.packetLoss+=s.packetLoss,r.roundTripTime+=s.roundTripTime,r.nack+=s.nack,r.bitrateSend+=s.bitrateSend,r.bitrateRecv+=s.bitrateRecv}}catch(e){o.e(e)}finally{o.f()}return r.jitter=null===i.jitter?null:r.jitter/n,r.packetLoss=null===i.packetLoss?null:r.packetLoss/n,r.roundTripTime=null===i.roundTripTime?null:r.roundTripTime/n,r.nack=null===i.nack?null:r.nack/n,r.bitrateSend/=n,r.bitrateRecv/=n,r.status=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n>1||e>.2||t>.5||r>.2?ho.BAD:n>.3||e>.1||t>.3||r>.1?ho.OK:ho.GOOD}(r.packetLoss,r.jitter,r.roundTripTime,r.nack),r},mo=function(){function e(){c(this,e),this.peerConnection=null,this.timer=null,this.listeners=[],this.history=[],this.entry={jitter:0,packetLoss:0,roundTripTime:0,nack:0,time:0,bitrateSend:0,bitrateRecv:0},this.lastStat={time:null,bytesSent:null,bytesReceived:null,audio:{out:{packetsSent:null,packetsLost:null,bytesSent:null},in:{packetsReceived:null}},video:{out:{packetsSent:null,packetsLost:null,bytesSent:null,nackCount:null},in:{bytesReceived:null}}},this.boundPrintStats=this.printStats.bind(this)}var t;return d(e,[{key:"init",value:function(e){this.peerConnection=e}},{key:"printStats",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.peerConnection,n=this.entry,r=this.lastStat,i=this.history,e.next=3,t.getStats();case 3:o=e.sent,s=Date.now(),a=null,Object.keys(n).forEach((function(e){n[e]=0})),n.jitter=null,n.packetLoss=null,n.roundTripTime=null,n.nack=null,n.time=s,o.forEach((function(e){if("inbound-rtp"===e.type){var t=e.kind||e.mediaType;if(r.time){var i=(s-r.time)/1e3,c=Math.max(e.bytesReceived-r[t].in.bytesReceived,0);n.bitrateRecv+=8*c/i}r[t].in.bytesReceived=e.bytesReceived}else if("outbound-rtp"===e.type){var u=e.kind||e.mediaType;if(r.time){var l=(s-r.time)/1e3,d=e.bytesSent-r[u].out.bytesSent;n.bitrateSend+=8*d/l}r[u].out.bytesSent=e.bytesSent}else if("remote-inbound-rtp"===e.type){var h=e.kind||e.mediaType;if(r[h]){var f=o.get(e.localId),p=void 0!==e.roundTripTime,m=void 0!==e.jitter,v=void 0!==e.packetsLost,y=void 0!==f.nackCount;if(r.time){var g=e.packetsLost-r[h].out.packetsLost,b=f.packetsSent-r[h].out.packetsSent,S=b>0?g/b:0;if(n.jitter=m?Math.max(n.jitter,b>0?e.jitter:0):null,n.packetLoss=v?Math.max(n.packetLoss,S):null,n.roundTripTime=p?Math.max(n.roundTripTime,e.roundTripTime):null,"video"===h){var k=f.nackCount-r[h].out.nackCount,w=b>0?k/b:0;n.nack=y?Math.max(n.nack,w):null}}"video"===h&&(r[h].out.nackCount=f.nackCount),r[h].out.packetsSent=f.packetsSent,r[h].out.packetsLost=e.packetsLost}}else"candidate-pair"===e.type&&"succeeded"===e.state&&"currentRoundTripTime"in e&&(a=e.currentRoundTripTime)})),null===n.roundTripTime&&null!==a&&(n.roundTripTime=a),fo(i,n),c=po(i),!1===navigator.onLine&&(c.status=ho.BAD),["disconnected","failed","closed"].includes(t.iceConnectionState)&&(c.status=ho.NO_CONNECTION),this.emit(c),r.time=s;case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"getCurrentStatistics",value:function(){return po(this.history)}},{key:"onUpdate",value:function(e){var t=this.listeners,n=this.timer;0===t.length&&null===n&&(this.timer=setInterval(this.boundPrintStats,1e3),this.peerConnection.addEventListener("iceconnectionstatechange",this.boundPrintStats),window.addEventListener("offline",this.boundPrintStats)),t.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){try{t(e)}catch(e){p.error("ConnectionStatistics::emit",e)}}))}},{key:"destroy",value:function(){clearInterval(this.timer),window.removeEventListener("offline",this.boundPrintStats),this.peerConnection&&(this.peerConnection.removeEventListener("iceconnectionstatechange",this.boundPrintStats),this.peerConnection=null),this.timer=null,this.history.length=0,this.listeners.length=0}}]),e}();mo.Status=ho;const vo=mo;const yo=function(){function e(){c(this,e),this.pc=null,this.statistics=new vo,this.listeners=[],this.disconnectTimer=null,this.prevIceState="initial",this.onOffline=this.onOffline.bind(this),this.handleIceStateChange=this.handleIceStateChange.bind(this),this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.addEventListeners()}return d(e,[{key:"addEventListeners",value:function(){window.addEventListener("offline",this.onOffline)}},{key:"onOffline",value:function(){this.emit({type:"offline"})}},{key:"observe",value:function(e){this.pc||(this.pc=e,this.pc.oniceconnectionstatechange=this.handleIceStateChange,this.pc.onconnectionstatechange=this.handleConnectionStateChange,this.statistics.init(e),this.emit({type:"statistics_ready",statistics:this.statistics}))}},{key:"destroy",value:function(){var e=this.pc,t=this.statistics;clearTimeout(this.disconnectTimer),t&&(t.destroy(),this.statistics=null),e&&(e.onconnectionstatechange=null,e.oniceconnectionstatechange=null,this.pc=null),window.removeEventListener("offline",this.onOffline)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"handleConnectionStateChange",value:function(e){e.currentTarget&&p.warn("connectionStateChange: ",e.currentTarget.connectionState)}},{key:"handleIceStateChange",value:function(e){var t=this;if(e.currentTarget){var n=e.currentTarget.iceConnectionState;"disconnected"===n&&(this.emit({type:"warning",name:"ice_disconnected"}),clearTimeout(this.disconnectTimer),this.disconnectTimer=window.setTimeout((function(){t.pc&&"connected"!==t.pc.iceConnectionState&&t.emit({type:"error",name:"ice_failed",code:"Goldfinger"})}),2e3)),"failed"===n&&this.emit({type:"error",name:"ice_failed",code:"Thunderball"}),"disconnected"===this.prevIceState&&["completed","connected"].includes(n)&&this.emit({type:"clear_warning",name:"ice_disconnected"}),this.prevIceState=n}}}]),e}();var go={logger:self.console,WebSocket:self.WebSocket},bo={log(...e){this.enabled&&(e.push(Date.now()),go.logger.log("[ActionCable]",...e))}};const So=()=>(new Date).getTime(),ko=e=>(So()-e)/1e3;class wo{constructor(e){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=e,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=So(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),bo.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=So(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),bo.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=So()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,bo.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=So(),bo.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout((()=>{this.reconnectIfStale(),this.poll()}),this.getPollInterval())}getPollInterval(){const{staleThreshold:e,reconnectionBackoffRate:t}=this.constructor;return 1e3*e*Math.pow(1+t,Math.min(this.reconnectAttempts,10))*(1+(0===this.reconnectAttempts?1:t)*Math.random())}reconnectIfStale(){this.connectionIsStale()&&(bo.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${ko(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?bo.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${ko(this.disconnectedAt)} s`):(bo.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return ko(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&ko(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){"visible"===document.visibilityState&&setTimeout((()=>{!this.connectionIsStale()&&this.connection.isOpen()||(bo.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())}),200)}}wo.staleThreshold=6,wo.reconnectionBackoffRate=.15;var Co={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:xo,protocols:To}=Co,Ro=To.slice(0,To.length-1),_o=[].indexOf;class Po{constructor(e){this.open=this.open.bind(this),this.consumer=e,this.subscriptions=this.consumer.subscriptions,this.monitor=new wo(this),this.disconnected=!0}send(e){return!!this.isOpen()&&(this.webSocket.send(JSON.stringify(e)),!0)}open(){return this.isActive()?(bo.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1):(bo.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${To}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new go.WebSocket(this.consumer.url,To),this.installEventHandlers(),this.monitor.start(),!0)}close({allowReconnect:e}={allowReconnect:!0}){if(e||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(bo.log(`Reopening WebSocket, current state is ${this.getState()}`),!this.isActive())return this.open();try{return this.close()}catch(e){bo.log("Failed to reopen WebSocket",e)}finally{bo.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}isProtocolSupported(){return _o.call(Ro,this.getProtocol())>=0}isState(...e){return _o.call(e,this.getState())>=0}getState(){if(this.webSocket)for(let e in go.WebSocket)if(go.WebSocket[e]===this.webSocket.readyState)return e.toLowerCase();return null}installEventHandlers(){for(let e in this.events){const t=this.events[e].bind(this);this.webSocket[`on${e}`]=t}}uninstallEventHandlers(){for(let e in this.events)this.webSocket[`on${e}`]=function(){}}}Po.reopenDelay=500,Po.prototype.events={message(e){if(!this.isProtocolSupported())return;const{identifier:t,message:n,reason:r,reconnect:i,type:o}=JSON.parse(e.data);switch(o){case xo.welcome:return this.monitor.recordConnect(),this.subscriptions.reload();case xo.disconnect:return bo.log(`Disconnecting. Reason: ${r}`),this.close({allowReconnect:i});case xo.ping:return this.monitor.recordPing();case xo.confirmation:return this.subscriptions.confirmSubscription(t),this.subscriptions.notify(t,"connected");case xo.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",n)}},open(){if(bo.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return bo.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(e){if(bo.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){bo.log("WebSocket onerror event")}};class Mo{constructor(e,t={},n){this.consumer=e,this.identifier=JSON.stringify(t),function(e,t){if(null!=t)for(let n in t){const r=t[n];e[n]=r}}(this,n)}perform(e,t={}){return t.action=e,this.send(t)}send(e){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(e)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class Eo{constructor(e){this.subscriptions=e,this.pendingSubscriptions=[]}guarantee(e){-1==this.pendingSubscriptions.indexOf(e)?(bo.log(`SubscriptionGuarantor guaranteeing ${e.identifier}`),this.pendingSubscriptions.push(e)):bo.log(`SubscriptionGuarantor already guaranteeing ${e.identifier}`),this.startGuaranteeing()}forget(e){bo.log(`SubscriptionGuarantor forgetting ${e.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter((t=>t!==e))}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout((()=>{this.subscriptions&&"function"==typeof this.subscriptions.subscribe&&this.pendingSubscriptions.map((e=>{bo.log(`SubscriptionGuarantor resubscribing ${e.identifier}`),this.subscriptions.subscribe(e)}))}),500)}}class Oo{constructor(e){this.consumer=e,this.guarantor=new Eo(this),this.subscriptions=[]}create(e,t){const n="object"==typeof e?e:{channel:e},r=new Mo(this.consumer,n,t);return this.add(r)}add(e){return this.subscriptions.push(e),this.consumer.ensureActiveConnection(),this.notify(e,"initialized"),this.subscribe(e),e}remove(e){return this.forget(e),this.findAll(e.identifier).length||this.sendCommand(e,"unsubscribe"),e}reject(e){return this.findAll(e).map((e=>(this.forget(e),this.notify(e,"rejected"),e)))}forget(e){return this.guarantor.forget(e),this.subscriptions=this.subscriptions.filter((t=>t!==e)),e}findAll(e){return this.subscriptions.filter((t=>t.identifier===e))}reload(){return this.subscriptions.map((e=>this.subscribe(e)))}notifyAll(e,...t){return this.subscriptions.map((n=>this.notify(n,e,...t)))}notify(e,t,...n){let r;return r="string"==typeof e?this.findAll(e):[e],r.map((e=>"function"==typeof e[t]?e[t](...n):void 0))}subscribe(e){this.sendCommand(e,"subscribe")&&this.guarantor.guarantee(e)}confirmSubscription(e){bo.log(`Subscription confirmed ${e}`),this.findAll(e).map((e=>this.guarantor.forget(e)))}sendCommand(e,t){const{identifier:n}=e;return this.consumer.send({command:t,identifier:n})}}class Do{constructor(e){this._url=e,this.subscriptions=new Oo(this),this.connection=new Po(this)}get url(){return function(e){"function"==typeof e&&(e=e());if(e&&!/^wss?:/i.test(e)){const t=document.createElement("a");return t.href=e,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}return e}(this._url)}send(e){return this.connection.send(e)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}}function Ao(e=function(e){const t=document.head.querySelector(`meta[name='action-cable-${e}']`);if(t)return t.getAttribute("content")}("url")||Co.default_mount_path){return new Do(e)}const Io=function(){function e(t){c(this,e),this.channels={},this.onMessageHandler=this.defaultMessageHandler,this.onReceived=this.onReceived.bind(this),this.offMessage=this.offMessage.bind(this),this.onConnected=this.onConnected.bind(this),this.startSession=this.startSession.bind(this),this.onDisconnected=this.onDisconnected.bind(this),this.cable=Ao(t)}return d(e,[{key:"startSession",value:function(){this.channels.RoomChannel=this.cable.subscriptions.create({channel:"RoomChannel"},{connected:this.onConnected,received:this.onReceived,disconnected:this.onDisconnected}),this.channels.UserChannel=this.cable.subscriptions.create({channel:"UserChannel"},{received:this.onReceived})}},{key:"onConnected",value:function(){this.disconnectTimestamp&&this.handleReconnect(),p.debug("ActionCableConnection::onConnected")}},{key:"handleReconnect",value:function(){this.onMessageHandler({type:"reconnect"})}},{key:"onReceived",value:function(e){p.debug("ActionCableConnection::onReceived",e),e._src="actioncable",this.onMessageHandler(e)}},{key:"onDisconnected",value:function(){p.debug("ActionCableConnection::onDisconnected"),this.disconnectTimestamp=Date.now(),this.onMessageHandler({type:"disconnect"})}},{key:"onMessage",value:function(e){"function"==typeof e&&(this.onMessageHandler=e)}},{key:"offMessage",value:function(){this.onMessageHandler=this.defaultMessageHandler}},{key:"defaultMessageHandler",value:function(e){p.debug("ActionCableConnection::defaultMessageHandler: ",e)}},{key:"send",value:function(e){var t=e.channel,n=void 0===t?"RoomChannel":t,r=e.type,i=void 0===r?"ping":r,o=this.channels[n];o?o.perform(i):p.warn("ActionCableConnection::send no subscription found! ",n)}},{key:"close",value:function(){this.cable.disconnect(),this.offMessage(),this.channels={},this.cable=null}}]),e}();var Bo=function(e,t){return e.core.eventHandler.send({type:"connection",connectionStatus:t})},Lo=function(e){var t=e.core;Bo(e,"fetch_room"),t.eventHandler.eyeson=e,t.comApi.onError((function(){return t.eventHandler.send({type:"warning",name:"error:comapi"})})),t.comApi.getRoom((function(n){if(n.error)return p.warn("eyeson::prepareConnection",n.error),void Bo(e,"access_denied");Bo(e,"received_room"),t.rtConnection=new Io(n.links.websocket),t.eventHandler.rtConnection=t.rtConnection,t.rtConnection.startSession(),t.eventHandler.monitor=new yo,t.eventHandler.api=t.comApi,function(e){e.core.keepRoomAlive=setInterval((function(){e.core.rtConnection.send({type:"user_joins"})}),3e4)}(e),function(e){var t=1;e.core.pollingFallbackInterval=setInterval((function(){var n=e.core;return 200===t?(p.debug("eyeson::pollingFallback: max count exceeded, clearing interval."),void clearInterval(n.pollingFallbackInterval)):n.eventHandler._connection?(p.debug("eyeson::pollingFallback: connection set, clearing interval."),void clearInterval(n.pollingFallbackInterval)):void n.comApi.getRoom((function(e){if(!0===e.ready)return p.debug("eyeson::pollingFallback: room ready"),void n.eventHandler.send({type:"room_ready",content:e});p.debug("eyeson::pollingFallback: room not ready",t),t+=1}))}),5e3)}(e)}))},Fo=function(){function e(){c(this,e),this.config=h,this.core={eventHandler:new no},this.room={},this.user={},this.links={},this.options=f}return d(e,[{key:"onEvent",value:function(e){"function"==typeof e?this.core.eventHandler.onReceive(e):p.error("A listener to eyeson events has to be of type function. The argument passed to onEvent is of type "+a(e)+".")}},{key:"offEvent",value:function(e){this.core.eventHandler.removeListener(e)}},{key:"connect",value:function(e){p.debug("eyeson::connect",e),this.core.comApi=new m(this.config.api,e),Lo(this)}},{key:"join",value:function(e){p.debug("eyeson::join",e),function(e,t){var n=e.core;if(n.eventHandler._connection){var r=new co(n.eventHandler._connection,n.comApi,t);r.setMonitor(n.eventHandler.monitor),n.eventHandler.session=r,r.start(),function(e){var t=e.core,n=t.eventHandler._rtData.broadcasts;n&&t.eventHandler.send({type:"broadcasts_update",broadcasts:n})}(e),clearInterval(n.keepRoomAlive),e.session=r}else p.error("You tried to join a session that is not yet available. Before calling join, a connection status of connected has to be received.")}(this,e)}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{audio:!0,video:!0};p.debug("eyeson::start");this.onEvent((function e(r){"ready"===r.connectionStatus&&(t.offEvent(e),t.join(n))})),this.connect(e)}},{key:"destroy",value:function(){var e=this.core;p.debug("eyeson::destroy"),clearInterval(e.keepRoomAlive),clearInterval(e.pollingFallbackInterval),e.eventHandler.destroy(),e.eventHandler=new no}},{key:"send",value:function(e){return e._src="client",this.core.eventHandler.send(e)}},{key:"throttledSend",value:function(e){var t=this;return this._throttledSend||(this._throttledSend=v((function(e){return t.send(e)}),500)),this._throttledSend(e)}},{key:"createInstance",value:function(){return new e}}]),e}();const jo=new Fo;function Vo(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||V(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const Uo=function(){function e(t){c(this,e),this.roomUrl=t}return d(e,[{key:"search",value:function(e){return this.request("".concat(this.roomUrl,"/search?q=").concat(e)).then((function(e){return e.data}))}},{key:"random",value:function(){return this.request("".concat(this.roomUrl,"/random")).then((function(e){return e.data}))}},{key:"trending",value:function(){var e=this;return this.request("".concat(this.roomUrl,"/trending?limit=9")).then((function(t){var n=t.data;return e.staff().then((function(e){return[].concat(Vo(n),Vo(e))}))}))}},{key:"staff",value:function(){return this.request("".concat(this.roomUrl,"/staff")).then((function(e){return e.data}))}},{key:"randomForQuery",value:function(e){var t=this;return new Promise((function(n,r){t.search(e).then((function(e){return Array.isArray(e)?e.filter((function(e){return e.images.original_mp4.mp4_size>=4e4})):[]})).then((function(e){if(0===e.length)throw new TypeError("No data found");n(e[Math.floor(Math.random()*e.length)])})).catch(r)}))}},{key:"request",value:function(e){return fetch(new Request(e)).then((function(e){return e.json()})).catch((function(t){return p.warn("GiphyApi",e,t),{data:[]}}))}}]),e}();function No(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return Wo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Wo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Wo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const Ho=function(){function e(){c(this,e),this.level=0,this.instant=0,this.silenceDuration=0,this.intervalCounter=0,this.track=null,this.context=null,this.source=null,this.analyser=null,this.volumes=null,this.listener=[],this.timer=null,this.errorTimer=null,this.boundOnTrackEnded=this.onTrackEnded.bind(this),this.initError=!1,this.init()}return d(e,[{key:"init",value:function(){var e=window.AudioContext||window.webkitAudioContext;void 0!==e?(this.context=new e,this.context.onstatechange=function(e){var t=e.target;"suspended"===t.state&&p.error("SoundMeter::init AudioContext: ",t.state)}):p.error("AudioContext is not available. Probably the current user agent does not support this feature. Use the feature detector to hide not supported elements. Any call on onUpdate will not send values.")}},{key:"connectToSource",value:function(e){var t=this;if(!this.context)return this;if(!e||e.getAudioTracks().length<1)return this.initError=!0,this.onTrackEnded(),this;p.debug("SoundMeter::connectToSource",e);var n=U(e.getAudioTracks(),1);if(this.track=n[0],"live"!==this.track.readyState)return this.initError=!0,this.onTrackEnded(),this;this.track.addEventListener("ended",this.boundOnTrackEnded),this.source=this.context.createMediaStreamSource(e);var r=this.context.createAnalyser();return r.fftSize=512,r.minDecibels=-127,r.maxDecibels=0,r.smoothingTimeConstant=.5,this.source.connect(r),this.analyser=r,this.volumes=new Uint8Array(r.frequencyBinCount),!this.running&&this.listener.length>0&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100)),this}},{key:"analyse",value:function(){var e=this,t=this.analyser,n=this.volumes,r=this.level;if(t){t.getByteFrequencyData(n);var i,o=0,s=No(n);try{for(s.s();!(i=s.n()).done;){o+=i.value}}catch(e){s.e(e)}finally{s.f()}var a=o/n.length,c=Math.min(Math.round(100*a/127),100);if(0===r&&0===c&&10===this.intervalCounter&&(this.silenceDuration++,this.silenceDuration>30&&!this.errorTimer&&(this.errorTimer=setTimeout((function(){e.emit({warning:"MicrophoneSilenceWarning"}),e.resetSilenceCounter()}),1e3))),r!==c)this.silenceDuration>0&&this.resetSilenceCounter(),Math.abs(r-c)>=1&&(this.level=c,this.emit({value:c}));this.intervalCounter<10&&this.intervalCounter++}}},{key:"resetSilenceCounter",value:function(){clearTimeout(this.errorTimer),this.errorTimer=null,this.silenceDuration=0}},{key:"stop",value:function(){this.offUpdate(),this.track&&(this.track.removeEventListener("ended",this.boundOnTrackEnded),this.track=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.source&&(this.source.disconnect(),this.source=null),this.volumes=null,this.context&&this.context.stop&&"closed"!==this.context.state&&(this.context.onstatechange=null,this.context.close(),this.context=null)}},{key:"onUpdate",value:function(e){var t=this;this.listener.push(e),this.initError?this.onTrackEnded():!this.running&&this.context&&this.track&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100))}},{key:"offUpdate",value:function(){clearTimeout(this.errorTimer),this.listener.length=0,this.running&&(clearInterval(this.timer),this.running=!1)}},{key:"onTrackEnded",value:function(){this.emit({error:"EyesonMicrophoneError"}),this.stop()}},{key:"emit",value:function(e){this.listener.forEach((function(t){return t(e)}))}}]),e}();const zo=function(){function e(){c(this,e),this._listener=[],this._monitor=null,this._running=!1,this.state=null}var t;return d(e,[{key:"onUpdate",value:function(e){"function"==typeof e&&this._listener.push(e)}},{key:"offUpdate",value:function(e){"function"==typeof e?this._listener=this._listener.filter((function(t){return t!==e})):this._listener.length=0}},{key:"_emit",value:function(e){var t=e[e.length-1].state;t!==this.state&&(this.state=t,p.debug("SystemPressureMonitor::emit",t),this._listener.forEach((function(e){try{e(t)}catch(e){p.error("SystemPressureMonitor::emit",e)}})))}},{key:"start",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==Xe.canMonitorSystemPressure()){e.next=3;break}return p.error("SystemPressureMonitor is not supported"),e.abrupt("return");case 3:if(e.prev=3,this._monitor||(this._monitor=new PressureObserver(this._emit.bind(this),{sampleRate:1})),this._running){e.next=9;break}return e.next=8,this._monitor.observe("cpu");case 8:this._running=!0;case 9:null===this.state&&this._emit([{state:"nominal"}]),p.debug("SystemPressureMonitor::start"),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(3),p.error("SystemPressureMonitor::start",e.t0);case 16:case"end":return e.stop()}}),e,this,[[3,13]])}))),function(){return t.apply(this,arguments)})},{key:"stop",value:function(){this._monitor&&this._running&&(this._monitor.disconnect(),this._running=!1)}},{key:"destroy",value:function(){this.stop(),this.offUpdate(),this.state=null,this._monitor=null}}]),e}(),Go=jo})();var i=r._$,o=r.Nr,s=r.Lt,a=r.JN,c=r.L0,u=r.mM,l=r.Yd,d=r.qG,h=r.dm,f=r.DX,p=r.N2,m=r.D,v=r.Ds,y=r.ZP,g=r.j8,b=r.P2;export{i as ConnectionStatistics,o as DeviceManager,s as FeatureDetector,a as FullscreenHelper,c as GiphyApi,u as LocalStorage,l as Logger,d as MediaStreamBuilder,h as MicMixer,f as SoundMeter,p as StreamHelpers,m as SystemPressureMonitor,v as debounce,y as default,g as immediate,b as throttle}; //# sourceMappingURL=eyeson-esm.js.map \ No newline at end of file diff --git a/dist/eyeson-esm.js.map b/dist/eyeson-esm.js.map index f66a6281b918fed45a82cb0c1a2f465f5ae5e59a..057cb41d580c6742da6024e979d71e75e8efa900 100644 --- a/dist/eyeson-esm.js.map +++ b/dist/eyeson-esm.js.map @@ -1 +1 @@ -{"version":3,"file":"eyeson-esm.js","mappings":"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","sources":["webpack://eyeson/./node_modules/platform/platform.js","webpack://eyeson/./node_modules/screenfull/dist/screenfull.js","webpack://eyeson/./node_modules/sdp/sdp.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/regenerator/index.js","webpack://eyeson/webpack/bootstrap","webpack://eyeson/webpack/runtime/compat get default export","webpack://eyeson/webpack/runtime/define property getters","webpack://eyeson/webpack/runtime/global","webpack://eyeson/webpack/runtime/hasOwnProperty shorthand","webpack://eyeson/webpack/runtime/make namespace object","webpack://eyeson/webpack/runtime/node module decorator","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://eyeson/./src/config.js","webpack://eyeson/./src/options.js","webpack://eyeson/./src/Logger.js","webpack://eyeson/./src/ComApi.js","webpack://eyeson/./src/utils/throttle.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://eyeson/./src/events/BaseEvent.js","webpack://eyeson/./src/events/PlaybackEvents.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://eyeson/./src/events/PublicEvent.js","webpack://eyeson/./src/events/AnnotationEvents.js","webpack://eyeson/./src/events/StfuEvent.js","webpack://eyeson/./src/events/IgnoreEvent.js","webpack://eyeson/./src/events/ForwardEvent.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/utils.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/safari/safari_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/common_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_core.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_factory.js","webpack://eyeson/./src/FullscreenHelper.js","webpack://eyeson/./src/FeatureDetector.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://eyeson/./src/NinjaStream.js","webpack://eyeson/./src/LocalStorage.js","webpack://eyeson/./src/utils/immediate.js","webpack://eyeson/./src/utils/StreamHelpers.js","webpack://eyeson/./src/utils/throttledAnimationFrame.js","webpack://eyeson/./src/utils/importScript.js","webpack://eyeson/./src/utils/cacheStorage.js","webpack://eyeson/./src/utils/canvasBlur.js","webpack://eyeson/./src/VirtualBackgroundMixer.js","webpack://eyeson/./src/DeviceManager.js","webpack://eyeson/./src/MediaStreamBuilder.js","webpack://eyeson/./src/MicMixer.js","webpack://eyeson/./src/events/ChangeLocalStreamEvent.js","webpack://eyeson/./src/events/PodiumEvent.js","webpack://eyeson/./src/events/SnapshotEvent.js","webpack://eyeson/./src/events/SetLayerEvent.js","webpack://eyeson/./src/events/SendChatEvent.js","webpack://eyeson/./src/events/StopRtmpEvent.js","webpack://eyeson/./src/events/SetLayoutEvent.js","webpack://eyeson/./src/events/StartRtmpEvent.js","webpack://eyeson/./src/sepp/eventEmitter.js","webpack://eyeson/./src/sepp/Transport.js","webpack://eyeson/./src/sepp/crlfNormalize.js","webpack://eyeson/./src/sepp/parseJwtPayload.js","webpack://eyeson/./src/sepp/uuid.js","webpack://eyeson/./src/sepp/SEPP.js","webpack://eyeson/./src/SigMessageWhitelist.js","webpack://eyeson/./src/PodiumFacade.js","webpack://eyeson/./src/SigMessageTransformer.js","webpack://eyeson/./src/SessionDescriptionHandler.js","webpack://eyeson/./src/SigConnection.js","webpack://eyeson/./src/events/RoomReceivedEvent.js","webpack://eyeson/./src/events/FetchRoomEvent.js","webpack://eyeson/./src/events/DeleteFileEvent.js","webpack://eyeson/./src/events/UploadFileEvent.js","webpack://eyeson/./src/events/ReceiveChatEvent.js","webpack://eyeson/./src/events/StartStreamEvent.js","webpack://eyeson/./src/events/ChangeStreamEvent.js","webpack://eyeson/./src/events/ReplaceStreamEvent.js","webpack://eyeson/./src/events/ToggleCameraEvent.js","webpack://eyeson/./src/events/AcceptSessionEvent.js","webpack://eyeson/./src/events/StopRecordingEvent.js","webpack://eyeson/./src/events/VoiceActivityEvent.js","webpack://eyeson/./src/events/StartRecordingEvent.js","webpack://eyeson/./src/events/ScreenCaptureEvent.js","webpack://eyeson/./src/events/StartPresentingEvent.js","webpack://eyeson/./src/events/StopPresentingEvent.js","webpack://eyeson/./src/events/StopBroadcastsEvent.js","webpack://eyeson/./src/events/ClearFrontLayerEvent.js","webpack://eyeson/./src/events/RequestGuestUserEvent.js","webpack://eyeson/./src/events/SessionTerminationEvent.js","webpack://eyeson/./src/events/ParticipantListUpdateEvent.js","webpack://eyeson/./src/utils/scale.js","webpack://eyeson/./src/utils/debounce.js","webpack://eyeson/./src/CanvasMixer.js","webpack://eyeson/./src/events/MixerEvents.js","webpack://eyeson/./src/VideoPlayer.js","webpack://eyeson/./src/events/MediaEvents.js","webpack://eyeson/./src/events/LockMeetingEvent.js","webpack://eyeson/./src/events/TerminateMeetingEvent.js","webpack://eyeson/./src/events/KickUserEvent.js","webpack://eyeson/./src/events/VirtualBackgroundEvent.js","webpack://eyeson/./src/events/ScreenVideoChangeEvent.js","webpack://eyeson/./src/events/ScreenVideoStoppedEvent.js","webpack://eyeson/./src/DeviceMonitor.js","webpack://eyeson/./src/PipCam.js","webpack://eyeson/./src/events/PipCamEvents.js","webpack://eyeson/./src/events/DeviceEndEvents.js","webpack://eyeson/./src/EventHandler.js","webpack://eyeson/./src/SDPModifiers.js","webpack://eyeson/./src/ConferenceSession.js","webpack://eyeson/./src/utils/ConnectionStatistics.js","webpack://eyeson/./src/ConnectionMonitor.js","webpack://eyeson/./node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js","webpack://eyeson/./src/ActionCableConnection.js","webpack://eyeson/./src/eyeson.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://eyeson/./src/utils/GiphyApi.js","webpack://eyeson/./src/SoundMeter.js","webpack://eyeson/./src/SystemPressureMonitor.js","webpack://eyeson/./index.js"],"sourcesContent":["/*!\n * Platform.js v1.3.6\n * Copyright 2014-2020 Benjamin Tan\n * Copyright 2011-2013 John-David Dalton\n * Available under MIT license\n */\n;(function() {\n 'use strict';\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used as a reference to the global object. */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Backup possible global object. */\n var oldRoot = root;\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n root = freeGlobal;\n }\n\n /**\n * Used as the maximum length of an array-like object.\n * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n * for more details.\n */\n var maxSafeInteger = Math.pow(2, 53) - 1;\n\n /** Regular expression to detect Opera. */\n var reOpera = /\\bOpera/;\n\n /** Possible global object. */\n var thisBinding = this;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check for own properties of an object. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to resolve the internal `[[Class]]` of values. */\n var toString = objectProto.toString;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Capitalizes a string value.\n *\n * @private\n * @param {string} string The string to capitalize.\n * @returns {string} The capitalized string.\n */\n function capitalize(string) {\n string = String(string);\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n /**\n * A utility function to clean up the OS name.\n *\n * @private\n * @param {string} os The OS name to clean up.\n * @param {string} [pattern] A `RegExp` pattern matching the OS name.\n * @param {string} [label] A label for the OS.\n */\n function cleanupOS(os, pattern, label) {\n // Platform tokens are defined at:\n // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n var data = {\n '10.0': '10',\n '6.4': '10 Technical Preview',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': 'Server 2008 R2 / 7',\n '6.0': 'Server 2008 / Vista',\n '5.2': 'Server 2003 / XP 64-bit',\n '5.1': 'XP',\n '5.01': '2000 SP1',\n '5.0': '2000',\n '4.0': 'NT',\n '4.90': 'ME'\n };\n // Detect Windows version from platform tokens.\n if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) &&\n (data = data[/[\\d.]+$/.exec(os)])) {\n os = 'Windows ' + data;\n }\n // Correct character case and cleanup string.\n os = String(os);\n\n if (pattern && label) {\n os = os.replace(RegExp(pattern, 'i'), label);\n }\n\n os = format(\n os.replace(/ ce$/i, ' CE')\n .replace(/\\bhpw/i, 'web')\n .replace(/\\bMacintosh\\b/, 'Mac OS')\n .replace(/_PowerPC\\b/i, ' OS')\n .replace(/\\b(OS X) [^ \\d]+/i, '$1')\n .replace(/\\bMac (OS X)\\b/, '$1')\n .replace(/\\/(\\d)/, ' $1')\n .replace(/_/g, '.')\n .replace(/(?: BePC|[ .]*fc[ \\d.]+)$/i, '')\n .replace(/\\bx86\\.64\\b/gi, 'x86_64')\n .replace(/\\b(Windows Phone) OS\\b/, '$1')\n .replace(/\\b(Chrome OS \\w+) [\\d.]+\\b/, '$1')\n .split(' on ')[0]\n );\n\n return os;\n }\n\n /**\n * An iteration utility for arrays and objects.\n *\n * @private\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} callback The function called per iteration.\n */\n function each(object, callback) {\n var index = -1,\n length = object ? object.length : 0;\n\n if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) {\n while (++index < length) {\n callback(object[index], index, object);\n }\n } else {\n forOwn(object, callback);\n }\n }\n\n /**\n * Trim and conditionally capitalize string values.\n *\n * @private\n * @param {string} string The string to format.\n * @returns {string} The formatted string.\n */\n function format(string) {\n string = trim(string);\n return /^(?:webOS|i(?:OS|P))/.test(string)\n ? string\n : capitalize(string);\n }\n\n /**\n * Iterates over an object's own properties, executing the `callback` for each.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} callback The function executed per own property.\n */\n function forOwn(object, callback) {\n for (var key in object) {\n if (hasOwnProperty.call(object, key)) {\n callback(object[key], key, object);\n }\n }\n }\n\n /**\n * Gets the internal `[[Class]]` of a value.\n *\n * @private\n * @param {*} value The value.\n * @returns {string} The `[[Class]]`.\n */\n function getClassOf(value) {\n return value == null\n ? capitalize(value)\n : toString.call(value).slice(8, -1);\n }\n\n /**\n * Host objects can return type values that are different from their actual\n * data type. The objects we are concerned with usually return non-primitive\n * types of \"object\", \"function\", or \"unknown\".\n *\n * @private\n * @param {*} object The owner of the property.\n * @param {string} property The property to check.\n * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.\n */\n function isHostType(object, property) {\n var type = object != null ? typeof object[property] : 'number';\n return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n (type == 'object' ? !!object[property] : true);\n }\n\n /**\n * Prepares a string for use in a `RegExp` by making hyphens and spaces optional.\n *\n * @private\n * @param {string} string The string to qualify.\n * @returns {string} The qualified string.\n */\n function qualify(string) {\n return String(string).replace(/([ -])(?!$)/g, '$1?');\n }\n\n /**\n * A bare-bones `Array#reduce` like utility function.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function called per iteration.\n * @returns {*} The accumulated result.\n */\n function reduce(array, callback) {\n var accumulator = null;\n each(array, function(value, index) {\n accumulator = callback(accumulator, value, index, array);\n });\n return accumulator;\n }\n\n /**\n * Removes leading and trailing whitespace from a string.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} The trimmed string.\n */\n function trim(string) {\n return String(string).replace(/^ +| +$/g, '');\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a new platform object.\n *\n * @memberOf platform\n * @param {Object|string} [ua=navigator.userAgent] The user agent string or\n * context object.\n * @returns {Object} A platform object.\n */\n function parse(ua) {\n\n /** The environment context object. */\n var context = root;\n\n /** Used to flag when a custom context is provided. */\n var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String';\n\n // Juggle arguments.\n if (isCustomContext) {\n context = ua;\n ua = null;\n }\n\n /** Browser navigator object. */\n var nav = context.navigator || {};\n\n /** Browser user agent string. */\n var userAgent = nav.userAgent || '';\n\n ua || (ua = userAgent);\n\n /** Used to flag when `thisBinding` is the [ModuleScope]. */\n var isModuleScope = isCustomContext || thisBinding == oldRoot;\n\n /** Used to detect if browser is like Chrome. */\n var likeChrome = isCustomContext\n ? !!nav.likeChrome\n : /\\bChrome\\b/.test(ua) && !/internal|\\n/i.test(toString.toString());\n\n /** Internal `[[Class]]` value shortcuts. */\n var objectClass = 'Object',\n airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject',\n enviroClass = isCustomContext ? objectClass : 'Environment',\n javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java),\n phantomClass = isCustomContext ? objectClass : 'RuntimeObject';\n\n /** Detect Java environments. */\n var java = /\\bJava/.test(javaClass) && context.java;\n\n /** Detect Rhino. */\n var rhino = java && getClassOf(context.environment) == enviroClass;\n\n /** A character to represent alpha. */\n var alpha = java ? 'a' : '\\u03b1';\n\n /** A character to represent beta. */\n var beta = java ? 'b' : '\\u03b2';\n\n /** Browser document object. */\n var doc = context.document || {};\n\n /**\n * Detect Opera browser (Presto-based).\n * http://www.howtocreate.co.uk/operaStuff/operaObject.html\n * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini\n */\n var opera = context.operamini || context.opera;\n\n /** Opera `[[Class]]`. */\n var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera))\n ? operaClass\n : (opera = null);\n\n /*------------------------------------------------------------------------*/\n\n /** Temporary variable used over the script's lifetime. */\n var data;\n\n /** The CPU architecture. */\n var arch = ua;\n\n /** Platform description array. */\n var description = [];\n\n /** Platform alpha/beta indicator. */\n var prerelease = null;\n\n /** A flag to indicate that environment features should be used to resolve the platform. */\n var useFeatures = ua == userAgent;\n\n /** The browser/environment version. */\n var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();\n\n /** A flag to indicate if the OS ends with \"/ Version\" */\n var isSpecialCasedOS;\n\n /* Detectable layout engines (order is important). */\n var layout = getLayout([\n { 'label': 'EdgeHTML', 'pattern': 'Edge' },\n 'Trident',\n { 'label': 'WebKit', 'pattern': 'AppleWebKit' },\n 'iCab',\n 'Presto',\n 'NetFront',\n 'Tasman',\n 'KHTML',\n 'Gecko'\n ]);\n\n /* Detectable browser names (order is important). */\n var name = getName([\n 'Adobe AIR',\n 'Arora',\n 'Avant Browser',\n 'Breach',\n 'Camino',\n 'Electron',\n 'Epiphany',\n 'Fennec',\n 'Flock',\n 'Galeon',\n 'GreenBrowser',\n 'iCab',\n 'Iceweasel',\n 'K-Meleon',\n 'Konqueror',\n 'Lunascape',\n 'Maxthon',\n { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' },\n 'Midori',\n 'Nook Browser',\n 'PaleMoon',\n 'PhantomJS',\n 'Raven',\n 'Rekonq',\n 'RockMelt',\n { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' },\n 'SeaMonkey',\n { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Sleipnir',\n 'SlimBrowser',\n { 'label': 'SRWare Iron', 'pattern': 'Iron' },\n 'Sunrise',\n 'Swiftfox',\n 'Vivaldi',\n 'Waterfox',\n 'WebPositive',\n { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' },\n { 'label': 'UC Browser', 'pattern': 'UCBrowser' },\n 'Opera Mini',\n { 'label': 'Opera Mini', 'pattern': 'OPiOS' },\n 'Opera',\n { 'label': 'Opera', 'pattern': 'OPR' },\n 'Chromium',\n 'Chrome',\n { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' },\n { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },\n { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },\n { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' },\n { 'label': 'IE', 'pattern': 'IEMobile' },\n { 'label': 'IE', 'pattern': 'MSIE' },\n 'Safari'\n ]);\n\n /* Detectable products (order is important). */\n var product = getProduct([\n { 'label': 'BlackBerry', 'pattern': 'BB10' },\n 'BlackBerry',\n { 'label': 'Galaxy S', 'pattern': 'GT-I9000' },\n { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },\n { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' },\n { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' },\n { 'label': 'Galaxy S5', 'pattern': 'SM-G900' },\n { 'label': 'Galaxy S6', 'pattern': 'SM-G920' },\n { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' },\n { 'label': 'Galaxy S7', 'pattern': 'SM-G930' },\n { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' },\n 'Google TV',\n 'Lumia',\n 'iPad',\n 'iPod',\n 'iPhone',\n 'Kindle',\n { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Nexus',\n 'Nook',\n 'PlayBook',\n 'PlayStation Vita',\n 'PlayStation',\n 'TouchPad',\n 'Transformer',\n { 'label': 'Wii U', 'pattern': 'WiiU' },\n 'Wii',\n 'Xbox One',\n { 'label': 'Xbox 360', 'pattern': 'Xbox' },\n 'Xoom'\n ]);\n\n /* Detectable manufacturers. */\n var manufacturer = getManufacturer({\n 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },\n 'Alcatel': {},\n 'Archos': {},\n 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },\n 'Asus': { 'Transformer': 1 },\n 'Barnes & Noble': { 'Nook': 1 },\n 'BlackBerry': { 'PlayBook': 1 },\n 'Google': { 'Google TV': 1, 'Nexus': 1 },\n 'HP': { 'TouchPad': 1 },\n 'HTC': {},\n 'Huawei': {},\n 'Lenovo': {},\n 'LG': {},\n 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 },\n 'Motorola': { 'Xoom': 1 },\n 'Nintendo': { 'Wii U': 1, 'Wii': 1 },\n 'Nokia': { 'Lumia': 1 },\n 'Oppo': {},\n 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 },\n 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 },\n 'Xiaomi': { 'Mi': 1, 'Redmi': 1 }\n });\n\n /* Detectable operating systems (order is important). */\n var os = getOS([\n 'Windows Phone',\n 'KaiOS',\n 'Android',\n 'CentOS',\n { 'label': 'Chrome OS', 'pattern': 'CrOS' },\n 'Debian',\n { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' },\n 'Fedora',\n 'FreeBSD',\n 'Gentoo',\n 'Haiku',\n 'Kubuntu',\n 'Linux Mint',\n 'OpenBSD',\n 'Red Hat',\n 'SuSE',\n 'Ubuntu',\n 'Xubuntu',\n 'Cygwin',\n 'Symbian OS',\n 'hpwOS',\n 'webOS ',\n 'webOS',\n 'Tablet OS',\n 'Tizen',\n 'Linux',\n 'Mac OS X',\n 'Macintosh',\n 'Mac',\n 'Windows 98;',\n 'Windows '\n ]);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Picks the layout engine from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected layout engine.\n */\n function getLayout(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the manufacturer from an array of guesses.\n *\n * @private\n * @param {Array} guesses An object of guesses.\n * @returns {null|string} The detected manufacturer.\n */\n function getManufacturer(guesses) {\n return reduce(guesses, function(result, value, key) {\n // Lookup the manufacturer by product or scan the UA for the manufacturer.\n return result || (\n value[product] ||\n value[/^[a-z]+(?: +[a-z]+\\b)*/i.exec(product)] ||\n RegExp('\\\\b' + qualify(key) + '(?:\\\\b|\\\\w*\\\\d)', 'i').exec(ua)\n ) && key;\n });\n }\n\n /**\n * Picks the browser name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected browser name.\n */\n function getName(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the OS name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected OS name.\n */\n function getOS(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + '(?:/[\\\\d.]+|[ \\\\w.]*)', 'i').exec(ua)\n )) {\n result = cleanupOS(result, pattern, guess.label || guess);\n }\n return result;\n });\n }\n\n /**\n * Picks the product name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected product name.\n */\n function getProduct(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + ' *\\\\d+[.\\\\w_]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + ' *\\\\w+-[\\\\w]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\\\d+|[^ ();-]*)', 'i').exec(ua)\n )) {\n // Split by forward slash and append product version if needed.\n if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\\d.]+/.test(result[0])) {\n result[0] += ' ' + result[1];\n }\n // Correct character case and cleanup string.\n guess = guess.label || guess;\n result = format(result[0]\n .replace(RegExp(pattern, 'i'), guess)\n .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')\n .replace(RegExp('(' + guess + ')[-_.]?(\\\\w)', 'i'), '$1 $2'));\n }\n return result;\n });\n }\n\n /**\n * Resolves the version using an array of UA patterns.\n *\n * @private\n * @param {Array} patterns An array of UA patterns.\n * @returns {null|string} The detected version.\n */\n function getVersion(patterns) {\n return reduce(patterns, function(result, pattern) {\n return result || (RegExp(pattern +\n '(?:-[\\\\d.]+/|(?: for [\\\\w-]+)?[ /-])([\\\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;\n });\n }\n\n /**\n * Returns `platform.description` when the platform object is coerced to a string.\n *\n * @name toString\n * @memberOf platform\n * @returns {string} Returns `platform.description` if available, else an empty string.\n */\n function toStringPlatform() {\n return this.description || '';\n }\n\n /*------------------------------------------------------------------------*/\n\n // Convert layout to an array so we can add extra details.\n layout && (layout = [layout]);\n\n // Detect Android products.\n // Browsers on Android devices typically provide their product IDS after \"Android;\"\n // up to \"Build\" or \") AppleWebKit\".\n // Example:\n // \"Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36\n // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36\"\n if (/\\bAndroid\\b/.test(os) && !product &&\n (data = /\\bAndroid[^;]*;(.*?)(?:Build|\\) AppleWebKit)\\b/i.exec(ua))) {\n product = trim(data[1])\n // Replace any language codes (eg. \"en-US\").\n .replace(/^[a-z]{2}-[a-z]{2};\\s*/i, '')\n || null;\n }\n // Detect product names that contain their manufacturer's name.\n if (manufacturer && !product) {\n product = getProduct([manufacturer]);\n } else if (manufacturer && product) {\n product = product\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\\\s]', 'i'), manufacturer + ' ')\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\\\w)', 'i'), manufacturer + ' $2');\n }\n // Clean up Google TV.\n if ((data = /\\bGoogle TV\\b/.exec(product))) {\n product = data[0];\n }\n // Detect simulators.\n if (/\\bSimulator\\b/i.test(ua)) {\n product = (product ? product + ' ' : '') + 'Simulator';\n }\n // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.\n if (name == 'Opera Mini' && /\\bOPiOS\\b/.test(ua)) {\n description.push('running in Turbo/Uncompressed mode');\n }\n // Detect IE Mobile 11.\n if (name == 'IE' && /\\blike iPhone OS\\b/.test(ua)) {\n data = parse(ua.replace(/like iPhone OS/, ''));\n manufacturer = data.manufacturer;\n product = data.product;\n }\n // Detect iOS.\n else if (/^iP/.test(product)) {\n name || (name = 'Safari');\n os = 'iOS' + ((data = / OS ([\\d_]+)/i.exec(ua))\n ? ' ' + data[1].replace(/_/g, '.')\n : '');\n }\n // Detect Kubuntu.\n else if (name == 'Konqueror' && /^Linux\\b/i.test(os)) {\n os = 'Kubuntu';\n }\n // Detect Android browsers.\n else if ((manufacturer && manufacturer != 'Google' &&\n ((/Chrome/.test(name) && !/\\bMobile Safari\\b/i.test(ua)) || /\\bVita\\b/.test(product))) ||\n (/\\bAndroid\\b/.test(os) && /^Chrome/.test(name) && /\\bVersion\\//i.test(ua))) {\n name = 'Android Browser';\n os = /\\bAndroid\\b/.test(os) ? os : 'Android';\n }\n // Detect Silk desktop/accelerated modes.\n else if (name == 'Silk') {\n if (!/\\bMobi/i.test(ua)) {\n os = 'Android';\n description.unshift('desktop mode');\n }\n if (/Accelerated *= *true/i.test(ua)) {\n description.unshift('accelerated');\n }\n }\n // Detect UC Browser speed mode.\n else if (name == 'UC Browser' && /\\bUCWEB\\b/.test(ua)) {\n description.push('speed mode');\n }\n // Detect PaleMoon identifying as Firefox.\n else if (name == 'PaleMoon' && (data = /\\bFirefox\\/([\\d.]+)\\b/.exec(ua))) {\n description.push('identifying as Firefox ' + data[1]);\n }\n // Detect Firefox OS and products running Firefox.\n else if (name == 'Firefox' && (data = /\\b(Mobile|Tablet|TV)\\b/i.exec(ua))) {\n os || (os = 'Firefox OS');\n product || (product = data[1]);\n }\n // Detect false positives for Firefox/Safari.\n else if (!name || (data = !/\\bMinefield\\b/i.test(ua) && /\\b(?:Firefox|Safari)\\b/.exec(name))) {\n // Escape the `/` for Firefox 1.\n if (name && !product && /[\\/,]|^[^(]+?\\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {\n // Clear name of false positives.\n name = null;\n }\n // Reassign a generic name.\n if ((data = product || manufacturer || os) &&\n (product || manufacturer || /\\b(?:Android|Symbian OS|Tablet OS|webOS)\\b/.test(os))) {\n name = /[a-z]+(?: Hat)?/i.exec(/\\bAndroid\\b/.test(os) ? os : data) + ' Browser';\n }\n }\n // Add Chrome version to description for Electron.\n else if (name == 'Electron' && (data = (/\\bChrome\\/([\\d.]+)\\b/.exec(ua) || 0)[1])) {\n description.push('Chromium ' + data);\n }\n // Detect non-Opera (Presto-based) versions (order is important).\n if (!version) {\n version = getVersion([\n '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\\\d.]+$)|UCBrowser|YaBrowser)',\n 'Version',\n qualify(name),\n '(?:Firefox|Minefield|NetFront)'\n ]);\n }\n // Detect stubborn layout engines.\n if ((data =\n layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' ||\n /\\bOpera\\b/.test(name) && (/\\bOPR\\b/.test(ua) ? 'Blink' : 'Presto') ||\n /\\b(?:Midori|Nook|Safari)\\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' ||\n !layout && /\\bMSIE\\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') ||\n layout == 'WebKit' && /\\bPlayStation\\b(?! Vita\\b)/i.test(name) && 'NetFront'\n )) {\n layout = [data];\n }\n // Detect Windows Phone 7 desktop mode.\n if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\\d+)/i.exec(ua) || 0)[1])) {\n name += ' Mobile';\n os = 'Windows Phone ' + (/\\+$/.test(data) ? data : data + '.x');\n description.unshift('desktop mode');\n }\n // Detect Windows Phone 8.x desktop mode.\n else if (/\\bWPDesktop\\b/i.test(ua)) {\n name = 'IE Mobile';\n os = 'Windows Phone 8.x';\n description.unshift('desktop mode');\n version || (version = (/\\brv:([\\d.]+)/.exec(ua) || 0)[1]);\n }\n // Detect IE 11 identifying as other browsers.\n else if (name != 'IE' && layout == 'Trident' && (data = /\\brv:([\\d.]+)/.exec(ua))) {\n if (name) {\n description.push('identifying as ' + name + (version ? ' ' + version : ''));\n }\n name = 'IE';\n version = data[1];\n }\n // Leverage environment features.\n if (useFeatures) {\n // Detect server-side environments.\n // Rhino has a global function while others have a global object.\n if (isHostType(context, 'global')) {\n if (java) {\n data = java.lang.System;\n arch = data.getProperty('os.arch');\n os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');\n }\n if (rhino) {\n try {\n version = context.require('ringo/engine').version.join('.');\n name = 'RingoJS';\n } catch(e) {\n if ((data = context.system) && data.global.system == context.system) {\n name = 'Narwhal';\n os || (os = data[0].os || null);\n }\n }\n if (!name) {\n name = 'Rhino';\n }\n }\n else if (\n typeof context.process == 'object' && !context.process.browser &&\n (data = context.process)\n ) {\n if (typeof data.versions == 'object') {\n if (typeof data.versions.electron == 'string') {\n description.push('Node ' + data.versions.node);\n name = 'Electron';\n version = data.versions.electron;\n } else if (typeof data.versions.nw == 'string') {\n description.push('Chromium ' + version, 'Node ' + data.versions.node);\n name = 'NW.js';\n version = data.versions.nw;\n }\n }\n if (!name) {\n name = 'Node.js';\n arch = data.arch;\n os = data.platform;\n version = /[\\d.]+/.exec(data.version);\n version = version ? version[0] : null;\n }\n }\n }\n // Detect Adobe AIR.\n else if (getClassOf((data = context.runtime)) == airRuntimeClass) {\n name = 'Adobe AIR';\n os = data.flash.system.Capabilities.os;\n }\n // Detect PhantomJS.\n else if (getClassOf((data = context.phantom)) == phantomClass) {\n name = 'PhantomJS';\n version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);\n }\n // Detect IE compatibility modes.\n else if (typeof doc.documentMode == 'number' && (data = /\\bTrident\\/(\\d+)/i.exec(ua))) {\n // We're in compatibility mode when the Trident version + 4 doesn't\n // equal the document mode.\n version = [version, doc.documentMode];\n if ((data = +data[1] + 4) != version[1]) {\n description.push('IE ' + version[1] + ' mode');\n layout && (layout[1] = '');\n version[1] = data;\n }\n version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];\n }\n // Detect IE 11 masking as other browsers.\n else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\\b/.test(name)) {\n description.push('masking as ' + name + ' ' + version);\n name = 'IE';\n version = '11.0';\n layout = ['Trident'];\n os = 'Windows';\n }\n os = os && format(os);\n }\n // Detect prerelease phases.\n if (version && (data =\n /(?:[ab]|dp|pre|[ab]\\d+pre)(?:\\d+\\+?)?$/i.exec(version) ||\n /(?:alpha|beta)(?: ?\\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||\n /\\bMinefield\\b/i.test(ua) && 'a'\n )) {\n prerelease = /b/i.test(data) ? 'beta' : 'alpha';\n version = version.replace(RegExp(data + '\\\\+?$'), '') +\n (prerelease == 'beta' ? beta : alpha) + (/\\d+\\+?/.exec(data) || '');\n }\n // Detect Firefox Mobile.\n if (name == 'Fennec' || name == 'Firefox' && /\\b(?:Android|Firefox OS|KaiOS)\\b/.test(os)) {\n name = 'Firefox Mobile';\n }\n // Obscure Maxthon's unreliable version.\n else if (name == 'Maxthon' && version) {\n version = version.replace(/\\.[\\d.]+/, '.x');\n }\n // Detect Xbox 360 and Xbox One.\n else if (/\\bXbox\\b/i.test(product)) {\n if (product == 'Xbox 360') {\n os = null;\n }\n if (product == 'Xbox 360' && /\\bIEMobile\\b/.test(ua)) {\n description.unshift('mobile mode');\n }\n }\n // Add mobile postfix.\n else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) &&\n (os == 'Windows CE' || /Mobi/i.test(ua))) {\n name += ' Mobile';\n }\n // Detect IE platform preview.\n else if (name == 'IE' && useFeatures) {\n try {\n if (context.external === null) {\n description.unshift('platform preview');\n }\n } catch(e) {\n description.unshift('embedded');\n }\n }\n // Detect BlackBerry OS version.\n // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp\n else if ((/\\bBlackBerry\\b/.test(product) || /\\bBB10\\b/.test(ua)) && (data =\n (RegExp(product.replace(/ +/g, ' *') + '/([.\\\\d]+)', 'i').exec(ua) || 0)[1] ||\n version\n )) {\n data = [data, /BB10/.test(ua)];\n os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0];\n version = null;\n }\n // Detect Opera identifying/masking itself as another browser.\n // http://www.opera.com/support/kb/view/843/\n else if (this != forOwn && product != 'Wii' && (\n (useFeatures && opera) ||\n (/Opera/.test(name) && /\\b(?:MSIE|Firefox)\\b/i.test(ua)) ||\n (name == 'Firefox' && /\\bOS X (?:\\d+\\.){2,}/.test(os)) ||\n (name == 'IE' && (\n (os && !/^Win/.test(os) && version > 5.5) ||\n /\\bWindows XP\\b/.test(os) && version > 8 ||\n version == 8 && !/\\bTrident\\b/.test(ua)\n ))\n ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) {\n // When \"identifying\", the UA contains both Opera and the other browser's name.\n data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');\n if (reOpera.test(name)) {\n if (/\\bIE\\b/.test(data) && os == 'Mac OS') {\n os = null;\n }\n data = 'identify' + data;\n }\n // When \"masking\", the UA contains only the other browser's name.\n else {\n data = 'mask' + data;\n if (operaClass) {\n name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));\n } else {\n name = 'Opera';\n }\n if (/\\bIE\\b/.test(data)) {\n os = null;\n }\n if (!useFeatures) {\n version = null;\n }\n }\n layout = ['Presto'];\n description.push(data);\n }\n // Detect WebKit Nightly and approximate Chrome/Safari versions.\n if ((data = (/\\bAppleWebKit\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n // Correct build number for numeric comparison.\n // (e.g. \"532.5\" becomes \"532.05\")\n data = [parseFloat(data.replace(/\\.(\\d)$/, '.0$1')), data];\n // Nightly builds are postfixed with a \"+\".\n if (name == 'Safari' && data[1].slice(-1) == '+') {\n name = 'WebKit Nightly';\n prerelease = 'alpha';\n version = data[1].slice(0, -1);\n }\n // Clear incorrect browser versions.\n else if (version == data[1] ||\n version == (data[2] = (/\\bSafari\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n version = null;\n }\n // Use the full Chrome version when available.\n data[1] = (/\\b(?:Headless)?Chrome\\/([\\d.]+)/i.exec(ua) || 0)[1];\n // Detect Blink layout engine.\n if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') {\n layout = ['Blink'];\n }\n // Detect JavaScriptCore.\n // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi\n if (!useFeatures || (!likeChrome && !data[1])) {\n layout && (layout[1] = 'like Safari');\n data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12');\n } else {\n layout && (layout[1] = 'like Chrome');\n data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28');\n }\n // Add the postfix of \".x\" or \"+\" for approximate versions.\n layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'));\n // Obscure version for some Safari 1-2 releases.\n if (name == 'Safari' && (!version || parseInt(version) > 45)) {\n version = data;\n } else if (name == 'Chrome' && /\\bHeadlessChrome/i.test(ua)) {\n description.unshift('headless');\n }\n }\n // Detect Opera desktop modes.\n if (name == 'Opera' && (data = /\\bzbov|zvav$/.exec(os))) {\n name += ' ';\n description.unshift('desktop mode');\n if (data == 'zvav') {\n name += 'Mini';\n version = null;\n } else {\n name += 'Mobile';\n }\n os = os.replace(RegExp(' *' + data + '$'), '');\n }\n // Detect Chrome desktop mode.\n else if (name == 'Safari' && /\\bChrome\\b/.exec(layout && layout[1])) {\n description.unshift('desktop mode');\n name = 'Chrome Mobile';\n version = null;\n\n if (/\\bOS X\\b/.test(os)) {\n manufacturer = 'Apple';\n os = 'iOS 4.3+';\n } else {\n os = null;\n }\n }\n // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number.\n else if (/\\bSRWare Iron\\b/.test(name) && !version) {\n version = getVersion('Chrome');\n }\n // Strip incorrect OS versions.\n if (version && version.indexOf((data = /[\\d.]+$/.exec(os))) == 0 &&\n ua.indexOf('/' + data + '-') > -1) {\n os = trim(os.replace(data, ''));\n }\n // Ensure OS does not include the browser name.\n if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) {\n os = os.replace(RegExp(' *' + qualify(name) + ' *'), '');\n }\n // Add layout engine.\n if (layout && !/\\b(?:Avant|Nook)\\b/.test(name) && (\n /Browser|Lunascape|Maxthon/.test(name) ||\n name != 'Safari' && /^iOS/.test(os) && /\\bSafari\\b/.test(layout[1]) ||\n /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) {\n // Don't add layout details to description if they are falsey.\n (data = layout[layout.length - 1]) && description.push(data);\n }\n // Combine contextual information.\n if (description.length) {\n description = ['(' + description.join('; ') + ')'];\n }\n // Append manufacturer to description.\n if (manufacturer && product && product.indexOf(manufacturer) < 0) {\n description.push('on ' + manufacturer);\n }\n // Append product to description.\n if (product) {\n description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product);\n }\n // Parse the OS into an object.\n if (os) {\n data = / ([\\d.+]+)$/.exec(os);\n isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/';\n os = {\n 'architecture': 32,\n 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os,\n 'version': data ? data[1] : null,\n 'toString': function() {\n var version = this.version;\n return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');\n }\n };\n }\n // Add browser/OS architecture.\n if ((data = /\\b(?:AMD|IA|Win|WOW|x86_|x)64\\b/i.exec(arch)) && !/\\bi686\\b/i.test(arch)) {\n if (os) {\n os.architecture = 64;\n os.family = os.family.replace(RegExp(' *' + data), '');\n }\n if (\n name && (/\\bWOW64\\b/i.test(ua) ||\n (useFeatures && /\\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\\bWin64; x64\\b/i.test(ua)))\n ) {\n description.unshift('32-bit');\n }\n }\n // Chrome 39 and above on OS X is always 64-bit.\n else if (\n os && /^OS X/.test(os.family) &&\n name == 'Chrome' && parseFloat(version) >= 39\n ) {\n os.architecture = 64;\n }\n\n ua || (ua = null);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The platform object.\n *\n * @name platform\n * @type Object\n */\n var platform = {};\n\n /**\n * The platform description.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.description = ua;\n\n /**\n * The name of the browser's layout engine.\n *\n * The list of common layout engines include:\n * \"Blink\", \"EdgeHTML\", \"Gecko\", \"Trident\" and \"WebKit\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.layout = layout && layout[0];\n\n /**\n * The name of the product's manufacturer.\n *\n * The list of manufacturers include:\n * \"Apple\", \"Archos\", \"Amazon\", \"Asus\", \"Barnes & Noble\", \"BlackBerry\",\n * \"Google\", \"HP\", \"HTC\", \"LG\", \"Microsoft\", \"Motorola\", \"Nintendo\",\n * \"Nokia\", \"Samsung\" and \"Sony\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.manufacturer = manufacturer;\n\n /**\n * The name of the browser/environment.\n *\n * The list of common browser names include:\n * \"Chrome\", \"Electron\", \"Firefox\", \"Firefox for iOS\", \"IE\",\n * \"Microsoft Edge\", \"PhantomJS\", \"Safari\", \"SeaMonkey\", \"Silk\",\n * \"Opera Mini\" and \"Opera\"\n *\n * Mobile versions of some browsers have \"Mobile\" appended to their name:\n * eg. \"Chrome Mobile\", \"Firefox Mobile\", \"IE Mobile\" and \"Opera Mobile\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.name = name;\n\n /**\n * The alpha/beta release indicator.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.prerelease = prerelease;\n\n /**\n * The name of the product hosting the browser.\n *\n * The list of common products include:\n *\n * \"BlackBerry\", \"Galaxy S4\", \"Lumia\", \"iPad\", \"iPod\", \"iPhone\", \"Kindle\",\n * \"Kindle Fire\", \"Nexus\", \"Nook\", \"PlayBook\", \"TouchPad\" and \"Transformer\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.product = product;\n\n /**\n * The browser's user agent string.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.ua = ua;\n\n /**\n * The browser/environment version.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.version = name && version;\n\n /**\n * The name of the operating system.\n *\n * @memberOf platform\n * @type Object\n */\n platform.os = os || {\n\n /**\n * The CPU architecture the OS is built for.\n *\n * @memberOf platform.os\n * @type number|null\n */\n 'architecture': null,\n\n /**\n * The family of the OS.\n *\n * Common values include:\n * \"Windows\", \"Windows Server 2008 R2 / 7\", \"Windows Server 2008 / Vista\",\n * \"Windows XP\", \"OS X\", \"Linux\", \"Ubuntu\", \"Debian\", \"Fedora\", \"Red Hat\",\n * \"SuSE\", \"Android\", \"iOS\" and \"Windows Phone\"\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'family': null,\n\n /**\n * The version of the OS.\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'version': null,\n\n /**\n * Returns the OS string.\n *\n * @memberOf platform.os\n * @returns {string} The OS string.\n */\n 'toString': function() { return 'null'; }\n };\n\n platform.parse = parse;\n platform.toString = toStringPlatform;\n\n if (platform.version) {\n description.unshift(version);\n }\n if (platform.name) {\n description.unshift(name);\n }\n if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) {\n description.push(product ? '(' + os + ')' : 'on ' + os);\n }\n if (description.length) {\n platform.description = description.join(' ');\n }\n return platform;\n }\n\n /*--------------------------------------------------------------------------*/\n\n // Export platform.\n var platform = parse();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose platform on the global object to prevent errors when platform is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n root.platform = platform;\n\n // Define as an anonymous module so platform can be aliased through path mapping.\n define(function() {\n return platform;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for CommonJS support.\n forOwn(platform, function(value, key) {\n freeExports[key] = value;\n });\n }\n else {\n // Export to the global object.\n root.platform = platform;\n }\n}.call(this));\n","/*!\n* screenfull\n* v5.2.0 - 2021-11-03\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrÑ–bute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return {\n value: void 0,\n done: !0\n };\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable || \"\" === iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n throw new TypeError(_typeof(iterable) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) keys.push(key);\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(obj);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default {\n api: 'https://api.eyeson.team',\n allowSafariSFU: true,\n screencapture: true\n};\n","export default {\n widescreen: false\n};\n","/*eslint no-console: 0*/\n\n/**\n * eyeson Logger implement debug|info|warn|error methods.\n **/\nexport default (function () {\n return {\n error: function (...args) {\n return console.error(...args);\n },\n warn: function (...args) {\n return console.warn(...args);\n },\n info: function (...args) {\n return console.log(...args);\n },\n debug: function (...args) {\n if (!console.debug) {\n return null;\n }\n return console.debug(...args);\n }\n };\n})();\n","/* eslint max-lines: off */\nimport Logger from './Logger.js';\n\n/**\n * eyeson Communications Api\n **/\nclass ComApi {\n constructor(uri, token) {\n this.uri = uri;\n this.token = token.replace(/\\W+/g, '');\n this.cache = { users: [] };\n this.errorCallback = null;\n this._handleError = this._handleError.bind(this);\n }\n\n _request(path, options = {}) {\n return fetch(new Request(this.uri + path), options).then(response => {\n const contentType = response.headers.get('content-type');\n\n if (\n contentType &&\n contentType.indexOf('application/json') !== -1 &&\n response.ok\n ) {\n return response.json();\n }\n\n // not json - e.g. broadcast stop\n if (response.ok) {\n return response.text();\n }\n\n throw new Error(`ComApiError: ${response.status}`);\n });\n }\n\n /**\n * NOTE: slightly adjusted from:\n * https://gist.github.com/ghinda/8442a57f22099bdb2e34\n **/\n /* eslint-disable */\n _objectToFormData(obj, form, namespace) {\n let fd = form || new FormData();\n let formKey = null;\n\n for (let property in obj) {\n if (!obj.hasOwnProperty(property)) {\n return;\n }\n if (namespace) {\n // adjusted, skip \"int props\" for layout api\n let prop = isNaN(parseInt(property)) ? property : '';\n formKey = namespace + '[' + prop + ']';\n } else {\n formKey = property;\n }\n // if the property is an object, but not a File, use recursivity.\n if (\n typeof obj[property] === 'object' &&\n !(obj[property] instanceof File)\n ) {\n this._objectToFormData(obj[property], fd, property);\n } else {\n // if it's a string or a File object\n fd.append(formKey, obj[property]);\n }\n }\n\n return fd;\n }\n /* eslint-enable */\n\n _post(path, data) {\n return this._request(path, {\n method: 'POST',\n body: this._objectToFormData(data)\n });\n }\n\n _put(path, data) {\n const formData = new FormData();\n /* eslint-disable guard-for-in */\n for (const key in data) {\n formData.append(key, data[key]);\n }\n /* eslint-enable */\n return this._request(path, {\n method: 'PUT',\n body: formData\n });\n }\n\n _handleError(error) {\n Logger.error('ComApi::handleError', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return false;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n /**\n * Fetch room details including the user and credentials from com-api.\n **/\n getRoom(callback) {\n return this._request(`/rooms/${this.token}`)\n .then(callback)\n .catch(error => {\n return callback ? callback({ error: error }) : { error: error };\n });\n }\n\n /**\n * Terminate meeting immediately for all users\n **/\n terminateMeeting() {\n return this._request(`/rooms/${this.token}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Retrieve user information. Will use cache on multiple requests.\n **/\n getUser(userId, callback) {\n const user = this.cache.users.find(cachedUser => cachedUser.id === userId);\n\n if (user) {\n callback(user);\n return null;\n }\n\n return this._request(`/rooms/${this.token}/users/${userId}`)\n .then(apiUser => {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n let extendedUser = this.addUserAttributes(apiUser, userId, userId);\n users.push(extendedUser);\n this.cache.users = users;\n callback(extendedUser);\n })\n .catch(this._handleError);\n }\n\n addUserAttributes(user, userId, clientId) {\n let largeAvatarUrl = user.avatar;\n\n try {\n largeAvatarUrl = `${user.avatar}?size=large`;\n } catch (error) {\n Logger.warn('ComApi::addUserAttributes missing', user);\n }\n\n return Object.assign(user, {\n id: userId,\n apiId: user.id,\n clientId: clientId,\n // sipId will be removed in future (2023)!\n sipId: clientId,\n largeAvatar: largeAvatarUrl\n });\n }\n\n /**\n * Remove user from current meeting.\n **/\n kickUser(userId) {\n return this._request(`/rooms/${this.token}/users/${userId}`, {\n method: 'DELETE'\n })\n .then(() => {\n const user = this.cache.users.find(\n cachedUser => cachedUser.id === userId\n );\n if (user) {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n this.cache.users = users;\n }\n })\n .catch(this._handleError);\n }\n\n /**\n * Request a guest user from api.\n **/\n /* eslint-disable camelcase */\n requestUser(user, callback) {\n return this._post(`/guests/${this.token}`, {\n name: user.name,\n email: user.email,\n custom_fields: {\n locale: user.locale || 'en'\n }\n })\n .then(callback)\n .catch(error => callback({ error: error }));\n }\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n startBroadcast(data, platform) {\n return this._post(`/rooms/${this.token}/broadcasts`, {\n platform: platform,\n player_url: data.playerUrl || '',\n stream_url: data.streamUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n publishBroadcast(data, platform) {\n return this._put(`/rooms/${this.token}/broadcasts/${platform}`, {\n player_url: data.playerUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Stop a broadcast from a platform.\n **/\n stopBroadcast(platform) {\n return this._request(`/rooms/${this.token}/broadcasts/${platform}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Stop all broadcasts.\n **/\n stopAllBroadcasts() {\n return this._request(`/rooms/${this.token}/broadcasts`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Start a recording.\n **/\n startRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'POST'\n });\n }\n\n /**\n * Stop a recording\n **/\n stopRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Set layout\n * params object either as { layout: 'auto' } or { users: [ id1, id2 ...] }\n **/\n setLayout(params) {\n return this._post(`/rooms/${this.token}/layout`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Set layer\n *\n * params object: {\n * insert: {\n * icon: user['avatar'],\n * title: \"#{user['name']}:\",\n * content: question.truncate(280)\n * }\n * }\n *\n **/\n setLayer(params) {\n return this._post(`/rooms/${this.token}/layers`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Clear front most layer\n **/\n clearFrontLayer() {\n return this._request(`/rooms/${this.token}/layers/1`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Take a snapshot of the current podium\n **/\n takeSnapshot() {\n return this._request(`/rooms/${this.token}/snapshot`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n\n getSnapshot(snapshotId, callback) {\n return this._request(`/rooms/${this.token}/snapshots/${snapshotId}`)\n .then(callback)\n .catch(error => {\n if (callback) {\n callback({ error });\n return;\n }\n this._handleError(error);\n });\n }\n\n /**\n * Start a playback\n **/\n startPlayback(playback) {\n return this._post(`/rooms/${this.token}/playbacks`, {\n playback: playback\n }).catch(this._handleError);\n }\n\n /**\n * Stop a playback identified by play_id\n **/\n stopPlayback(playback) {\n return this._request(`/rooms/${this.token}/playbacks/${playback.play_id}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Lock meeting to freeze current participants\n */\n lockMeeting() {\n return this._request(`/rooms/${this.token}/lock`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n}\n\nexport default ComApi;\n","/* eslint-disable */\n/**\n * Creates and returns a new, throttled version of the passed function, that,\n * when invoked repeatedly, will only actually call the original function at most\n * once per every wait milliseconds. Useful for rate-limiting events that occur\n * faster than you can keep up with.\n *\n * By default, throttle will execute the function as soon as you call it for the\n * first time, and, if you call it again any number of times during the wait\n * period, as soon as that period is over. If you'd like to disable the\n * leading-edge call, pass {leading: false}, and if you'd like to disable the\n * execution on the trailing-edge, pass {trailing: false}.\n *\n * @see http://underscorejs.org/#throttle\n **/\nexport default (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n};\n/* eslint-enable */\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import Logger from './../Logger.js';\n\nclass BaseEvent {\n constructor(context) {\n this.context = context;\n }\n\n handle(msg) {\n Logger.error('BaseEvent::handle is not implemented', msg);\n }\n}\n\nexport default BaseEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StartPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.startPlayback(msg.playback);\n }\n}\n\nclass StopPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.stopPlayback(msg.playback);\n }\n}\n\nexport { StartPlaybackEvent, StopPlaybackEvent };\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import BaseEvent from './BaseEvent.js';\n\nclass PublicEvent extends BaseEvent {\n handle(msg) {\n if (msg._src === 'client') {\n return;\n }\n\n Reflect.deleteProperty(msg, '_src');\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default PublicEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartAnnotationEvent extends PublicEvent {\n handle() {\n this.context.annotationLoop = window.setInterval(() => {\n this.context._api.createAnnotation(\n response => {\n return super.handle({ type: 'annotation', annotation: response });\n },\n () => {\n window.clearInterval(this.context.annotationLoop);\n }\n );\n }, 1000);\n }\n}\n\nclass StopAnnotationEvent extends PublicEvent {\n handle() {\n window.clearInterval(this.context.annotationLoop);\n this.context._api.stopAnnotation();\n }\n}\n\nexport { StartAnnotationEvent, StopAnnotationEvent };\n","import PublicEvent from './PublicEvent.js';\n\nclass StfuEvent extends PublicEvent {\n handle() {\n this.context._rtConnection.send({ type: 'stfu' });\n }\n}\n\nexport default StfuEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass IgnoreEvent extends BaseEvent {\n handle() {\n // do nothing.\n }\n}\n\nexport default IgnoreEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ForwardEvent extends BaseEvent {\n handle(msg) {\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default ForwardEvent;\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator ||\n !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const 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 const 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 let 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(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 const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\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 if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = 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.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 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'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/*\n * Copyright (c) 2017 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/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","/*\n * Copyright (c) 2016 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 */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","import screenfull from 'screenfull';\n\nclass FullscreenHelper {\n constructor() {\n this.onChange = this.onChange.bind(this);\n this.hasSupport = Boolean(screenfull.isEnabled);\n }\n\n toggle() {\n return this.isFullscreen() ? screenfull.exit() : screenfull.request();\n }\n\n canFullscreen() {\n return this.hasSupport;\n }\n\n isFullscreen() {\n return this.hasSupport && screenfull.isFullscreen;\n }\n\n onChange(callback) {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.on('change', () => callback(this.isFullscreen()));\n }\n\n off() {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.off('change');\n }\n}\n\nexport default FullscreenHelper;\n","/* eslint-disable max-lines */\nimport config from './config.js';\nimport Logger from './Logger.js';\nimport adapter from 'webrtc-adapter';\nimport platform from 'platform';\nimport FullscreenHelper from './FullscreenHelper.js';\n\nlet _canvasBlurSupport = null;\n\n/**\n * Feature Detector.\n **/\nexport default {\n environment: function () {\n return {\n canMix: this.canMix(),\n canPip: this.hasPipSupport(),\n canSFU: this.canSFU(),\n isPhone: this.isPhone(),\n inIframe: this.inIframe(),\n isIOSDevice: this.isIOSDevice(),\n canUseEyeson: this.canUseEyeson(),\n canFullscreen: this.canFullscreen(),\n hasMobileDevice: this.hasMobileDevice(),\n canToggleCamera: this.canToggleCamera(),\n canPresentFiles: this.canPresentFiles(),\n canScreenCapture: this.canScreenCapture(),\n canAdjustSettings: this.canAdjustDeviceSettings(),\n canStreamLocalMedia: this.canStreamLocalMedia(),\n isExperimentalBrowser: this.isExperimentalBrowser()\n };\n },\n\n platform: () => platform,\n\n /**\n * Test if browser should be able to use eyeson.\n * canDataChannel includes hasPeerConnection check\n **/\n canUseEyeson: function () {\n return (\n !this.isWebView() &&\n this.hasGetUserMedia() &&\n this.canDataChannel() &&\n this.isMinimumRequiredBrowser()\n );\n },\n\n hasGetUserMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices\n );\n },\n\n hasGetDisplayMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getDisplayMedia' in navigator.mediaDevices\n );\n },\n\n hasPeerConnection: function () {\n return 'RTCPeerConnection' in window;\n },\n\n hasCaptureStream: function () {\n return (\n 'captureStream' in HTMLMediaElement.prototype ||\n 'mozCaptureStream' in HTMLMediaElement.prototype\n );\n },\n\n hasCanvasCaptureSupport: function () {\n return (\n 'CanvasCaptureMediaStream' in window ||\n 'CanvasCaptureMediaStreamTrack' in window\n );\n },\n\n hasSenders: function () {\n return 'RTCRtpSender' in window;\n },\n\n /**\n * 07 Aug 2019 - Safari doesn't seem to fire the event properly.\n **/\n hasTrackOnUnmute: function () {\n if (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n ) {\n return false;\n }\n return 'onunmute' in MediaStreamTrack.prototype;\n },\n\n /**\n * https://caniuse.com/#feat=webp\n **/\n hasWebpSupport: function () {\n if (this.isChrome()) {\n return adapter.browserDetails.version >= 70;\n }\n if (this.isFF()) {\n return adapter.browserDetails.version >= 65;\n }\n\n return false;\n },\n /**\n * Test if user agent supports changing of audio output.\n **/\n canChangeAudioOutput: function () {\n if (!document) {\n return true;\n }\n return 'setSinkId' in HTMLMediaElement.prototype;\n },\n\n /**\n * Test if user agent supports changing the microphone.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeMicrophone: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports different microphones on multiple simultanious\n * getUserMedia streams.\n * Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038 (fixed since v101)\n **/\n canMultipleDifferentMicrophones: function () {\n return !(this.isFF() && this.browserVersion() < 101);\n },\n\n /**\n * Test if user agent supports remembering devices.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeCamera: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports screen capture feature.\n * on mobile hasGetDisplayMedia() is true, but still doesn't work:\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#Browser_compatibility\n * and https://caniuse.com/#feat=mdn-api_mediadevices_getdisplaymedia\n **/\n canScreenCapture: function () {\n if (\n !config.screencapture ||\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n this.hasMobileDevice()\n ) {\n return false;\n }\n return this.hasGetDisplayMedia() || (this.isFF() && this.hasGetUserMedia());\n },\n\n canPresentFiles: function () {\n if (\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n (this.isFF() && adapter.browserDetails.version <= 60) ||\n this.isIPhone() ||\n (this.isIOSDevice() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser())\n ) {\n return false;\n }\n return true;\n },\n\n canStreamLocalMedia: function () {\n const audioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof audioContext !== 'function') {\n return false;\n }\n const proto = audioContext.prototype;\n const acMethods = [\n 'createGain',\n 'createMediaStreamSource',\n 'createMediaElementSource',\n 'createMediaStreamDestination'\n ].every(method => typeof proto[method] === 'function');\n return acMethods && this.hasCanvasCaptureSupport();\n },\n\n /**\n * Unfortunately we had issues with higher resolution constraints on\n * Safari (iOS and Mac).\n **/\n requiresLowerConstraints: function () {\n return (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n );\n },\n\n browserName: function () {\n let name = adapter.browserDetails.browser.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n return name;\n },\n\n browserVersion: function () {\n if (adapter.browserDetails.browser === 'safari') {\n return adapter.extractVersion(navigator.userAgent, /Version\\/(\\d+)\\./, 1);\n }\n return adapter.browserDetails.version;\n },\n\n isEdge: function () {\n return adapter.browserDetails.browser === 'edge';\n },\n\n isFF: function () {\n return adapter.browserDetails.browser === 'firefox';\n },\n\n isChrome: function () {\n return adapter.browserDetails.browser === 'chrome';\n },\n\n isSafari: function () {\n return adapter.browserDetails.browser === 'safari';\n },\n\n isMinimumRequiredBrowser: function () {\n if (this.isChrome()) {\n return this.isMinimumRequiredChrome();\n }\n if (this.isFF()) {\n return this.isMinimumRequiredFF();\n }\n if (this.isSafari()) {\n return this.isMinimumRequiredSafari();\n }\n return false;\n },\n\n /**\n * 2021-01-18 Edge is not supported anymore due to PeerConnection\n * and other issues\n **/\n isMinimumRequiredEdge: function () {\n return false;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Firefox_version_history\n * A customer is on WinXP (hello 2019) and FF seems\n * to be locked at 52 with an extended support version on that OS.\n * May god have mercy on those poor souls.\n **/\n isMinimumRequiredFF: function () {\n if (!this.isFF()) {\n return false;\n }\n return adapter.browserDetails.version >= 52;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Google_Chrome_version_history\n **/\n isMinimumRequiredChrome: function () {\n if (!this.isChrome()) {\n return false;\n }\n return adapter.browserDetails.version >= 70;\n },\n\n isMinimumRequiredSafari: function () {\n if (!this.isSafari()) {\n return false;\n }\n return this.browserVersion() >= 10 || this.isWorkingIOSBrowser();\n },\n\n isWorkingIOSBrowser: function () {\n // EdgiOS, FxiOS, CriOS\n const iOSBrowser = / [a-zA-Z]+iOS\\//.test(navigator.userAgent);\n const operaTouch = navigator.userAgent.indexOf(' OPT/') > -1;\n return (iOSBrowser || operaTouch) && this.hasGetUserMedia();\n },\n\n isExperimentalBrowser: function () {\n return ['safari', 'edge'].includes(adapter.browserDetails.browser);\n },\n\n /**\n * Unfortunately Safari on iOS pauses the local camera during PIP,\n * and afterwards the remote video is frozen.\n **/\n hasPipSupport: function () {\n if (!document) {\n return true;\n }\n\n return Boolean(\n 'webkitSupportsPresentationMode' in HTMLVideoElement.prototype ||\n ('pictureInPictureEnabled' in document &&\n document.pictureInPictureEnabled)\n );\n },\n\n /**\n * Detect non-working pip in iOS webview\n **/\n iOSPipCheck: function () {\n return new Promise(resolve => {\n const support = this.hasPipSupport();\n if (!support || !this.isIOSDevice()) {\n resolve(support);\n return;\n }\n const video = document.createElement('video');\n video.preload = 'none';\n video.src = 'about:blank';\n video.onsuspend = () => {\n const wkEnabled =\n video.webkitSupportsPresentationMode('picture-in-picture');\n resolve(wkEnabled);\n };\n });\n },\n\n /**\n * Check user agent if it is an Android device.\n **/\n isAndroidDevice: function () {\n return Boolean(navigator.userAgent.match(/Android/i));\n },\n\n /**\n * Check user agent if it is an iOS device.\n * This check includes detection of \"Desktop mode\" on mobile devices\n **/\n isIOSDevice: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !window.MSStream\n );\n },\n\n /**\n * Check user agent if it is an iPhone.\n * This check includes detection of \"Desktop mode\" on iPhone.\n * To distinguish between iPad and iPhone in \"Desktio mode\",\n * we have to additionally check for aspect ratio\n **/\n isIPhone: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPhone/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' &&\n navigator.maxTouchPoints > 1 &&\n window.screen.height / window.screen.width >= 1.5)) &&\n !window.MSStream\n );\n },\n\n /**\n * As a solution for mobile sites, our Android engineers recommend to\n * specifically detect “mobile†in the User-Agent string as well as\n * “android.â€\n *\n * https://webmasters.googleblog.com/2011/03/mo-better-to-also-detect-mobile-user.html\n **/\n isAndroidPhone: function () {\n const isAndroid = /(android)/i.test(navigator.userAgent);\n const isMobile = /(mobile)/i.test(navigator.userAgent);\n return isAndroid && isMobile;\n },\n\n isMacOS: function () {\n if (typeof navigator.userAgentData !== 'undefined') {\n return navigator.userAgentData.platform === 'macOS';\n }\n return navigator.platform.indexOf('Mac') === 0;\n },\n\n /**\n * Is the app running inside an iFrame.\n * https://stackoverflow.com/a/326076/980524\n **/\n inIframe: function () {\n try {\n return window.self !== window.top;\n } catch (error) {\n return true;\n }\n },\n\n /**\n * Phone vs. tablet\n **/\n isPhone: function () {\n return this.isIPhone() || this.isAndroidPhone();\n },\n\n /**\n * ...\n **/\n hasMobileDevice: function () {\n return this.isIOSDevice() || this.isAndroidDevice();\n },\n\n /**\n * Is the app running on a touch device.\n * https://stackoverflow.com/a/4819886/980524\n * Note: touch device, might be a laptop with a touch display or those\n * dell tablets we have laying around here.\n **/\n isTouchDevice: function () {\n return Boolean('ontouchstart' in window || navigator.maxTouchPoints);\n },\n\n /**\n * iOS doesn't propagate tap events to react when we have display tooltips.\n * This results in annoying \"double taps\" from the user.\n * But the tooltips aren't designed for touch devices anyway.\n **/\n canDisplayTooltips: function () {\n return !this.isIOSDevice() && !this.isTestSuite();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canAdjustDeviceSettings: function () {\n return !this.isIOSDevice();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canToggleCamera: function () {\n return true;\n },\n\n /**\n * iPad file presentation has issues add cam to canvas\n **/\n canDrawCamera: function () {\n return !this.isIOSDevice();\n },\n\n canMix: function () {\n return (\n this.isChrome() &&\n this.canScreenCapture() &&\n this.hasCanvasCaptureSupport()\n );\n },\n\n /**\n * Browsers don't behave the same way when setting the .enabled property of\n * a MediaSTreamTrack to false.\n * In Chrome (as of May 2019) the activity indicator stays active even if\n * the track is disabled (enabled: false).\n * https://bugs.chromium.org/p/webrtc/issues/detail?id=5942\n * While in Firefox the indicator is turned off.\n */\n stopsDeviceActivityIndicatorOnDisable: function () {\n if (this.isFF()) {\n return true;\n }\n return false;\n },\n\n /**\n * Edge doesn't have this property and raises an error when trying to\n * access it.\n **/\n supportsBlurOnSVG: function () {\n return (\n typeof SVGElement !== 'undefined' &&\n typeof SVGElement.prototype.blur !== 'undefined'\n );\n },\n\n /**\n * Chrome will throw a SecurityException when trying to read the\n * `localStorage` property.\n **/\n hasLocalStorage: function () {\n try {\n const hasLocalStorage =\n typeof window.localStorage === 'object' && window.localStorage !== null;\n window.localStorage.setItem('eyeson.test', 'test');\n const canGet = window.localStorage.getItem('eyeson.test') === 'test';\n return hasLocalStorage && canGet;\n } catch (error) {\n Logger.debug('FeatureDetector::hasLocalStorage:', error.message);\n return false;\n }\n },\n\n canFullscreen: function () {\n return new FullscreenHelper().canFullscreen();\n },\n\n isFullscreen: function () {\n return new FullscreenHelper().isFullscreen();\n },\n\n /**\n * Check for SFU-mode support\n * VP8 codec required, in Safari available since v12.1\n **/\n canSFU: function () {\n let safariWithoutVP8 = false;\n if (this.isSafari()) {\n if (!config.allowSafariSFU) {\n return false;\n }\n if (this.isWorkingIOSBrowser()) {\n return true;\n }\n const uAVersion = navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/);\n if (uAVersion && uAVersion.length > 1) {\n safariWithoutVP8 =\n Number(uAVersion[1]) < 12 ||\n (Number(uAVersion[1]) === 12 && Number(uAVersion[2]) < 1);\n }\n }\n return !safariWithoutVP8 && !this.isTestSuite();\n },\n\n canDataChannel: function () {\n return (\n this.hasPeerConnection() &&\n typeof RTCPeerConnection.prototype.createDataChannel === 'function' &&\n 'RTCDataChannel' in window\n );\n },\n\n /**\n * SDP SSRC updates for SFU mode switch\n * Safari has a bug of broken mediastream when all ssrc's change\n **/\n disallowAudioSyncSrcChange: function () {\n return this.isSafari() && this.canSFU();\n },\n\n canShare: function () {\n return Boolean(navigator.share);\n },\n\n /**\n * https://developer.chrome.com/multidevice/user-agent#webview_user_agent\n *\n * If you’re attempting to differentiate between the WebView and Chrome for\n * Android, you should look for the presence of the Version/_X.X_ string in\n * the WebView user-agent string.\n *\n * In the newer versions of WebView, you can differentiate the WebView by\n * looking for the wv field as highlighted below\n **/\n isWebView: function () {\n return /Version\\/|wv/i.test(navigator.userAgent) && this.isAndroidDevice();\n },\n\n /* eslint-disable no-process-env */\n /* global process */\n isTestSuite: function () {\n return (\n process.env.NODE_ENV === 'test' ||\n adapter.browserDetails.browser === 'test-suite'\n );\n },\n /* eslint-enable no-process-env */\n\n /**\n * mobile Safari is not able to display canvas stream in video\n * https://stackoverflow.com/a/63948310\n */\n canVirtualBackground: function () {\n return (\n !this.isIOSDevice() &&\n Boolean(window.WebAssembly) &&\n typeof WebAssembly.validate === 'function' &&\n (typeof WebAssembly.instantiateStreaming === 'function' ||\n typeof WebAssembly.instantiate === 'function') &&\n Boolean(window.CanvasRenderingContext2D) &&\n typeof window.ImageData === 'function' &&\n typeof window.requestAnimationFrame === 'function'\n );\n },\n\n // eslint-disable-next-line max-statements\n canvasBlurSupport: function () {\n if (_canvasBlurSupport !== null) {\n return _canvasBlurSupport;\n }\n const filterSupport =\n window.CanvasRenderingContext2D &&\n 'filter' in CanvasRenderingContext2D.prototype;\n if (!filterSupport) {\n _canvasBlurSupport = false;\n return _canvasBlurSupport;\n }\n let canvas1 = document.createElement('canvas');\n let canvas2 = document.createElement('canvas');\n canvas1.width = 10;\n canvas1.height = 10;\n canvas2.width = 10;\n canvas2.height = 10;\n let ctx1 = canvas1.getContext('2d');\n let ctx2 = canvas2.getContext('2d');\n ctx1.filter = 'blur(5px)';\n ctx1.fillStyle = '#000000';\n ctx1.fillRect(3, 3, 4, 4);\n ctx2.fillStyle = '#000000';\n ctx2.fillRect(3, 3, 4, 4);\n let data1 = ctx1.getImageData(5, 5, 1, 1);\n let data2 = ctx2.getImageData(5, 5, 1, 1);\n _canvasBlurSupport = data1.data[3] !== data2.data[3];\n return _canvasBlurSupport;\n },\n\n /**\n * We've noticed many issues with Safari and stereo on desktop and mobile.\n * Even weired ones like https://developer.apple.com/forums/thread/672037.\n * On Android issues occur when output device is changed, especially buetooth\n * devices are difficult.\n */\n canStereo: function () {\n return !(this.isSafari() || this.isAndroidDevice());\n },\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/displaySurface\n canChooseDisplaySurface: function () {\n return (\n this.hasGetDisplayMedia() &&\n navigator.mediaDevices.getSupportedConstraints().displaySurface\n );\n },\n\n hasPipCamSupport: function () {\n return this.isChrome() && this.hasPipSupport();\n },\n\n canMonitorSystemPressure: function () {\n /* eslint-disable no-undef */\n return (\n typeof window.PressureObserver === 'function' &&\n Array.isArray(PressureObserver.supportedSources) &&\n PressureObserver.supportedSources.includes('cpu')\n );\n /* eslint-enable no-undef */\n }\n};\n/* eslint-enable max-lines */\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","/**\n * Ninja Stream\n **/\nclass NinjaStream {\n constructor() {\n this._stream = this.createStream();\n }\n\n get stream() {\n return this._stream;\n }\n\n /**\n * Create a dummy stream from a canvas element.\n **/\n // eslint-disable-next-line max-statements\n createStream() {\n const width = 0;\n const height = 0;\n let canvas = Object.assign(document.createElement('canvas'), {\n width,\n height\n });\n canvas.id = 'eyeson-ninja-stream';\n canvas.getContext('2d').fillRect(0, 0, width, height);\n let stream = canvas.captureStream();\n let [track] = stream.getVideoTracks();\n // adjust FF to identify NinjaStream track\n if (\n window.CanvasCaptureMediaStream &&\n stream instanceof window.CanvasCaptureMediaStream\n ) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n }\n return stream;\n }\n}\n\nexport default NinjaStream;\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\n\n/**\n * Wrapper around localStorage API in order to prefix keys to be stored and\n * offer default values on demand. If no localStorage is provided by\n * the user-agent, we use a temporary fallbackStorage.\n **/\nexport default (function () {\n const prefix = 'eyeson.';\n const fallbackStorage = {};\n const hasLocalStorage = FeatureDetector.hasLocalStorage();\n\n return {\n store: function (key, value) {\n if (!hasLocalStorage) {\n fallbackStorage[key] = value;\n return true;\n }\n try {\n window.localStorage.setItem(prefix + key, JSON.stringify(value));\n } catch (error) {\n Logger.error('LocalStorage::store', error);\n return false;\n }\n return true;\n },\n // eslint-disable-next-line max-statements\n load: function (key, defaultValueParam) {\n let defaultValue = defaultValueParam;\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n defaultValue = Object.assign({}, defaultValue);\n }\n if (!hasLocalStorage) {\n return fallbackStorage[key] || defaultValue;\n }\n let storedValue = window.localStorage.getItem(prefix + key);\n if (!storedValue) {\n return defaultValue;\n }\n try {\n return JSON.parse(storedValue);\n } catch (error) {\n Logger.error('LocalStorage::load', key, error);\n return defaultValue;\n }\n }\n };\n})();\n","// https://github.com/YuzuJS/setImmediate/blob/modern-browsers-only/setImmediate.js\nconst immediate = (() => {\n const stack = [];\n const target = '*';\n const messageName = 'com.eyeson.immediate';\n const handleMessage = event => {\n if (event.source === window && event.data === messageName) {\n event.stopPropagation();\n const fn = stack.shift();\n if (fn) {\n fn();\n }\n }\n };\n window.addEventListener('message', handleMessage);\n return fn => {\n stack.push(fn);\n window.postMessage(messageName, target);\n };\n})();\n\nexport default immediate;\n","/* eslint-disable max-lines */\nimport FeatureDetector from '../FeatureDetector.js';\nimport Logger from '../Logger';\n\nconst CanvasMedia =\n window.CanvasCaptureMediaStream || window.CanvasCaptureMediaStreamTrack;\n\nexport const hasAudio = stream => {\n return Boolean(\n stream &&\n stream.getAudioTracks().length > 0 &&\n stream.getAudioTracks()[0].enabled\n );\n};\n\nexport const hasVideo = stream => {\n return Boolean(\n stream &&\n stream.getVideoTracks().length > 0 &&\n stream.getVideoTracks()[0].enabled\n );\n};\n\nexport const disableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = false));\n }\n return stream;\n};\n\nexport const enableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = true));\n }\n return stream;\n};\n\nexport const toggleAudio = (stream, enabled) => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\nexport const toggleVideo = (stream, enabled) => {\n if (stream) {\n stream.getVideoTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\n// In order to be \"informed\" about track ending in compose_canvas where we\n// create offscreen/hidden video elements and need to clean them up afterwards,\n// we need to dispatch 'stopped' ourselves. The 'ended' event is not emitted\n// after stopping the track, as one might expect see:\n// https://stackoverflow.com/q/55953038/980524\nexport const stopTrack = track => {\n track.stop();\n return track.dispatchEvent(new Event('stopped'));\n};\n\nexport const stopStream = stream => {\n if (stream) {\n stream.getTracks().forEach(stopTrack);\n }\n};\n\nconst isScreenTrack = track => {\n return (\n /screen|monitor|window|web-contents-media-stream/i.test(track.label) ||\n track.type === 'screen-track' ||\n track.type === 'screen-video-track'\n );\n};\n\nconst isScreenPresentationTrack = track => {\n return isScreenTrack(track) && track.type !== 'screen-video-track';\n};\n\nexport const isScreenAsVideoTrack = track => {\n return isScreenTrack(track) && track.type === 'screen-video-track';\n};\n\nconst isCanvasTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id !== 'eyeson-ninja-stream' &&\n track.canvas.id !== 'eyeson-vbg-stream'\n );\n};\n\nexport const isNinjaStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-ninja-stream'\n );\n};\n\nexport const isVbgStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-vbg-stream'\n );\n};\n\nconst isCameraTrack = track => {\n return (\n !isCanvasTrack(track) && !isScreenTrack(track) && !isVbgStreamTrack(track)\n );\n};\n\nexport const getScreenTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenTrack);\n};\n\nexport const getScreenPresentationTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenPresentationTrack);\n};\n\nexport const getScreenAsVideoTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenAsVideoTrack);\n};\n\nexport const getCameraTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCameraTrack);\n};\n\nexport const getVbgTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isVbgStreamTrack);\n};\n\nexport const stopCamera = stream => {\n getCameraTracks(stream).forEach(stopTrack);\n};\n\nexport const disableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = false));\n return stream;\n};\n\nexport const enableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = true));\n return stream;\n};\n\nexport const toggleCamera = (stream, enabled) => {\n getCameraTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const toggleVbgTrack = (stream, enabled) => {\n getVbgTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const getCanvasTracks = stream => {\n // current FF implementation\n if (stream instanceof CanvasMedia) {\n return stream.getVideoTracks();\n }\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCanvasTrack);\n};\n\nexport const isScreenStream = stream => {\n return hasVideo(stream) && stream.getVideoTracks().some(isScreenTrack);\n};\n\nexport const isScreenPresentationStream = stream => {\n return (\n hasVideo(stream) && stream.getVideoTracks().some(isScreenPresentationTrack)\n );\n};\n\nexport const isCanvasStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n\n return stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isVBGStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n return hasVideo(stream) && stream.getVideoTracks().some(isVbgStreamTrack);\n};\n\nexport const isCameraStream = stream => {\n return (\n hasVideo(stream) &&\n !isScreenStream(stream) &&\n !isCanvasStream(stream) &&\n !isVBGStream(stream)\n );\n};\n\nexport const isCanvasPresentationStream = stream => {\n if (!stream) {\n return false;\n }\n return isCanvasStream(stream) && stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isPresentationStream = stream => {\n return isScreenPresentationStream(stream) || isCanvasStream(stream);\n};\n\nexport const hasCameraVideo = stream => {\n return getCameraTracks(stream).some(track => track.enabled);\n};\n\nexport const getFacingMode = stream => {\n const tracks = getCameraTracks(stream);\n if (tracks.length > 0) {\n const [track] = tracks;\n if (typeof track.getSettings === 'function') {\n const settings = track.getSettings();\n if (settings && 'facingMode' in settings) {\n return settings.facingMode;\n }\n }\n }\n return null;\n};\n\n// try to make FF's captureStream handling track based.\nexport const captureStream = canvas => {\n // NOTE: getContext is needed for firefox, otherwise we get an exception:\n // NS_ERROR_NOT_INITIALIZED when calling .captureStream on the canvas.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1257440\n canvas.getContext('2d');\n\n // 0 param is fps, but since that doesn't work cross browser, we use 0\n // and request frames manually.\n const stream = canvas.captureStream(20);\n const [track] = stream.getVideoTracks();\n if (!('requestFrame' in track)) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n track.requestFrame = () => stream.requestFrame();\n }\n\n return stream;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeAudioTrack = () => {\n try {\n const ac = new (window.AudioContext || window.webkitAudioContext)();\n const { stream } = ac.createMediaStreamDestination();\n const [track] = stream.getAudioTracks();\n track.type = 'fake-audio';\n track.enabled = false;\n stopStream(stream);\n ac.close();\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeAudioTrack Unable to create audio track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeVideoTrack = () => {\n try {\n const canvas = document.createElement('canvas');\n // Firefox needs some kind of kickass\n canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height);\n const stream = canvas.captureStream();\n const [track] = stream.getVideoTracks();\n track.type = 'fake-video';\n track.enabled = false;\n stopStream(stream);\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeVideoTrack Unable to create video track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nexport const createExternalStream = (stream, audioOnly = false) => {\n if (\n stream &&\n stream instanceof MediaStream &&\n stream.getTracks().length > 0\n ) {\n const aTrack = stream\n .getAudioTracks()\n .find(track => track.readyState === 'live');\n const vTrack = stream\n .getVideoTracks()\n .find(track => track.readyState === 'live');\n const audioTrack = aTrack || createFakeAudioTrack();\n const videoTrack = vTrack || createFakeVideoTrack();\n const tracks = [];\n if (audioTrack) {\n tracks.push(audioTrack);\n }\n if (videoTrack && !audioOnly) {\n tracks.push(videoTrack);\n }\n return new MediaStream(tracks);\n }\n return false;\n};\n","import immediate from './immediate.js';\n\nconst throttledAnimationFrame = (fn, fps) => {\n let raf = null;\n let focus = true;\n let abort = false;\n let animationFrameThen = 0;\n const frameRate = 1000 / fps;\n const throttledRAF = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n raf = requestAnimationFrame(throttledRAF);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n fn();\n };\n const throttledImmediate = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n immediate(throttledImmediate);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n if (!abort) {\n fn();\n }\n };\n const result = {\n requestAnimationFrame: () => {\n if (focus) {\n raf = requestAnimationFrame(throttledRAF);\n } else {\n if (abort) {\n abort = false;\n }\n immediate(throttledImmediate);\n }\n },\n cancelAnimationFrame: () => {\n abort = true;\n if (raf) {\n cancelAnimationFrame(raf);\n raf = null;\n }\n }\n };\n document.addEventListener('visibilitychange', () => {\n focus = document.visibilityState === 'visible';\n if (!focus && raf) {\n result.cancelAnimationFrame();\n result.requestAnimationFrame();\n }\n });\n return result;\n};\n\nexport default throttledAnimationFrame;\n","/**\n * importScript\n * lazy-load script files, promise-based\n */\nconst importScript = (url, integrity = null) => {\n return new Promise((resolve, reject) => {\n const src = new URL(url, location.href);\n const script = document.createElement('script');\n script.async = true;\n script.onload = () => {\n if (script.parentNode) {\n script.remove();\n }\n resolve(script);\n };\n script.onerror = () => {\n if (script.parentNode) {\n script.remove();\n }\n reject(new Error('Unable to initiate script ' + url));\n };\n if (integrity) {\n script.integrity = integrity.algo + '-' + integrity.hash;\n }\n script.src = src;\n document.head.append(script);\n });\n};\n\nexport default importScript;\n","const cacheStorageSupport = typeof window.CacheStorage === 'function';\n\nconst storeBlobURL = async (blobURL, path) => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const response = await fetch(blobURL);\n const blob = await response.blob();\n const cache = await caches.open('store');\n await cache.put(path, new Response(blob));\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nconst loadBlobURL = async path => {\n if (cacheStorageSupport) {\n try {\n const cache = await caches.open('store');\n const response = await cache.match(path);\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n return false;\n};\n\nconst deleteBlob = async path => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const cache = await caches.open('store');\n await cache.delete(path);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nexport default {\n storeBlobURL,\n loadBlobURL,\n deleteBlob\n};\n","/* eslint-disable max-statements */\n/* eslint-disable no-bitwise */\n/* eslint-disable id-length */\n// https://github.com/davidenke/context-filter-polyfill/blob/master/src/filters/blur.filter.ts\n\nconst _mulTable = [\n 1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107,\n 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221,\n 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103,\n 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119,\n 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151,\n 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13,\n 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75,\n 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229,\n 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183,\n 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37,\n 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61,\n 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207,\n 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178,\n 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153,\n 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133,\n 66, 131, 65, 129, 1\n];\nconst _shgTable = [\n 0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18,\n 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20,\n 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21,\n 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20,\n 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22,\n 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18,\n 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22,\n 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24,\n 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24,\n 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22,\n 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23,\n 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25,\n 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25,\n 22, 25, 25, 25, 24, 25, 24, 25, 18\n];\n\nconst canvasBlur = () => {\n let _canvas = null;\n let _ctx = null;\n let _previous = false;\n let _r = null;\n let _g = null;\n let _b = null;\n let _vmin = null;\n let _vmax = null;\n\n const run = (imageBitmap, radius = 0) => {\n if (_previous && _canvas) {\n _previous = false;\n return _canvas;\n }\n _previous = true;\n const amount = parseFloat(radius);\n\n const { width, height } = imageBitmap;\n if (!_canvas) {\n _canvas = document.createElement('canvas');\n _ctx = _canvas.getContext('2d', { alpha: false, desynchronized: true });\n _canvas.width = width;\n _canvas.height = height;\n }\n _ctx.drawImage(imageBitmap, 0, 0);\n const imageData = _ctx.getImageData(0, 0, width, height);\n const { data } = imageData;\n\n // http://www.quasimondo.com/BoxBlurForCanvas/FastBlur.js\n const wm = width - 1;\n const hm = height - 1;\n const rad1 = amount + 1;\n\n const mulSum = _mulTable[amount];\n const shgSum = _shgTable[amount];\n\n if (!_r) {\n _r = new Uint32Array(data.length / 4);\n _g = new Uint32Array(data.length / 4);\n _b = new Uint32Array(data.length / 4);\n\n _vmin = new Uint32Array(width);\n _vmax = new Uint32Array(width);\n }\n\n let iterations = 2;\n let p = 0;\n let p1 = 0;\n let p2 = 0;\n\n while (iterations-- > 0) {\n let yw = 0;\n let yi = 0;\n\n for (let y = 0; y < height; y++) {\n let rsum = data[yw] * rad1;\n let gsum = data[yw + 1] * rad1;\n let bsum = data[yw + 2] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n p = yw + ((i > wm ? wm : i) << 2);\n rsum += data[p++];\n gsum += data[p++];\n bsum += data[p++];\n }\n\n for (let x = 0; x < width; x++) {\n _r[yi] = rsum;\n _g[yi] = gsum;\n _b[yi] = bsum;\n\n if (y === 0) {\n _vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n _vmax[x] = (p = x - amount) > 0 ? p << 2 : 0;\n }\n\n p1 = yw + _vmin[x];\n p2 = yw + _vmax[x];\n\n rsum += data[p1++] - data[p2++];\n gsum += data[p1++] - data[p2++];\n bsum += data[p1++] - data[p2++];\n\n yi++;\n }\n yw += width << 2;\n }\n\n for (let x = 0; x < width; x++) {\n let yp = x;\n let rsum = _r[yp] * rad1;\n let gsum = _g[yp] * rad1;\n let bsum = _b[yp] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n yp += i > hm ? 0 : width;\n rsum += _r[yp];\n gsum += _g[yp];\n bsum += _b[yp];\n }\n\n yi = x << 2;\n\n for (let y = 0; y < height; y++) {\n data[yi] = (rsum * mulSum) >>> shgSum;\n data[yi + 1] = (gsum * mulSum) >>> shgSum;\n data[yi + 2] = (bsum * mulSum) >>> shgSum;\n\n if (x === 0) {\n _vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n _vmax[y] = (p = y - amount) > 0 ? p * width : 0;\n }\n\n p1 = x + _vmin[y];\n p2 = x + _vmax[y];\n\n rsum += _r[p1] - _r[p2];\n gsum += _g[p1] - _g[p2];\n bsum += _b[p1] - _b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n _ctx.putImageData(imageData, 0, 0);\n\n return _canvas;\n };\n\n const reset = () => {\n _canvas = null;\n _ctx = null;\n _previous = false;\n _r = null;\n _g = null;\n _b = null;\n _vmin = null;\n _vmax = null;\n };\n\n return { run, reset };\n};\n\nexport default canvasBlur;\n","/* eslint-disable max-lines */\n/* eslint-disable max-statements */\nimport FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport LocalStorage from './LocalStorage.js';\nimport throttledAnimationFrame from './utils/throttledAnimationFrame.js';\nimport importScript from './utils/importScript.js';\nimport { stopStream, stopTrack, getVbgTracks } from './utils/StreamHelpers.js';\nimport cacheStorage from './utils/cacheStorage.js';\nimport canvasBlur from './utils/canvasBlur.js';\n\nwindow.exports = window.exports || {};\n\nconst OffscreenCanvasSupport =\n typeof window.OffscreenCanvas === 'function' &&\n (() => {\n try {\n new OffscreenCanvas(1, 1).getContext('2d');\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n })();\nconst OffscreenCanvasBlurSupport =\n OffscreenCanvasSupport &&\n Boolean(window.OffscreenCanvasRenderingContext2D) &&\n 'filter' in OffscreenCanvasRenderingContext2D.prototype;\nconst ImageBitmapSupport = typeof window.createImageBitmap === 'function';\nconst TrackProcessorSupport =\n typeof window.MediaStreamTrackProcessor === 'function';\nconst SIMDSupport =\n window.WebAssembly &&\n WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7,\n 0, 65, 0, 253, 15, 26, 11\n ])\n );\nconst EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nconst _max = Math.max;\n\nconst _frameRate = 20;\nconst _stateChange = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\nconst _segmentationModel = {\n id: 'selfie_landscape',\n name: 'selfie_segmentation_landscape',\n width: 256,\n height: 144,\n pixelCount: 36864\n};\n\nlet _tflite = null;\nlet _tfliteReady = false;\nlet _tfliteLoading = false;\nlet _inputMemoryOffset = null;\nlet _outputMemoryOffset = null;\n\nlet _localImageFile = null;\nlet _localImageFileBackup = null;\n\nconst initiateTFLite = async () => {\n if (_tflite) {\n return;\n }\n _tfliteLoading = true;\n _stateChange.dispatchEvent(new Event('change'));\n const loading = await Promise.all([\n SIMDSupport\n ? importScript('vendor/tflite/tflite-simd.js')\n : importScript('vendor/tflite/tflite.js'),\n fetch(`vendor/tflite/models/${_segmentationModel.name}.tflite`)\n ]);\n _tflite = await window.exports[\n SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule'\n ]();\n const model = await loading[1].arrayBuffer();\n const modelBufferOffset = _tflite._getModelBufferMemoryOffset();\n _tflite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);\n _tflite._loadModel(model.byteLength);\n _inputMemoryOffset = _tflite._getInputMemoryOffset() / 4;\n _outputMemoryOffset = _tflite._getOutputMemoryOffset() / 4;\n _tfliteLoading = false;\n _tfliteReady = true;\n _stateChange.dispatchEvent(new Event('change'));\n};\n\nconst createOffscreenCanvas = (width, height, options = {}, type) => {\n const result = {\n canvas: null,\n ctx: null\n };\n const extra = type === 'blur' && OffscreenCanvasBlurSupport;\n if (OffscreenCanvasSupport && extra) {\n result.canvas = new OffscreenCanvas(width, height);\n result.ctx = result.canvas.getContext('2d', options);\n return result;\n }\n result.canvas = document.createElement('canvas');\n result.canvas.width = width;\n result.canvas.height = height;\n result.ctx = result.canvas.getContext(\n '2d',\n Object.assign({ desynchronized: true }, options)\n );\n return result;\n};\n\n(async () => {\n const virtualBackgroundType = LocalStorage.load('virtualBackgroundType');\n if (virtualBackgroundType === 'image:blob') {\n const url = await cacheStorage.loadBlobURL('/virtualBackgroundLocalImage');\n if (url) {\n _localImageFile = url;\n }\n }\n})();\n\nconst loadImage = (url, instance) => {\n return new Promise(resolve => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(true);\n }\n if (url === 'blob' && !_localImageFile) {\n resolve(null);\n return;\n }\n const img = new Image();\n img.onerror = () => resolve(null);\n img.onload = () => resolve(img);\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url === 'blob' && _localImageFile ? _localImageFile : url;\n }).then(img => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(false);\n }\n return img;\n });\n};\n\nconst checkImageLoad = url => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = () => reject(new TypeError('Invalid image file'));\n img.onload = () => resolve();\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url;\n });\n};\n\nconst loadImageFile = (() => {\n let input = null;\n return callbackFN => {\n if (!input) {\n input = Object.assign(document.createElement('input'), {\n type: 'file',\n accept: 'image/*'\n });\n }\n input.onchange = ({ target: { files } }) => {\n if (files.length > 0) {\n const url = URL.createObjectURL(files[0]);\n checkImageLoad(url).then(() => {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = url;\n callbackFN();\n }, callbackFN);\n }\n input.onchange = null;\n input.value = '';\n };\n input.click();\n };\n})();\n\nconst createImageCanvas = (image, width, height) => {\n const hRatio = width / image.width;\n const vRatio = height / image.height;\n const ratio = _max(hRatio, vRatio);\n const imgWidth = image.width * ratio;\n const imgHeight = image.height * ratio;\n const centerShiftX = (width - imgWidth) / 2;\n const centerShiftY = (height - imgHeight) / 2;\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n canvas.ctx.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n centerShiftX,\n centerShiftY,\n imgWidth,\n imgHeight\n );\n return canvas.canvas;\n};\n\nconst createGeneraliCanvas = (image, width, height) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(image, 15, 15);\n return canvas.canvas;\n};\n\nconst createGradientCanvas = (width, height, options) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n const gradient = ctx.createLinearGradient(\n options.startX,\n options.startY,\n options.endX,\n options.endY\n );\n gradient.addColorStop(0, options.color1);\n gradient.addColorStop(1, options.color2);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n return canvas.canvas;\n};\n\nconst createBlurCanvas = (instance, width, height, blur) => {\n const length = blur * 2;\n const fullLength = length * 2;\n const bigWidth = width + fullLength;\n const bigHeight = height + fullLength;\n instance.blurCanvas = createOffscreenCanvas(\n bigWidth,\n bigHeight,\n {\n alpha: false\n },\n 'blur'\n );\n instance.imageCanvas = createOffscreenCanvas(bigWidth, bigHeight, {\n alpha: false\n });\n instance.blurCanvas.ctx.filter = `blur(${blur}px)`;\n};\n\nconst _allowedTypesCheck =\n /^(off|eyeson|generali:.*|color:.+|image:.+|blur:\\d+)/;\n\nconst setState = () => {\n if (_tfliteReady) {\n return 'ready';\n }\n if (_tfliteLoading) {\n return 'initialize';\n }\n return '';\n};\n\nclass VirtualBackgroundMixer {\n constructor(name = 'global') {\n Logger.info('VirtualBackgroundMixer::constructor', name);\n this.name = name;\n this.canvas = null;\n this.ctx = null;\n this.originalStream = null;\n this.outStream = null;\n this.video = null;\n this.reader = null;\n this.size = { width: 0, height: 0 };\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.playPromise = null;\n this.abort = false;\n this.paused = false;\n this.raf = throttledAnimationFrame(this.drawVideo.bind(this), 20);\n this.backgroundOld = null;\n this.backgroundType = null;\n this.backgroundValue = null;\n this.blurInit = false;\n this.blurCanvas = null;\n this.canvasBlur = canvasBlur();\n this.imageCanvas = null;\n this.state = setState();\n this.loadingListener = [];\n this.handleStateChange = () => {\n const state = setState();\n this.state = state;\n this.emitLoading(state === 'initialize');\n };\n _stateChange.addEventListener('change', this.handleStateChange);\n }\n\n static isTypeAllowed(type) {\n return _allowedTypesCheck.test(type);\n }\n\n static async checkExternalImage(type) {\n if (/^image:([\\w]+:)?\\/\\//i.test(type)) {\n const url = type.substring(6);\n await checkImageLoad(url);\n }\n }\n\n static loadLocalImage(callbackFN) {\n loadImageFile(callbackFN);\n }\n\n static getImageBlobOrFallback(isBlobAvailable = true) {\n if (_localImageFile && isBlobAvailable) {\n return 'image:blob';\n }\n return 'blur:8';\n }\n\n storeLocalImageFile() {\n if (_localImageFile) {\n _localImageFileBackup = _localImageFile;\n }\n }\n\n resetLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = _localImageFileBackup;\n _localImageFileBackup = null;\n }\n }\n\n saveLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFileBackup);\n }\n _localImageFileBackup = null;\n }\n }\n\n updateCache(type) {\n if (type === 'image:blob') {\n if (_localImageFile) {\n cacheStorage.storeBlobURL(\n _localImageFile,\n '/virtualBackgroundLocalImage'\n );\n }\n } else {\n cacheStorage.deleteBlob('/virtualBackgroundLocalImage');\n }\n }\n\n onLoading(listener) {\n this.loadingListener.push(listener);\n }\n\n offLoading(listener) {\n this.loadingListener = this.loadingListener.filter(fn => fn !== listener);\n }\n\n emitLoading(loading) {\n this.loadingListener.forEach(listener => listener(loading));\n }\n\n initiateStream(userMediaStream) {\n Logger.info('VirtualBackgroundMixer::initiate', this.name);\n initiateTFLite();\n const videoTracks = userMediaStream.getVideoTracks();\n if (videoTracks.length === 0) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'missing track'\n );\n return userMediaStream;\n }\n const [videoTrack] = videoTracks;\n const trackSettings = videoTrack.getSettings();\n if (\n videoTrack.readyState !== 'live' ||\n !trackSettings.width ||\n !trackSettings.height\n ) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n '0 width or height, or not ready',\n videoTrack.readyState,\n trackSettings.width,\n trackSettings.height\n );\n return userMediaStream;\n }\n if (this.originalStream) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'existing originalStream!',\n this.originalStream.id,\n userMediaStream.id\n );\n if (this.originalStream.id !== userMediaStream.id) {\n this.stopOriginalStream();\n }\n this.terminate();\n }\n this.originalStream = userMediaStream;\n this.canvas = document.createElement('canvas');\n this.canvas.id = 'eyeson-vbg-stream';\n this.ctx = this.canvas.getContext('2d', { desynchronized: true });\n this.ctx.imageSmoothingEnabled = false;\n this.size.width = trackSettings.width;\n this.size.height = trackSettings.height;\n this.canvas.width = trackSettings.width;\n this.canvas.height = trackSettings.height;\n const canvasStream = this.canvas.captureStream(_frameRate);\n const [canvasTrack] = canvasStream.getVideoTracks();\n if (!canvasTrack.canvas) {\n canvasTrack.type = 'canvas-track';\n canvasTrack.canvas = this.canvas;\n }\n const settings = {};\n if (typeof canvasTrack.getSettings === 'function') {\n Object.assign(settings, canvasTrack.getSettings());\n }\n Object.assign(settings, trackSettings);\n canvasTrack.getSettings = () => settings;\n canvasTrack.srcLabel = videoTrack.label;\n canvasTrack.srcDeviceId = trackSettings.deviceId;\n this.outStream = new MediaStream([canvasTrack]);\n userMediaStream\n .getAudioTracks()\n .forEach(track => this.outStream.addTrack(track));\n this.start();\n return this.outStream;\n }\n\n start() {\n Logger.info('VirtualBackgroundMixer::start', this.name);\n let canvas = null;\n let video = null;\n const { width, height } = this.size;\n if (!width || !height) {\n Logger.warn(\n 'VirtualBackgroundMixer::start 0 width or height',\n this.name,\n width,\n height\n );\n return;\n }\n if (TrackProcessorSupport) {\n try {\n const [track] = this.originalStream.getVideoTracks();\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n this.reader = processor.readable.getReader();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!this.reader) {\n video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = this.originalStream;\n this.video = video;\n }\n this.segmentationMask = new ImageData(\n _segmentationModel.width,\n _segmentationModel.height\n );\n canvas = createOffscreenCanvas(\n _segmentationModel.width,\n _segmentationModel.height,\n { willReadFrequently: true }\n );\n this.segmentationMaskCanvas = canvas.canvas;\n this.segmentationMaskCtx = canvas.ctx;\n this.segmentationMaskCtx.imageSmoothingEnabled = false;\n if (video && !ImageBitmapSupport) {\n canvas = createOffscreenCanvas(width, height);\n this.videoCanvas = canvas.canvas;\n this.videoCtx = canvas.ctx;\n }\n this.abort = false;\n this.paused = false;\n this.blurInit = false;\n this.canvasBlur.reset();\n this.initBackground();\n if (this.reader) {\n Logger.info(\n 'VirtualBackgroundMixer::start::videoTrackProcessor',\n this.name\n );\n this.raf.requestAnimationFrame();\n } else {\n video.onloadeddata = () => {\n Logger.info(\n 'VirtualBackgroundMixer::start::video.loadeddata',\n this.name\n );\n this.raf.requestAnimationFrame();\n };\n this.playPromise = video.play();\n this.playPromise.catch(error => {\n Logger.error(\n 'VirtualBackgroundMixer::start::video.play',\n this.name,\n error\n );\n });\n }\n }\n\n // eslint-disable-next-line complexity\n async drawVideo() {\n let frame = null;\n if (this.abort) {\n return;\n }\n const {\n ctx,\n size,\n paused,\n segmentationMask,\n segmentationMaskCtx,\n segmentationMaskCanvas\n } = this;\n if (this.reader) {\n try {\n const { value } = await this.reader.read();\n if (value) {\n value.width = value.displayWidth;\n value.height = value.displayHeight;\n frame = value;\n }\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!_tfliteReady || paused) {\n ctx.drawImage(frame || this.video, 0, 0);\n } else {\n if (!frame) {\n if (ImageBitmapSupport) {\n try {\n frame = await createImageBitmap(this.video);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n } else {\n this.videoCtx.drawImage(this.video, 0, 0);\n frame = this.videoCanvas;\n }\n }\n if (this.abort) {\n return;\n }\n if (frame && frame.width > 0 && frame.height > 0) {\n segmentationMaskCtx.drawImage(\n frame,\n 0,\n 0,\n frame.width,\n frame.height,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const imageData = segmentationMaskCtx.getImageData(\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const { data } = imageData;\n const heap = _tflite.HEAPF32;\n const maskData = segmentationMask.data;\n const { pixelCount } = _segmentationModel;\n for (\n let heapIndex = 0, imgIndex = 0, index = 0, indexId = 0;\n index < pixelCount;\n index++\n ) {\n indexId = index * 3;\n heapIndex = _inputMemoryOffset + indexId;\n imgIndex = index * 4;\n heap[heapIndex] = data[imgIndex] / 255;\n heap[heapIndex + 1] = data[imgIndex + 1] / 255;\n heap[heapIndex + 2] = data[imgIndex + 2] / 255;\n }\n _tflite._runInference();\n for (\n let index = 0, indexOut = 0, person = 0.0;\n index < pixelCount;\n index++\n ) {\n person = heap[_outputMemoryOffset + index];\n // Sets only the alpha component of each pixel\n indexOut = index * 4;\n maskData[indexOut + 3] = 255 * person;\n }\n segmentationMaskCtx.putImageData(segmentationMask, 0, 0);\n ctx.globalCompositeOperation = 'copy';\n ctx.filter = 'blur(2px)';\n ctx.drawImage(\n segmentationMaskCanvas,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height,\n 0,\n 0,\n size.width,\n size.height\n );\n ctx.globalCompositeOperation = 'source-in';\n ctx.filter = 'none';\n ctx.drawImage(frame, 0, 0);\n if (this.backgroundType) {\n this.drawBackground(frame);\n }\n }\n }\n if (!paused && this.paused) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n if (frame && typeof frame.close === 'function') {\n frame.close();\n }\n if (!this.abort) {\n this.raf.requestAnimationFrame();\n }\n }\n\n suspend() {\n const { ctx } = this;\n this.paused = true;\n if (ctx) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n }\n\n resume() {\n this.paused = false;\n }\n\n drawBackground(frame) {\n const {\n backgroundType,\n ctx,\n blurCanvas,\n imageCanvas,\n backgroundValue,\n size\n } = this;\n if (!backgroundType || !ctx) {\n return;\n }\n ctx.globalCompositeOperation = 'destination-over';\n if (backgroundType === 'blur') {\n if (FeatureDetector.canvasBlurSupport()) {\n const length = Number(backgroundValue) * 2;\n const fullLength = length * 2;\n if (!this.blurInit) {\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n 0,\n 0,\n size.width + fullLength,\n size.height + fullLength\n );\n this.blurInit = true;\n }\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n length,\n length,\n size.width,\n size.height\n );\n blurCanvas.ctx.drawImage(imageCanvas.canvas, 0, 0);\n ctx.drawImage(\n blurCanvas.canvas,\n length,\n length,\n size.width,\n size.height,\n 0,\n 0,\n size.width,\n size.height\n );\n } else {\n const blurred = this.canvasBlur.run(frame, backgroundValue);\n ctx.drawImage(blurred, 0, 0);\n }\n } else if (backgroundType === 'color') {\n ctx.fillStyle = backgroundValue;\n ctx.fillRect(0, 0, size.width, size.height);\n } else if (imageCanvas) {\n ctx.drawImage(imageCanvas, 0, 0);\n } else {\n ctx.drawImage(frame, 0, 0);\n }\n }\n\n async initBackground() {\n const { backgroundType, backgroundValue } = this;\n const { width, height } = this.size;\n let done = false;\n if (!width || !height) {\n return;\n }\n if (backgroundType === 'eyeson') {\n this.imageCanvas = createGradientCanvas(width, height, {\n startX: 0,\n startY: 0,\n endX: width,\n endY: 50,\n color1: '#ff7676',\n color2: '#9e206c'\n });\n done = true;\n } else if (backgroundType === 'generali') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createGeneraliCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'image') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createImageCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'blur') {\n this.blurInit = false;\n createBlurCanvas(this, width, height, Number(backgroundValue));\n this.canvasBlur.reset();\n done = true;\n } else {\n this.imageCanvas = null;\n done = true;\n }\n if (done) {\n this.backgroundOld = {\n type: backgroundType,\n value: backgroundValue\n };\n }\n }\n\n setBackgroundFallback() {\n const { backgroundOld } = this;\n if (backgroundOld) {\n this.backgroundType = backgroundOld.type;\n this.backgroundValue = backgroundOld.value;\n } else {\n if (!this.imageCanvas) {\n const { width, height } = this.size;\n this.blurInit = false;\n createBlurCanvas(this, width, height, 8);\n }\n this.backgroundType = 'blur';\n this.backgroundValue = '8';\n }\n }\n\n changeBackground(type) {\n Logger.info('VirtualBackgroundMixer::changeBackground', this.name, type);\n if (typeof type !== 'string') {\n return;\n }\n const colon = type.indexOf(':');\n if (colon === -1) {\n this.backgroundType = type === 'off' ? null : type;\n this.backgroundValue = null;\n } else {\n this.backgroundType = type.substring(0, colon);\n this.backgroundValue = type.substring(colon + 1);\n }\n if (!this.abort) {\n this.initBackground();\n }\n }\n\n stop() {\n Logger.info('VirtualBackgroundMixer::stop', this.name);\n this.abort = true;\n if (this.raf) {\n this.raf.cancelAnimationFrame();\n }\n if (this.video) {\n const { video, playPromise } = this;\n if (playPromise && video) {\n playPromise.then(() => video.pause());\n }\n this.video.onloadeddata = null;\n this.video = null;\n this.playPromise = null;\n }\n if (this.reader) {\n this.reader = null;\n }\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.backgroundOld = null;\n this.imageCanvas = null;\n this.blurCanvas = null;\n this.canvasBlur.reset();\n }\n\n stopOriginalStream() {\n Logger.info(\n 'VirtualBackgroundMixer::stopOriginalStream',\n this.name,\n this.originalStream\n );\n this.stop();\n stopStream(this.originalStream);\n }\n\n terminate() {\n Logger.info('VirtualBackgroundMixer::terminate', this.name);\n this.stop();\n if (this.outStream) {\n getVbgTracks(this.outStream).forEach(track => {\n stopTrack(track);\n Logger.info(\n 'VirtualBackgroundMixer::terminate stop track',\n this.name,\n track\n );\n });\n }\n this.originalStream = null;\n this.outStream = null;\n this.canvas = null;\n this.ctx = null;\n this.video = null;\n }\n\n destroy() {\n Logger.info('VirtualBackgroundMixer::destroy', this.name);\n _stateChange.removeEventListener('change', this.handleStateChange);\n this.loadingListener.length = 0;\n this.canvasBlur = null;\n }\n}\n\nexport default VirtualBackgroundMixer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport eyesonOptions from './options.js';\nimport LocalStorage from './LocalStorage.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst changedDevices = (listA, listB) => {\n if (listA.length !== listB.length) {\n return true;\n }\n for (\n let deviceA = null, found = false, { length } = listA, index = 0;\n index < length;\n index++\n ) {\n deviceA = listA[index];\n found = listB.find(deviceB => {\n return (\n deviceA.deviceId === deviceB.deviceId &&\n deviceA.groupId === deviceB.groupId &&\n deviceA.label === deviceB.label &&\n deviceA.kind === deviceB.kind\n );\n });\n if (!found) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * eyeson Device Manager used to handle cameras, microphones and speakers.\n **/\nclass DeviceManager {\n /* eslint-disable max-statements */\n constructor(options) {\n this.sinkId = 'default';\n this.options = options || { audio: true, video: true, eco: false };\n this.stream = null;\n this.cameras = [];\n this.listeners = [];\n this.speakers = [];\n this.microphones = [];\n this.constraints = {};\n this.terminationInProgress = false;\n this.virtualBackground = new VirtualBackgroundMixer('DeviceManager');\n this.virtualBackgroundType = 'off';\n\n DeviceManager.getSinkId().then(sinkId => (this.sinkId = sinkId));\n\n this.setStream = this.setStream.bind(this);\n this.handleError = this.handleError.bind(this);\n this.verifyStream = this.verifyStream.bind(this);\n this.storeConstraints = this.storeConstraints.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.initiateVirtualBackground = this.initiateVirtualBackground.bind(this);\n }\n /* eslint-enable max-statements */\n\n static getDevices() {\n if (!('mediaDevices' in navigator)) {\n return Promise.resolve([]);\n }\n return navigator.mediaDevices.enumerateDevices().then(devices => {\n // hack for safari ios and desktop because they hide existing devices to avoid fingerprinting: https://webkit.org/blog/7763/a-closer-look-into-webrtc/\n if (\n devices.length === 2 &&\n devices.every(\n device => device.kind === 'audioinput' && device.deviceId === ''\n )\n ) {\n return [\n { deviceId: '', groupId: '', kind: 'audioinput', label: '' },\n { deviceId: '', groupId: '', kind: 'videoinput', label: '' }\n ];\n }\n return devices;\n });\n }\n\n /**\n * Get constraints for specified options { audio: true, video: true }\n * If a specific device is chosen it has to be stored in localStorage or will\n * be ignored.\n **/\n static getConstraints(optionsParam) {\n const options = optionsParam || { audio: true, video: true };\n return DeviceManager.getDevices()\n .then(devices => {\n return DeviceManager.determineConstraintsForDevices(devices, options);\n })\n .catch(error => {\n Logger.error('DeviceManager::getConstraints ', error);\n });\n }\n\n /* eslint-disable max-statements, complexity */\n static determineConstraintsForDevices(devices, options) {\n const constraints = LocalStorage.load('mediaConstraints', options);\n const stereo = FeatureDetector.canStereo() && !options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n\n if (!('video' in constraints)) {\n constraints.video = true;\n }\n if (!('audio' in constraints)) {\n constraints.audio = audioConstraints;\n }\n\n if (constraints.video.deviceId) {\n const videoDeviceId = constraints.video.deviceId.exact;\n if (!devices.find(device => device.deviceId === videoDeviceId)) {\n constraints.video = options.video;\n }\n }\n if (constraints.audio.deviceId) {\n const audioDeviceId = constraints.audio.deviceId.exact;\n if (!devices.find(device => device.deviceId === audioDeviceId)) {\n constraints.audio = options.audio ? audioConstraints : false;\n }\n }\n\n if (options.video === false && !options.eco) {\n constraints.video = false;\n }\n if (options.video === true && constraints.video === false) {\n constraints.video = true;\n }\n if (\n (options.audio === true && constraints.audio === false) ||\n constraints.audio === true\n ) {\n constraints.audio = audioConstraints;\n }\n if (\n constraints.audio &&\n constraints.audio.channelCount !== audioConstraints.channelCount\n ) {\n constraints.audio.channelCount = audioConstraints.channelCount;\n }\n\n // In case we don't have a videoinput device but specify\n // video: true, we get NotFoundError in FF & DevicesNotFoundError in\n // Chrome.\n if (devices.filter(device => device.kind === 'videoinput').length === 0) {\n constraints.video = false;\n }\n\n DeviceManager.applyLastUsedDevices(constraints, devices);\n DeviceManager.applyWidescreen(constraints);\n\n return constraints;\n }\n /* eslint-enable max-statements, complexity */\n\n static applyLastUsedDevices(constraints, devices) {\n const videoId = LocalStorage.load('videoId');\n const audioId = LocalStorage.load('audioId');\n if (\n constraints.video === true &&\n videoId &&\n devices.find(device => device.deviceId === videoId)\n ) {\n constraints.video = { deviceId: { exact: videoId } };\n }\n if (\n constraints.audio &&\n audioId &&\n devices.find(device => device.deviceId === audioId)\n ) {\n constraints.audio.deviceId = { exact: audioId };\n }\n }\n\n static applyWidescreen(constraints) {\n const { widescreen } = eyesonOptions;\n if (widescreen) {\n if (constraints.video === true) {\n constraints.video = {};\n }\n if (constraints.video) {\n Object.assign(constraints.video, { width: 640, height: 360 });\n }\n } else if (\n typeof constraints.video === 'object' &&\n ('width' in constraints.video || 'height' in constraints.video)\n ) {\n Reflect.deleteProperty(constraints.video, 'width');\n Reflect.deleteProperty(constraints.video, 'height');\n }\n }\n\n /**\n * For now we handle the mobile options and constraints completely separately.\n * That way we can address the facingMode constraint.\n **/\n static getMobileConstraints(options) {\n let constraints = Object.assign({ audio: true, video: true }, options);\n DeviceManager.applyWidescreen(constraints);\n return Promise.resolve(constraints);\n }\n\n /**\n * Get sinkId.\n **/\n static getSinkId() {\n let sinkId = LocalStorage.load('sinkId', '');\n return DeviceManager.getDevices().then(devices => {\n if (!devices.find(device => device.deviceId === sinkId)) {\n sinkId = 'default';\n }\n return sinkId;\n });\n }\n\n /**\n * Return available devices in a friendly format.\n **/\n static fetchDevices() {\n return DeviceManager.getDevices().then(devices => {\n const speakers = devices.filter(device => device.kind === 'audiooutput');\n if (\n speakers.length > 0 &&\n speakers.findIndex(speaker => speaker.deviceId === 'default') === -1\n ) {\n speakers.unshift({\n deviceId: 'default',\n kind: 'audiooutput',\n groupId: 'default',\n label: 'System default'\n });\n }\n return {\n cameras: devices.filter(device => device.kind === 'videoinput'),\n microphones: devices.filter(device => device.kind === 'audioinput'),\n speakers: speakers\n };\n });\n }\n\n static fetchInputDevices() {\n return DeviceManager.getDevices().then(devices => {\n return devices.filter(device => device.kind.includes('input'));\n });\n }\n\n async setVirtualBackgroundType(type) {\n if (!VirtualBackgroundMixer.isTypeAllowed(type)) {\n Logger.warn(\n 'DeviceManage::setVirtualBackgroundType type not allowed',\n type\n );\n return;\n }\n await VirtualBackgroundMixer.checkExternalImage(type);\n const wasOff = this.virtualBackgroundType === 'off';\n const willBeOff = type === 'off';\n this.virtualBackgroundType = type;\n this.virtualBackground.changeBackground(type);\n if (this.stream && ((wasOff && !willBeOff) || (!wasOff && willBeOff))) {\n this.update();\n }\n }\n\n static getStoredVirtualBackgroundType(isBlobAvailable) {\n const type = LocalStorage.load('virtualBackgroundType', 'off');\n if (type === 'image:blob') {\n return VirtualBackgroundMixer.getImageBlobOrFallback(isBlobAvailable);\n }\n return type;\n }\n\n loadLocalImageForVirtualBackground(callbackFN) {\n VirtualBackgroundMixer.loadLocalImage(error => {\n if (!error) {\n this.setVirtualBackgroundType('image:blob');\n }\n callbackFN(error);\n });\n }\n\n /**\n * Sets cameras, microphones, and speakers and starts a video stream\n * with supplied options.\n **/\n start() {\n this.watchForNewDevices();\n\n return DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .then(() => DeviceManager.getConstraints(this.options))\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n stopStream() {\n if (!this.stream) {\n return;\n }\n if (this.virtualBackground.originalStream) {\n this.virtualBackground.stopOriginalStream();\n this.virtualBackground.terminate();\n } else {\n stopStream(this.stream);\n }\n this.stream = null;\n }\n\n /**\n * Stop the media stream. Since we call getUserMedia on gotDevices we don't\n * have a stream in that case.\n **/\n stop() {\n this.stopStream();\n }\n\n terminate() {\n navigator.mediaDevices.ondevicechange = null;\n this.terminationInProgress = true;\n window.setTimeout(() => {\n this.stop();\n this.virtualBackground.destroy();\n }, 10);\n }\n\n setDevices(devices) {\n const camHasChanged = changedDevices(this.cameras, devices.cameras);\n const micHasChanged = changedDevices(this.microphones, devices.microphones);\n const speakerHasChanged = changedDevices(this.speakers, devices.speakers);\n this.cameras = devices.cameras;\n this.microphones = devices.microphones;\n this.speakers = devices.speakers;\n this.options.audio =\n this.microphones.length > 0 ? this.options.audio : false;\n this.options.video = this.cameras.length > 0 ? this.options.video : false;\n if (camHasChanged || micHasChanged || speakerHasChanged) {\n this.emit(devices);\n }\n }\n\n watchForNewDevices() {\n navigator.mediaDevices.ondevicechange = () => {\n DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .catch(this.handleError);\n };\n }\n\n /**\n * Register listeners for changes on devices.\n **/\n onChange(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * Remove a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * Wrapper around mediaDevices getUserMedia. Ensures a running stream is\n * stopped and a new one started with newly defined constraints.\n **/\n update(constraints) {\n this.constraints = constraints || this.constraints;\n this.stop();\n\n this.watchForNewDevices();\n\n return navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n /**\n * Similar to update but instead of directly supplying constraints,\n * update with options.\n **/\n updateWithOptions(options, isMobile = false) {\n this.options = options || this.options;\n this.stop();\n\n this.watchForNewDevices();\n\n const constraintsFn = isMobile ? 'getMobileConstraints' : 'getConstraints';\n return DeviceManager[constraintsFn](this.options)\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n stream.getAudioTracks()[0].enabled = this.options.audio;\n }\n return stream;\n }\n\n initiateVirtualBackground(stream) {\n if (\n this.virtualBackgroundType !== 'off' &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return this.virtualBackground.initiateStream(stream);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n storeConstraints() {\n const { constraints } = this;\n const { video, audio } = constraints;\n Logger.debug('DeviceManager::storeConstraints', constraints);\n LocalStorage.store('mediaConstraints', constraints);\n LocalStorage.store('sinkId', this.sinkId);\n LocalStorage.store('virtualBackgroundType', this.virtualBackgroundType);\n if (video && video.deviceId && video.deviceId.exact) {\n LocalStorage.store('videoId', video.deviceId.exact);\n }\n if (audio && audio.deviceId && audio.deviceId.exact) {\n LocalStorage.store('audioId', audio.deviceId.exact);\n }\n this.virtualBackground.updateCache(this.virtualBackgroundType);\n }\n\n /**\n * Set active stream.\n *\n * NOTE: This can be called _after_ we have already stopped.\n **/\n // eslint-disable-next-line max-statements\n setStream(stream) {\n const firstRun = this.stream === null;\n this.stream = stream;\n if (this.terminationInProgress) {\n this.stop();\n return Promise.resolve();\n }\n const emitStreamUpdate = () => {\n this.emit({\n stream: this.stream,\n constraints: this.constraints,\n options: this.options\n });\n this.verifyStream();\n };\n if (firstRun) {\n return DeviceManager.fetchDevices().then(devices => {\n this.setDevices(devices);\n emitStreamUpdate();\n });\n }\n emitStreamUpdate();\n return Promise.resolve();\n }\n\n verifyStream() {\n if (\n this.constraints.video &&\n this.stream &&\n this.stream.getVideoTracks().length === 0 &&\n !this.options.eco\n ) {\n this.handleError({ name: 'EyesonCameraError' });\n }\n\n if (\n this.constraints.audio &&\n this.stream &&\n this.stream.getAudioTracks().length === 0\n ) {\n this.handleError({ name: 'EyesonMicrophoneError' });\n }\n }\n\n /**\n * Set video input selection.\n **/\n setVideoInput(deviceId) {\n let videoConstraints = {};\n Object.assign(videoConstraints, this.constraints.video, {\n deviceId: { exact: deviceId }\n });\n this.constraints.video = videoConstraints;\n return this.update();\n }\n\n /**\n * Set audio input selection.\n **/\n setAudioInput(deviceId, options = {}) {\n let audioConstraints = {};\n Object.assign(audioConstraints, this.constraints.audio, {\n deviceId: { exact: deviceId }\n });\n this.constraints.audio = audioConstraints;\n if (options.preventUpdate === true) {\n return Promise.resolve();\n }\n return this.update();\n }\n\n /**\n * Set and store audio output selection.\n **/\n setAudioOutput(sinkId) {\n this.sinkId = sinkId || 'default';\n LocalStorage.store('sinkId', this.sinkId);\n this.emit({ sinkId: this.sinkId });\n }\n\n handleError(error) {\n Logger.error('DeviceManager::', error);\n this.emit({ error: error, constraints: this.constraints });\n }\n\n /**\n * emit bound listeners about changes.\n **/\n emit(state) {\n this.listeners.forEach(listener => listener(state));\n }\n}\n\nexport default DeviceManager;\n/* eslint-enable max-lines */\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport NinjaStream from './NinjaStream.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport {\n stopTrack,\n captureStream,\n isCanvasPresentationStream,\n isScreenStream,\n isScreenPresentationStream,\n getScreenTracks,\n getScreenPresentationTracks,\n getCanvasTracks,\n getCameraTracks,\n toggleAudio,\n stopStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Options are basically what the user of MediaStreamBuilder \"wants\" to see in\n * the conference session. For example: no camera video -> options video: false\n * but we'd still have a media stream track with video because conference server\n * currently expects this behaviour and relies on mute_video command being\n * sent.\n **/\nclass MediaStreamBuilder {\n constructor(\n options = {\n eco: false,\n audio: true,\n video: true,\n screen: false,\n surface: null,\n screenStream: null,\n canvas: null,\n existingStream: null,\n micMixer: null,\n vbgMixer: null,\n isPresentation: false,\n virtualBackground: false,\n deviceMonitor: null\n }\n ) {\n this.options = options;\n this.tempStream = null;\n this.brokenTrackCallback = null;\n this.bindMethods();\n }\n\n bindMethods() {\n this.getMediaStream = this.getMediaStream.bind(this);\n this.addNinjaTrack = this.addNinjaTrack.bind(this);\n this.addCanvasTrack = this.addCanvasTrack.bind(this);\n this.addScreenTrack = this.addScreenTrack.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.adjustVideoTrack = this.adjustVideoTrack.bind(this);\n this.addScreenStreamTrack = this.addScreenStreamTrack.bind(this);\n this.initializeVirtualBackground =\n this.initializeVirtualBackground.bind(this);\n }\n\n /**\n * We always acquire a stream with at least audio enabled and adjust\n * the desired mute behaviour via the track.\n * Unless, we have no camera and microphones. In that case we use a\n * NinjaStream.\n * If the browser does not support updating the peerConnection\n * we acquire a audio and video stream and adjust the tracks accordingly.\n *\n * In case of replaceTrack support we stop the tracks before\n * acquiring a new stream. Since stopping a track also stops the source.\n * So, at least in Safari we'd stop the camera if the old and new track\n * use the same source.\n * Furthermore Safari on iOS behaves differently again. Camera muting\n * _sometimes_ freezes the remote stream video playback (audio fine).\n **/\n start() {\n Logger.debug('MediaStreamBuilder::start', this.options);\n const {\n existingStream,\n video,\n audio,\n screen,\n canvas,\n micMixer,\n screenStream\n } = this.options;\n if (\n FeatureDetector.isIOSDevice() &&\n existingStream &&\n typeof video === 'boolean' &&\n existingStream.active &&\n getCameraTracks(existingStream).length > 0 &&\n getCameraTracks(existingStream)[0].readyState !== 'ended'\n ) {\n // eslint-disable-next-line max-statements\n return new Promise(resolve => {\n const [vTrack] = getCameraTracks(existingStream);\n vTrack.enabled = video;\n vTrack.onended =\n video && this.brokenTrackCallback\n ? () => {\n Logger.error('iOS video track broken');\n existingStream.getTracks().forEach(track => track.stop());\n this.brokenTrackCallback();\n }\n : null;\n if (typeof audio === 'boolean') {\n toggleAudio(existingStream, audio);\n }\n if (canvas) {\n const newStream = new MediaStream(existingStream.getTracks());\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n newStream.addTrack(canvasTrack);\n resolve(newStream);\n return;\n }\n resolve(existingStream);\n });\n }\n\n if (FeatureDetector.isSafari() && screen && micMixer && !canvas) {\n return (\n screenStream ? Promise.resolve(screenStream) : this.getDisplayMedia()\n )\n .then(displayStream => {\n return DeviceManager.getConstraints().then(constraints => {\n const stream = new MediaStream();\n this.addScreenStreamTrack(stream, displayStream);\n this.tempStream = new MediaStream(displayStream.getTracks());\n return navigator.mediaDevices\n .getUserMedia({ audio: constraints.audio })\n .then(audioStream => {\n this.adjustAudioTrack(audioStream);\n audioStream\n .getTracks()\n .forEach(track => this.tempStream.addTrack(track));\n micMixer.mixScreenshareAudio(\n audioStream,\n displayStream,\n stream\n );\n if (micMixer.active) {\n micMixer.setMicOnlyStream(audioStream, displayStream);\n }\n return stream;\n });\n });\n })\n .then(stream => {\n this.tempStream = null;\n return stream;\n })\n .catch(error => {\n if (this.tempStream) {\n stopStream(this.tempStream);\n this.tempStream = null;\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n return DeviceManager.fetchInputDevices()\n .then(this.getMediaStream)\n .then(this.adjustVideoTrack)\n .then(this.adjustAudioTrack)\n .then(this.initializeVirtualBackground)\n .then(this.addCanvasTrack)\n .then(this.addScreenTrack)\n .then(this.addNinjaTrack)\n .then(stream => {\n this.tempStream = null;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.applyTempTracks();\n }\n return stream;\n })\n .catch(error => {\n this.cleanupTempStream();\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.discardTempTracks();\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n // eslint-disable-next-line max-statements\n getMediaStream(devices) {\n if (devices.length === 0) {\n this.options = { audio: false, video: false };\n this.tempStream = new NinjaStream().stream;\n return this.tempStream;\n }\n const { eco, video, existingStream } = this.options;\n const options = {\n video: FeatureDetector.hasCanvasCaptureSupport() || eco ? video : true,\n audio: true\n };\n if (video === false && !eco && FeatureDetector.isIOSDevice()) {\n options.video = true;\n }\n let { getConstraints } = DeviceManager;\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n stopStream(existingStream);\n }\n if (FeatureDetector.isPhone() || FeatureDetector.isIOSDevice()) {\n stopStream(existingStream);\n getConstraints = DeviceManager.getMobileConstraints;\n }\n return getConstraints(options).then(constraints => {\n return navigator.mediaDevices.getUserMedia(constraints).then(stream => {\n this.tempStream = stream;\n return stream;\n });\n });\n }\n\n /**\n * Adjust audio and video tracks according to the supplied options.\n * We stop the video track so the camera indicator isn't active.\n * We add a filler video track, unless we're in eco mode, which would result\n * in sdp with media section for video & recvonly. meaning we'd still\n * receive video.\n * In case of iOS we have the cam track that shouldn't get stopped to get turned\n * on again\n **/\n adjustVideoTrack(stream) {\n if (stream.getVideoTracks().length === 1) {\n const [vTrack] = stream.getVideoTracks();\n vTrack.enabled = this.options.video;\n if (this.options.video === false && !FeatureDetector.isIOSDevice()) {\n stopTrack(vTrack);\n }\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addVideoTrack(vTrack);\n }\n }\n return stream;\n }\n\n initializeVirtualBackground(stream) {\n const { screen, virtualBackground, vbgMixer } = this.options;\n if (\n !screen &&\n virtualBackground &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return vbgMixer.initiateStream(stream);\n }\n return stream;\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n const [aTrack] = stream.getAudioTracks();\n aTrack.enabled = this.options.audio;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addAudioTrack(aTrack);\n }\n }\n return stream;\n }\n\n addCanvasTrack(stream) {\n const { canvas, existingStream } = this.options;\n if (canvas) {\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n stream.addTrack(canvasTrack);\n }\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n stream.addTrack(canvasTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n async addScreenTrack(stream) {\n let { screenStream } = this.options;\n const { screen, existingStream, micMixer } = this.options;\n if (screen && micMixer) {\n if (screenStream === null || typeof screenStream === 'undefined') {\n screenStream = await this.getDisplayMedia();\n }\n const outStream = new MediaStream();\n this.addScreenStreamTrack(outStream, screenStream);\n micMixer.mixScreenshareAudio(stream, screenStream, outStream);\n if (micMixer.active) {\n micMixer.setMicOnlyStream(stream, screenStream);\n }\n this.tempStream = new MediaStream(\n stream.getTracks().concat(screenStream.getTracks())\n );\n return outStream;\n }\n // this is crazy! for now, we loose screen audio if there was any\n if (isScreenPresentationStream(existingStream)) {\n const [screenTrack] = getScreenPresentationTracks(existingStream);\n stream.addTrack(screenTrack);\n }\n return stream;\n }\n\n addScreenStreamTrack(stream, screenStream) {\n const [screenTrack] = screenStream.getVideoTracks();\n // options required for SAFARI\n screenTrack.type = this.options.isPresentation\n ? 'screen-track'\n : 'screen-video-track';\n if (stream) {\n stream.addTrack(screenTrack);\n }\n }\n\n getDisplayMedia() {\n if (FeatureDetector.hasGetDisplayMedia()) {\n const stereo = FeatureDetector.canStereo() && !this.options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n const videoConstraints = {\n // removed width constraint due to safari bug drawing a green line\n // width: { max: 1920 },\n height: { max: 1080 },\n frameRate: { max: 15 }\n };\n if (FeatureDetector.isChrome() && FeatureDetector.isMacOS()) {\n // disable audio processing to prevent down-mixing\n // unfortunately audio on entire screen (not supported on Mac) causes echo!\n audioConstraints.echoCancellation = false;\n }\n if (this.options.surface && FeatureDetector.canChooseDisplaySurface()) {\n videoConstraints.displaySurface = this.options.surface;\n }\n return navigator.mediaDevices.getDisplayMedia({\n audio: audioConstraints,\n video: videoConstraints,\n surfaceSwitching: 'include',\n selfBrowserSurface: 'include',\n systemAudio: 'include'\n });\n }\n return navigator.mediaDevices.getUserMedia({\n video: {\n mediaSource: 'screen',\n width: { max: 1920 },\n height: { max: 1040 },\n frameRate: { max: 15 }\n }\n });\n }\n\n addNinjaTrack(stream) {\n const { eco, video } = this.options;\n if (eco || !FeatureDetector.hasCanvasCaptureSupport()) {\n return stream;\n }\n if (stream.getVideoTracks().length === 0) {\n const [fillerTrack] = new NinjaStream().stream.getVideoTracks();\n fillerTrack.enabled = video;\n stream.addTrack(fillerTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n cleanupTempStream() {\n let { tempStream } = this;\n if (!tempStream) {\n return;\n }\n const { existingStream, screenStream } = this.options;\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n tempStream.removeTrack(canvasTrack);\n }\n if (isScreenStream(existingStream)) {\n const [screenTrack] = getScreenTracks(existingStream);\n tempStream.removeTrack(screenTrack);\n }\n if (isScreenPresentationStream(screenStream)) {\n const [screenTrack] = getScreenPresentationTracks(screenStream);\n tempStream.removeTrack(screenTrack);\n }\n stopStream(tempStream);\n this.tempStream = null;\n }\n\n onBrokenTrackError(callback) {\n this.brokenTrackCallback = callback;\n return this;\n }\n}\n\nexport default MediaStreamBuilder;\n","import Logger from './Logger.js';\nimport { stopStream, stopTrack } from './utils/StreamHelpers.js';\n\nclass MicMixer {\n constructor() {\n this.active = false;\n this.audioContext = null;\n this.acOut = null;\n this.micOnlyStream = null;\n this.originalStream = null;\n }\n\n setMicOnlyStream(audioStream, videoStream) {\n this.micOnlyStream = new MediaStream();\n const audioTracks = audioStream.getAudioTracks();\n const videoTracks = videoStream.getVideoTracks();\n if (audioTracks.length > 0) {\n this.micOnlyStream.addTrack(audioTracks[0]);\n }\n if (videoTracks.length > 0) {\n this.micOnlyStream.addTrack(videoTracks[0]);\n }\n return this.micOnlyStream;\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n getOriginalStream() {\n return this.originalStream;\n }\n\n stopOriginalStream() {\n stopStream(this.originalStream);\n }\n\n noMix(userMediaStream, outStream) {\n const audioTracks = userMediaStream.getAudioTracks();\n if (audioTracks.length > 0) {\n outStream.addTrack(audioTracks[0]);\n }\n }\n\n initMixScreenshareMix(userMediaStream, displayStream, outStream) {\n this.audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n this.acOut = this.audioContext.createMediaStreamDestination();\n this.audioContext\n .createMediaStreamSource(displayStream)\n .connect(this.acOut);\n this.audioContext\n .createMediaStreamSource(userMediaStream)\n .connect(this.acOut);\n outStream.addTrack(this.acOut.stream.getAudioTracks()[0]);\n }\n\n mixScreenshareAudio(userMediaStream, displayStream, outStream) {\n this.originalStream = displayStream;\n const displayAudio = displayStream.getAudioTracks();\n if (displayAudio.length === 0) {\n this.noMix(userMediaStream, outStream);\n } else {\n try {\n this.initMixScreenshareMix(userMediaStream, displayStream, outStream);\n this.active = true;\n } catch (exc) {\n Logger.error('MicMixer::mixScreenshareAudio', exc);\n stopTrack(displayAudio[0]);\n this.noMix(userMediaStream, outStream);\n }\n }\n }\n\n destroy() {\n this.stopOriginalStream();\n this.micOnlyStream = null;\n this.originalStream = null;\n if (this.audioContext) {\n stopStream(this.acOut.stream);\n this.audioContext.close().then(() => {\n this.audioContext = null;\n this.acOut = null;\n this.active = false;\n });\n return;\n }\n this.active = false;\n }\n}\n\nexport default MicMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst adjustMediaStreamTracks = (stream, audio, video) => {\n stream.getAudioTracks().forEach(track => (track.enabled = audio));\n stream.getVideoTracks().forEach(track => (track.enabled = video));\n};\n\n/**\n * ChangeLocalStream (optimization after PodiumEvent).\n **/\nclass ChangeLocalStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio, video, screen = false, surface }) {\n Logger.debug('ChangeLocalStreamEvent::handle');\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream, vbgMixer } = _session;\n const wasScreenAsVideo = Boolean(_session.micMixer);\n\n if (\n FeatureDetector.isIOSDevice() ||\n (FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !wasScreenAsVideo &&\n !localStream.wasScreenAsVideo)\n ) {\n if (vbgMixer) {\n if (video) {\n vbgMixer.resume();\n } else {\n vbgMixer.suspend();\n }\n if (\n vbgMixer.originalStream &&\n vbgMixer.originalStream !== localStream\n ) {\n adjustMediaStreamTracks(vbgMixer.originalStream, audio, video);\n }\n }\n adjustMediaStreamTracks(localStream, audio, video);\n localStream.locallyChanged = true;\n _session.emit({ type: 'stream_update', localStream });\n return;\n }\n\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n }\n\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n\n new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(stream => {\n stream.locallyChanged = true;\n stream.wasScreenAsVideo = wasScreenAsVideo;\n _session.setStream(stream);\n })\n .catch(error => {\n Logger.error('ChangeLocalStreamEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n _session.emit({ type: 'stop_screen_video' });\n }\n });\n }\n}\n\nexport default ChangeLocalStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport ForwardEvent from './ForwardEvent.js';\nimport ChangeLocalStreamEvent from './ChangeLocalStreamEvent.js';\nimport {\n isPresentationStream,\n isCameraStream,\n isVBGStream,\n hasAudio,\n hasVideo\n} from './../utils/StreamHelpers.js';\n\nclass PodiumEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n // For dev\n Logger.debug('PodiumEvent::handle', msg);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream } = _session;\n\n if (\n !msg.hasPresenter &&\n isPresentationStream(localStream) &&\n !_session.stopPresentingSet\n ) {\n _session.emit({ type: 'stop_presenting' });\n }\n\n if (_session && !_session.externalStream) {\n this.scanMessageForLocalStreamOptimization(localStream, msg);\n }\n\n new ForwardEvent(this.context).handle(msg);\n }\n\n // Optimization to avoid streaming when not on video podium.\n // First, we need a localStream, then we avoid adjustments when we initially\n // join the room (isSource) and finally if we're not on the podium,\n // but have a local camera stream with video, we change our local stream.\n //\n // We only re-activate the camera in the opposite case if the current\n // localStream was locallyChanged (through this optimization) since we\n // want to avoid situations where a user doesn't expect to be on the video\n // podium and we suddenly turned on their camera.\n //\n // Last case: someone else is presenting (screen share or canvas presentation)\n // we're still on the video podium but not actively presenting.\n // eslint-disable-next-line max-statements\n scanMessageForLocalStreamOptimization(localStream, msg) {\n const { video, isSource, isPresenter, hasPresenter, hasDesktopSources } =\n msg;\n\n if (!localStream) {\n return;\n }\n\n if (\n isSource &&\n ((!video && (isCameraStream(localStream) || isVBGStream(localStream))) ||\n (video &&\n !hasVideo(localStream) &&\n localStream.locallyChanged &&\n !hasPresenter))\n ) {\n const options = {\n audio: hasAudio(localStream),\n video: video\n };\n if (localStream.wasScreenAsVideo) {\n options.video = false;\n options.screen = true;\n }\n new ChangeLocalStreamEvent(this.context).handle(options);\n }\n\n if (video && !isPresenter && hasDesktopSources) {\n new ChangeLocalStreamEvent(this.context).handle({\n audio: hasAudio(localStream),\n video: false\n });\n }\n }\n}\n\nexport default PodiumEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SnapshotEvent extends BaseEvent {\n handle() {\n this.context._api.takeSnapshot();\n }\n}\n\nexport default SnapshotEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayerEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayer(msg.params);\n }\n}\n\nexport default SetLayerEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SendChatEvent extends BaseEvent {\n handle(msg) {\n if (!this.context._session) {\n throw new Error('Session does not exist');\n }\n this.context._session.send({\n type: 'chat',\n content: msg.content\n });\n }\n}\n\nexport default SendChatEvent;\n","import Logger from '../Logger';\nimport PublicEvent from './PublicEvent';\n\nclass StopRtmpEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopBroadcast('generic')\n .then(() => super.handle({ type: msg.type }))\n .catch(error => Logger.warn(error));\n }\n}\n\nexport default StopRtmpEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayoutEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayout(msg.params);\n }\n}\n\nexport default SetLayoutEvent;\n","import BaseEvent from './BaseEvent';\n\nconst fixUrlEnd = url => {\n if (!url.endsWith('/')) {\n return url + '/';\n }\n return url;\n};\n\nclass StartRtmpEvent extends BaseEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n const streamUrl = fixUrlEnd(msg.url) + msg.key;\n _api.startBroadcast({ streamUrl }, 'generic').catch(error => {\n _session.emit({\n type: 'start_broadcast_error',\n platform: 'generic',\n error: error\n });\n });\n }\n}\n\nexport default StartRtmpEvent;\n","const EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nclass EventEmitter {\n constructor() {\n this.listeners = new Map();\n this.target = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\n }\n\n onEvent(cb) {\n const fn = ({ detail }) => cb(detail);\n this.target.addEventListener('event', fn);\n this.listeners.set(cb, fn);\n }\n\n offEvent(cb) {\n const fn = this.listeners.get(cb);\n if (fn) {\n this.target.removeEventListener('event', fn);\n this.listeners.delete(cb);\n }\n }\n\n removeAllListeners() {\n const { listeners, target } = this;\n listeners.forEach(fn => target.removeEventListener('event', fn));\n listeners.clear();\n }\n\n emit(data) {\n const event = new CustomEvent('event', { detail: data });\n this.target.dispatchEvent(event);\n }\n}\n\nexport default EventEmitter;\n","import EventEmitter from './eventEmitter.js';\n\nclass Transport extends EventEmitter {\n constructor(options) {\n super();\n this.connection = null;\n this.options = options;\n this.wasOpen = false;\n }\n\n connect() {\n const { options } = this;\n this.wasOpen = false;\n const connection = new WebSocket(\n `${options.endpoint}?auth_token=${options.auth_token}`\n );\n connection.onopen = () => {\n this.wasOpen = true;\n this.emit({ type: 'connected' });\n };\n connection.onmessage = ({ data }) => {\n this.emit({ type: 'message', message: data });\n };\n connection.onerror = () => {\n this.emit({ type: 'transportError' });\n };\n connection.onclose = () => {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event\n this.destroy();\n };\n this.connection = connection;\n }\n\n isConnected() {\n const { connection } = this;\n if (connection) {\n return connection.readyState === WebSocket.OPEN;\n }\n return false;\n }\n\n send(message) {\n const { connection } = this;\n if (!connection) {\n return false;\n }\n connection.send(message);\n return true;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { connection, wasOpen } = this;\n if (connection) {\n this.connection = null;\n connection.onopen = null;\n connection.onmessage = null;\n connection.onerror = null;\n connection.onclose = null;\n if (connection.readyState <= WebSocket.OPEN) {\n connection.close();\n }\n this.emit({ type: 'disconnected', was_open: wasOpen });\n }\n this.removeAllListeners();\n }\n}\n\nexport default Transport;\n","// https://github.com/bluelovers/ws-string/blob/master/packages/crlf-normalize/src/index.ts\nconst R_CRLF = /\\r\\n|\\r(?!\\n)|\\n/g;\nconst CRLF = '\\r\\n';\nconst crlfNormalize = text => text.replace(R_CRLF, CRLF);\n\nexport default crlfNormalize;\n","// https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library\nconst parseJwtPayload = token => {\n try {\n return JSON.parse(atob(token.split('.')[1]));\n } catch (error) {\n return false;\n }\n};\n\nexport default parseJwtPayload;\n","const supportsRandomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function';\n\nconst uuid = () => {\n if (supportsRandomUUID) {\n return crypto.randomUUID();\n }\n let index = 0;\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, char => {\n const byte = bytes[index];\n index += 1;\n // eslint-disable-next-line no-bitwise\n return (char ^ (byte & (15 >> (char / 4)))).toString(16);\n });\n};\n\nexport default uuid;\n","/* eslint-disable max-lines */\nimport EventEmitter from './eventEmitter.js';\nimport Transport from './Transport.js';\nimport crlfNormalize from './crlfNormalize.js';\nimport parseJwtPayload from './parseJwtPayload.js';\nimport uuid from './uuid.js';\n\nconst checkUserAgentOptions = (options = {}) => {\n let failed = '';\n [\n 'client_id',\n 'conf_id',\n 'client_name',\n 'sessionDescriptionHandlerFactory',\n 'transportOptions'\n ].some(key => {\n if (!options[key]) {\n failed = key;\n return false;\n }\n return true;\n });\n if (!failed) {\n ['auth_token', 'endpoint'].some(key => {\n if (!options.transportOptions[key]) {\n failed = `transportOptions.${key}`;\n return false;\n }\n return true;\n });\n }\n if (failed) {\n throw new Error(`Invalid options - ${failed}`);\n }\n};\n\nconst slowdown = (fn, ms, ctx) => {\n const stack = [];\n let wait = false;\n const cb = (...args) => {\n if (wait) {\n stack.push(args);\n return;\n }\n wait = true;\n setTimeout(() => {\n wait = false;\n if (stack.length > 0) {\n const nextArgs = stack.shift();\n Reflect.apply(cb, null, nextArgs);\n }\n }, ms);\n Reflect.apply(fn, ctx, args);\n };\n return cb;\n};\n\nclass UserAgent extends EventEmitter {\n constructor(options) {\n super();\n checkUserAgentOptions(options);\n this.callId = null;\n this.sessionDescriptionHandler = null;\n this.options = options;\n this.initAuthToken();\n this.debouncedHandleSDPUpdate = slowdown(this.handleSdpUpdate, 250, this);\n }\n\n // eslint-disable-next-line max-statements\n async onMessage(message) {\n const obj = JSON.parse(message);\n const { type, data } = obj;\n this.verifySender(obj);\n if (type === 'call_accepted') {\n this.setCallId(data.call_id);\n await this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'accepted' });\n } else if (type === 'call_resumed') {\n this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'resumed' });\n } else if (type === 'call_rejected') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'reject',\n code: data.reject_code\n });\n this.terminate();\n } else if (type === 'call_terminated') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'bye',\n code: data.term_code\n });\n this.terminate();\n } else if (type === 'sdp_update') {\n this.debouncedHandleSDPUpdate(data);\n } else {\n data.type = type;\n this.emit({ type: 'message', data });\n }\n }\n\n initAuthToken() {\n const { options } = this;\n const jwt = parseJwtPayload(options.transportOptions.auth_token);\n if (\n jwt === false ||\n jwt.client_id !== options.client_id ||\n jwt.conf_id !== options.conf_id ||\n !jwt.exp\n ) {\n throw new Error('Invalid auth token');\n }\n }\n\n setCallId(callId) {\n this.callId = callId;\n }\n\n verifySender(message) {\n const { options } = this;\n if (\n !(message.from === options.conf_id && message.to === options.client_id)\n ) {\n // throw new Error('Invalid message sender');\n // eslint-disable-next-line no-console\n console.error(new Error('Invalid message sender', message));\n }\n }\n\n async handleSdpUpdate(data) {\n const { callId } = this;\n const { sdp } = data;\n if (!callId || callId !== data.call_id) {\n throw new Error('Invalid call id');\n }\n this.emit({ type: 'sdp_update', sdp });\n const answerSdp = await this.sessionDescriptionHandler.updateDescription(\n sdp\n );\n if (sdp.type === 'offer' && answerSdp) {\n const desc = {\n type: answerSdp.type,\n sdp: crlfNormalize(answerSdp.sdp)\n };\n this.message('sdp_update', {\n call_id: callId,\n sdp: desc\n });\n }\n }\n\n message(type = 'message', data = {}) {\n const { options } = this;\n const message = JSON.stringify({\n type,\n msg_id: uuid(),\n from: options.client_id,\n to: options.conf_id,\n data\n });\n this.transport.send(message);\n }\n\n connect() {\n const { options } = this;\n const transport = new Transport(options.transportOptions);\n this.transport = transport;\n this.termination = false;\n this.emit({ type: 'transportCreated', transport });\n transport.onEvent(event => {\n const { type } = event;\n if (type === 'connected') {\n if (!this.sessionDescriptionHandler) {\n this.sessionDescriptionHandler =\n options.sessionDescriptionHandlerFactory(\n options.sessionDescriptionHandlerFactoryOptions\n );\n this.emit({ type: 'registered' });\n }\n } else if (type === 'message') {\n this.onMessage(event.message);\n } else if (type === 'disconnected') {\n if (!this.termination) {\n this.emit({\n type: 'terminated',\n reason: 'disconnect',\n code: event.was_open ? 0 : -1\n });\n }\n }\n });\n transport.connect();\n }\n\n // eslint-disable-next-line max-statements\n async call() {\n const { sessionDescriptionHandler, options } = this;\n if (!sessionDescriptionHandler) {\n throw new Error('Invalid sessionDescriptionHandler');\n }\n const description = await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_start', {\n sdp: desc,\n display_name: options.client_name,\n mute_video: options.mute_video\n });\n }\n\n resume(authToken) {\n if (!this.callId) {\n throw new Error('Session was already closed');\n }\n this.options.transportOptions.auth_token = authToken;\n try {\n this.initAuthToken();\n } catch (error) {\n this.emit({ type: 'terminated', reason: 'disconnect', code: -1 });\n return;\n }\n const onReconnect = seppEvent => {\n if (seppEvent.type === 'transportCreated') {\n this.offEvent(onReconnect);\n // eslint-disable-next-line max-statements\n this.transport.onEvent(async transportEvent => {\n if (transportEvent.type === 'connected') {\n const { transport, sessionDescriptionHandler } = this;\n if (!this.callId) {\n transport.destroy();\n throw new Error('Session was already closed');\n }\n try {\n const description =\n await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_resume', {\n call_id: this.callId,\n sdp: desc\n });\n } catch (error) {\n transport.destroy();\n throw new Error('Unable to reconnect');\n }\n }\n });\n }\n };\n this.onEvent(onReconnect);\n this.connect();\n }\n\n // eslint-disable-next-line max-statements\n terminate() {\n const { sessionDescriptionHandler, transport, callId } = this;\n this.callId = null;\n if (sessionDescriptionHandler) {\n sessionDescriptionHandler.close();\n }\n if (transport) {\n if (transport.isConnected() && callId) {\n this.termination = true;\n this.message('call_terminate', {\n call_id: callId,\n term_code: 0\n });\n this.emit({ type: 'terminated', reason: 'terminate', code: 0 });\n }\n this.transport = null;\n transport.destroy();\n }\n }\n}\n\nexport default { UserAgent };\n","/**\n * This is where we keep the list of sip events we're interested in forwarding.\n **/\nexport default [\n 'chat',\n 'recording',\n 'memberlist',\n 'source_update',\n 'voice_activity'\n];\n","/**\n * Podium Facade.\n **/\nclass PodiumFacade {\n constructor(message, clientId) {\n const { src = [], psrc, asrc, vsrc, dsrc, dims } = message;\n this.clientId = clientId;\n this.sources = src;\n this.presenterIdx = psrc;\n this.audioSources = asrc;\n this.videoSources = vsrc;\n this.desktopSources = dsrc;\n this.dimensions = dims;\n this.userSourceIndex = src.indexOf(clientId);\n }\n\n get isSolo() {\n const uniqueSources = Array.from(new Set(this.sources));\n return uniqueSources.length === 1 && this.sources[0] === this.clientId;\n }\n\n get isSource() {\n return this.sources.includes(this.clientId);\n }\n\n get isPresenter() {\n return this.hasPresenter && this.presenter === this.clientId;\n }\n\n get presenter() {\n return this.hasPresenter && this.sources[this.presenterIdx];\n }\n\n get hasMedia() {\n return this.sources.some(source => /media/.test(source));\n }\n\n get hasPresenter() {\n return Number.isInteger(this.presenterIdx) && this.presenterIdx > -1;\n }\n\n get hasVideoSources() {\n return Boolean(this.videoSources);\n }\n\n get hasDesktopSources() {\n return Number.isInteger(this.desktopSources) && this.desktopSources > -1;\n }\n\n get hasAudioPosition() {\n return this.audioSources.includes(this.userSourceIndex);\n }\n\n get hasVideoPosition() {\n return this.videoSources.includes(this.userSourceIndex);\n }\n\n get hasMutedVideoPeers() {\n return (\n !this.hasDesktopSources &&\n this.videoSources.filter(source => source !== this.userSourceIndex)\n .length === 0\n );\n }\n\n get userDimensions() {\n const userVideoIndex = this.videoSources.indexOf(this.userSourceIndex);\n if (userVideoIndex > -1) {\n return this.dimensions[userVideoIndex];\n }\n return null;\n }\n}\n\nexport default PodiumFacade;\n","import Logger from './Logger.js';\nimport PodiumFacade from './PodiumFacade.js';\n\n/**\n * SipMessageTransformer\n **/\nclass SigMessageTransformer {\n constructor(clientId) {\n this.clientId = clientId;\n this.stamp = this.stamp.bind(this);\n this.default = this.default.bind(this);\n this.process = this.process.bind(this);\n this.sourceUpdate = this.sourceUpdate.bind(this);\n this.voiceActivity = this.voiceActivity.bind(this);\n }\n\n /**\n * Put a stamp with _src on the message.\n **/\n stamp(message) {\n return Object.assign({ _src: 'sig' }, message);\n }\n\n process(message) {\n /* eslint-disable camelcase */\n const transformation =\n {\n source_update: this.sourceUpdate,\n voice_activity: this.voiceActivity\n }[message.type] || this.default;\n /* eslint-enable camelcase */\n\n return transformation(this.stamp(message));\n }\n\n default(message) {\n Logger.debug('SipMessageTransformer::default', message);\n return message;\n }\n\n sourceUpdate(message) {\n Logger.debug('SipMessageTransformer::sourceUpdate', message);\n\n const podium = new PodiumFacade(message, this.clientId);\n\n const transformed = {\n type: 'podium',\n solo: podium.isSolo,\n audio: podium.hasAudioPosition,\n video: podium.hasVideoPosition,\n media: podium.hasMedia,\n sources: podium.sources,\n isSource: podium.isSource,\n presenter: podium.presenter,\n isPresenter: podium.isPresenter,\n hasPresenter: podium.hasPresenter,\n videoSources: podium.videoSources,\n userDimensions: podium.userDimensions,\n hasVideoSources: podium.hasVideoSources,\n hasDesktopSources: podium.hasDesktopSources,\n hasMutedVideoPeers: podium.hasMutedVideoPeers\n };\n\n return transformed;\n }\n\n voiceActivity(message) {\n Logger.debug('SipMessageTransformer::voiceActivity', message);\n\n // we rename the type here so we can use 'voice_activity' for passing to the\n // ui\n const transformed = Object.assign({\n type: 'voice_activity_raw',\n on: message.on,\n userId: message.cid\n });\n\n return transformed;\n }\n}\n\nexport default SigMessageTransformer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport 'webrtc-adapter';\nimport {\n stopTrack,\n getCanvasTracks,\n isCanvasPresentationStream\n} from './utils/StreamHelpers.js';\n\nconst _iceCheckingTimeout = 3000;\n\n/**\n * SessionDescriptionHandler\n */\nclass SessionDescriptionHandler {\n // eslint-disable-next-line max-statements\n constructor(options) {\n this.datachannel = null;\n this.peerConnection = null;\n this.localStream = null;\n this.remoteStream = null;\n this.connected = false;\n this.iceCheckingTimer = null;\n this.peerConnectionReady = null;\n this.options = options || {};\n this.connection = options.connection;\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.initPeerConnection();\n }\n\n /**\n * Gets the local description from the underlying media implementation\n */\n // eslint-disable-next-line max-statements\n async getDescription() {\n const { options, peerConnection } = this;\n Logger.debug('SessionDescriptionHandler::getDescription:', options);\n this.localStream = options.stream;\n const offer = await peerConnection.createOffer(options.RTCOfferOptions);\n options.SDPModifiers.active.forEach(modifier => {\n offer.sdp = modifier(offer.sdp);\n });\n await peerConnection.setLocalDescription(offer);\n await this.peerConnectionReady;\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug('SessionDescriptionHandler::getDescription offer', sdp);\n return { type: 'offer', sdp };\n }\n\n /**\n * Set the remote description to the underlying media implementation\n */\n async setDescription(sessionDescription) {\n const { datachannel } = this;\n Logger.debug(\n 'SessionDescriptionHandler::setDescription:',\n sessionDescription\n );\n if (sessionDescription && sessionDescription.sdp) {\n this.connection.seppMessaging = sessionDescription.sdp.includes(\n 'a=eyeson-sepp-messaging'\n );\n }\n await this.peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n if (datachannel.readyState === 'connecting') {\n await new Promise(resolve => {\n datachannel.onopen = () => {\n datachannel.onopen = null;\n resolve();\n };\n });\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateDescription(sessionDescription) {\n const { options, peerConnection } = this;\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription:',\n sessionDescription\n );\n if (sessionDescription.type === 'offer') {\n try {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n const answer = await peerConnection.createAnswer();\n options.SDPModifiers.active.forEach(modifier => {\n answer.sdp = modifier(answer.sdp);\n });\n await peerConnection.setLocalDescription(answer);\n this.options.remoteDescriptionUpdate(sessionDescription);\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription answer',\n sdp\n );\n return { type: 'answer', sdp };\n } catch (error) {\n Logger.error('SessionDescriptionHandler::updateDescription', error);\n }\n } else if (sessionDescription.type === 'answer') {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n }\n return null;\n }\n\n close() {\n Logger.debug('SessionDescriptionHandler::close');\n clearTimeout(this.iceCheckingTimer);\n if (this.peerConnection) {\n this.stopAllTracks();\n this.peerConnection.close();\n this.peerConnection = null;\n if (\n this.datachannel &&\n ['connecting', 'open'].includes(this.datachannel.readyState)\n ) {\n this.datachannel.close();\n this.datachannel = null;\n }\n Logger.debug(\n 'SessionDescriptionHandler::close ' +\n 'Stopped streams and closed peerConnection.'\n );\n }\n }\n\n // eslint-disable-next-line max-statements\n initPeerConnection() {\n const { options } = this;\n const pcOptions = this.buildPeerConnectionOptions();\n Logger.debug(\n 'SessionDescriptionHandler::initPeerConnection with',\n pcOptions\n );\n let resolveReady = null;\n this.peerConnectionReady = new Promise(resolve => (resolveReady = resolve));\n try {\n const pc = new RTCPeerConnection(pcOptions);\n this.peerConnection = pc;\n options.stream.getTracks().forEach(track => {\n pc.addTrack(track, options.stream);\n });\n const channel = pc.createDataChannel('data', { negotiated: true, id: 0 });\n this.handleDatachannel(channel);\n pc.onicecandidate = ({ candidate }) => {\n if (!candidate) {\n resolveReady();\n return;\n }\n Logger.debug(\n 'SessionDescriptionHandler::gotIceCandidate',\n candidate.candidate\n );\n };\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n resolveReady();\n }\n };\n if (options.sendOnly === true) {\n pc.addEventListener(\n 'connectionstatechange',\n this.handleConnectionStateChange\n );\n } else {\n pc.ontrack = this.handleOntrack.bind(this);\n }\n this.iceCheckingTimer = setTimeout(\n () => resolveReady(),\n _iceCheckingTimeout\n );\n } catch (error) {\n Logger.error(\n 'SessionDescriptionHandler::initPeerConnection failed:',\n error,\n this.connection.uaOptions\n );\n }\n }\n\n /**\n * Only signal (handleAccept) that we have a remote stream once ontrack\n * says so. Is called twice, once for audio and once for video track.\n */\n handleOntrack({ track, streams }) {\n const { options } = this;\n [this.remoteStream] = streams;\n Logger.debug('SessionDescriptionHandler::handleOntrack:', track.kind);\n track.onunmute = () => options.handleUnmute(track);\n options.handleAccept(this.remoteStream);\n }\n\n handleConnectionStateChange() {\n if (\n this.peerConnection.connectionState === 'connected' &&\n !this.connected\n ) {\n this.connected = true;\n this.options.handleAccept();\n }\n }\n\n handleDatachannel(channel) {\n this.datachannel = channel;\n this.connection.initDatachannel(channel);\n }\n\n /**\n * We need to re-format the iceServers here. SIP.js used to offer a\n * higher level api and we supplied the servers in a different format e.g:\n *\n * { stunServers: [\"stun:stun1.visocon.com:3478\"] }\n * { turnServers: [{ urls: [1,2,3], username: \"bob\", password: \"nob\" }] }\n *\n * We currently have the api set return the creds in that format.\n * The peerConnection however expects:\n *\n * {\n * \"iceServers\": [\n * { \"urls\": \"stun:stun1.visocon.com:3478\" },\n * { \"urls\": [1,2,3], \"username\": \"bob\", \"credential\": \"nob\" }\n * ]\n * }\n */\n buildPeerConnectionOptions() {\n const { options } = this;\n const iceServers = [{ urls: options.stun_servers }];\n options.turn_servers.forEach(turnServer => {\n turnServer.credential = turnServer.password;\n iceServers.push(turnServer);\n });\n const pcOptions = {\n sdpSemantics: 'unified-plan',\n iceServers\n };\n return pcOptions;\n }\n\n getLocalStream() {\n return this.localStream;\n }\n\n getRemoteStream() {\n return this.remoteStream;\n }\n\n setStream(newStream) {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n let oldStream = this.getLocalStream();\n this.localStream = newStream;\n\n this.stopUnusedTracks(oldStream, newStream);\n\n let [audioTrack] = newStream.getAudioTracks();\n // in case of multiple streams, the preferred video track is the\n // canvas presentation stream\n let [videoTrack] = isCanvasPresentationStream(newStream)\n ? getCanvasTracks(newStream)\n : newStream.getVideoTracks();\n\n if (!this.tracksExist()) {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n return;\n }\n const senders = this.peerConnection.getSenders();\n\n const audioSender = senders.find(\n sender => sender.track && sender.track.kind === 'audio'\n );\n const videoSender = senders.find(\n sender => sender.track && sender.track.kind === 'video'\n );\n Promise.all([\n audioSender ? audioSender.replaceTrack(audioTrack) : null,\n videoSender ? videoSender.replaceTrack(videoTrack) : null\n ])\n .then(() => {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n })\n .catch(reject);\n });\n }\n\n stopUnusedTracks(oldStream, newStream) {\n if (this.connection.hasExternalStream) {\n return;\n }\n const unusedTracks = oldStream\n .getTracks()\n .filter(track => !newStream.getTracks().includes(track));\n unusedTracks.forEach(stopTrack);\n }\n\n tracksExist() {\n return Boolean(\n this.peerConnection.getSenders().find(sender => sender.track !== null)\n );\n }\n\n scaleResolution(factor) {\n // factor 0.5 => scaleResolutionDownBy 2\n try {\n const ratio = Math.max(1.0 / Math.max(factor, 0.1), 1.0);\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].scaleResolutionDownBy !== ratio) {\n params.encodings[0].scaleResolutionDownBy = ratio;\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::scaleResolution failed:', error);\n }\n }\n\n // eslint-disable-next-line max-statements\n limitFramerate(fps) {\n try {\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].maxFramerate !== fps) {\n if (fps) {\n params.encodings[0].maxFramerate = fps;\n } else {\n Reflect.deleteProperty(params.encodings[0], 'maxFramerate');\n }\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::limitFramerate failed:', error);\n }\n }\n\n /**\n * Stop all tracks\n */\n stopAllTracks() {\n Logger.debug('SessionDescriptionHandler::stopAllTracks');\n let receivers = this.peerConnection.getReceivers\n ? this.peerConnection.getReceivers()\n : [];\n this.peerConnection\n .getSenders()\n .concat(receivers)\n .forEach(rtp => {\n if (rtp.track) {\n stopTrack(rtp.track);\n }\n });\n }\n}\n\nexport default SessionDescriptionHandler;\n/* eslint-enable max-lines */\n","import SEPP from './sepp/SEPP.js';\nimport Logger from './Logger.js';\nimport WHITELIST from './SigMessageWhitelist.js';\nimport SigMessageTransformer from './SigMessageTransformer.js';\nimport SessionDescriptionHandler from './SessionDescriptionHandler.js';\n\nconst maxMessageSize = 32 * 1024;\n\n/**\n * eyeson Sip Connection.\n *\n * Registers with provided sip credentials and handles events received.\n **/\nclass SigConnection {\n constructor(signaling, user) {\n this.listeners = [];\n this.messageListener = [];\n this.datachannel = null;\n this.uaOptions = this.initUserAgentOptions(signaling, user);\n this.clientId = this.uaOptions.client_id;\n this.userAgent = null;\n this.transformer = new SigMessageTransformer(this.clientId);\n this.seppMessaging = false;\n }\n\n initUserAgentOptions(signaling, user) {\n if (signaling.type !== 'sepp') {\n return {\n client_id: null\n };\n }\n const signalingOptions = signaling.options;\n const uaOptions = {\n client_id: signalingOptions.client_id,\n conf_id: signalingOptions.conf_id,\n client_name: user.name,\n mute_video: false,\n sessionDescriptionHandlerFactory: options => {\n return new SessionDescriptionHandler(options);\n },\n sessionDescriptionHandlerFactoryOptions: {\n stun_servers: signalingOptions.stun_servers,\n turn_servers: signalingOptions.turn_servers\n },\n transportOptions: {\n auth_token: signalingOptions.auth_token,\n endpoint: signalingOptions.endpoint\n }\n };\n return uaOptions;\n }\n\n /**\n * Connect and register to the configured WebSocket server.\n **/\n start() {\n return new Promise(resolve => {\n if (!this.uaOptions.client_id) {\n throw new TypeError('Invalid signaling data');\n }\n this.userAgent = new SEPP.UserAgent(this.uaOptions);\n resolve();\n });\n }\n\n /**\n * Start a session on current connection.\n **/\n startSession(options) {\n Object.assign(\n this.uaOptions.sessionDescriptionHandlerFactoryOptions,\n options\n );\n if (options.mediaOptions) {\n this.uaOptions.mute_video = !options.mediaOptions.video;\n }\n this.userAgent.onEvent(({ type, data }) => {\n if (type === 'registered') {\n // eslint-disable-next-line prefer-reflect\n this.userAgent.call();\n } else if (type === 'message') {\n this.handleMessage(data);\n }\n });\n this.userAgent.connect();\n return this.userAgent;\n }\n\n updateAuthAndRestartSession(roomData) {\n Logger.debug('updateAuthAndRestartSession', roomData);\n if (!roomData.error) {\n this.uaOptions.transportOptions.auth_token =\n roomData.signaling.options.auth_token;\n }\n this.userAgent.connect();\n }\n\n updateAuthAndResume(roomData) {\n Logger.debug('updateAuthAndResume', roomData);\n if (!this.userAgent) {\n Logger.warn('updateAuthAndResume', 'userAgent already gone');\n return;\n }\n if (roomData.error) {\n this.userAgent.resume(null);\n return;\n }\n this.userAgent.resume(roomData.signaling.options.auth_token);\n }\n\n initDatachannel(channel) {\n this.datachannel = channel;\n Logger.debug('SigConnection::initDatachannel', channel);\n channel.onmessage = event => {\n if (event.data === '{\"type\":\"ping\"}' && channel.readyState === 'open') {\n channel.send('{\"type\":\"pong\"}');\n return;\n }\n Logger.debug('SigConnection::dataChannelMessage', event.data);\n const message = JSON.parse(event.data);\n if (message.type === 'ack') {\n return;\n }\n this.handleMessage(message);\n };\n }\n\n /**\n * Stop listening for messages.\n **/\n // eslint-disable-next-line max-statements\n close() {\n const { datachannel, userAgent } = this;\n this.datachannel = null;\n this.userAgent = null;\n if (datachannel && datachannel.readyState === 'open') {\n datachannel.close();\n }\n if (userAgent) {\n userAgent.removeAllListeners();\n userAgent.terminate();\n }\n }\n\n /**\n * Parse, filter, transform and finally forward messages received from SIP\n * connection.\n **/\n onMessage(callback) {\n this.messageListener.push(callback);\n }\n\n handleMessage(message) {\n if (!WHITELIST.includes(message.type)) {\n Logger.debug(\n `SigConnection::handleMessage ignoring \"${message.type}\" message.`\n );\n return;\n }\n const transformedMessage = this.transformer.process(message);\n this.messageListener.forEach(cb => cb(transformedMessage));\n }\n\n /**\n * Transport a message over current connection.\n **/\n // eslint-disable-next-line max-statements\n send(msg) {\n if (this.seppMessaging) {\n this.sendSeppMessage(msg);\n return;\n }\n const { datachannel } = this;\n msg.cid = this.uaOptions.client_id;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (\n datachannel &&\n datachannel.readyState === 'open' &&\n data.length < maxMessageSize\n ) {\n Logger.debug('SigConnection::send datachannel', data);\n datachannel.send(data);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n\n // eslint-disable-next-line max-statements\n sendSeppMessage(msg) {\n const { userAgent } = this;\n if (userAgent && userAgent.callId) {\n msg.cid = this.uaOptions.client_id;\n msg.call_id = userAgent.callId;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (data.length < maxMessageSize) {\n Logger.debug('SigConnection::send sepp', msg);\n userAgent.message(msg.type, msg);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n }\n\n onError(errorHandler) {\n this.listeners.push(errorHandler);\n return this;\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n}\n\nexport default SigConnection;\n","import eyesonOptions from '../options.js';\nimport Logger from '../Logger.js';\nimport PublicEvent from './PublicEvent.js';\nimport SigConnection from '../SigConnection.js';\n\nconst startSigConnection = (context, signaling, user) => {\n context.connection = new SigConnection(signaling, user);\n context._connection\n .onError(msg => context.send(msg))\n .start()\n .then(() => context.send({ type: 'connection', connectionStatus: 'ready' }))\n .catch(() =>\n context.send({ type: 'connection', connectionStatus: 'transport_error' })\n );\n};\n\nclass RoomReceived extends PublicEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n super.handle(msg);\n this.context.rtData = msg.content;\n\n if (msg.content.ready !== true) {\n Logger.debug('RoomReceived not ready:', msg.content);\n return;\n }\n\n const { user, room, signaling, links, options } = msg.content;\n\n // Update eyeson's public data\n this.context._eyeson.room = room;\n this.context._eyeson.user = this.context._api.addUserAttributes(\n user,\n user.id,\n signaling.options.client_id\n );\n this.context._eyeson.links = links;\n eyesonOptions.widescreen = Boolean(options.widescreen);\n\n if (this.context._connection) {\n Logger.debug('RoomReceived double room_ready');\n return;\n }\n startSigConnection(this.context, signaling, user);\n }\n}\n\nexport default RoomReceived;\n","import PublicEvent from './PublicEvent.js';\n\nclass FetchRoomEvent extends PublicEvent {\n handle() {\n this.context._api.getRoom(room => {\n return super.handle({ type: 'fetch_room', room });\n });\n }\n}\n\nexport default FetchRoomEvent;\n","import BaseEvent from './BaseEvent.js';\n\n/**\n * Deletes a file using the com api.\n **/\nclass DeleteFileEvent extends BaseEvent {\n handle(msg) {\n this.context._api.deleteFile(msg.file);\n }\n}\n\nexport default DeleteFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\n/**\n * Uploads a file using the com api.\n **/\n\nclass UploadFileEvent extends PublicEvent {\n handle(msg) {\n this.context._api.uploadFile(msg.file, this.addFile.bind(this));\n }\n\n addFile(response) {\n super.handle({\n type: 'add_file',\n file: response\n });\n }\n}\n\nexport default UploadFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass ReceiveChatEvent extends PublicEvent {\n handle(msg) {\n // remove domain part to support legacy SIP user\n const userId = msg.cid.split('@').shift();\n\n this.msg = msg;\n this.context._api.getUser(userId, this.forwardMessage.bind(this));\n }\n\n forwardMessage(user) {\n const timestamp = Date.parse(this.msg.ts || this.msg.created_at);\n super.handle({\n type: this.msg.type,\n user: user,\n timestamp: new Date(timestamp),\n content: this.msg.content\n });\n }\n}\n\nexport default ReceiveChatEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport DeviceManager from '../DeviceManager.js';\nimport MicMixer from '../MicMixer.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport { getScreenAsVideoTracks, stopStream } from '../utils/StreamHelpers.js';\n\nclass StartStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({\n audio = true,\n video = true,\n virtualBackground = false,\n screen = false,\n surface = null\n }) {\n Logger.debug(\n `StartStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.options.virtualBackground = virtualBackground;\n if (_session.vbgMixer) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n _session.vbgMixer.changeBackground(type);\n }\n if (\n _session.localStream &&\n !FeatureDetector.canMultipleDifferentMicrophones()\n ) {\n stopStream(_session.localStream);\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n return new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(() => _session.send({ type: 'mute_video', on: !(video || screen) }))\n .then(() => {\n if (_session.externalStream) {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n }\n })\n .catch(error => {\n Logger.error('StartStreamEvent', error);\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n });\n }\n}\n\nexport default StartStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport {\n toggleAudio,\n toggleVideo,\n toggleCamera,\n toggleVbgTrack,\n isNinjaStreamTrack,\n isScreenAsVideoTrack,\n getScreenAsVideoTracks,\n isCanvasPresentationStream\n} from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ChangeStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio = true, video = true, screen = false, surface }) {\n Logger.debug(\n `ChangeStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n const changeStream = () => {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n if (\n FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !screen\n ) {\n const [videoTrack] = _session.localStream.getVideoTracks();\n const [audioTrack] = _session.localStream.getAudioTracks();\n if (\n !(video && isNinjaStreamTrack(videoTrack)) &&\n videoTrack.readyState !== 'ended' &&\n audioTrack.readyState !== 'ended' &&\n !isScreenAsVideoTrack(videoTrack)\n ) {\n if (_session.vbgMixer && _session.vbgMixer.originalStream) {\n _session.vbgMixer[video ? 'start' : 'stop']();\n toggleVbgTrack(_session.localStream, video);\n toggleCamera(_session.vbgMixer.originalStream, video);\n } else {\n toggleCamera(_session.localStream, video);\n }\n toggleAudio(_session.localStream, audio);\n resolve(_session.localStream);\n return;\n }\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: _session.localStream,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.screen = true;\n options.video = false;\n options.surface = surface;\n options.virtualBackground = false;\n options.vbgMixer = null;\n options.micMixer = _session.micMixer;\n }\n new MediaStreamBuilder(options)\n .onBrokenTrackError(() => {\n _session.emit({ type: 'broken_track_error' });\n })\n .start()\n .then(resolve)\n .catch(reject);\n });\n };\n\n if (_session.externalStream) {\n toggleAudio(_session.externalStream, audio);\n toggleVideo(_session.externalStream, video);\n _session.send({ type: 'mute_video', on: !video });\n return Promise.resolve();\n }\n\n return (\n changeStream()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(stream => {\n if (isCanvasPresentationStream(stream)) {\n _session.canvasMixer.setStream(stream);\n } else {\n _session.send({ type: 'mute_video', on: !(video || screen) });\n }\n })\n // eslint-disable-next-line max-statements\n .catch(err => {\n Logger.error(err);\n if (\n err instanceof Error &&\n [\n 'NotReadableError',\n 'DevicesNotFoundError',\n 'NotFoundError'\n ].includes(err.name)\n ) {\n _session.emit({ type: 'warning', name: 'error_' + err.name });\n }\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${err.name}`;\n if (err.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${err.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n })\n );\n }\n}\n\nexport default ChangeStreamEvent;\n","import Logger from '../Logger';\nimport BaseEvent from './BaseEvent';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from '../utils/StreamHelpers';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ReplaceStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const stream = createExternalStream(msg.stream);\n if (!stream) {\n Logger.error('ReplaceStreamEvent::handle invalid stream', msg.stream);\n return Promise.reject(new TypeError('Invalid stream'));\n }\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n\n _session.options.audio = hasAudio(stream);\n _session.options.video = hasVideo(stream);\n\n return _session\n .setStream(stream)\n .then(() => {\n _session.externalStream = stream;\n _connection.hasExternalStream = true;\n _session.send({ type: 'mute_video', on: !hasVideo(stream) });\n })\n .catch(err => {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n Logger.error(err);\n });\n }\n}\n\nexport default ReplaceStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\n\nclass ToggleCameraEvent extends BaseEvent {\n handle({ facingMode }) {\n Logger.debug('ToggleCameraEvent::handle', facingMode);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: { facingMode: facingMode },\n existingStream: _session.localStream,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(_session.setStream)\n .catch(Logger.error);\n }\n}\n\nexport default ToggleCameraEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass AcceptSessionEvent extends PublicEvent {\n handle(msg) {\n const {\n type,\n session: { sessionDescriptionHandler }\n } = msg;\n const localStream = sessionDescriptionHandler.getLocalStream();\n const remoteStream = sessionDescriptionHandler.getRemoteStream();\n super.handle({\n type,\n localStream,\n remoteStream\n });\n }\n}\n\nexport default AcceptSessionEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopRecordingEvent extends PublicEvent {\n handle(msg) {\n this.context._api.stopRecording(msg);\n }\n}\n\nexport default StopRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * VoiceActivityEvent\n **/\nclass VoiceActivityEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise(resolve => {\n this.context._api.getUser(id, resolve);\n });\n }\n\n handle(msg) {\n this.getUser(msg.userId).then(\n user => {\n this.context.send({ type: 'voice_activity', user: user, on: msg.on });\n },\n error => {\n Logger.error('VoiceActivityEvent::handle', error);\n }\n );\n }\n}\n\nexport default VoiceActivityEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartRecordingEvent extends PublicEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n\n _api\n .startRecording(msg)\n .catch(error => _session.emit({ type: 'recording_error', error: error }));\n }\n}\n\nexport default StartRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport { getScreenPresentationTracks } from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\nconst detectDisplaySurface = screenTrack => {\n if (screenTrack && typeof screenTrack.getSettings === 'function') {\n const settings = screenTrack.getSettings();\n if (\n Reflect.apply(Object.prototype.hasOwnProperty, settings, [\n 'displaySurface'\n ])\n ) {\n return settings.displaySurface;\n }\n }\n return '';\n};\n\nclass ScreenCaptureEvent extends BaseEvent {\n handle({ audio, screen = false, screenStream, surface }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n }\n _session.micMixer = new MicMixer();\n\n const onError = error => {\n Logger.error('ScreenCaptureEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'capture_error', name });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: false,\n screen: screen,\n surface: surface,\n screenStream: screenStream,\n existingStream: _session.localStream,\n micMixer: _session.micMixer,\n isPresentation: true,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n let present = 'screen';\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n });\n const displaySurface = detectDisplaySurface(screenTrack);\n if (displaySurface) {\n present = `screen-${displaySurface}`;\n }\n }\n _session.emit({ type: 'start_presenting', stream, present });\n })\n .catch(onError);\n }\n}\n\nexport default ScreenCaptureEvent;\n","import Logger from '../Logger.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport BaseEvent from './BaseEvent.js';\n\nclass StartPresentingEvent extends BaseEvent {\n streamVideo() {\n const { _session } = this.context;\n\n const onError = error => {\n Logger.error('StartPresentingEvent', error);\n if (!error.name.match(/notallowed|permission/i)) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(userMediaStream => {\n const stream = _session.videoPlayer.invokeStream(userMediaStream);\n return this.handle({ stream });\n })\n .catch(onError);\n }\n\n // eslint-disable-next-line max-statements\n async handle({ stream = null, present = '' }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n if (_session.videoPlayer && !_session.videoPlayer.isStreaming()) {\n this.streamVideo();\n } else {\n let presentationStream = stream || _session.localStream;\n if (_session.canvasMixer && _session.canvasMixer.stream) {\n // eslint-disable-next-line prefer-destructuring\n presentationStream = _session.canvasMixer.stream;\n }\n await _session.setStream(presentationStream);\n _session.send({ type: 'set_presenter', on: true });\n _session.send({ type: 'desktopstreaming', on: true });\n _session.emit({ type: 'presentation_started', present });\n }\n }\n}\n\nexport default StartPresentingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StopPresentingEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.canvasMixer) {\n if (_session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.stopOriginalStream();\n _session.canvasMixer.vbgMixer.terminate();\n _session.canvasMixer.vbgMixer = null;\n }\n _session.canvasMixer.stop();\n _session.canvasMixer = null;\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.videoPlayer) {\n _session.videoPlayer.destroy();\n _session.videoPlayer = null;\n }\n _session.send({ type: 'desktopstreaming', on: false });\n _session.send({ type: 'set_presenter', on: false });\n _session.emit({ type: 'presentation_ended' });\n _session.stopPresentingSet = true;\n }\n}\n\nexport default StopPresentingEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopBroadcastsEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopAllBroadcasts()\n .then(() => super.handle({ type: msg.type }));\n }\n}\n\nexport default StopBroadcastsEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ClearFrontLayerEvent extends BaseEvent {\n handle() {\n this.context._api.clearFrontLayer();\n }\n}\n\nexport default ClearFrontLayerEvent;\n","import ComApi from '../ComApi.js';\nimport PublicEvent from './PublicEvent.js';\n\n/**\n * Request a user from guest token.\n * use same error if meeting is locked due to backwards compatibility for mobile apps\n * error 423 Locked = meeting locked\n **/\nclass RequestGuestUserEvent extends PublicEvent {\n handle(msg) {\n return new ComApi(msg.api, msg.token).requestUser(\n { name: msg.name, email: msg.email, locale: msg.locale },\n response => {\n if (!response.access_key) {\n let isLocked = response.locked;\n if (response.error && response.error.message === 'ComApiError: 423') {\n isLocked = true;\n }\n super.handle({\n type: 'error',\n content: 'Request guest user failed',\n locked: isLocked\n });\n return;\n }\n super.handle({ type: 'guest_user', token: response.access_key });\n }\n );\n }\n}\n\nexport default RequestGuestUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SessionTerminationEvent extends BaseEvent {\n handle() {\n this.context._eyeson.destroy();\n }\n}\n\nexport default SessionTerminationEvent;\n","import Logger from './../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * We handle participants list update is separated in two actions: one to\n * add, one to remove. In order to keep it easy to handle, the user data is\n * fetched from api (or later received via websocket). Not to mess with\n * comApi current handling, we keep it here for a while.\n **/\nclass ParticipantListUpdateEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise((resolve, reject) => {\n if (!this.context._api) {\n reject(new Error('missing ComAPI'));\n return;\n }\n try {\n this.context._api.getUser(id, resolve);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n handle(msg) {\n (msg.add || []).forEach((user, idx, add) => {\n const id = user.cid;\n const { clientId } = this.context._connection;\n\n const initial = Boolean(add.find(addition => addition.cid === clientId));\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({\n type: 'add_user',\n user: apiUser,\n initial: initial\n });\n })\n .catch(error => Logger.error(error));\n });\n (msg.del || []).forEach(user => {\n const id = user;\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({ type: 'remove_user', userId: id, user: apiUser });\n })\n .catch(error => Logger.error(error));\n });\n this.context.send({ type: 'playback_update', playing: msg.media || [] });\n }\n}\n\nexport default ParticipantListUpdateEvent;\n","const toFixedNumber = number => Number(parseFloat(number).toFixed(2));\n\nconst scale = (width, height, max) => {\n const ratio = Math.min(max.width / width, max.height / height);\n const xScaled = toFixedNumber(width * ratio);\n const yScaled = toFixedNumber(height * ratio);\n\n return { width: xScaled, height: yScaled };\n};\n\nexport default scale;\n","/* eslint-disable */\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @see https://davidwalsh.name/javascript-debounce-function\n **/\nexport default (func, wait, immediate) => {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n};\n/* eslint-enable */\n","/* eslint-disable max-lines */\nimport scale from './utils/scale.js';\nimport Logger from './Logger.js';\nimport debounce from './utils/debounce.js';\n\nimport {\n isVBGStream,\n getVbgTracks,\n getScreenPresentationTracks,\n getCameraTracks,\n getCanvasTracks,\n stopStream\n} from './utils/StreamHelpers';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst FPS = 15;\nconst FPS_INTERVAL = 1000 / FPS;\nconst CAMERA_SMALL = { width: 220, height: 140 };\nconst CAMERA_MEDIUM = { width: 320, height: 240 };\nconst CAMERA_LARGE = { width: 420, height: 340 };\nconst CAMERA_NONE = { width: 0, height: 0 };\n\nconst supportsTrackProcessor =\n typeof window.MediaStreamTrackProcessor === 'function';\n\nconst defaultTrack = {\n getSettings: () => ({ width: 0, height: 0 }),\n addEventListener: () => null\n};\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\n// Note:\n// autoplay elements will stop playing in safari if not in viewport:\n// https://webkit.org/blog/6784/new-video-policies-for-ios/\n// that's the reason why we don't set autoplay\n// video.setAttribute('autoplay', '1');\n// but instead `.play` manually.\n// eslint-disable-next-line max-statements\nconst bindVideoToStream = stream => {\n const [track] = stream.getVideoTracks();\n if (!track) {\n return null;\n }\n if (supportsTrackProcessor) {\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n return processor.readable.getReader();\n }\n const { width, height } = track.getSettings();\n const video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = stream;\n track.addEventListener('stopped', () => {\n video.srcObject = null;\n });\n video\n .play()\n .catch(error =>\n Logger.warn('bindVideoToStream: play', error, error.message)\n );\n return video;\n};\n\n/* eslint-disable max-statements, id-length */\nconst fitImage = (target, source) => {\n const sourceAspectRatio = source.width / source.height;\n const targetAspectRatio = target.width / target.height;\n\n let { width, height } = target;\n let x = 0;\n let y = 0;\n\n // Image's aspect ratio is less than target's we fit on height\n // and place the image centrally along width\n if (sourceAspectRatio < targetAspectRatio) {\n width = source.width * (height / source.height);\n x = (target.width - width) / 2;\n }\n // Image's aspect ratio is greater than target's we fit on width\n // and place the image centrally along height\n if (sourceAspectRatio > targetAspectRatio) {\n height = source.height * (width / source.width);\n y = (target.height - height) / 2;\n }\n\n return { x: x, y: y, width: width, height: height };\n};\n/* eslint-enable max-statements */\n\nconst initIOSSettings = mixer => {\n // neccessary to run calcSizesAndPositions and draw functions\n // without camera\n mixer.cameraStream = { getVideoTracks: () => [] };\n mixer.screenStream = { getVideoTracks: () => [] };\n};\n\nconst getCanvasCaptureTrackCanvas = stream => {\n if (stream && stream.getVideoTracks().length > 0) {\n const [track] = stream.getVideoTracks();\n if ('canvas' in track) {\n return track.canvas;\n }\n }\n return null;\n};\n\nclass CanvasMixer {\n /* eslint-disable max-statements */\n constructor(canvas, stream) {\n this.canvas = canvas;\n this.stream = stream;\n this.camera = null;\n this.screen = null;\n this.canvasTrack = null;\n this.context = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true\n });\n this.xPos = 0;\n this.camSize = CAMERA_MEDIUM;\n this.isCanvasCapture = false;\n\n this.draw = this.draw.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onError = this.onError.bind(this);\n this.onRedraw = this.onRedraw.bind(this);\n this.setStream = this.setStream.bind(this);\n this.setCamera = this.setCamera.bind(this);\n this.drawFrame = this.drawFrame.bind(this);\n this.calcSizesAndPositions = this.calcSizesAndPositions.bind(this);\n\n this.bouncedDraw = debounce(this.draw, FPS_INTERVAL);\n }\n /* eslint-enable max-statements */\n\n onError(errorCallback) {\n this.errorCallback = errorCallback;\n }\n\n onRedraw(redrawCallback) {\n this.redrawCallback = redrawCallback;\n }\n\n // eslint-disable-next-line max-statements\n start() {\n const [canvasTrack] = getCanvasTracks(this.stream);\n this.canvasTrack = canvasTrack;\n if (isIOSDevice) {\n initIOSSettings(this);\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'none');\n } else {\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'medium');\n this.setStream(this.stream);\n }\n this.draw();\n }\n\n stop() {\n if (this.stream) {\n stopStream(this.stream);\n this.stream = null;\n this.camera = null;\n this.screen = null;\n this.screenStream = null;\n this.cameraStream = null;\n this.canvasTrack = null;\n }\n }\n\n // eslint-disable-next-line max-statements\n setStream(newStream) {\n this.stream = newStream;\n this.cameraStream = new MediaStream(\n isVBGStream(newStream)\n ? getVbgTracks(newStream)\n : getCameraTracks(newStream)\n );\n this.screenStream = new MediaStream(\n getScreenPresentationTracks(this.stream)\n );\n const originalCanvas = getCanvasCaptureTrackCanvas(this.cameraStream);\n if (originalCanvas) {\n this.isCanvasCapture = true;\n this.camera = originalCanvas;\n } else {\n this.isCanvasCapture = false;\n this.camera = bindVideoToStream(this.cameraStream);\n }\n this.screen = bindVideoToStream(this.screenStream);\n this.calcSizesAndPositions();\n this.redrawQueued = true;\n }\n\n setCamera(position, size) {\n this.cameraPosition = position || this.cameraPosition;\n this.cameraSizeInWords = size || this.cameraSizeInWords;\n this.redrawQueued = true;\n }\n\n calcSizesAndPositions() {\n // Fetch the latest settings (width and height) from the track directly,\n // otherwise resized windows won't be positioned/scaled correctly...\n const [screenTrack = defaultTrack] = this.screenStream.getVideoTracks();\n const screenStreamSettings = screenTrack.getSettings();\n const fitScreen = fitImage(this.canvas, screenStreamSettings);\n const [cameraTrack = defaultTrack] = this.cameraStream.getVideoTracks();\n const cameraTrackSettings = cameraTrack.getSettings();\n\n this.camSize = {\n small: CAMERA_SMALL,\n medium: CAMERA_MEDIUM,\n large: CAMERA_LARGE,\n none: CAMERA_NONE\n }[this.cameraSizeInWords];\n\n const scaledCam = scale(\n cameraTrackSettings.width,\n cameraTrackSettings.height,\n this.camSize\n );\n\n this.sizes = {\n screen: { width: fitScreen.width, height: fitScreen.height },\n camera: { width: scaledCam.width, height: scaledCam.height }\n };\n /* eslint-disable id-length, camelcase */\n const camPosition = {\n x:\n this.cameraPosition.horizontal === 'right'\n ? this.canvas.width - this.sizes.camera.width\n : 0,\n y:\n this.cameraPosition.vertical === 'bottom'\n ? this.canvas.height - this.sizes.camera.height\n : 0\n };\n this.positions = {\n screen: { x: fitScreen.x, y: fitScreen.y },\n camera: { x: camPosition.x, y: camPosition.y }\n };\n /* eslint-enable id-length */\n }\n\n /* eslint-disable max-statements */\n async draw() {\n try {\n if (!this.stream || !this.stream.active) {\n return;\n }\n\n // Doing this on every draw due to resizeable windows while screensharing\n this.calcSizesAndPositions();\n\n // In case we need to report back a redraw - doc/image can re-render\n if (this.redrawCallback && this.redrawQueued) {\n this.redrawCallback();\n this.redrawQueued = false;\n }\n\n // Actual drawing code\n const t0 = performance.now();\n if (this.screen) {\n let screenFrame = this.screen;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.screen instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.screen.read();\n screenFrame = result.value;\n }\n this.drawFrame(\n screenFrame,\n this.positions.screen,\n this.sizes.screen,\n false,\n true\n );\n }\n let cameraFrame = this.camera;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.camera instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.camera.read();\n cameraFrame = result.value;\n }\n this.drawFrame(\n cameraFrame,\n this.positions.camera,\n this.sizes.camera,\n this.isCanvasCapture,\n false\n );\n const t1 = performance.now();\n if (t1 - t0 >= FPS_INTERVAL) {\n Logger.warn(`Mixer::drawFrame took ${t1 - t0}ms.`);\n }\n\n // Request a frame so remote end receives updates reliably\n try {\n if (this.canvasTrack) {\n this.canvasTrack.requestFrame();\n }\n } catch (error) {\n Logger.warn(`CanvasMixer draw requestFrame error - ${error.message}`);\n }\n\n // Request another draw if the stream is still active\n this.bouncedDraw();\n } catch (error) {\n Logger.error(error);\n this.errorCallback(error);\n }\n }\n /* eslint-enable max-statements */\n\n // eslint-disable-next-line max-statements\n drawFrame(video, pos, size, isCanvasCapture, isScreenStream) {\n // Pollute the canvas even if we don't have a stream, so we force a frame\n // update.\n const { context, canvas } = this;\n if (\n !video ||\n (!isCanvasCapture &&\n video instanceof HTMLVideoElement &&\n (!video.srcObject || !video.srcObject.active))\n ) {\n const imgData = context.createImageData(1, 1);\n context.putImageData(imgData, 0, 0);\n return;\n }\n\n // Clear prev drawn frames only for screen streams, otherwise old frames\n // show up if the window is resized (smaller).\n if (isScreenStream && !isCanvasCapture) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n context.drawImage(video, pos.x, pos.y, size.width, size.height);\n if (supportsTrackProcessor && typeof video.close === 'function') {\n video.close();\n }\n }\n}\n\nexport default CanvasMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport CanvasMixer from '../CanvasMixer.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport {\n getScreenPresentationTracks,\n stopTrack\n} from '../utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from '../VirtualBackgroundMixer.js';\nimport DeviceManager from '../DeviceManager.js';\n\nclass StartMixerEvent extends BaseEvent {\n handle({\n audio,\n video,\n canvas,\n screen = false,\n surface,\n onRedraw,\n changeStream = false,\n present = 'mixer'\n }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n // if (_session.micMixer) {\n // _session.micMixer.destroy();\n // _session.micMixer = null;\n // }\n const vbgType = DeviceManager.getStoredVirtualBackgroundType();\n const vbgMixer = new VirtualBackgroundMixer('canvasmixer');\n vbgMixer.changeBackground(vbgType);\n\n const onError = error => {\n Logger.error('StartMixerEvent', error);\n if (!_session.canvasMixer && vbgMixer) {\n vbgMixer.terminate();\n }\n if (!error.name.match(/notallowed|permission/i) && screen) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n screen: screen,\n surface: surface,\n canvas: canvas,\n existingStream: _session.localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n stopTrack(screenTrack);\n });\n }\n _session.canvasMixer = new CanvasMixer(canvas, stream);\n _session.canvasMixer.vbgMixer = vbgMixer;\n _session.canvasMixer.onError(onError);\n _session.canvasMixer.onRedraw(onRedraw);\n _session.canvasMixer.start();\n return stream;\n })\n .then(stream => {\n if (changeStream) {\n _session.emit({ type: 'start_presenting', stream, present });\n } else {\n _session.emit({ type: 'stream_update', presentationStream: stream });\n }\n })\n .catch(onError);\n }\n}\n\nclass UpdateMixerEvent extends BaseEvent {\n handle({ position, size }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n _session.canvasMixer.setCamera(position, size);\n } catch (error) {\n Logger.error(error);\n }\n }\n}\n\nexport { StartMixerEvent, UpdateMixerEvent };\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\n\nconst videoFrameSupport =\n typeof HTMLVideoElement.prototype.requestVideoFrameCallback === 'function';\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass VideoPlayer {\n // eslint-disable-next-line max-statements\n constructor({\n canvas,\n file,\n onReady,\n onDuration,\n onTimeUpdate,\n onEnd,\n performAction\n }) {\n this.ac = null;\n this.acOut = null;\n this.gainNode = null;\n this.timer = null;\n this.canvas = canvas;\n this.url = URL.createObjectURL(file);\n this.ctx = canvas.getContext('2d');\n this.video = document.createElement('video');\n this.callback = { onReady, onDuration, onTimeUpdate, onEnd, performAction };\n this.errorCallback = null;\n this.boundDrawVideoFrame = this.drawVideoFrame.bind(this);\n this.boundInitCanvasStream = this.initCanvasStream.bind(this);\n this.isPlaying = false;\n this.blockTimeUpdate = false;\n this.micOnlyStream = null;\n this.userMediaStream = null;\n this.initTimeout = null;\n this.invokationTimer = null;\n this.initVideo();\n }\n\n drawVideoFrame() {\n this.ctx.drawImage(this.video, 0, 0);\n if (videoFrameSupport) {\n this.timer = this.video.requestVideoFrameCallback(\n this.boundDrawVideoFrame\n );\n } else {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n }\n\n // eslint-disable-next-line max-statements\n initVideo() {\n const { video } = this;\n video.playsInline = true;\n video.autoplay = Boolean(isIOSDevice);\n video.preload = '';\n video.onplaying = this.onVideoPlay.bind(this);\n video.onpause = this.onVideoPause.bind(this);\n video.onseeked = this.onVideoSeeked.bind(this);\n video.ontimeupdate = this.onVideoTimeUpdate.bind(this);\n video.onloadeddata = this.onVideoReady.bind(this);\n video.onerror = this.onVideoError.bind(this);\n video.onended = this.onVideoEnd.bind(this);\n this.initTimeout = setTimeout(() => this.onVideoError(), 6000);\n video.src = this.url;\n }\n\n // eslint-disable-next-line max-statements\n onVideoReady() {\n const { video, canvas } = this;\n clearTimeout(this.initTimeout);\n this.callback.onDuration(video.duration);\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n this.ac = new (window.AudioContext || window.webkitAudioContext)();\n this.gainNode = this.ac.createGain();\n this.ac.createMediaElementSource(video).connect(this.gainNode);\n this.gainNode.connect(this.ac.destination);\n if (videoFrameSupport) {\n this.timer = video.requestVideoFrameCallback(this.boundDrawVideoFrame);\n }\n this.callback.performAction(this.onVideoAction.bind(this));\n try {\n this.ctx.drawImage(video, 0, 0);\n } catch (error) {\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return;\n }\n this.callback.onReady();\n if (video.autoplay) {\n setTimeout(() => {\n video.pause();\n video.currentTime = 0;\n });\n }\n }\n\n onVideoAction(type, value) {\n if (type === 'play') {\n return this.onPlayAction();\n } else if (type === 'pause') {\n return this.onPauseAction();\n } else if (type === 'time') {\n this.onTimeAction(value);\n } else if (type === 'volume') {\n this.onVolumeAction(value);\n }\n return Promise.resolve();\n }\n\n onPlayAction() {\n const { video } = this;\n if (video.paused && !this.isPlaying) {\n return video.play().then(\n () => video.paused,\n () => video.paused\n );\n }\n return Promise.resolve(video.paused);\n }\n\n onPauseAction() {\n const { video } = this;\n if (!video.paused && this.isPlaying) {\n video.pause();\n }\n return Promise.resolve(video.paused);\n }\n\n onTimeAction(time) {\n const { video } = this;\n this.blockTimeUpdate = true;\n if (time >= video.duration) {\n video.currentTime = video.duration - 0.1;\n } else {\n video.currentTime = time;\n }\n this.blockTimeUpdate = false;\n }\n\n onVolumeAction(volume) {\n if (this.gainNode) {\n this.gainNode.gain.value = volume;\n }\n }\n\n onVideoPlay() {\n this.isPlaying = true;\n if (!videoFrameSupport) {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n }\n\n onVideoPause() {\n // also triggered on onended\n this.isPlaying = false;\n if (!videoFrameSupport && this.timer) {\n cancelAnimationFrame(this.timer);\n }\n }\n\n onVideoSeeked() {\n if (!videoFrameSupport && !this.isPlaying) {\n this.ctx.drawImage(this.video, 0, 0);\n }\n }\n\n onVideoTimeUpdate() {\n if (!this.blockTimeUpdate) {\n this.callback.onTimeUpdate(this.video.currentTime);\n }\n }\n\n onVideoError() {\n const { video } = this;\n const error =\n video && video.error ? video.error : new TypeError('VideoPlayer failed');\n Logger.error('VideoPlayer failed', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n }\n\n onVideoEnd() {\n this.callback.onEnd();\n }\n\n initCanvasStream() {\n this.ctx.drawImage(this.video, 0, 0);\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n\n // eslint-disable-next-line max-statements\n invokeStream(userMediaStream) {\n const canvasStream = this.canvas.captureStream(25);\n const [canvasStreamTrack] = canvasStream.getVideoTracks();\n // Firefox issue, track is no CanvasCaptureMediaStreamTrack\n if (!canvasStreamTrack.canvas) {\n canvasStreamTrack.type = 'canvas-track';\n canvasStreamTrack.canvas = this.canvas;\n }\n const outStream = new MediaStream([canvasStreamTrack]);\n this.acOut = this.ac.createMediaStreamDestination();\n this.gainNode.connect(this.acOut);\n this.ac.createMediaStreamSource(userMediaStream).connect(this.acOut);\n this.acOut.stream\n .getAudioTracks()\n .forEach(track => outStream.addTrack(track));\n this.userMediaStream = userMediaStream;\n this.micOnlyStream = new MediaStream(\n userMediaStream.getAudioTracks().concat(canvasStreamTrack)\n );\n if (!this.isPlaying) {\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n return outStream;\n }\n\n isStreaming() {\n return Boolean(this.micOnlyStream);\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { video } = this;\n clearTimeout(this.initTimeout);\n if (this.url) {\n URL.revokeObjectURL(this.url);\n this.url = null;\n }\n if (this.timer) {\n if (videoFrameSupport) {\n video.cancelVideoFrameCallback(this.timer);\n } else {\n cancelAnimationFrame(this.timer);\n }\n this.timer = null;\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n if (this.userMediaStream) {\n stopStream(this.userMediaStream);\n this.userMediaStream = null;\n }\n if (this.micOnlyStream) {\n stopStream(this.micOnlyStream);\n this.micOnlyStream = null;\n }\n if (this.acOut) {\n stopStream(this.acOut.stream);\n this.acOut = null;\n }\n if (this.ac) {\n this.gainNode.disconnect();\n this.ac.close().then(() => {\n this.ac = null;\n this.gainNode = null;\n });\n }\n if (video) {\n video.pause();\n video.onplaying = null;\n video.onpause = null;\n video.ontimeupdate = null;\n video.onloadeddata = null;\n video.onseeked = null;\n video.onerror = null;\n video.onended = null;\n this.video = null;\n }\n this.callback = null;\n this.errorCallback = null;\n this.ctx = null;\n this.canvas = null;\n this.boundDrawVideoFrame = null;\n }\n}\n\nexport default VideoPlayer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport VideoPlayer from '../VideoPlayer.js';\n\nclass StartMediaEvent extends BaseEvent {\n handle(message) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const onError = error => {\n Logger.error('StartMediaEvent', error);\n const name =\n error && (error instanceof MediaError || error instanceof DOMException)\n ? 'error_VideoError'\n : 'error_TypeError';\n _session.emit({ type: 'warning', name: name });\n _session.emit({ type: 'stop_presenting' });\n };\n\n try {\n _session.videoPlayer = new VideoPlayer(message);\n _session.videoPlayer.onError(onError);\n } catch (error) {\n onError(error);\n }\n }\n}\n\nexport { StartMediaEvent };\n","import BaseEvent from './BaseEvent.js';\n\nclass LockMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.lockMeeting();\n }\n}\n\nexport default LockMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass TerminateMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.terminateMeeting();\n }\n}\n\nexport default TerminateMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass KickUserEvent extends BaseEvent {\n handle(msg) {\n this.context._api.kickUser(msg.userId);\n }\n}\n\nexport default KickUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass VirtualBackgroundEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n if (msg.state === 'suspend') {\n _session.vbgMixer.suspend();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.suspend();\n }\n } else if (msg.state === 'resume') {\n _session.vbgMixer.resume();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.resume();\n }\n }\n }\n }\n}\n\nexport default VirtualBackgroundEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst destroySessionMicMixer = session => {\n if (session.micMixer) {\n session.micMixer.destroy();\n session.micMixer = null;\n }\n};\n\nconst getScreenErrorName = error => {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n return name;\n};\n\nclass ScreenVideoChangeEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n async handle({ surface }) {\n let screenStream = null;\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n const mediaStreamBuilder = new MediaStreamBuilder({ surface });\n screenStream = await mediaStreamBuilder.getDisplayMedia();\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n _session.emit({ type: 'warning', name: getScreenErrorName(error) });\n return;\n }\n destroySessionMicMixer(_session);\n _session.micMixer = new MicMixer();\n const options = {\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n screen: true,\n surface,\n micMixer: _session.micMixer,\n screenStream\n };\n try {\n const stream = await new MediaStreamBuilder(options).start();\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n _session.setStream(stream);\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n destroySessionMicMixer(_session);\n _session.emit({\n type: 'screen_capture_error',\n name: getScreenErrorName(error)\n });\n _session.emit({ type: 'screen_video_ended' });\n }\n }\n}\n\nexport default ScreenVideoChangeEvent;\n","import BaseEvent from './BaseEvent';\n\nclass ScreenVideoStoppedEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.emit({ type: 'screen_video_ended' });\n }\n}\n\nexport default ScreenVideoStoppedEvent;\n","import FeatureDetector from './FeatureDetector.js';\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass DeviceMonitor {\n constructor() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n this.audioTrack = null;\n this.videoTrack = null;\n this.audioEnded = null;\n this.videoEnded = null;\n this.boundOnAudioEnd = this.onAudioEnd.bind(this);\n this.boundOnVideoEnd = this.onVideoEnd.bind(this);\n this.listeners = [];\n }\n\n addAudioTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempAudioTrack = track;\n }\n }\n\n addVideoTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempVideoTrack = track;\n }\n }\n\n applyTempTracks() {\n this.clearTracks();\n if (this.tempAudioTrack) {\n this.audioTrack = this.tempAudioTrack;\n this.tempAudioTrack = null;\n this.audioTrack.addEventListener('ended', this.boundOnAudioEnd);\n }\n if (this.tempVideoTrack) {\n this.videoTrack = this.tempVideoTrack;\n this.tempVideoTrack = null;\n this.videoTrack.addEventListener('ended', this.boundOnVideoEnd);\n }\n }\n\n discardTempTracks() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n }\n\n onAudioEnd() {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n return;\n }\n this.audioEnded = setTimeout(() => {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n } else {\n this.emit({ type: 'audio_device_ended' });\n }\n }, 1000);\n }\n\n onVideoEnd() {\n this.videoEnded = setTimeout(() => {\n if (!this.audioEnded) {\n this.emit({ type: 'video_device_ended' });\n }\n }, 1000);\n }\n\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n clearTracks() {\n clearTimeout(this.audioEnded);\n clearTimeout(this.videoEnded);\n if (this.audioTrack) {\n this.audioTrack.removeEventListener('ended', this.boundOnAudioEnd);\n this.audioTrack = null;\n }\n if (this.videoTrack) {\n this.videoTrack.removeEventListener('ended', this.boundOnVideoEnd);\n this.videoTrack = null;\n }\n this.audioEnded = null;\n this.videoEnded = null;\n }\n\n destroy() {\n this.listeners.length = 0;\n this.discardTempTracks();\n this.clearTracks();\n }\n}\n\nexport default DeviceMonitor;\n","import FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport eyesonOptions from './options.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceManager from './DeviceManager.js';\nimport DeviceMonitor from './DeviceMonitor.js';\n\nclass PipCam {\n constructor(session) {\n this.video = null;\n this.stream = null;\n this.canvasStream = null;\n this.vbgMixer = null;\n this.deviceMonitor = null;\n this.session = session;\n this.isActive = false;\n this.startTimer = null;\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n const { session } = this;\n if (!FeatureDetector.hasPipCamSupport()) {\n session.emit({ type: 'pip_cam_warning_unsupported' });\n return;\n }\n try {\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n this.initFakeStream();\n await this.initVideoAndPip();\n await this.initCamera();\n clearTimeout(this.startTimer);\n this.isActive = true;\n session.emit({ type: 'pip_cam', active: true });\n } catch (error) {\n this.onError(error);\n }\n }\n\n onError(error) {\n const { session } = this;\n clearTimeout(this.startTimer);\n Logger.error('PipCam error', error);\n if (session) {\n session.emit({ type: 'pip_cam_error' });\n session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateCamera() {\n if (!this.isActive) {\n return;\n }\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n try {\n video.srcObject = canvasStream;\n await video.play();\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n await this.initCamera();\n clearTimeout(this.startTimer);\n } catch (error) {\n this.onError(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n initFakeStream() {\n const { widescreen } = eyesonOptions;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d', { alpha: false });\n canvas.width = 640;\n canvas.height = widescreen ? 360 : 480;\n ctx.fillStyle = '#404040';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n // https://aydos.com/svgedit/\n const path = new Path2D(\n widescreen\n ? 'M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n : 'M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n );\n ctx.fillStyle = '#212121';\n ctx.fill(path);\n this.canvasStream = canvas.captureStream();\n }\n\n async initVideoAndPip() {\n const video = document.createElement('video');\n this.video = video;\n video.muted = true;\n video.playsInline = true;\n video.onleavepictureinpicture = () => this.onExitPip();\n video.onpause = ({ target }) => this.onVideoPause(target);\n video.srcObject = this.canvasStream;\n await video.play();\n await video.requestPictureInPicture();\n }\n\n // eslint-disable-next-line max-statements\n async initCamera() {\n const { virtualBackground } = this.session.options;\n if (virtualBackground) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer('PipCam');\n this.vbgMixer.changeBackground(type);\n }\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(event => this.onDeviceEvent(event));\n\n const options = {\n audio: false,\n video: true,\n virtualBackground: virtualBackground,\n vbgMixer: this.vbgMixer,\n deviceMonitor: this.deviceMonitor\n };\n this.stream = await new MediaStreamBuilder(options).start();\n this.video.srcObject = this.stream;\n await this.video.play();\n }\n\n onExitPip() {\n if (this.session) {\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n onVideoPause(video) {\n // eslint-disable-next-line no-empty-function\n setTimeout(() => video.play().catch(() => {}));\n }\n\n onDeviceEvent({ type }) {\n if (type.endsWith('_ended')) {\n clearTimeout(this.startTimer);\n if (this.session) {\n this.session.emit({ type: 'pip_cam_warning_video_ended' });\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n }\n\n // eslint-disable-next-line max-statements\n async stop() {\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n clearTimeout(this.startTimer);\n if (video) {\n video.onpause = null;\n video.onleavepictureinpicture = null;\n if (document.pictureInPictureElement === video) {\n try {\n await document.exitPictureInPicture();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n video.srcObject = null;\n this.video = null;\n }\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n if (canvasStream) {\n stopStream(canvasStream);\n this.canvasStream = null;\n }\n if (this.isActive) {\n if (this.session) {\n this.session.emit({ type: 'pip_cam', active: false });\n }\n this.isActive = false;\n }\n }\n\n async destroy() {\n await this.stop();\n this.session = null;\n }\n}\n\nexport default PipCam;\n","import BaseEvent from './BaseEvent.js';\nimport PipCam from '../PipCam.js';\n\nclass StartPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: _session.pipCam.isActive });\n return;\n }\n _session.pipCam = new PipCam(_session);\n _session.pipCam.start();\n }\n}\n\nclass StopPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (!_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: false });\n return;\n }\n _session.pipCam.destroy();\n _session.pipCam = null;\n }\n}\n\nclass UpdatePipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.pipCam.updateCamera();\n }\n }\n}\n\nexport { StartPipCamEvent, StopPipCamEvent, UpdatePipCamEvent };\n","import PublicEvent from './PublicEvent.js';\nimport ChangeStreamEvent from './ChangeStreamEvent.js';\nimport { hasAudio, hasVideo } from '../utils/StreamHelpers.js';\nimport Logger from '../Logger.js';\nimport DeviceManager from '../DeviceManager.js';\nimport LocalStorage from '../LocalStorage.js';\nimport FeatureDetector from '../FeatureDetector.js';\n\nclass AudioDeviceEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n const video = hasVideo(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AudioDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass VideoDeviceEndEvent extends PublicEvent {\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n } catch (error) {\n Logger.error('VideoDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass AllDevicesEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AllDevicesEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nexport { AudioDeviceEndEvent, VideoDeviceEndEvent, AllDevicesEndEvent };\n","import Logger from './Logger.js';\n\nimport {\n StopPlaybackEvent,\n StartPlaybackEvent\n} from './events/PlaybackEvents.js';\n\nimport {\n StartAnnotationEvent,\n StopAnnotationEvent\n} from './events/AnnotationEvents.js';\n\nimport StfuEvent from './events/StfuEvent.js';\nimport IgnoreEvent from './events/IgnoreEvent.js';\nimport PublicEvent from './events/PublicEvent.js';\nimport PodiumEvent from './events/PodiumEvent.js';\nimport ForwardEvent from './events/ForwardEvent.js';\nimport SnapshotEvent from './events/SnapshotEvent.js';\nimport SetLayerEvent from './events/SetLayerEvent.js';\nimport SendChatEvent from './events/SendChatEvent.js';\nimport StopRtmpEvent from './events/StopRtmpEvent.js';\nimport SetLayoutEvent from './events/SetLayoutEvent.js';\nimport StartRtmpEvent from './events/StartRtmpEvent.js';\nimport RoomReceivedEvent from './events/RoomReceivedEvent.js';\nimport FetchRoomEvent from './events/FetchRoomEvent.js';\nimport DeleteFileEvent from './events/DeleteFileEvent.js';\nimport UploadFileEvent from './events/UploadFileEvent.js';\nimport ReceiveChatEvent from './events/ReceiveChatEvent.js';\nimport StartStreamEvent from './events/StartStreamEvent.js';\nimport ChangeStreamEvent from './events/ChangeStreamEvent.js';\nimport ReplaceStreamEvent from './events/ReplaceStreamEvent.js';\nimport ToggleCameraEvent from './events/ToggleCameraEvent.js';\nimport AcceptSessionEvent from './events/AcceptSessionEvent.js';\nimport StopRecordingEvent from './events/StopRecordingEvent.js';\nimport VoiceActivityEvent from './events/VoiceActivityEvent.js';\nimport StartRecordingEvent from './events/StartRecordingEvent.js';\nimport StartScreenCaptureEvent from './events/ScreenCaptureEvent.js';\nimport StartPresentingEvent from './events/StartPresentingEvent.js';\nimport StopPresentingEvent from './events/StopPresentingEvent.js';\nimport StopBroadcastsEvent from './events/StopBroadcastsEvent.js';\nimport ClearFrontLayerEvent from './events/ClearFrontLayerEvent.js';\nimport RequestGuestUserEvent from './events/RequestGuestUserEvent.js';\nimport SessionTerminationEvent from './events/SessionTerminationEvent.js';\nimport ParticipantListUpdateEvent from './events/ParticipantListUpdateEvent.js';\nimport { StartMixerEvent, UpdateMixerEvent } from './events/MixerEvents.js';\nimport { StartMediaEvent } from './events/MediaEvents.js';\nimport LockMeetingEvent from './events/LockMeetingEvent.js';\nimport TerminateMeetingEvent from './events/TerminateMeetingEvent.js';\nimport KickUserEvent from './events/KickUserEvent.js';\nimport VirtualBackgroundEvent from './events/VirtualBackgroundEvent.js';\nimport ScreenVideoChangeEvent from './events/ScreenVideoChangeEvent.js';\nimport ScreenVideoStoppedEvent from './events/ScreenVideoStoppedEvent.js';\nimport {\n StartPipCamEvent,\n StopPipCamEvent,\n UpdatePipCamEvent\n} from './events/PipCamEvents.js';\nimport {\n AudioDeviceEndEvent,\n VideoDeviceEndEvent,\n AllDevicesEndEvent\n} from './events/DeviceEndEvents.js';\n\n/**\n * Event Handler uses the connection credentials for the room and\n * the user to setup a (monitored) connection, start a session and\n * listen for any events.\n **/\nclass EventHandler {\n constructor() {\n this.listeners = [];\n this._eyeson = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n\n this.send = this.send.bind(this);\n }\n\n /* eslint-disable max-statements */\n destroy() {\n if (this._monitor) {\n this._monitor.destroy();\n }\n if (this._connection) {\n this._connection.close();\n }\n if (this._rtConnection) {\n this._rtConnection.close();\n }\n if (this._session) {\n if (this._session.vbgMixer) {\n this._session.vbgMixer.stopOriginalStream();\n this._session.vbgMixer.terminate();\n this._session.vbgMixer.destroy();\n }\n this._session.end();\n }\n this._api = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n }\n /* eslint-enable max-statements */\n\n set connection(con) {\n if (this._connection) {\n Logger.error(\n 'A connection is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._connection = con;\n this._connection.onMessage(this.send);\n }\n\n get connection() {\n return null;\n }\n\n set rtConnection(con) {\n if (this._rtConnection) {\n Logger.error(\n 'A real-time connection is already set. If you are trying to start' +\n ' a new session you have the close the current before.'\n );\n return;\n }\n this._rtConnection = con;\n this._rtConnection.onMessage(this.send);\n }\n\n get rtConnection() {\n return null;\n }\n\n set monitor(mon) {\n if (this._monitor) {\n Logger.error(\n 'A monitor is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._monitor = mon;\n this._monitor.onEvent(this.send);\n }\n\n get monitor() {\n return this._monitor;\n }\n\n set session(ses) {\n if (this._session) {\n Logger.error(\n 'A session is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._session = ses;\n this._session.onEvent(this.send);\n }\n\n get session() {\n return null;\n }\n\n set api(api) {\n this._api = api;\n }\n\n get api() {\n return null;\n }\n\n set rtData(data) {\n this._rtData = data;\n }\n\n get rtData() {\n return null;\n }\n\n set eyeson(eyeson) {\n this._eyeson = eyeson;\n }\n\n get eyeson() {\n return null;\n }\n\n /**\n * Register a new listener.\n **/\n onReceive(callback) {\n Logger.debug('EventHandler::onReceive');\n this.listeners.push(callback);\n }\n\n /**\n * Unregisters a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n /* eslint-disable camelcase */\n send(msg) {\n if (!msg.silenced) {\n Logger.debug('EventHandler::send', msg);\n }\n new ({\n stfu: ForwardEvent,\n chat: ReceiveChatEvent,\n accept: AcceptSessionEvent,\n podium: PodiumEvent,\n snapshot: SnapshotEvent,\n send_chat: SendChatEvent,\n set_layer: SetLayerEvent,\n set_layout: SetLayoutEvent,\n fetch_room: FetchRoomEvent,\n room_ready: RoomReceivedEvent,\n room_setup: RoomReceivedEvent,\n memberlist: ParticipantListUpdateEvent,\n upload_file: UploadFileEvent,\n delete_file: DeleteFileEvent,\n request_stfu: StfuEvent,\n change_stream: ChangeStreamEvent,\n replace_stream: ReplaceStreamEvent,\n toggle_camera: ToggleCameraEvent,\n stop_playback: StopPlaybackEvent,\n playback_update: ForwardEvent,\n start_playback: StartPlaybackEvent,\n start_stream: StartStreamEvent,\n stop_recording: StopRecordingEvent,\n start_screen_capture: StartScreenCaptureEvent,\n stop_broadcasts: StopBroadcastsEvent,\n start_recording: StartRecordingEvent,\n stop_presenting: StopPresentingEvent,\n start_presenting: StartPresentingEvent,\n stop_annotation: StopAnnotationEvent,\n start_annotation: StartAnnotationEvent,\n clear_front_layer: ClearFrontLayerEvent,\n request_guest_user: RequestGuestUserEvent,\n voice_activity_raw: VoiceActivityEvent,\n start_mixer: StartMixerEvent,\n update_mixer: UpdateMixerEvent,\n lock_meeting: LockMeetingEvent,\n terminate_meeting: TerminateMeetingEvent,\n kick_user: KickUserEvent,\n session_termination: SessionTerminationEvent,\n start_media: StartMediaEvent,\n change_screen_video: ScreenVideoChangeEvent,\n stop_screen_video: ScreenVideoStoppedEvent,\n stop_rtmp: StopRtmpEvent,\n start_rtmp: StartRtmpEvent,\n suspend_virtual_background: VirtualBackgroundEvent,\n audio_device_ended: AudioDeviceEndEvent,\n video_device_ended: VideoDeviceEndEvent,\n all_devices_ended: AllDevicesEndEvent,\n start_pip_cam: StartPipCamEvent,\n stop_pip_cam: StopPipCamEvent,\n update_pip_cam: UpdatePipCamEvent,\n\n capture_error: ForwardEvent,\n voice_activity: ForwardEvent,\n options_update: ForwardEvent,\n ext_not_installed: ForwardEvent,\n broadcasts_update: ForwardEvent,\n presentation_ended: ForwardEvent,\n\n recording: IgnoreEvent,\n ext_cancel: IgnoreEvent,\n ext_installed: IgnoreEvent,\n message_status: IgnoreEvent,\n moderator_info: IgnoreEvent\n }[msg.type] || PublicEvent)(this).handle(msg);\n }\n /* eslint-enable camelcase */\n}\n\nexport default EventHandler;\n","import FeatureDetector from './FeatureDetector.js';\n\n/**\n * Add 'Visoweb' identifier to origin field of sdp. Believe this is still\n * relevant for some remotes.\n **/\nconst addOriginToSDP = sdp => {\n return sdp.replace('o=-', 'o=Visoweb');\n};\n\n/**\n * Add session attribute to disable sfu mode from the client.\n **/\n// eslint-disable-next-line max-statements\nconst addSessionAttributes = sdp => {\n // double check config.allowSafariSFU on runtime\n const splitSDP = sdp.split('\\r\\n');\n const tLineIdx = splitSDP.findIndex(line => line.startsWith('t='));\n let addIndex = 1;\n if (FeatureDetector.canSFU()) {\n // insert sfuLine after tLine (timing), delete 0 elements\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=sfu-capable');\n addIndex++;\n if (FeatureDetector.disallowAudioSyncSrcChange()) {\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=disallow-audio-ssrc-change');\n addIndex++;\n }\n }\n if (FeatureDetector.canDataChannel()) {\n splitSDP.splice(\n tLineIdx + addIndex,\n 0,\n 'a=eyeson-datachan-capable',\n 'a=eyeson-datachan-keepalive',\n 'a=eyeson-sepp-messaging'\n );\n }\n return splitSDP.join('\\r\\n');\n};\n\n// eslint-disable-next-line max-statements\nconst addStereo = sdp => {\n const stereo = FeatureDetector.canStereo();\n const codecMatch = sdp.match(/^a=rtpmap:(\\d+) opus/m);\n if (codecMatch) {\n const fmtpRegExp = new RegExp(`^a=fmtp:${codecMatch[1]} (.+)$`, 'm');\n const fmtpMatch = sdp.match(fmtpRegExp);\n if (fmtpMatch) {\n const options = {};\n fmtpMatch[1].split(';').forEach(entry => {\n const [key, value] = entry.split('=');\n options[key] = value;\n });\n options['stereo'] = stereo ? '1' : '0';\n // options['sprop-stereo'] = '1';\n const result = Object.entries(options)\n .map(([key, value]) => `${key}=${value}`)\n .join(';');\n return sdp.replace(fmtpRegExp, `a=fmtp:${codecMatch[1]} ${result}`);\n }\n }\n return sdp;\n};\n\nconst sendOnly = sdp => {\n const lines = sdp.split('\\r\\n');\n let doIt = false;\n lines.forEach((line, row) => {\n if (line.startsWith('m=audio') || line.startsWith('m=video')) {\n doIt = true;\n } else if (line.startsWith('m=application')) {\n doIt = false;\n } else if (line === 'a=sendrecv' && doIt) {\n lines[row] = 'a=sendonly';\n }\n });\n return lines.join('\\r\\n');\n};\n\nconst getModifiers = options => {\n const modifiers = {\n active: [addStereo],\n passive: [addOriginToSDP, addSessionAttributes]\n };\n if (options.sendOnly === true) {\n modifiers.active.push(sendOnly);\n }\n return modifiers;\n};\n\nexport { getModifiers };\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport { getModifiers } from './SDPModifiers.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceMonitor from './DeviceMonitor.js';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Conference Session is starting a session from active connection,\n * delegating events to registered listeners.\n **/\nclass ConferenceSession {\n /* eslint-disable max-statements */\n constructor(connection, comApi, options = {}) {\n this.options = options;\n this.options.RTCConstraints = Object.assign(\n {},\n this.defaultRTCConstraints,\n { offerToReceiveVideo: !this.options.eco }\n );\n this.accepted = false;\n this.listeners = [];\n this.restarting = false;\n this.connection = connection;\n this.comApi = comApi;\n this.sipSession = null;\n this.startAttempts = 0;\n this.maxStartAttempts = 3;\n this.tryAuthUpdate = true;\n this.tryResume = true;\n this.tryWaitResume = true;\n this.resumeTimer = null;\n this.waitResumeTimer = null;\n\n this.end = this.end.bind(this);\n this.emit = this.emit.bind(this);\n this.setStream = this.setStream.bind(this);\n this.endSession = this.endSession.bind(this);\n this.initSession = this.initSession.bind(this);\n this.handleFailed = this.handleFailed.bind(this);\n this.handleAccept = this.handleAccept.bind(this);\n this.handleUnmute = this.handleUnmute.bind(this);\n this.restartSession = this.restartSession.bind(this);\n this.tryRecoveryFrom = this.tryRecoveryFrom.bind(this);\n this.terminateSession = this.terminateSession.bind(this);\n this.remoteDescriptionUpdate = this.remoteDescriptionUpdate.bind(this);\n }\n /* eslint-enable max-statements */\n\n get peerConnection() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.peerConnection;\n }\n return null;\n }\n\n get localStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.localStream;\n }\n return null;\n }\n\n get remoteStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.remoteStream;\n }\n return null;\n }\n\n get defaultRTCConstraints() {\n return { offerToReceiveAudio: true, offerToReceiveVideo: true };\n }\n\n /**\n * Request stream and invoke session start.\n **/\n start() {\n if (this.options.stream) {\n this.initExternalStream();\n return;\n }\n this.initDeviceMonitor();\n this.initVirtualBackground();\n new MediaStreamBuilder(this.options)\n .start()\n .then(this.initSession)\n .catch(this.handleFailed);\n }\n\n initExternalStream() {\n const audioOnly = !hasVideo(this.options.stream) && this.options.eco;\n const stream = createExternalStream(this.options.stream, audioOnly);\n if (!stream) {\n this.handleFailed({ name: 'invalid_stream' });\n return;\n }\n this.externalStream = stream;\n this.options.audio = hasAudio(stream);\n this.options.video = hasVideo(stream);\n this.initSession(this.externalStream);\n }\n\n initVirtualBackground() {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer();\n this.vbgMixer.changeBackground(type);\n this.options.vbgMixer = this.vbgMixer;\n }\n\n initDeviceMonitor() {\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(msg => this.emit(msg));\n this.options.deviceMonitor = this.deviceMonitor;\n }\n\n buildSessionOptions(stream) {\n const { options } = this;\n if (options.sendOnly === true) {\n options.RTCConstraints = {};\n }\n return {\n stream: stream,\n sendOnly: options.sendOnly,\n SDPModifiers: getModifiers({\n sendOnly: options.sendOnly\n }),\n connection: this.connection,\n handleAccept: this.handleAccept,\n handleUnmute: this.handleUnmute,\n RTCConstraints: options.RTCConstraints,\n remoteDescriptionUpdate: this.remoteDescriptionUpdate,\n mediaOptions: { audio: options.audio, video: options.video }\n };\n }\n\n /**\n * Init session and start stream.\n **/\n // eslint-disable-next-line max-statements\n initSession(stream) {\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n const options = this.buildSessionOptions(stream);\n this.sipSession = this.connection.startSession(options);\n this.onUnmute(stream);\n this.sipSession.onEvent(event => {\n if (event.type === 'accepted') {\n this.adjustVideoPodium();\n } else if (event.type === 'resumed') {\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n } else if (event.type === 'terminated') {\n this.handleTermination(event.reason, event.code);\n }\n });\n if (this.externalStream) {\n this.connection.hasExternalStream = true;\n }\n\n if (window) {\n window.addEventListener(\n FeatureDetector.isIOSDevice() ? 'pagehide' : 'beforeunload',\n this.endSession\n );\n }\n }\n\n /**\n * End a conference session.\n **/\n end() {\n this.listeners = [];\n this.endSession();\n this.accepted = false;\n this.sipSession = null;\n this.connection = null;\n }\n\n /**\n * Before terminating the session, remove all listeners and stop all\n * streams.\n **/\n endSession() {\n Logger.debug('ConferenceSession::endSession');\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if (this.sipSession) {\n this.sipSession.removeAllListeners();\n this.terminateSession();\n }\n if (this.connection) {\n this.connection.close();\n }\n if (this.deviceMonitor) {\n this.deviceMonitor.destroy();\n }\n }\n /* eslint-enable max-statements */\n\n /**\n * Depending on the state of the session, this function may send a CANCEL\n * request, a non-2xx final response, a BYE request, or even no request at\n * all.\n * https://sipjs.com/api/0.7.0/session/#terminateoptions\n **/\n terminateSession() {\n Logger.debug('ConferenceSession::terminateSession');\n try {\n this.sipSession.terminate();\n } catch (error) {\n Logger.error(error);\n }\n }\n\n /**\n * Replace the active stream with newStream and emit 'stream_update' with the\n * new stream.\n *\n * In case of an error (as will be the case in current EDGE (May 2019))\n * report back the current streams.\n **/\n // eslint-disable-next-line max-statements\n async setStream(newStream) {\n if (!this.sipSession) {\n return null;\n }\n try {\n const { sessionDescriptionHandler } = this.sipSession;\n const streams = await sessionDescriptionHandler.setStream(newStream);\n this.stopPresentingSet = false;\n if (this.micMixer && this.micMixer.active) {\n streams.newStream = this.micMixer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n if (this.videoPlayer && this.videoPlayer.isStreaming()) {\n streams.newStream = this.videoPlayer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n this.onUnmute(streams.newStream);\n this.emit({\n type: 'stream_update',\n localStream: streams.newStream,\n stream: streams.remoteStream\n });\n return streams.newStream;\n } catch (error) {\n Logger.error('ConferenceSession::setStream', error);\n this.emit({\n type: 'stream_update',\n localStream: this.localStream,\n stream: this.remoteStream\n });\n return this.localStream;\n }\n }\n\n /**\n * Trigger local track unmuted event.\n * Used to prevent iOS issue black video after incoming call.\n */\n onUnmute(stream) {\n if (stream) {\n stream.getTracks().forEach(track => {\n track.onunmute = () =>\n this.emit({ type: 'local_track_unmuted', track: track });\n });\n }\n }\n\n /**\n * Register a session monitor.\n **/\n setMonitor(monitor) {\n this.monitor = monitor;\n }\n\n /**\n * Forward accept event, build expected message format.\n **/\n handleAccept(remoteStream) {\n if (this.monitor) {\n this.monitor.observe(this.peerConnection);\n }\n if (!this.accepted) {\n this.emit({ type: 'accept', session: this.sipSession });\n this.accepted = true;\n }\n if (remoteStream) {\n this.emit({ type: 'stream_update', stream: remoteStream });\n }\n }\n\n handleUnmute(track) {\n this.emit({ type: 'track_unmuted', track: track });\n }\n\n remoteDescriptionUpdate(sdpWrapper) {\n Logger.debug('ConferenceSession::remoteDescriptionUpdate', sdpWrapper.sdp);\n let sfu = false;\n\n const splitSDP = sdpWrapper.sdp.split('\\r\\n');\n const sfuLine = splitSDP.find(line => line.startsWith('a=sfu-mode'));\n\n if (sfuLine) {\n sfu = sfuLine.includes('on');\n }\n\n this.emit({ type: 'remote_description_update', update: { sfu: sfu } });\n }\n\n /**\n * Once we have accepted the session, we need to adjust the video podium,\n * according to the current options.\n **/\n adjustVideoPodium() {\n this.send({ type: 'mute_video', on: !this.options.video });\n }\n\n /**\n * On Termination log to debug what happened.\n **/\n // eslint-disable-next-line max-statements\n handleTermination(reason, code) {\n Logger.debug('ConfSession::handleTermination', reason, code);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if ((reason === 'bye' && code === 200) || reason === 'terminate') {\n this.handleExit();\n } else if (reason === 'disconnect') {\n if (code === -1) {\n if (this.tryAuthUpdate) {\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data =>\n this.connection.updateAuthAndRestartSession(data)\n );\n return;\n } else if (this.tryWaitResume && this.connection) {\n this.tryWaitResume = false;\n this.waitResumeTimer = setTimeout(() => {\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n }, 5000);\n this.resumeTimer = setTimeout(() => {\n this.handleFailed({ name: 503 });\n }, 15000);\n return;\n }\n this.handleFailed({ name: 503 });\n } else {\n if (this.tryResume && this.connection) {\n this.tryResume = false;\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n this.resumeTimer = setTimeout(\n () => this.handleFailed({ name: 410 }),\n 10000\n );\n return;\n }\n this.handleFailed({ name: 410 });\n }\n } else {\n this.handleFailed({ name: code });\n }\n if (!this.restarting) {\n this.emit({ type: 'session_termination' });\n }\n }\n\n /**\n * Forward exit event\n **/\n handleExit() {\n this.emit({ type: 'exit', reason: 'bye' });\n }\n\n /**\n * Forward failed event unless we attempt a recovery.\n **/\n handleFailed(reason) {\n Logger.warn('ConferenceSession::handleFailed: ', reason);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n let key = 'Desert';\n if (reason && reason.name) {\n key = reason.name;\n }\n\n if (this.tryRecoveryFrom(key)) {\n return;\n }\n\n const name =\n {\n NotFoundError: 'devices',\n NotAllowedError: 'permission',\n DevicesNotFoundError: 'devices',\n PermissionDeniedError: 'permission',\n NotReadableError: 'not_readable',\n 403: 'session_in_use',\n 410: 'abrupt_disconnect',\n 413: 'request_too_large',\n 426: 'ice_error',\n 486: 'session_in_use',\n 607: 'meeting_locked'\n }[key] || 'session_failed';\n\n this.emit({\n type: 'error',\n name: name,\n code: this.errorCodeName(key, name)\n });\n }\n\n errorCodeName(key, name) {\n if (\n [\n 'permission',\n 'devices',\n 'not_readable',\n 'meeting_locked',\n 'session_in_use',\n 'transport_error'\n ].includes(name)\n ) {\n return '';\n }\n return String(key);\n }\n\n /**\n * Conference session may recover from `failure` if a recovery for that\n * `failure` is known and its condition applies.\n **/\n tryRecoveryFrom(failure) {\n Logger.debug('ConferenceSession::tryRecoveryFrom: ', failure);\n\n const recovery = {\n 404: {\n condition: () => this.startAttempts < this.maxStartAttempts,\n action: () => this.restartSession()\n }\n }[failure];\n\n if (this.startAttempts >= this.maxStartAttempts) {\n this.restarting = false;\n return false;\n }\n\n return Boolean(recovery && recovery.condition() && recovery.action());\n }\n\n /**\n * End the previously started session, but keep already registered listeners.\n **/\n restartSession() {\n Logger.debug('ConferenceSession::restartSession: ', this.startAttempts);\n this.restarting = true;\n this.startAttempts += 1;\n\n setTimeout(() => {\n this.endSession();\n this.start();\n }, 1000);\n\n return true;\n }\n\n /**\n * Register event listeners.\n **/\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n /**\n * Transport a message over the connection.\n **/\n send(msg) {\n return this.connection.send(msg);\n }\n}\n\nexport default ConferenceSession;\n\n/* eslint-enable max-lines */\n","import Logger from '../Logger.js';\n\nconst Status = {\n NO_CONNECTION: 3,\n BAD: 2,\n OK: 1,\n GOOD: 0\n};\n\nconst calculateStatus = (\n packetLossRate = 0,\n jitter = 0,\n roundTripTime = 0,\n nackRate = 0\n) => {\n if (\n roundTripTime > 1 ||\n packetLossRate > 0.2 ||\n jitter > 0.5 ||\n nackRate > 0.2\n ) {\n return Status.BAD;\n }\n if (\n roundTripTime > 0.3 ||\n packetLossRate > 0.1 ||\n jitter > 0.3 ||\n nackRate > 0.1\n ) {\n return Status.OK;\n }\n return Status.GOOD;\n};\n\nconst getOldestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time < result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst getNewestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time > result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst addHistory = (history, entry) => {\n if (history.length < 3) {\n history.push(Object.assign({}, entry));\n return;\n }\n Object.assign(getOldestHistoryEntry(history), entry);\n};\n\n// eslint-disable-next-line max-statements\nconst getHistoryAverage = history => {\n const { length } = history;\n const result = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n bitrateSend: 0,\n bitrateRecv: 0,\n status: Status.GOOD\n };\n const newest = getNewestHistoryEntry(history);\n for (const entry of history) {\n result.jitter += entry.jitter;\n result.packetLoss += entry.packetLoss;\n result.roundTripTime += entry.roundTripTime;\n result.nack += entry.nack;\n result.bitrateSend += entry.bitrateSend;\n result.bitrateRecv += entry.bitrateRecv;\n }\n result.jitter = newest.jitter === null ? null : result.jitter / length;\n result.packetLoss =\n newest.packetLoss === null ? null : result.packetLoss / length;\n result.roundTripTime =\n newest.roundTripTime === null ? null : result.roundTripTime / length;\n result.nack = newest.nack === null ? null : result.nack / length;\n result.bitrateSend /= length;\n result.bitrateRecv /= length;\n result.status = calculateStatus(\n result.packetLoss,\n result.jitter,\n result.roundTripTime,\n result.nack\n );\n return result;\n};\n\nclass ConnectionStatistics {\n constructor() {\n this.peerConnection = null;\n this.timer = null;\n this.listeners = [];\n this.history = [];\n this.entry = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n time: 0,\n bitrateSend: 0,\n bitrateRecv: 0\n };\n this.lastStat = {\n time: null,\n bytesSent: null,\n bytesReceived: null,\n audio: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null\n },\n in: {\n packetsReceived: null\n }\n },\n video: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null,\n nackCount: null\n },\n in: {\n bytesReceived: null\n }\n }\n };\n this.boundPrintStats = this.printStats.bind(this);\n }\n\n init(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n // eslint-disable-next-line max-statements\n async printStats() {\n const { peerConnection, entry, lastStat, history } = this;\n const stats = await peerConnection.getStats();\n const now = Date.now();\n let statsCurrentRoundTripTime = null;\n Object.keys(entry).forEach(key => {\n entry[key] = 0;\n });\n entry.jitter = null;\n entry.packetLoss = null;\n entry.roundTripTime = null;\n entry.nack = null;\n entry.time = now;\n\n // eslint-disable-next-line max-statements, complexity\n stats.forEach(report => {\n if (report.type === 'inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const received = Math.max(\n report.bytesReceived - lastStat[kind].in.bytesReceived,\n 0\n );\n entry.bitrateRecv += (received * 8) / diff;\n }\n lastStat[kind].in.bytesReceived = report.bytesReceived;\n } else if (report.type === 'outbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const sent = report.bytesSent - lastStat[kind].out.bytesSent;\n entry.bitrateSend += (sent * 8) / diff;\n }\n lastStat[kind].out.bytesSent = report.bytesSent;\n } else if (report.type === 'remote-inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat[kind]) {\n const outbound = stats.get(report.localId);\n const hasRTT = typeof report.roundTripTime !== 'undefined';\n const hasJitter = typeof report.jitter !== 'undefined';\n const hasPacketLoss = typeof report.packetsLost !== 'undefined';\n const hasNackCount = typeof outbound.nackCount !== 'undefined';\n if (lastStat.time) {\n const lost = report.packetsLost - lastStat[kind].out.packetsLost;\n const packets =\n outbound.packetsSent - lastStat[kind].out.packetsSent;\n const packetLossRate = packets > 0 ? lost / packets : 0;\n entry.jitter = hasJitter\n ? Math.max(entry.jitter, packets > 0 ? report.jitter : 0)\n : null;\n entry.packetLoss = hasPacketLoss\n ? Math.max(entry.packetLoss, packetLossRate)\n : null;\n entry.roundTripTime = hasRTT\n ? Math.max(entry.roundTripTime, report.roundTripTime)\n : null;\n if (kind === 'video') {\n const nack = outbound.nackCount - lastStat[kind].out.nackCount;\n const nackRate = packets > 0 ? nack / packets : 0;\n entry.nack = hasNackCount ? Math.max(entry.nack, nackRate) : null;\n }\n }\n if (kind === 'video') {\n lastStat[kind].out.nackCount = outbound.nackCount;\n }\n lastStat[kind].out.packetsSent = outbound.packetsSent;\n lastStat[kind].out.packetsLost = report.packetsLost;\n }\n } else if (\n report.type === 'candidate-pair' &&\n report.state === 'succeeded' &&\n 'currentRoundTripTime' in report\n ) {\n statsCurrentRoundTripTime = report.currentRoundTripTime;\n }\n });\n if (entry.roundTripTime === null && statsCurrentRoundTripTime !== null) {\n entry.roundTripTime = statsCurrentRoundTripTime;\n }\n addHistory(history, entry);\n const average = getHistoryAverage(history);\n if (navigator.onLine === false) {\n average.status = Status.BAD;\n }\n if (\n ['disconnected', 'failed', 'closed'].includes(\n peerConnection.iceConnectionState\n )\n ) {\n average.status = Status.NO_CONNECTION;\n }\n this.emit(average);\n lastStat.time = now;\n }\n\n getCurrentStatistics() {\n return getHistoryAverage(this.history);\n }\n\n onUpdate(listener) {\n const { listeners, timer } = this;\n if (listeners.length === 0 && timer === null) {\n this.timer = setInterval(this.boundPrintStats, 1000);\n this.peerConnection.addEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n window.addEventListener('offline', this.boundPrintStats);\n }\n listeners.push(listener);\n }\n\n emit(statistics) {\n this.listeners.forEach(listener => {\n try {\n listener(statistics);\n } catch (err) {\n Logger.error('ConnectionStatistics::emit', err);\n }\n });\n }\n\n destroy() {\n clearInterval(this.timer);\n window.removeEventListener('offline', this.boundPrintStats);\n if (this.peerConnection) {\n this.peerConnection.removeEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n this.peerConnection = null;\n }\n this.timer = null;\n this.history.length = 0;\n this.listeners.length = 0;\n }\n}\n\nConnectionStatistics.Status = Status;\n\nexport default ConnectionStatistics;\n","import Logger from './Logger.js';\nimport ConnectionStatistics from './utils/ConnectionStatistics.js';\n/**\n * Connection Monitor informs about on and offline and ice state changes.\n * I.e. when the connection to the conf server (from a webRTC point of view)\n * is breaking up or degrading.\n **/\nclass ConnectionMonitor {\n constructor() {\n this.pc = null;\n this.statistics = new ConnectionStatistics();\n this.listeners = [];\n this.disconnectTimer = null;\n this.prevIceState = 'initial';\n this.onOffline = this.onOffline.bind(this);\n this.handleIceStateChange = this.handleIceStateChange.bind(this);\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.addEventListeners();\n }\n\n addEventListeners() {\n window.addEventListener('offline', this.onOffline);\n }\n\n onOffline() {\n this.emit({ type: 'offline' });\n }\n\n observe(peerConnection) {\n if (this.pc) {\n return;\n }\n this.pc = peerConnection;\n this.pc.oniceconnectionstatechange = this.handleIceStateChange;\n this.pc.onconnectionstatechange = this.handleConnectionStateChange;\n this.statistics.init(peerConnection);\n this.emit({ type: 'statistics_ready', statistics: this.statistics });\n }\n\n destroy() {\n const { pc, statistics } = this;\n clearTimeout(this.disconnectTimer);\n if (statistics) {\n statistics.destroy();\n this.statistics = null;\n }\n if (pc) {\n pc.onconnectionstatechange = null;\n pc.oniceconnectionstatechange = null;\n this.pc = null;\n }\n window.removeEventListener('offline', this.onOffline);\n }\n\n onEvent(listener) {\n this.listeners.push(listener);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n handleConnectionStateChange(event) {\n if (event.currentTarget) {\n Logger.warn(\n 'connectionStateChange: ',\n event.currentTarget.connectionState\n );\n }\n }\n\n /* eslint-disable max-statements */\n handleIceStateChange(event) {\n // event doesn't have a current target in EDGE\n if (!event.currentTarget) {\n return;\n }\n\n const { iceConnectionState: currentIceState } = event.currentTarget;\n\n if (currentIceState === 'disconnected') {\n this.emit({ type: 'warning', name: 'ice_disconnected' });\n // As of Chrome 76 failed is no longer emitted\n // https://bugs.chromium.org/p/chromium/issues/detail?id=982793&q=ice%20failed&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified\n //\n // We use a 2 seconds delay to re-check the connection.\n clearTimeout(this.disconnectTimer);\n this.disconnectTimer = window.setTimeout(() => {\n if (this.pc && this.pc.iceConnectionState !== 'connected') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Goldfinger' });\n }\n }, 2000);\n }\n\n if (currentIceState === 'failed') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Thunderball' });\n }\n\n if (\n this.prevIceState === 'disconnected' &&\n ['completed', 'connected'].includes(currentIceState)\n ) {\n this.emit({ type: 'clear_warning', name: 'ice_disconnected' });\n }\n\n this.prevIceState = currentIceState;\n }\n /* eslint-enable max-statements */\n}\n\nexport default ConnectionMonitor;\n","var adapters = {\n logger: self.console,\n WebSocket: self.WebSocket\n};\n\nvar logger = {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now());\n adapters.logger.log(\"[ActionCable]\", ...messages);\n }\n }\n};\n\nconst now = () => (new Date).getTime();\n\nconst secondsSince = time => (now() - time) / 1e3;\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this);\n this.connection = connection;\n this.reconnectAttempts = 0;\n }\n start() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n addEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);\n }\n }\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(\"ConnectionMonitor stopped\");\n }\n }\n isRunning() {\n return this.startedAt && !this.stoppedAt;\n }\n recordPing() {\n this.pingedAt = now();\n }\n recordConnect() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n logger.log(\"ConnectionMonitor recorded connect\");\n }\n recordDisconnect() {\n this.disconnectedAt = now();\n logger.log(\"ConnectionMonitor recorded disconnect\");\n }\n startPolling() {\n this.stopPolling();\n this.poll();\n }\n stopPolling() {\n clearTimeout(this.pollTimeout);\n }\n poll() {\n this.pollTimeout = setTimeout((() => {\n this.reconnectIfStale();\n this.poll();\n }), this.getPollInterval());\n }\n getPollInterval() {\n const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));\n const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;\n const jitter = jitterMax * Math.random();\n return staleThreshold * 1e3 * backoff * (1 + jitter);\n }\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);\n } else {\n logger.log(\"ConnectionMonitor reopening\");\n this.connection.reopen();\n }\n }\n }\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt;\n }\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;\n }\n disconnectedRecently() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n }\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout((() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);\n this.connection.reopen();\n }\n }), 200);\n }\n }\n}\n\nConnectionMonitor.staleThreshold = 6;\n\nConnectionMonitor.reconnectionBackoffRate = .15;\n\nvar INTERNAL = {\n message_types: {\n welcome: \"welcome\",\n disconnect: \"disconnect\",\n ping: \"ping\",\n confirmation: \"confirm_subscription\",\n rejection: \"reject_subscription\"\n },\n disconnect_reasons: {\n unauthorized: \"unauthorized\",\n invalid_request: \"invalid_request\",\n server_restart: \"server_restart\"\n },\n default_mount_path: \"/cable\",\n protocols: [ \"actioncable-v1-json\", \"actioncable-unsupported\" ]\n};\n\nconst {message_types: message_types, protocols: protocols} = INTERNAL;\n\nconst supportedProtocols = protocols.slice(0, protocols.length - 1);\n\nconst indexOf = [].indexOf;\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this);\n this.consumer = consumer;\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ConnectionMonitor(this);\n this.disconnected = true;\n }\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n }\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);\n return false;\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);\n if (this.webSocket) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n }\n close({allowReconnect: allowReconnect} = {\n allowReconnect: true\n }) {\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isOpen()) {\n return this.webSocket.close();\n }\n }\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`);\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error);\n } finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n }\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol;\n }\n }\n isOpen() {\n return this.isState(\"open\");\n }\n isActive() {\n return this.isState(\"open\", \"connecting\");\n }\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;\n }\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0;\n }\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase();\n }\n }\n }\n return null;\n }\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this);\n this.webSocket[`on${eventName}`] = handler;\n }\n }\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {};\n }\n }\n}\n\nConnection.reopenDelay = 500;\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) {\n return;\n }\n const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`);\n return this.close({\n allowReconnect: reconnect\n });\n\n case message_types.ping:\n return this.monitor.recordPing();\n\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier);\n return this.subscriptions.notify(identifier, \"connected\");\n\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close(event) {\n logger.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error() {\n logger.log(\"WebSocket onerror event\");\n }\n};\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key];\n object[key] = value;\n }\n }\n return object;\n};\n\nclass Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer;\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n perform(action, data = {}) {\n data.action = action;\n return this.send(data);\n }\n send(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n }\n unsubscribe() {\n return this.consumer.subscriptions.remove(this);\n }\n}\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions;\n this.pendingSubscriptions = [];\n }\n guarantee(subscription) {\n if (this.pendingSubscriptions.indexOf(subscription) == -1) {\n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`);\n this.pendingSubscriptions.push(subscription);\n } else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`);\n }\n this.startGuaranteeing();\n }\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`);\n this.pendingSubscriptions = this.pendingSubscriptions.filter((s => s !== subscription));\n }\n startGuaranteeing() {\n this.stopGuaranteeing();\n this.retrySubscribing();\n }\n stopGuaranteeing() {\n clearTimeout(this.retryTimeout);\n }\n retrySubscribing() {\n this.retryTimeout = setTimeout((() => {\n if (this.subscriptions && typeof this.subscriptions.subscribe === \"function\") {\n this.pendingSubscriptions.map((subscription => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`);\n this.subscriptions.subscribe(subscription);\n }));\n }\n }), 500);\n }\n}\n\nclass Subscriptions {\n constructor(consumer) {\n this.consumer = consumer;\n this.guarantor = new SubscriptionGuarantor(this);\n this.subscriptions = [];\n }\n create(channelName, mixin) {\n const channel = channelName;\n const params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n const subscription = new Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n }\n add(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.subscribe(subscription);\n return subscription;\n }\n remove(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n }\n reject(identifier) {\n return this.findAll(identifier).map((subscription => {\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n return subscription;\n }));\n }\n forget(subscription) {\n this.guarantor.forget(subscription);\n this.subscriptions = this.subscriptions.filter((s => s !== subscription));\n return subscription;\n }\n findAll(identifier) {\n return this.subscriptions.filter((s => s.identifier === identifier));\n }\n reload() {\n return this.subscriptions.map((subscription => this.subscribe(subscription)));\n }\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));\n }\n notify(subscription, callbackName, ...args) {\n let subscriptions;\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [ subscription ];\n }\n return subscriptions.map((subscription => typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined));\n }\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription);\n }\n }\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`);\n this.findAll(identifier).map((subscription => this.guarantor.forget(subscription)));\n }\n sendCommand(subscription, command) {\n const {identifier: identifier} = subscription;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n }\n}\n\nclass Consumer {\n constructor(url) {\n this._url = url;\n this.subscriptions = new Subscriptions(this);\n this.connection = new Connection(this);\n }\n get url() {\n return createWebSocketURL(this._url);\n }\n send(data) {\n return this.connection.send(data);\n }\n connect() {\n return this.connection.open();\n }\n disconnect() {\n return this.connection.close({\n allowReconnect: false\n });\n }\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n }\n}\n\nfunction createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url();\n }\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n}\n\nfunction createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url);\n}\n\nfunction getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport { Connection, ConnectionMonitor, Consumer, INTERNAL, Subscription, SubscriptionGuarantor, Subscriptions, adapters, createConsumer, createWebSocketURL, getConfig, logger };\n","import Logger from './Logger.js';\nimport { createConsumer } from '@rails/actioncable';\n\n/**\n * Registers with provided token and room.\n **/\nclass ActionCableConnection {\n constructor(uri) {\n this.channels = {};\n this.onMessageHandler = this.defaultMessageHandler;\n\n this.onReceived = this.onReceived.bind(this);\n this.offMessage = this.offMessage.bind(this);\n this.onConnected = this.onConnected.bind(this);\n this.startSession = this.startSession.bind(this);\n this.onDisconnected = this.onDisconnected.bind(this);\n\n this.cable = createConsumer(uri);\n }\n\n startSession() {\n this.channels.RoomChannel = this.cable.subscriptions.create(\n { channel: 'RoomChannel' },\n {\n connected: this.onConnected,\n received: this.onReceived,\n disconnected: this.onDisconnected\n }\n );\n this.channels.UserChannel = this.cable.subscriptions.create(\n { channel: 'UserChannel' },\n { received: this.onReceived }\n );\n }\n\n onConnected() {\n if (this.disconnectTimestamp) {\n this.handleReconnect();\n }\n Logger.debug('ActionCableConnection::onConnected');\n }\n\n handleReconnect() {\n this.onMessageHandler({ type: 'reconnect' });\n }\n\n onReceived(msg) {\n Logger.debug('ActionCableConnection::onReceived', msg);\n msg._src = 'actioncable';\n this.onMessageHandler(msg);\n }\n\n onDisconnected() {\n Logger.debug('ActionCableConnection::onDisconnected');\n this.disconnectTimestamp = Date.now();\n this.onMessageHandler({ type: 'disconnect' });\n }\n\n onMessage(onMessageHandler) {\n if (typeof onMessageHandler !== 'function') {\n return;\n }\n this.onMessageHandler = onMessageHandler;\n }\n\n offMessage() {\n this.onMessageHandler = this.defaultMessageHandler;\n }\n\n defaultMessageHandler(msg) {\n Logger.debug('ActionCableConnection::defaultMessageHandler: ', msg);\n }\n\n /**\n * msg has the format { channel: 'xyz', type: 'abc' }\n **/\n send({ channel = 'RoomChannel', type = 'ping' }) {\n const subscription = this.channels[channel];\n\n if (!subscription) {\n Logger.warn(\n 'ActionCableConnection::send no subscription found! ',\n channel\n );\n return;\n }\n\n subscription.perform(type);\n }\n\n close() {\n this.cable.disconnect();\n this.offMessage();\n this.channels = {};\n this.cable = null;\n }\n}\n\nexport default ActionCableConnection;\n","import config from './config.js';\nimport options from './options.js';\nimport ComApi from './ComApi.js';\nimport Logger from './Logger.js';\nimport throttle from './utils/throttle.js';\nimport EventHandler from './EventHandler.js';\nimport ConferenceSession from './ConferenceSession.js';\nimport ConnectionMonitor from './ConnectionMonitor.js';\nimport ActionCableConnection from './ActionCableConnection.js';\n\n/**\n * Initial connection status change updater.\n **/\nconst updateStatus = (eyeson, status) =>\n eyeson.core.eventHandler.send({\n type: 'connection',\n connectionStatus: status\n });\n\nconst keepRoomAlive = eyeson => {\n eyeson.core.keepRoomAlive = setInterval(() => {\n eyeson.core.rtConnection.send({ type: 'user_joins' });\n }, 30000);\n};\n\n/**\n * Remove this once WSS messages arrive reliably.\n **/\nconst pollingFallback = eyeson => {\n let counter = 1;\n eyeson.core.pollingFallbackInterval = setInterval(() => {\n const { core } = eyeson;\n if (counter === 200) {\n Logger.debug(\n 'eyeson::pollingFallback: max count exceeded, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n if (core.eventHandler._connection) {\n Logger.debug(\n 'eyeson::pollingFallback: connection set, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n core.comApi.getRoom(data => {\n if (data.ready === true) {\n Logger.debug('eyeson::pollingFallback: room ready');\n core.eventHandler.send({ type: 'room_ready', content: data });\n return;\n }\n Logger.debug('eyeson::pollingFallback: room not ready', counter);\n counter += 1;\n });\n }, 5000);\n};\n\n/**\n * Load initial room data.\n **/\nconst loadInitialInfos = eyeson => {\n const { core } = eyeson;\n const { broadcasts } = core.eventHandler._rtData;\n if (broadcasts) {\n core.eventHandler.send({\n type: 'broadcasts_update',\n broadcasts: broadcasts\n });\n }\n};\n\n/**\n * Join a session and listen to any events. eventHandler keeps all the\n * stuff.\n **/\n// eslint-disable-next-line max-statements\nconst joinSession = (eyeson, mediaOptions) => {\n const { core } = eyeson;\n if (!core.eventHandler._connection) {\n Logger.error(\n 'You tried to join a session that is not yet available. ' +\n 'Before calling join, a connection status of connected has ' +\n 'to be received.'\n );\n return;\n }\n\n const session = new ConferenceSession(\n core.eventHandler._connection,\n core.comApi,\n mediaOptions\n );\n session.setMonitor(core.eventHandler.monitor);\n core.eventHandler.session = session;\n\n session.start();\n loadInitialInfos(eyeson);\n clearInterval(core.keepRoomAlive);\n eyeson.session = session;\n};\n\n/**\n * Initialise our connections.\n **/\nconst prepareConnection = eyeson => {\n const { core } = eyeson;\n updateStatus(eyeson, 'fetch_room');\n\n core.eventHandler.eyeson = eyeson;\n\n core.comApi.onError(() =>\n core.eventHandler.send({ type: 'warning', name: 'error:comapi' })\n );\n\n // eslint-disable-next-line max-statements\n core.comApi.getRoom(data => {\n if (data.error) {\n Logger.warn('eyeson::prepareConnection', data.error);\n updateStatus(eyeson, 'access_denied');\n return;\n }\n updateStatus(eyeson, 'received_room');\n\n core.rtConnection = new ActionCableConnection(data.links.websocket);\n core.eventHandler.rtConnection = core.rtConnection;\n core.rtConnection.startSession();\n\n core.eventHandler.monitor = new ConnectionMonitor();\n core.eventHandler.api = core.comApi;\n keepRoomAlive(eyeson);\n pollingFallback(eyeson);\n });\n};\n\n/****** The following represents the public API, adapt with caution! *********/\nclass eyesonClass {\n /****** Public data ********************************************************/\n constructor() {\n /**\n * The room, user and links to be updated when fetched from the ComAPI.\n */\n this.config = config;\n this.core = { eventHandler: new EventHandler() };\n this.room = {};\n this.user = {};\n this.links = {};\n this.options = options;\n }\n /****** Public helper methods **********************************************/\n\n /**\n * Attach event listener\n **/\n onEvent(listener) {\n if (typeof listener !== 'function') {\n Logger.error(\n 'A listener to eyeson events has to be of type function.' +\n ' The argument passed to onEvent is of type ' +\n typeof listener +\n '.'\n );\n return;\n }\n this.core.eventHandler.onReceive(listener);\n }\n\n /**\n * Remove event listener\n **/\n offEvent(listener) {\n this.core.eventHandler.removeListener(listener);\n }\n\n /**\n * Prepare required core connections.\n **/\n connect(token) {\n Logger.debug('eyeson::connect', token);\n this.core.comApi = new ComApi(this.config.api, token);\n prepareConnection(this);\n }\n\n /**\n * Join a session with supplied mediaOptions (audio/video).\n **/\n join(mediaOptions) {\n Logger.debug('eyeson::join', mediaOptions);\n joinSession(this, mediaOptions);\n }\n\n /**\n * Start an eyeson room meeting.\n **/\n start(token, mediaOptions = { audio: true, video: true }) {\n Logger.debug('eyeson::start');\n const joinOnConnect = event => {\n if (event.connectionStatus !== 'ready') {\n return;\n }\n this.offEvent(joinOnConnect);\n this.join(mediaOptions);\n };\n this.onEvent(joinOnConnect);\n this.connect(token);\n }\n\n /**\n * Destroy and cleanup a session.\n **/\n destroy() {\n const { core } = this;\n Logger.debug('eyeson::destroy');\n clearInterval(core.keepRoomAlive);\n clearInterval(core.pollingFallbackInterval);\n core.eventHandler.destroy();\n core.eventHandler = new EventHandler();\n }\n\n /**\n * Receive an event from client.\n **/\n send(msg) {\n msg._src = 'client';\n return this.core.eventHandler.send(msg);\n }\n\n /**\n * When invoked repeatedly, will only actually call the original function at\n * most once per every wait milliseconds.\n **/\n throttledSend(msg) {\n if (!this._throttledSend) {\n this._throttledSend = throttle(message => this.send(message), 500);\n }\n\n return this._throttledSend(msg);\n }\n\n /**\n * Create a new instance\n */\n createInstance() {\n // eslint-disable-next-line new-cap\n return new eyesonClass();\n }\n}\n\n// eslint-disable-next-line new-cap\nconst instance = new eyesonClass();\n\nexport default instance;\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import Logger from '../Logger.js';\n\nclass GiphyApi {\n constructor(roomUrl) {\n this.roomUrl = roomUrl;\n }\n\n search(query) {\n return this.request(`${this.roomUrl}/search?q=${query}`).then(\n ({ data }) => data\n );\n }\n\n random() {\n return this.request(`${this.roomUrl}/random`).then(({ data }) => data);\n }\n\n trending() {\n return this.request(`${this.roomUrl}/trending?limit=9`).then(({ data }) =>\n this.staff().then(staffGifs => [...data, ...staffGifs])\n );\n }\n\n staff() {\n return this.request(`${this.roomUrl}/staff`).then(({ data }) => data);\n }\n\n randomForQuery(query) {\n return new Promise((res, rej) => {\n this.search(query)\n .then(data => {\n if (!Array.isArray(data)) {\n return [];\n }\n return data.filter(img => img.images.original_mp4.mp4_size >= 40000);\n })\n .then(largerGifs => {\n if (largerGifs.length === 0) {\n throw new TypeError('No data found');\n }\n res(largerGifs[Math.floor(Math.random() * largerGifs.length)]);\n })\n .catch(rej);\n });\n }\n\n request(url) {\n return fetch(new Request(url))\n .then(response => response.json())\n .catch(error => {\n Logger.warn('GiphyApi', url, error);\n return { data: [] };\n });\n }\n}\n\nexport default GiphyApi;\n","import Logger from './Logger.js';\n\nconst updateInterval = 100;\n\n/**\n * Sound Meter that generates a number correlated to audio volume. The meter\n * itself displays nothing, but it makes the instantaneous and time-decaying\n * volumes available for inspection. It also reports on the fraction of samples\n * that were at or near the top of the measurement range.\n **/\nclass SoundMeter {\n // eslint-disable-next-line max-statements\n constructor() {\n this.level = 0;\n this.instant = 0;\n this.silenceDuration = 0;\n this.intervalCounter = 0;\n this.track = null;\n this.context = null;\n this.source = null;\n this.analyser = null;\n this.volumes = null;\n this.listener = [];\n this.timer = null;\n this.errorTimer = null;\n this.boundOnTrackEnded = this.onTrackEnded.bind(this);\n this.initError = false;\n this.init();\n }\n\n /**\n * Initialize audio context and prepare script processor to read input\n * channel data.\n **/\n init() {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof AudioContext === 'undefined') {\n Logger.error(\n 'AudioContext is not available. Probably the current' +\n ' user agent does not support this feature. Use the feature detector' +\n ' to hide not supported elements. Any call on onUpdate will not' +\n ' send values.'\n );\n return;\n }\n this.context = new AudioContext();\n\n this.context.onstatechange = ({ target }) => {\n if (target.state === 'suspended') {\n Logger.error('SoundMeter::init AudioContext: ', target.state);\n }\n };\n }\n\n /**\n * Connect to a media stream.\n **/\n // eslint-disable-next-line max-statements\n connectToSource(stream) {\n if (!this.context) {\n return this;\n }\n if (!stream || stream.getAudioTracks().length < 1) {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n Logger.debug('SoundMeter::connectToSource', stream);\n [this.track] = stream.getAudioTracks();\n if (this.track.readyState !== 'live') {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n this.track.addEventListener('ended', this.boundOnTrackEnded);\n this.source = this.context.createMediaStreamSource(stream);\n const analyser = this.context.createAnalyser();\n analyser.fftSize = 512;\n analyser.minDecibels = -127;\n analyser.maxDecibels = 0;\n analyser.smoothingTimeConstant = 0.5;\n this.source.connect(analyser);\n this.analyser = analyser;\n this.volumes = new Uint8Array(analyser.frequencyBinCount);\n if (!this.running && this.listener.length > 0) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n return this;\n }\n\n /**\n * Read audio level. Avoids triggering a re-render of the device-dialog\n * when the change is below 1% which wouldn't be noticable anyways.\n *\n * NOTE: When an USB Microphone is abruptly disconnected. The\n * intervalCounter reacts: when switching to a different mic, it seems to\n * take a bit to not return 0.00 for the audio level.\n **/\n // eslint-disable-next-line max-statements\n analyse() {\n const { analyser, volumes, level } = this;\n if (!analyser) {\n return;\n }\n analyser.getByteFrequencyData(volumes);\n let volumeSum = 0;\n for (const volume of volumes) {\n volumeSum += volume;\n }\n const averageVolume = volumeSum / volumes.length;\n const instant = Math.min(Math.round((averageVolume * 100) / 127), 100);\n\n // Handle microphone disconnect\n if (level === 0 && instant === 0 && this.intervalCounter === 10) {\n this.silenceDuration++;\n if (this.silenceDuration > 30 && !this.errorTimer) {\n this.errorTimer = setTimeout(() => {\n this.emit({ warning: 'MicrophoneSilenceWarning' });\n this.resetSilenceCounter();\n }, 1000);\n }\n }\n\n if (level !== instant) {\n // Clear a MicrophoneError once we get a signal, intervalCounter might be\n // too low sometimes.\n if (this.silenceDuration > 0) {\n this.resetSilenceCounter();\n }\n const diff = Math.abs(level - instant);\n if (diff >= 1) {\n this.level = instant;\n this.emit({ value: instant });\n }\n }\n if (this.intervalCounter < 10) {\n this.intervalCounter++;\n }\n }\n\n resetSilenceCounter() {\n clearTimeout(this.errorTimer);\n this.errorTimer = null;\n this.silenceDuration = 0;\n }\n\n /**\n * Stop read interval and disconnect from stream.\n **/\n // eslint-disable-next-line max-statements\n stop() {\n this.offUpdate();\n if (this.track) {\n this.track.removeEventListener('ended', this.boundOnTrackEnded);\n this.track = null;\n }\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n this.volumes = null;\n if (this.context && this.context.stop && this.context.state !== 'closed') {\n this.context.onstatechange = null;\n this.context.close();\n this.context = null;\n }\n }\n\n onUpdate(listener) {\n this.listener.push(listener);\n if (this.initError) {\n this.onTrackEnded();\n return;\n }\n if (!this.running && this.context && this.track) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n }\n\n offUpdate() {\n clearTimeout(this.errorTimer);\n this.listener.length = 0;\n if (this.running) {\n clearInterval(this.timer);\n this.running = false;\n }\n }\n\n onTrackEnded() {\n this.emit({ error: 'EyesonMicrophoneError' });\n this.stop();\n }\n\n emit(message) {\n this.listener.forEach(fn => fn(message));\n }\n}\n\nexport default SoundMeter;\n","import Logger from './Logger.js';\nimport FeatureDetector from './FeatureDetector.js';\n\n// sampleRate in Herz (Hz) to perform the check\nconst sampleRate = 1;\n\n// https://developer.chrome.com/docs/web-platform/compute-pressure/\nclass SystemPressureMonitor {\n constructor() {\n this._listener = [];\n this._monitor = null;\n this._running = false;\n this.state = null;\n }\n\n onUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener.push(listener);\n }\n }\n\n offUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener = this._listener.filter(fn => fn !== listener);\n } else {\n this._listener.length = 0;\n }\n }\n\n _emit(records) {\n // states are 'nominal', 'fair', 'serious', 'critical'\n // https://github.com/w3c/compute-pressure#design-considerations\n const { state } = records[records.length - 1];\n if (state === this.state) {\n return;\n }\n this.state = state;\n Logger.debug('SystemPressureMonitor::emit', state);\n this._listener.forEach(fn => {\n try {\n fn(state);\n } catch (error) {\n Logger.error('SystemPressureMonitor::emit', error);\n }\n });\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n if (FeatureDetector.canMonitorSystemPressure() === false) {\n Logger.error('SystemPressureMonitor is not supported');\n return;\n }\n try {\n if (!this._monitor) {\n // eslint-disable-next-line no-undef\n this._monitor = new PressureObserver(this._emit.bind(this), {\n sampleRate\n });\n }\n if (!this._running) {\n await this._monitor.observe('cpu');\n this._running = true;\n }\n if (this.state === null) {\n this._emit([{ state: 'nominal' }]);\n }\n Logger.debug('SystemPressureMonitor::start');\n } catch (error) {\n Logger.error('SystemPressureMonitor::start', error);\n }\n }\n\n stop() {\n if (this._monitor && this._running) {\n this._monitor.disconnect();\n this._running = false;\n }\n }\n\n destroy() {\n this.stop();\n this.offUpdate();\n this.state = null;\n this._monitor = null;\n }\n}\n\nexport default SystemPressureMonitor;\n","import eyeson from './src/eyeson.js';\n\nimport Logger from './src/Logger.js';\nimport MicMixer from './src/MicMixer.js';\nimport GiphyApi from './src/utils/GiphyApi.js';\nimport debounce from './src/utils/debounce.js';\nimport throttle from './src/utils/throttle.js';\nimport immediate from './src/utils/immediate.js';\nimport SoundMeter from './src/SoundMeter.js';\nimport LocalStorage from './src/LocalStorage.js';\nimport DeviceManager from './src/DeviceManager.js';\nimport FeatureDetector from './src/FeatureDetector.js';\nimport FullscreenHelper from './src/FullscreenHelper.js';\nimport MediaStreamBuilder from './src/MediaStreamBuilder.js';\nimport * as StreamHelpers from './src/utils/StreamHelpers.js';\nimport ConnectionStatistics from './src/utils/ConnectionStatistics.js';\nimport SystemPressureMonitor from './src/SystemPressureMonitor.js';\n\nexport {\n Logger,\n MicMixer,\n GiphyApi,\n debounce,\n throttle,\n immediate,\n SoundMeter,\n LocalStorage,\n StreamHelpers,\n DeviceManager,\n FeatureDetector,\n FullscreenHelper,\n MediaStreamBuilder,\n ConnectionStatistics,\n SystemPressureMonitor,\n};\n\nexport default eyeson;\n"],"names":["objectTypes","root","window","this","freeExports","exports","freeModule","module","nodeType","freeGlobal","g","global","self","maxSafeInteger","Math","pow","reOpera","objectProto","Object","prototype","hasOwnProperty","toString","capitalize","string","String","charAt","toUpperCase","slice","format","trim","test","forOwn","object","callback","key","call","getClassOf","value","qualify","replace","reduce","array","accumulator","index","length","each","platform","parse","ua","context","isCustomContext","nav","navigator","userAgent","data","isSpecialCasedOS","property","type","likeChrome","objectClass","airRuntimeClass","enviroClass","javaClass","java","phantomClass","rhino","environment","alpha","beta","doc","document","opera","operamini","operaClass","arch","description","prerelease","useFeatures","version","layout","result","guess","RegExp","pattern","exec","label","name","guesses","getName","product","getProduct","manufacturer","getManufacturer","os","split","cleanupOS","getOS","getVersion","patterns","push","unshift","indexOf","parseFloat","runtime","flash","system","Capabilities","phantom","major","minor","patch","documentMode","toFixed","lang","System","getProperty","require","join","e","process","browser","versions","electron","node","nw","appMinorVersion","external","parseInt","family","architecture","cpuClass","isCommonjs","fn","val","fnMap","i","l","ret","eventNameMap","change","fullscreenchange","error","fullscreenerror","screenfull","request","element","options","Promise","resolve","reject","onFullScreenEntered","off","bind","on","returnPromise","documentElement","requestFullscreen","then","catch","exit","isFullscreen","onFullScreenExit","exitFullscreen","toggle","onchange","onerror","event","eventName","addEventListener","removeEventListener","raw","defineProperties","get","Boolean","fullscreenElement","enumerable","isEnabled","fullscreenEnabled","SDPUtils","random","substring","localCName","generateIdentifier","splitLines","blob","map","line","splitSections","part","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","parseCandidate","parts","candidate","foundation","component","protocol","toLowerCase","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","undefined","writeCandidate","sdp","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","id","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","find","existingFeedback","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","stream","track","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","_typeof","_regeneratorRuntime","__esModule","Op","hasOwn","defineProperty","desc","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","configurable","writable","err","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","Context","makeInvokeMethod","tryCatch","arg","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","method","_invoke","AsyncIterator","PromiseImpl","invoke","record","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","state","Error","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","constructor","mark","setPrototypeOf","__proto__","awrap","async","iter","reverse","pop","skipTempReset","prev","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","n","getter","d","a","definition","o","prop","r","nmd","paths","children","_classCallCheck","instance","Constructor","_toPropertyKey","input","hint","prim","toPrimitive","res","Number","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","api","allowSafariSFU","screencapture","widescreen","_console","console","apply","arguments","warn","_console2","_console3","log","debug","_console4","ComApi","token","cache","users","errorCallback","_handleError","path","fetch","Request","response","contentType","headers","ok","json","text","concat","status","form","namespace","fd","FormData","formKey","File","append","_objectToFormData","_request","body","formData","Logger","userId","_this","user","cachedUser","apiUser","extendedUser","addUserAttributes","clientId","largeAvatarUrl","avatar","assign","apiId","sipId","largeAvatar","_this2","_post","email","custom_fields","locale","player_url","playerUrl","stream_url","streamUrl","_put","snapshotId","_this3","playback","play_id","func","wait","args","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","setTimeout","_setPrototypeOf","p","_inherits","subClass","superClass","_assertThisInitialized","ReferenceError","_possibleConstructorReturn","_getPrototypeOf","BaseEvent","msg","StartPlaybackEvent","_BaseEvent","_super","_createSuper","_api","startPlayback","StopPlaybackEvent","_BaseEvent2","_super2","stopPlayback","_get","Reflect","receiver","base","getOwnPropertyDescriptor","PublicEvent","_src","deleteProperty","listeners","StartAnnotationEvent","_PublicEvent","annotationLoop","setInterval","createAnnotation","annotation","clearInterval","StopAnnotationEvent","_PublicEvent2","stopAnnotation","StfuEvent","_rtConnection","send","IgnoreEvent","ForwardEvent","_arrayLikeToArray","arr","len","arr2","Array","_unsupportedIterableToArray","minLen","from","_slicedToArray","isArray","_i","_s","_e","_x","_r","_arr","_n","_d","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","wrapPeerConnectionEvent","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","has","unwrappedCb","delete","size","disableLog","bool","disableWarnings","deprecated","oldMethod","newMethod","isObject","compactObject","isObj","isEmptyObject","walkStats","stats","resultSet","endsWith","filterStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","shimGetUserMedia","browserDetails","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","ideal","exact","min","max","oldname_","oc","mix","advanced","shimConstraints_","constraints","audio","remap","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","some","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","DOMException","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","successCallbackWrapper_","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","RTCSessionDescription","signalingState","t","oldStream","nativeMethod","methodObj","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","streamid","shimPeerConnection","webkitRTCPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","code","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","encodings","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","all","finally","shimCreateAnswer","origCreateAnswer","createAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","toJSON","sdpMid","sdpMLineIndex","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","mLine","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","getMaxMessageSize","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","adapter","shimChrome","shimFirefox","shimSafari","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","commonShim","browserShim","adapterFactory","FullscreenHelper","onChange","hasSupport","_canvasBlurSupport","canMix","canPip","hasPipSupport","canSFU","isPhone","inIframe","isIOSDevice","canUseEyeson","canFullscreen","hasMobileDevice","canToggleCamera","canPresentFiles","canScreenCapture","canAdjustSettings","canAdjustDeviceSettings","canStreamLocalMedia","isExperimentalBrowser","isWebView","hasGetUserMedia","canDataChannel","isMinimumRequiredBrowser","hasGetDisplayMedia","hasPeerConnection","hasCaptureStream","HTMLMediaElement","hasCanvasCaptureSupport","hasSenders","hasTrackOnUnmute","isSafari","browserVersion","isWorkingIOSBrowser","hasWebpSupport","isChrome","isFF","canChangeAudioOutput","canChangeMicrophone","isOldSafari","isTestSuite","canMultipleDifferentMicrophones","canChangeCamera","config","isIPhone","audioContext","every","requiresLowerConstraints","browserName","txt","isEdge","isMinimumRequiredChrome","isMinimumRequiredFF","isMinimumRequiredSafari","isMinimumRequiredEdge","iOSBrowser","operaTouch","HTMLVideoElement","pictureInPictureEnabled","iOSPipCheck","support","createElement","preload","src","onsuspend","wkEnabled","webkitSupportsPresentationMode","isAndroidDevice","maxTouchPoints","MSStream","screen","isAndroidPhone","isAndroid","isMobile","isMacOS","userAgentData","top","isTouchDevice","canDisplayTooltips","canDrawCamera","stopsDeviceActivityIndicatorOnDisable","supportsBlurOnSVG","SVGElement","blur","hasLocalStorage","localStorage","setItem","canGet","getItem","safariWithoutVP8","uAVersion","disallowAudioSyncSrcChange","canShare","share","canVirtualBackground","WebAssembly","validate","instantiateStreaming","instantiate","CanvasRenderingContext2D","ImageData","requestAnimationFrame","canvasBlurSupport","canvas1","canvas2","ctx1","getContext","ctx2","fillStyle","fillRect","data1","getImageData","data2","canStereo","canChooseDisplaySurface","displaySurface","hasPipCamSupport","canMonitorSystemPressure","PressureObserver","supportedSources","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","NinjaStream","_stream","createStream","canvas","captureStream","CanvasCaptureMediaStream","fallbackStorage","FeatureDetector","store","load","defaultValueParam","defaultValue","storedValue","stack","messageName","CanvasMedia","CanvasCaptureMediaStreamTrack","hasAudio","enabled","hasVideo","disableAudio","enableAudio","toggleAudio","toggleVideo","stopTrack","stopStream","isScreenTrack","isScreenPresentationTrack","isScreenAsVideoTrack","isCanvasTrack","isNinjaStreamTrack","isVbgStreamTrack","isCameraTrack","getScreenTracks","getScreenPresentationTracks","getScreenAsVideoTracks","getCameraTracks","getVbgTracks","stopCamera","disableCamera","enableCamera","toggleCamera","toggleVbgTrack","getCanvasTracks","isScreenStream","isScreenPresentationStream","isCanvasStream","isVBGStream","isCameraStream","isCanvasPresentationStream","isPresentationStream","hasCameraVideo","getFacingMode","settings","requestFrame","createExternalStream","audioOnly","aTrack","vTrack","audioTrack","ac","createMediaStreamDestination","close","createFakeAudioTrack","videoTrack","createFakeVideoTrack","source","stopPropagation","postMessage","fps","raf","focus","abort","animationFrameThen","throttledRAF","elapsed","throttledImmediate","immediate","_requestAnimationFrame","cancelAnimationFrame","_cancelAnimationFrame","visibilityState","integrity","URL","location","href","script","onload","parentNode","remove","algo","hash","head","cacheStorageSupport","CacheStorage","storeBlobURL","_ref","_callee","blobURL","_context","caches","open","put","Response","t0","_x2","loadBlobURL","_ref2","_callee2","_context2","createObjectURL","_x3","deleteBlob","_ref3","_callee3","_context3","_x4","_mulTable","_shgTable","_canvas","_ctx","_previous","_g","_b","_vmin","_vmax","run","imageBitmap","amount","desynchronized","drawImage","imageData","wm","hm","rad1","mulSum","shgSum","Uint32Array","iterations","p1","p2","yw","yi","y","rsum","gsum","bsum","x","yp","putImageData","OffscreenCanvasSupport","OffscreenCanvas","OffscreenCanvasBlurSupport","OffscreenCanvasRenderingContext2D","ImageBitmapSupport","createImageBitmap","TrackProcessorSupport","MediaStreamTrackProcessor","SIMDSupport","Uint8Array","EventTargetConstructorSupport","EventTarget","_max","_stateChange","_segmentationModel","_tflite","_tfliteReady","_tfliteLoading","_inputMemoryOffset","_outputMemoryOffset","_localImageFile","_localImageFileBackup","initiateTFLite","loading","model","modelBufferOffset","importScript","arrayBuffer","_getModelBufferMemoryOffset","HEAPU8","_loadModel","_getInputMemoryOffset","_getOutputMemoryOffset","createOffscreenCanvas","ctx","LocalStorage","cacheStorage","loadImage","emitLoading","img","Image","host","crossOrigin","checkImageLoad","loadImageFile","callbackFN","accept","files","revokeObjectURL","click","createImageCanvas","image","hRatio","vRatio","ratio","imgWidth","imgHeight","centerShiftX","centerShiftY","createGeneraliCanvas","createGradientCanvas","gradient","createLinearGradient","startX","startY","endX","endY","addColorStop","color1","color2","createBlurCanvas","fullLength","bigWidth","bigHeight","blurCanvas","imageCanvas","_allowedTypesCheck","setState","VirtualBackgroundMixer","originalStream","outStream","reader","segmentationMaskCanvas","segmentationMaskCtx","segmentationMask","videoCanvas","videoCtx","playPromise","paused","throttledAnimationFrame","drawVideo","backgroundOld","backgroundType","backgroundValue","blurInit","canvasBlur","loadingListener","handleStateChange","_checkExternalImage","_initBackground","_drawVideo","listener","userMediaStream","videoTracks","trackSettings","stopOriginalStream","terminate","imageSmoothingEnabled","canvasTrack","srcLabel","srcDeviceId","start","_this$size","processor","readable","getReader","playsInline","muted","srcObject","willReadFrequently","initBackground","onloadeddata","play","frame","_yield$this$reader$re","heap","maskData","pixelCount","heapIndex","imgIndex","_index","person","read","displayWidth","displayHeight","t1","HEAPF32","_runInference","globalCompositeOperation","drawBackground","blurred","_callee4","_this$size2","_image","_context4","setBackgroundFallback","_this$size3","pause","_this4","_callee5","_context5","changedDevices","listA","listB","_ret","_loop","_deviceA","_found","deviceB","groupId","v","deviceA","found","DeviceManager","sinkId","eco","cameras","speakers","microphones","terminationInProgress","virtualBackground","virtualBackgroundType","getSinkId","setStream","handleError","verifyStream","storeConstraints","adjustAudioTrack","initiateVirtualBackground","_setVirtualBackgroundType","wasOff","willBeOff","isTypeAllowed","checkExternalImage","changeBackground","update","loadLocalImage","setVirtualBackgroundType","watchForNewDevices","fetchDevices","setDevices","getConstraints","ondevicechange","destroy","camHasChanged","micHasChanged","speakerHasChanged","emit","_this5","_this6","initiateStream","updateCache","_this7","firstRun","emitStreamUpdate","videoConstraints","audioConstraints","preventUpdate","device","optionsParam","getDevices","determineConstraintsForDevices","channelCount","videoDeviceId","audioDeviceId","applyLastUsedDevices","applyWidescreen","videoId","audioId","eyesonOptions","findIndex","speaker","isBlobAvailable","getImageBlobOrFallback","MediaStreamBuilder","surface","screenStream","existingStream","micMixer","vbgMixer","isPresentation","deviceMonitor","tempStream","brokenTrackCallback","bindMethods","_addScreenTrack","getMediaStream","addNinjaTrack","addCanvasTrack","addScreenTrack","adjustVideoTrack","addScreenStreamTrack","initializeVirtualBackground","_this$options","active","onended","canvasStream","displayStream","audioStream","mixScreenshareAudio","setMicOnlyStream","fetchInputDevices","applyTempTracks","cleanupTempStream","discardTempTracks","_this$options2","getMobileConstraints","addVideoTrack","_this$options3","addAudioTrack","_this$options4","_this$options5","_getScreenPresentatio","_getScreenPresentatio2","screenTrack","echoCancellation","surfaceSwitching","selfBrowserSurface","systemAudio","_this$options6","fillerTrack","_this$options7","MicMixer","acOut","micOnlyStream","videoStream","audioTracks","createMediaStreamSource","connect","displayAudio","noMix","initMixScreenshareMix","exc","adjustMediaStreamTracks","ChangeLocalStreamEvent","_ref$screen","_session","localStream","wasScreenAsVideo","resume","suspend","locallyChanged","PodiumEvent","hasPresenter","stopPresentingSet","scanMessageForLocalStreamOptimization","isSource","isPresenter","hasDesktopSources","SnapshotEvent","takeSnapshot","SetLayerEvent","setLayer","SendChatEvent","content","StopRtmpEvent","stopBroadcast","SetLayoutEvent","setLayout","StartRtmpEvent","_this$context","startBroadcast","EventEmitter","detail","clear","CustomEvent","_EventEmitter","Transport","connection","wasOpen","WebSocket","endpoint","auth_token","onopen","onmessage","onclose","OPEN","was_open","removeAllListeners","R_CRLF","atob","supportsRandomUUID","crypto","randomUUID","bytes","getRandomValues","char","byte","UserAgent","_call","_handleSdpUpdate","_onMessage","failed","transportOptions","checkUserAgentOptions","callId","sessionDescriptionHandler","initAuthToken","debouncedHandleSDPUpdate","ms","_len","_key","nextArgs","slowdown","handleSdpUpdate","verifySender","setCallId","call_id","setDescription","termination","reason","reject_code","term_code","jwt","parseJwtPayload","client_id","conf_id","exp","to","answerSdp","updateDescription","crlfNormalize","msg_id","uuid","transport","onEvent","sessionDescriptionHandlerFactory","sessionDescriptionHandlerFactoryOptions","onMessage","display_name","client_name","mute_video","authToken","onReconnect","seppEvent","offEvent","transportEvent","isConnected","PodiumFacade","_message$src","psrc","asrc","vsrc","dsrc","dims","sources","presenterIdx","audioSources","videoSources","desktopSources","dimensions","userSourceIndex","Set","presenter","isInteger","userVideoIndex","SigMessageTransformer","stamp","sourceUpdate","voiceActivity","source_update","voice_activity","podium","solo","isSolo","hasAudioPosition","hasVideoPosition","hasMedia","userDimensions","hasVideoSources","hasMutedVideoPeers","cid","SessionDescriptionHandler","datachannel","peerConnection","remoteStream","connected","iceCheckingTimer","peerConnectionReady","handleConnectionStateChange","initPeerConnection","_updateDescription","_setDescription","_getDescription","offer","RTCOfferOptions","SDPModifiers","modifier","localDescription","passive","sessionDescription","seppMessaging","remoteDescriptionUpdate","answer","stopAllTracks","pcOptions","buildPeerConnectionOptions","resolveReady","negotiated","handleDatachannel","onicecandidate","onicegatheringstatechange","iceGatheringState","sendOnly","ontrack","handleOntrack","uaOptions","onunmute","handleUnmute","handleAccept","initDatachannel","stun_servers","turn_servers","turnServer","credential","getLocalStream","stopUnusedTracks","tracksExist","audioSender","videoSender","replaceTrack","hasExternalStream","factor","rtp","SigConnection","signaling","messageListener","initUserAgentOptions","transformer","signalingOptions","SEPP","mediaOptions","handleMessage","roomData","WHITELIST","transformedMessage","sendSeppMessage","errorHandler","RoomReceived","rtData","ready","_msg$content","room","links","_eyeson","_connection","connectionStatus","startSigConnection","FetchRoomEvent","getRoom","DeleteFileEvent","deleteFile","file","UploadFileEvent","uploadFile","addFile","ReceiveChatEvent","getUser","forwardMessage","ts","created_at","StartStreamEvent","_ref$audio","_ref$video","_ref$virtualBackgroun","_ref$surface","getStoredVirtualBackgroundType","ChangeStreamEvent","onBrokenTrackError","canvasMixer","ReplaceStreamEvent","ToggleCameraEvent","AcceptSessionEvent","session","getRemoteStream","StopRecordingEvent","stopRecording","VoiceActivityEvent","StartRecordingEvent","startRecording","ScreenCaptureEvent","present","detectDisplaySurface","StartPresentingEvent","_handle","videoPlayer","invokeStream","_ref$stream","_ref$present","presentationStream","isStreaming","streamVideo","StopPresentingEvent","StopBroadcastsEvent","stopAllBroadcasts","ClearFrontLayerEvent","clearFrontLayer","RequestGuestUserEvent","requestUser","access_key","isLocked","locked","SessionTerminationEvent","ParticipantListUpdateEvent","add","initial","addition","del","playing","toFixedNumber","number","callNow","FPS_INTERVAL","CAMERA_SMALL","CAMERA_MEDIUM","CAMERA_LARGE","CAMERA_NONE","supportsTrackProcessor","defaultTrack","bindVideoToStream","_track$getSettings","CanvasMixer","camera","xPos","camSize","isCanvasCapture","draw","onRedraw","setCamera","drawFrame","calcSizesAndPositions","bouncedDraw","debounce","_draw","redrawCallback","mixer","cameraStream","horizontal","vertical","originalCanvas","getCanvasCaptureTrackCanvas","redrawQueued","position","cameraPosition","cameraSizeInWords","sourceAspectRatio","targetAspectRatio","_this$screenStream$ge3","screenStreamSettings","fitScreen","_this$cameraStream$ge3","cameraTrackSettings","small","medium","large","none","scaledCam","scale","sizes","camPosition","positions","screenFrame","cameraFrame","_result","performance","ReadableStreamDefaultReader","clearRect","imgData","createImageData","StartMixerEvent","_ref$changeStream","changeStream","vbgType","UpdateMixerEvent","videoFrameSupport","requestVideoFrameCallback","VideoPlayer","onReady","onDuration","onTimeUpdate","onEnd","performAction","gainNode","timer","boundDrawVideoFrame","drawVideoFrame","boundInitCanvasStream","initCanvasStream","isPlaying","blockTimeUpdate","initTimeout","invokationTimer","initVideo","autoplay","onplaying","onVideoPlay","onpause","onVideoPause","onseeked","onVideoSeeked","ontimeupdate","onVideoTimeUpdate","onVideoReady","onVideoError","onVideoEnd","duration","videoWidth","videoHeight","createGain","createMediaElementSource","destination","onVideoAction","currentTime","onPlayAction","onPauseAction","onTimeAction","onVolumeAction","time","volume","gain","canvasStreamTrack","cancelVideoFrameCallback","disconnect","StartMediaEvent","MediaError","LockMeetingEvent","lockMeeting","TerminateMeetingEvent","terminateMeeting","KickUserEvent","kickUser","VirtualBackgroundEvent","destroySessionMicMixer","getScreenErrorName","ScreenVideoChangeEvent","mediaStreamBuilder","_getScreenAsVideoTrac","_getScreenAsVideoTrac2","ScreenVideoStoppedEvent","DeviceMonitor","tempAudioTrack","tempVideoTrack","audioEnded","videoEnded","boundOnAudioEnd","onAudioEnd","boundOnVideoEnd","clearTracks","PipCam","isActive","startTimer","_destroy","_stop","_initCamera","_initVideoAndPip","_updateCamera","_start","initFakeStream","initVideoAndPip","initCamera","Path2D","fill","onleavepictureinpicture","onExitPip","requestPictureInPicture","onDeviceEvent","pictureInPictureElement","exitPictureInPicture","_callee6","_context6","StartPipCamEvent","pipCam","StopPipCamEvent","UpdatePipCamEvent","_BaseEvent3","_super3","updateCamera","AudioDeviceEndEvent","_tracks","mediaConstraints","newAudioDevice","VideoDeviceEndEvent","_handle2","AllDevicesEndEvent","_PublicEvent3","_handle3","_tracks2","_track$getSettings2","EventHandler","_monitor","end","con","mon","ses","_rtData","eyeson","silenced","stfu","chat","snapshot","send_chat","set_layer","set_layout","fetch_room","room_ready","RoomReceivedEvent","room_setup","memberlist","upload_file","delete_file","request_stfu","change_stream","replace_stream","toggle_camera","stop_playback","playback_update","start_playback","start_stream","stop_recording","start_screen_capture","StartScreenCaptureEvent","stop_broadcasts","start_recording","stop_presenting","start_presenting","stop_annotation","start_annotation","clear_front_layer","request_guest_user","voice_activity_raw","start_mixer","update_mixer","lock_meeting","terminate_meeting","kick_user","session_termination","start_media","change_screen_video","stop_screen_video","stop_rtmp","start_rtmp","suspend_virtual_background","audio_device_ended","video_device_ended","all_devices_ended","start_pip_cam","stop_pip_cam","update_pip_cam","capture_error","options_update","ext_not_installed","broadcasts_update","presentation_ended","recording","ext_cancel","ext_installed","message_status","moderator_info","addOriginToSDP","addSessionAttributes","splitSDP","tLineIdx","startsWith","addIndex","addStereo","stereo","codecMatch","fmtpRegExp","fmtpMatch","_entry$split2","entries","doIt","row","getModifiers","modifiers","ConferenceSession","comApi","RTCConstraints","defaultRTCConstraints","accepted","restarting","sipSession","startAttempts","maxStartAttempts","tryAuthUpdate","tryResume","tryWaitResume","resumeTimer","waitResumeTimer","endSession","initSession","handleFailed","restartSession","tryRecoveryFrom","terminateSession","_setStream","initExternalStream","initDeviceMonitor","initVirtualBackground","buildSessionOptions","startSession","onUnmute","adjustVideoPodium","handleTermination","getMicOnlyStream","monitor","observe","sdpWrapper","sfu","sfuLine","handleExit","updateAuthAndRestartSession","updateAuthAndResume","NotFoundError","NotAllowedError","NotReadableError","errorCodeName","failure","recovery","condition","action","Status","NO_CONNECTION","BAD","OK","GOOD","addHistory","history","getOldestHistoryEntry","getHistoryAverage","_step","jitter","packetLoss","roundTripTime","nack","bitrateSend","bitrateRecv","newest","getNewestHistoryEntry","_iterator","_createForOfIteratorHelper","packetLossRate","nackRate","calculateStatus","ConnectionStatistics","lastStat","bytesSent","bytesReceived","out","packetsSent","packetsLost","in","packetsReceived","nackCount","boundPrintStats","printStats","_printStats","statsCurrentRoundTripTime","average","mediaType","diff","received","localId","hasRTT","hasJitter","hasPacketLoss","hasNackCount","lost","packets","currentRoundTripTime","onLine","statistics","ConnectionMonitor","disconnectTimer","prevIceState","onOffline","handleIceStateChange","addEventListeners","oniceconnectionstatechange","onconnectionstatechange","init","currentTarget","currentIceState","adapters","logger","messages","getTime","secondsSince","visibilityDidChange","reconnectAttempts","isRunning","startedAt","stoppedAt","startPolling","staleThreshold","stopPolling","recordPing","pingedAt","recordConnect","disconnectedAt","recordDisconnect","poll","pollTimeout","reconnectIfStale","getPollInterval","reconnectionBackoffRate","connectionIsStale","refreshedAt","disconnectedRecently","reopen","isOpen","INTERNAL","message_types","welcome","ping","confirmation","rejection","disconnect_reasons","unauthorized","invalid_request","server_restart","default_mount_path","protocols","supportedProtocols","Connection","consumer","subscriptions","disconnected","webSocket","getState","uninstallEventHandlers","installEventHandlers","allowReconnect","reopenDelay","getProtocol","isState","isProtocolSupported","states","events","handler","identifier","reconnect","reload","confirmSubscription","notify","notifyAll","willAttemptReconnect","Subscription","mixin","properties","extend","perform","command","unsubscribe","SubscriptionGuarantor","pendingSubscriptions","guarantee","subscription","startGuaranteeing","forget","stopGuaranteeing","retrySubscribing","retryTimeout","subscribe","Subscriptions","guarantor","channelName","ensureActiveConnection","findAll","sendCommand","callbackName","Consumer","_url","createWebSocketURL","createConsumer","querySelector","getAttribute","getConfig","ActionCableConnection","onMessageHandler","defaultMessageHandler","onReceived","offMessage","onConnected","onDisconnected","cable","RoomChannel","UserChannel","disconnectTimestamp","handleReconnect","_ref$channel","_ref$type","updateStatus","core","eventHandler","prepareConnection","rtConnection","websocket","keepRoomAlive","counter","pollingFallbackInterval","pollingFallback","eyesonClass","onReceive","removeListener","setMonitor","broadcasts","loadInitialInfos","joinSession","joinOnConnect","_throttledSend","throttle","_toConsumableArray","GiphyApi","roomUrl","query","staff","staffGifs","_ref4","rej","search","images","original_mp4","mp4_size","largerGifs","floor","SoundMeter","level","instant","silenceDuration","intervalCounter","analyser","volumes","errorTimer","boundOnTrackEnded","onTrackEnded","initError","onstatechange","_stream$getAudioTrack2","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","frequencyBinCount","running","analyse","getByteFrequencyData","volumeSum","averageVolume","round","warning","resetSilenceCounter","abs","offUpdate","SystemPressureMonitor","_listener","_running","records","_emit","sampleRate"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"eyeson-esm.js","mappings":"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","sources":["webpack://eyeson/./node_modules/platform/platform.js","webpack://eyeson/./node_modules/screenfull/dist/screenfull.js","webpack://eyeson/./node_modules/sdp/sdp.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/regenerator/index.js","webpack://eyeson/webpack/bootstrap","webpack://eyeson/webpack/runtime/compat get default export","webpack://eyeson/webpack/runtime/define property getters","webpack://eyeson/webpack/runtime/global","webpack://eyeson/webpack/runtime/hasOwnProperty shorthand","webpack://eyeson/webpack/runtime/make namespace object","webpack://eyeson/webpack/runtime/node module decorator","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://eyeson/./src/config.js","webpack://eyeson/./src/options.js","webpack://eyeson/./src/Logger.js","webpack://eyeson/./src/ComApi.js","webpack://eyeson/./src/utils/throttle.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://eyeson/./src/events/BaseEvent.js","webpack://eyeson/./src/events/PlaybackEvents.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://eyeson/./src/events/PublicEvent.js","webpack://eyeson/./src/events/AnnotationEvents.js","webpack://eyeson/./src/events/StfuEvent.js","webpack://eyeson/./src/events/IgnoreEvent.js","webpack://eyeson/./src/events/ForwardEvent.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/utils.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/safari/safari_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/common_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_core.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_factory.js","webpack://eyeson/./src/FullscreenHelper.js","webpack://eyeson/./src/FeatureDetector.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://eyeson/./src/NinjaStream.js","webpack://eyeson/./src/LocalStorage.js","webpack://eyeson/./src/utils/immediate.js","webpack://eyeson/./src/utils/StreamHelpers.js","webpack://eyeson/./src/utils/throttledAnimationFrame.js","webpack://eyeson/./src/utils/importScript.js","webpack://eyeson/./src/utils/cacheStorage.js","webpack://eyeson/./src/utils/canvasBlur.js","webpack://eyeson/./src/VirtualBackgroundMixer.js","webpack://eyeson/./src/DeviceManager.js","webpack://eyeson/./src/MediaStreamBuilder.js","webpack://eyeson/./src/MicMixer.js","webpack://eyeson/./src/events/ChangeLocalStreamEvent.js","webpack://eyeson/./src/events/PodiumEvent.js","webpack://eyeson/./src/events/SnapshotEvent.js","webpack://eyeson/./src/events/SetLayerEvent.js","webpack://eyeson/./src/events/SendChatEvent.js","webpack://eyeson/./src/events/StopRtmpEvent.js","webpack://eyeson/./src/events/SetLayoutEvent.js","webpack://eyeson/./src/events/StartRtmpEvent.js","webpack://eyeson/./src/sepp/eventEmitter.js","webpack://eyeson/./src/sepp/Transport.js","webpack://eyeson/./src/sepp/crlfNormalize.js","webpack://eyeson/./src/sepp/parseJwtPayload.js","webpack://eyeson/./src/sepp/uuid.js","webpack://eyeson/./src/sepp/SEPP.js","webpack://eyeson/./src/SigMessageWhitelist.js","webpack://eyeson/./src/PodiumFacade.js","webpack://eyeson/./src/SigMessageTransformer.js","webpack://eyeson/./src/SessionDescriptionHandler.js","webpack://eyeson/./src/SigConnection.js","webpack://eyeson/./src/events/RoomReceivedEvent.js","webpack://eyeson/./src/events/FetchRoomEvent.js","webpack://eyeson/./src/events/DeleteFileEvent.js","webpack://eyeson/./src/events/UploadFileEvent.js","webpack://eyeson/./src/events/ReceiveChatEvent.js","webpack://eyeson/./src/events/StartStreamEvent.js","webpack://eyeson/./src/events/ChangeStreamEvent.js","webpack://eyeson/./src/events/ReplaceStreamEvent.js","webpack://eyeson/./src/events/ToggleCameraEvent.js","webpack://eyeson/./src/events/AcceptSessionEvent.js","webpack://eyeson/./src/events/StopRecordingEvent.js","webpack://eyeson/./src/events/VoiceActivityEvent.js","webpack://eyeson/./src/events/StartRecordingEvent.js","webpack://eyeson/./src/events/ScreenCaptureEvent.js","webpack://eyeson/./src/events/StartPresentingEvent.js","webpack://eyeson/./src/events/StopPresentingEvent.js","webpack://eyeson/./src/events/StopBroadcastsEvent.js","webpack://eyeson/./src/events/ClearFrontLayerEvent.js","webpack://eyeson/./src/events/RequestGuestUserEvent.js","webpack://eyeson/./src/events/SessionTerminationEvent.js","webpack://eyeson/./src/events/ParticipantListUpdateEvent.js","webpack://eyeson/./src/utils/scale.js","webpack://eyeson/./src/utils/debounce.js","webpack://eyeson/./src/CanvasMixer.js","webpack://eyeson/./src/events/MixerEvents.js","webpack://eyeson/./src/VideoPlayer.js","webpack://eyeson/./src/events/MediaEvents.js","webpack://eyeson/./src/events/LockMeetingEvent.js","webpack://eyeson/./src/events/TerminateMeetingEvent.js","webpack://eyeson/./src/events/KickUserEvent.js","webpack://eyeson/./src/events/VirtualBackgroundEvent.js","webpack://eyeson/./src/events/ScreenVideoChangeEvent.js","webpack://eyeson/./src/events/ScreenVideoStoppedEvent.js","webpack://eyeson/./src/DeviceMonitor.js","webpack://eyeson/./src/PipCam.js","webpack://eyeson/./src/events/PipCamEvents.js","webpack://eyeson/./src/events/DeviceEndEvents.js","webpack://eyeson/./src/EventHandler.js","webpack://eyeson/./src/SDPModifiers.js","webpack://eyeson/./src/ConferenceSession.js","webpack://eyeson/./src/utils/ConnectionStatistics.js","webpack://eyeson/./src/ConnectionMonitor.js","webpack://eyeson/./node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js","webpack://eyeson/./src/ActionCableConnection.js","webpack://eyeson/./src/eyeson.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://eyeson/./src/utils/GiphyApi.js","webpack://eyeson/./src/SoundMeter.js","webpack://eyeson/./src/SystemPressureMonitor.js","webpack://eyeson/./index.js"],"sourcesContent":["/*!\n * Platform.js v1.3.6\n * Copyright 2014-2020 Benjamin Tan\n * Copyright 2011-2013 John-David Dalton\n * Available under MIT license\n */\n;(function() {\n 'use strict';\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used as a reference to the global object. */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Backup possible global object. */\n var oldRoot = root;\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n root = freeGlobal;\n }\n\n /**\n * Used as the maximum length of an array-like object.\n * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n * for more details.\n */\n var maxSafeInteger = Math.pow(2, 53) - 1;\n\n /** Regular expression to detect Opera. */\n var reOpera = /\\bOpera/;\n\n /** Possible global object. */\n var thisBinding = this;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check for own properties of an object. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to resolve the internal `[[Class]]` of values. */\n var toString = objectProto.toString;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Capitalizes a string value.\n *\n * @private\n * @param {string} string The string to capitalize.\n * @returns {string} The capitalized string.\n */\n function capitalize(string) {\n string = String(string);\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n /**\n * A utility function to clean up the OS name.\n *\n * @private\n * @param {string} os The OS name to clean up.\n * @param {string} [pattern] A `RegExp` pattern matching the OS name.\n * @param {string} [label] A label for the OS.\n */\n function cleanupOS(os, pattern, label) {\n // Platform tokens are defined at:\n // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n var data = {\n '10.0': '10',\n '6.4': '10 Technical Preview',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': 'Server 2008 R2 / 7',\n '6.0': 'Server 2008 / Vista',\n '5.2': 'Server 2003 / XP 64-bit',\n '5.1': 'XP',\n '5.01': '2000 SP1',\n '5.0': '2000',\n '4.0': 'NT',\n '4.90': 'ME'\n };\n // Detect Windows version from platform tokens.\n if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) &&\n (data = data[/[\\d.]+$/.exec(os)])) {\n os = 'Windows ' + data;\n }\n // Correct character case and cleanup string.\n os = String(os);\n\n if (pattern && label) {\n os = os.replace(RegExp(pattern, 'i'), label);\n }\n\n os = format(\n os.replace(/ ce$/i, ' CE')\n .replace(/\\bhpw/i, 'web')\n .replace(/\\bMacintosh\\b/, 'Mac OS')\n .replace(/_PowerPC\\b/i, ' OS')\n .replace(/\\b(OS X) [^ \\d]+/i, '$1')\n .replace(/\\bMac (OS X)\\b/, '$1')\n .replace(/\\/(\\d)/, ' $1')\n .replace(/_/g, '.')\n .replace(/(?: BePC|[ .]*fc[ \\d.]+)$/i, '')\n .replace(/\\bx86\\.64\\b/gi, 'x86_64')\n .replace(/\\b(Windows Phone) OS\\b/, '$1')\n .replace(/\\b(Chrome OS \\w+) [\\d.]+\\b/, '$1')\n .split(' on ')[0]\n );\n\n return os;\n }\n\n /**\n * An iteration utility for arrays and objects.\n *\n * @private\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} callback The function called per iteration.\n */\n function each(object, callback) {\n var index = -1,\n length = object ? object.length : 0;\n\n if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) {\n while (++index < length) {\n callback(object[index], index, object);\n }\n } else {\n forOwn(object, callback);\n }\n }\n\n /**\n * Trim and conditionally capitalize string values.\n *\n * @private\n * @param {string} string The string to format.\n * @returns {string} The formatted string.\n */\n function format(string) {\n string = trim(string);\n return /^(?:webOS|i(?:OS|P))/.test(string)\n ? string\n : capitalize(string);\n }\n\n /**\n * Iterates over an object's own properties, executing the `callback` for each.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} callback The function executed per own property.\n */\n function forOwn(object, callback) {\n for (var key in object) {\n if (hasOwnProperty.call(object, key)) {\n callback(object[key], key, object);\n }\n }\n }\n\n /**\n * Gets the internal `[[Class]]` of a value.\n *\n * @private\n * @param {*} value The value.\n * @returns {string} The `[[Class]]`.\n */\n function getClassOf(value) {\n return value == null\n ? capitalize(value)\n : toString.call(value).slice(8, -1);\n }\n\n /**\n * Host objects can return type values that are different from their actual\n * data type. The objects we are concerned with usually return non-primitive\n * types of \"object\", \"function\", or \"unknown\".\n *\n * @private\n * @param {*} object The owner of the property.\n * @param {string} property The property to check.\n * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.\n */\n function isHostType(object, property) {\n var type = object != null ? typeof object[property] : 'number';\n return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n (type == 'object' ? !!object[property] : true);\n }\n\n /**\n * Prepares a string for use in a `RegExp` by making hyphens and spaces optional.\n *\n * @private\n * @param {string} string The string to qualify.\n * @returns {string} The qualified string.\n */\n function qualify(string) {\n return String(string).replace(/([ -])(?!$)/g, '$1?');\n }\n\n /**\n * A bare-bones `Array#reduce` like utility function.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function called per iteration.\n * @returns {*} The accumulated result.\n */\n function reduce(array, callback) {\n var accumulator = null;\n each(array, function(value, index) {\n accumulator = callback(accumulator, value, index, array);\n });\n return accumulator;\n }\n\n /**\n * Removes leading and trailing whitespace from a string.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} The trimmed string.\n */\n function trim(string) {\n return String(string).replace(/^ +| +$/g, '');\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a new platform object.\n *\n * @memberOf platform\n * @param {Object|string} [ua=navigator.userAgent] The user agent string or\n * context object.\n * @returns {Object} A platform object.\n */\n function parse(ua) {\n\n /** The environment context object. */\n var context = root;\n\n /** Used to flag when a custom context is provided. */\n var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String';\n\n // Juggle arguments.\n if (isCustomContext) {\n context = ua;\n ua = null;\n }\n\n /** Browser navigator object. */\n var nav = context.navigator || {};\n\n /** Browser user agent string. */\n var userAgent = nav.userAgent || '';\n\n ua || (ua = userAgent);\n\n /** Used to flag when `thisBinding` is the [ModuleScope]. */\n var isModuleScope = isCustomContext || thisBinding == oldRoot;\n\n /** Used to detect if browser is like Chrome. */\n var likeChrome = isCustomContext\n ? !!nav.likeChrome\n : /\\bChrome\\b/.test(ua) && !/internal|\\n/i.test(toString.toString());\n\n /** Internal `[[Class]]` value shortcuts. */\n var objectClass = 'Object',\n airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject',\n enviroClass = isCustomContext ? objectClass : 'Environment',\n javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java),\n phantomClass = isCustomContext ? objectClass : 'RuntimeObject';\n\n /** Detect Java environments. */\n var java = /\\bJava/.test(javaClass) && context.java;\n\n /** Detect Rhino. */\n var rhino = java && getClassOf(context.environment) == enviroClass;\n\n /** A character to represent alpha. */\n var alpha = java ? 'a' : '\\u03b1';\n\n /** A character to represent beta. */\n var beta = java ? 'b' : '\\u03b2';\n\n /** Browser document object. */\n var doc = context.document || {};\n\n /**\n * Detect Opera browser (Presto-based).\n * http://www.howtocreate.co.uk/operaStuff/operaObject.html\n * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini\n */\n var opera = context.operamini || context.opera;\n\n /** Opera `[[Class]]`. */\n var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera))\n ? operaClass\n : (opera = null);\n\n /*------------------------------------------------------------------------*/\n\n /** Temporary variable used over the script's lifetime. */\n var data;\n\n /** The CPU architecture. */\n var arch = ua;\n\n /** Platform description array. */\n var description = [];\n\n /** Platform alpha/beta indicator. */\n var prerelease = null;\n\n /** A flag to indicate that environment features should be used to resolve the platform. */\n var useFeatures = ua == userAgent;\n\n /** The browser/environment version. */\n var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();\n\n /** A flag to indicate if the OS ends with \"/ Version\" */\n var isSpecialCasedOS;\n\n /* Detectable layout engines (order is important). */\n var layout = getLayout([\n { 'label': 'EdgeHTML', 'pattern': 'Edge' },\n 'Trident',\n { 'label': 'WebKit', 'pattern': 'AppleWebKit' },\n 'iCab',\n 'Presto',\n 'NetFront',\n 'Tasman',\n 'KHTML',\n 'Gecko'\n ]);\n\n /* Detectable browser names (order is important). */\n var name = getName([\n 'Adobe AIR',\n 'Arora',\n 'Avant Browser',\n 'Breach',\n 'Camino',\n 'Electron',\n 'Epiphany',\n 'Fennec',\n 'Flock',\n 'Galeon',\n 'GreenBrowser',\n 'iCab',\n 'Iceweasel',\n 'K-Meleon',\n 'Konqueror',\n 'Lunascape',\n 'Maxthon',\n { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' },\n 'Midori',\n 'Nook Browser',\n 'PaleMoon',\n 'PhantomJS',\n 'Raven',\n 'Rekonq',\n 'RockMelt',\n { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' },\n 'SeaMonkey',\n { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Sleipnir',\n 'SlimBrowser',\n { 'label': 'SRWare Iron', 'pattern': 'Iron' },\n 'Sunrise',\n 'Swiftfox',\n 'Vivaldi',\n 'Waterfox',\n 'WebPositive',\n { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' },\n { 'label': 'UC Browser', 'pattern': 'UCBrowser' },\n 'Opera Mini',\n { 'label': 'Opera Mini', 'pattern': 'OPiOS' },\n 'Opera',\n { 'label': 'Opera', 'pattern': 'OPR' },\n 'Chromium',\n 'Chrome',\n { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' },\n { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },\n { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },\n { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' },\n { 'label': 'IE', 'pattern': 'IEMobile' },\n { 'label': 'IE', 'pattern': 'MSIE' },\n 'Safari'\n ]);\n\n /* Detectable products (order is important). */\n var product = getProduct([\n { 'label': 'BlackBerry', 'pattern': 'BB10' },\n 'BlackBerry',\n { 'label': 'Galaxy S', 'pattern': 'GT-I9000' },\n { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },\n { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' },\n { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' },\n { 'label': 'Galaxy S5', 'pattern': 'SM-G900' },\n { 'label': 'Galaxy S6', 'pattern': 'SM-G920' },\n { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' },\n { 'label': 'Galaxy S7', 'pattern': 'SM-G930' },\n { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' },\n 'Google TV',\n 'Lumia',\n 'iPad',\n 'iPod',\n 'iPhone',\n 'Kindle',\n { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Nexus',\n 'Nook',\n 'PlayBook',\n 'PlayStation Vita',\n 'PlayStation',\n 'TouchPad',\n 'Transformer',\n { 'label': 'Wii U', 'pattern': 'WiiU' },\n 'Wii',\n 'Xbox One',\n { 'label': 'Xbox 360', 'pattern': 'Xbox' },\n 'Xoom'\n ]);\n\n /* Detectable manufacturers. */\n var manufacturer = getManufacturer({\n 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },\n 'Alcatel': {},\n 'Archos': {},\n 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },\n 'Asus': { 'Transformer': 1 },\n 'Barnes & Noble': { 'Nook': 1 },\n 'BlackBerry': { 'PlayBook': 1 },\n 'Google': { 'Google TV': 1, 'Nexus': 1 },\n 'HP': { 'TouchPad': 1 },\n 'HTC': {},\n 'Huawei': {},\n 'Lenovo': {},\n 'LG': {},\n 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 },\n 'Motorola': { 'Xoom': 1 },\n 'Nintendo': { 'Wii U': 1, 'Wii': 1 },\n 'Nokia': { 'Lumia': 1 },\n 'Oppo': {},\n 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 },\n 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 },\n 'Xiaomi': { 'Mi': 1, 'Redmi': 1 }\n });\n\n /* Detectable operating systems (order is important). */\n var os = getOS([\n 'Windows Phone',\n 'KaiOS',\n 'Android',\n 'CentOS',\n { 'label': 'Chrome OS', 'pattern': 'CrOS' },\n 'Debian',\n { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' },\n 'Fedora',\n 'FreeBSD',\n 'Gentoo',\n 'Haiku',\n 'Kubuntu',\n 'Linux Mint',\n 'OpenBSD',\n 'Red Hat',\n 'SuSE',\n 'Ubuntu',\n 'Xubuntu',\n 'Cygwin',\n 'Symbian OS',\n 'hpwOS',\n 'webOS ',\n 'webOS',\n 'Tablet OS',\n 'Tizen',\n 'Linux',\n 'Mac OS X',\n 'Macintosh',\n 'Mac',\n 'Windows 98;',\n 'Windows '\n ]);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Picks the layout engine from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected layout engine.\n */\n function getLayout(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the manufacturer from an array of guesses.\n *\n * @private\n * @param {Array} guesses An object of guesses.\n * @returns {null|string} The detected manufacturer.\n */\n function getManufacturer(guesses) {\n return reduce(guesses, function(result, value, key) {\n // Lookup the manufacturer by product or scan the UA for the manufacturer.\n return result || (\n value[product] ||\n value[/^[a-z]+(?: +[a-z]+\\b)*/i.exec(product)] ||\n RegExp('\\\\b' + qualify(key) + '(?:\\\\b|\\\\w*\\\\d)', 'i').exec(ua)\n ) && key;\n });\n }\n\n /**\n * Picks the browser name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected browser name.\n */\n function getName(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the OS name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected OS name.\n */\n function getOS(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + '(?:/[\\\\d.]+|[ \\\\w.]*)', 'i').exec(ua)\n )) {\n result = cleanupOS(result, pattern, guess.label || guess);\n }\n return result;\n });\n }\n\n /**\n * Picks the product name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected product name.\n */\n function getProduct(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + ' *\\\\d+[.\\\\w_]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + ' *\\\\w+-[\\\\w]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\\\d+|[^ ();-]*)', 'i').exec(ua)\n )) {\n // Split by forward slash and append product version if needed.\n if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\\d.]+/.test(result[0])) {\n result[0] += ' ' + result[1];\n }\n // Correct character case and cleanup string.\n guess = guess.label || guess;\n result = format(result[0]\n .replace(RegExp(pattern, 'i'), guess)\n .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')\n .replace(RegExp('(' + guess + ')[-_.]?(\\\\w)', 'i'), '$1 $2'));\n }\n return result;\n });\n }\n\n /**\n * Resolves the version using an array of UA patterns.\n *\n * @private\n * @param {Array} patterns An array of UA patterns.\n * @returns {null|string} The detected version.\n */\n function getVersion(patterns) {\n return reduce(patterns, function(result, pattern) {\n return result || (RegExp(pattern +\n '(?:-[\\\\d.]+/|(?: for [\\\\w-]+)?[ /-])([\\\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;\n });\n }\n\n /**\n * Returns `platform.description` when the platform object is coerced to a string.\n *\n * @name toString\n * @memberOf platform\n * @returns {string} Returns `platform.description` if available, else an empty string.\n */\n function toStringPlatform() {\n return this.description || '';\n }\n\n /*------------------------------------------------------------------------*/\n\n // Convert layout to an array so we can add extra details.\n layout && (layout = [layout]);\n\n // Detect Android products.\n // Browsers on Android devices typically provide their product IDS after \"Android;\"\n // up to \"Build\" or \") AppleWebKit\".\n // Example:\n // \"Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36\n // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36\"\n if (/\\bAndroid\\b/.test(os) && !product &&\n (data = /\\bAndroid[^;]*;(.*?)(?:Build|\\) AppleWebKit)\\b/i.exec(ua))) {\n product = trim(data[1])\n // Replace any language codes (eg. \"en-US\").\n .replace(/^[a-z]{2}-[a-z]{2};\\s*/i, '')\n || null;\n }\n // Detect product names that contain their manufacturer's name.\n if (manufacturer && !product) {\n product = getProduct([manufacturer]);\n } else if (manufacturer && product) {\n product = product\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\\\s]', 'i'), manufacturer + ' ')\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\\\w)', 'i'), manufacturer + ' $2');\n }\n // Clean up Google TV.\n if ((data = /\\bGoogle TV\\b/.exec(product))) {\n product = data[0];\n }\n // Detect simulators.\n if (/\\bSimulator\\b/i.test(ua)) {\n product = (product ? product + ' ' : '') + 'Simulator';\n }\n // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.\n if (name == 'Opera Mini' && /\\bOPiOS\\b/.test(ua)) {\n description.push('running in Turbo/Uncompressed mode');\n }\n // Detect IE Mobile 11.\n if (name == 'IE' && /\\blike iPhone OS\\b/.test(ua)) {\n data = parse(ua.replace(/like iPhone OS/, ''));\n manufacturer = data.manufacturer;\n product = data.product;\n }\n // Detect iOS.\n else if (/^iP/.test(product)) {\n name || (name = 'Safari');\n os = 'iOS' + ((data = / OS ([\\d_]+)/i.exec(ua))\n ? ' ' + data[1].replace(/_/g, '.')\n : '');\n }\n // Detect Kubuntu.\n else if (name == 'Konqueror' && /^Linux\\b/i.test(os)) {\n os = 'Kubuntu';\n }\n // Detect Android browsers.\n else if ((manufacturer && manufacturer != 'Google' &&\n ((/Chrome/.test(name) && !/\\bMobile Safari\\b/i.test(ua)) || /\\bVita\\b/.test(product))) ||\n (/\\bAndroid\\b/.test(os) && /^Chrome/.test(name) && /\\bVersion\\//i.test(ua))) {\n name = 'Android Browser';\n os = /\\bAndroid\\b/.test(os) ? os : 'Android';\n }\n // Detect Silk desktop/accelerated modes.\n else if (name == 'Silk') {\n if (!/\\bMobi/i.test(ua)) {\n os = 'Android';\n description.unshift('desktop mode');\n }\n if (/Accelerated *= *true/i.test(ua)) {\n description.unshift('accelerated');\n }\n }\n // Detect UC Browser speed mode.\n else if (name == 'UC Browser' && /\\bUCWEB\\b/.test(ua)) {\n description.push('speed mode');\n }\n // Detect PaleMoon identifying as Firefox.\n else if (name == 'PaleMoon' && (data = /\\bFirefox\\/([\\d.]+)\\b/.exec(ua))) {\n description.push('identifying as Firefox ' + data[1]);\n }\n // Detect Firefox OS and products running Firefox.\n else if (name == 'Firefox' && (data = /\\b(Mobile|Tablet|TV)\\b/i.exec(ua))) {\n os || (os = 'Firefox OS');\n product || (product = data[1]);\n }\n // Detect false positives for Firefox/Safari.\n else if (!name || (data = !/\\bMinefield\\b/i.test(ua) && /\\b(?:Firefox|Safari)\\b/.exec(name))) {\n // Escape the `/` for Firefox 1.\n if (name && !product && /[\\/,]|^[^(]+?\\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {\n // Clear name of false positives.\n name = null;\n }\n // Reassign a generic name.\n if ((data = product || manufacturer || os) &&\n (product || manufacturer || /\\b(?:Android|Symbian OS|Tablet OS|webOS)\\b/.test(os))) {\n name = /[a-z]+(?: Hat)?/i.exec(/\\bAndroid\\b/.test(os) ? os : data) + ' Browser';\n }\n }\n // Add Chrome version to description for Electron.\n else if (name == 'Electron' && (data = (/\\bChrome\\/([\\d.]+)\\b/.exec(ua) || 0)[1])) {\n description.push('Chromium ' + data);\n }\n // Detect non-Opera (Presto-based) versions (order is important).\n if (!version) {\n version = getVersion([\n '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\\\d.]+$)|UCBrowser|YaBrowser)',\n 'Version',\n qualify(name),\n '(?:Firefox|Minefield|NetFront)'\n ]);\n }\n // Detect stubborn layout engines.\n if ((data =\n layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' ||\n /\\bOpera\\b/.test(name) && (/\\bOPR\\b/.test(ua) ? 'Blink' : 'Presto') ||\n /\\b(?:Midori|Nook|Safari)\\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' ||\n !layout && /\\bMSIE\\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') ||\n layout == 'WebKit' && /\\bPlayStation\\b(?! Vita\\b)/i.test(name) && 'NetFront'\n )) {\n layout = [data];\n }\n // Detect Windows Phone 7 desktop mode.\n if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\\d+)/i.exec(ua) || 0)[1])) {\n name += ' Mobile';\n os = 'Windows Phone ' + (/\\+$/.test(data) ? data : data + '.x');\n description.unshift('desktop mode');\n }\n // Detect Windows Phone 8.x desktop mode.\n else if (/\\bWPDesktop\\b/i.test(ua)) {\n name = 'IE Mobile';\n os = 'Windows Phone 8.x';\n description.unshift('desktop mode');\n version || (version = (/\\brv:([\\d.]+)/.exec(ua) || 0)[1]);\n }\n // Detect IE 11 identifying as other browsers.\n else if (name != 'IE' && layout == 'Trident' && (data = /\\brv:([\\d.]+)/.exec(ua))) {\n if (name) {\n description.push('identifying as ' + name + (version ? ' ' + version : ''));\n }\n name = 'IE';\n version = data[1];\n }\n // Leverage environment features.\n if (useFeatures) {\n // Detect server-side environments.\n // Rhino has a global function while others have a global object.\n if (isHostType(context, 'global')) {\n if (java) {\n data = java.lang.System;\n arch = data.getProperty('os.arch');\n os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');\n }\n if (rhino) {\n try {\n version = context.require('ringo/engine').version.join('.');\n name = 'RingoJS';\n } catch(e) {\n if ((data = context.system) && data.global.system == context.system) {\n name = 'Narwhal';\n os || (os = data[0].os || null);\n }\n }\n if (!name) {\n name = 'Rhino';\n }\n }\n else if (\n typeof context.process == 'object' && !context.process.browser &&\n (data = context.process)\n ) {\n if (typeof data.versions == 'object') {\n if (typeof data.versions.electron == 'string') {\n description.push('Node ' + data.versions.node);\n name = 'Electron';\n version = data.versions.electron;\n } else if (typeof data.versions.nw == 'string') {\n description.push('Chromium ' + version, 'Node ' + data.versions.node);\n name = 'NW.js';\n version = data.versions.nw;\n }\n }\n if (!name) {\n name = 'Node.js';\n arch = data.arch;\n os = data.platform;\n version = /[\\d.]+/.exec(data.version);\n version = version ? version[0] : null;\n }\n }\n }\n // Detect Adobe AIR.\n else if (getClassOf((data = context.runtime)) == airRuntimeClass) {\n name = 'Adobe AIR';\n os = data.flash.system.Capabilities.os;\n }\n // Detect PhantomJS.\n else if (getClassOf((data = context.phantom)) == phantomClass) {\n name = 'PhantomJS';\n version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);\n }\n // Detect IE compatibility modes.\n else if (typeof doc.documentMode == 'number' && (data = /\\bTrident\\/(\\d+)/i.exec(ua))) {\n // We're in compatibility mode when the Trident version + 4 doesn't\n // equal the document mode.\n version = [version, doc.documentMode];\n if ((data = +data[1] + 4) != version[1]) {\n description.push('IE ' + version[1] + ' mode');\n layout && (layout[1] = '');\n version[1] = data;\n }\n version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];\n }\n // Detect IE 11 masking as other browsers.\n else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\\b/.test(name)) {\n description.push('masking as ' + name + ' ' + version);\n name = 'IE';\n version = '11.0';\n layout = ['Trident'];\n os = 'Windows';\n }\n os = os && format(os);\n }\n // Detect prerelease phases.\n if (version && (data =\n /(?:[ab]|dp|pre|[ab]\\d+pre)(?:\\d+\\+?)?$/i.exec(version) ||\n /(?:alpha|beta)(?: ?\\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||\n /\\bMinefield\\b/i.test(ua) && 'a'\n )) {\n prerelease = /b/i.test(data) ? 'beta' : 'alpha';\n version = version.replace(RegExp(data + '\\\\+?$'), '') +\n (prerelease == 'beta' ? beta : alpha) + (/\\d+\\+?/.exec(data) || '');\n }\n // Detect Firefox Mobile.\n if (name == 'Fennec' || name == 'Firefox' && /\\b(?:Android|Firefox OS|KaiOS)\\b/.test(os)) {\n name = 'Firefox Mobile';\n }\n // Obscure Maxthon's unreliable version.\n else if (name == 'Maxthon' && version) {\n version = version.replace(/\\.[\\d.]+/, '.x');\n }\n // Detect Xbox 360 and Xbox One.\n else if (/\\bXbox\\b/i.test(product)) {\n if (product == 'Xbox 360') {\n os = null;\n }\n if (product == 'Xbox 360' && /\\bIEMobile\\b/.test(ua)) {\n description.unshift('mobile mode');\n }\n }\n // Add mobile postfix.\n else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) &&\n (os == 'Windows CE' || /Mobi/i.test(ua))) {\n name += ' Mobile';\n }\n // Detect IE platform preview.\n else if (name == 'IE' && useFeatures) {\n try {\n if (context.external === null) {\n description.unshift('platform preview');\n }\n } catch(e) {\n description.unshift('embedded');\n }\n }\n // Detect BlackBerry OS version.\n // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp\n else if ((/\\bBlackBerry\\b/.test(product) || /\\bBB10\\b/.test(ua)) && (data =\n (RegExp(product.replace(/ +/g, ' *') + '/([.\\\\d]+)', 'i').exec(ua) || 0)[1] ||\n version\n )) {\n data = [data, /BB10/.test(ua)];\n os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0];\n version = null;\n }\n // Detect Opera identifying/masking itself as another browser.\n // http://www.opera.com/support/kb/view/843/\n else if (this != forOwn && product != 'Wii' && (\n (useFeatures && opera) ||\n (/Opera/.test(name) && /\\b(?:MSIE|Firefox)\\b/i.test(ua)) ||\n (name == 'Firefox' && /\\bOS X (?:\\d+\\.){2,}/.test(os)) ||\n (name == 'IE' && (\n (os && !/^Win/.test(os) && version > 5.5) ||\n /\\bWindows XP\\b/.test(os) && version > 8 ||\n version == 8 && !/\\bTrident\\b/.test(ua)\n ))\n ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) {\n // When \"identifying\", the UA contains both Opera and the other browser's name.\n data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');\n if (reOpera.test(name)) {\n if (/\\bIE\\b/.test(data) && os == 'Mac OS') {\n os = null;\n }\n data = 'identify' + data;\n }\n // When \"masking\", the UA contains only the other browser's name.\n else {\n data = 'mask' + data;\n if (operaClass) {\n name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));\n } else {\n name = 'Opera';\n }\n if (/\\bIE\\b/.test(data)) {\n os = null;\n }\n if (!useFeatures) {\n version = null;\n }\n }\n layout = ['Presto'];\n description.push(data);\n }\n // Detect WebKit Nightly and approximate Chrome/Safari versions.\n if ((data = (/\\bAppleWebKit\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n // Correct build number for numeric comparison.\n // (e.g. \"532.5\" becomes \"532.05\")\n data = [parseFloat(data.replace(/\\.(\\d)$/, '.0$1')), data];\n // Nightly builds are postfixed with a \"+\".\n if (name == 'Safari' && data[1].slice(-1) == '+') {\n name = 'WebKit Nightly';\n prerelease = 'alpha';\n version = data[1].slice(0, -1);\n }\n // Clear incorrect browser versions.\n else if (version == data[1] ||\n version == (data[2] = (/\\bSafari\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n version = null;\n }\n // Use the full Chrome version when available.\n data[1] = (/\\b(?:Headless)?Chrome\\/([\\d.]+)/i.exec(ua) || 0)[1];\n // Detect Blink layout engine.\n if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') {\n layout = ['Blink'];\n }\n // Detect JavaScriptCore.\n // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi\n if (!useFeatures || (!likeChrome && !data[1])) {\n layout && (layout[1] = 'like Safari');\n data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12');\n } else {\n layout && (layout[1] = 'like Chrome');\n data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28');\n }\n // Add the postfix of \".x\" or \"+\" for approximate versions.\n layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'));\n // Obscure version for some Safari 1-2 releases.\n if (name == 'Safari' && (!version || parseInt(version) > 45)) {\n version = data;\n } else if (name == 'Chrome' && /\\bHeadlessChrome/i.test(ua)) {\n description.unshift('headless');\n }\n }\n // Detect Opera desktop modes.\n if (name == 'Opera' && (data = /\\bzbov|zvav$/.exec(os))) {\n name += ' ';\n description.unshift('desktop mode');\n if (data == 'zvav') {\n name += 'Mini';\n version = null;\n } else {\n name += 'Mobile';\n }\n os = os.replace(RegExp(' *' + data + '$'), '');\n }\n // Detect Chrome desktop mode.\n else if (name == 'Safari' && /\\bChrome\\b/.exec(layout && layout[1])) {\n description.unshift('desktop mode');\n name = 'Chrome Mobile';\n version = null;\n\n if (/\\bOS X\\b/.test(os)) {\n manufacturer = 'Apple';\n os = 'iOS 4.3+';\n } else {\n os = null;\n }\n }\n // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number.\n else if (/\\bSRWare Iron\\b/.test(name) && !version) {\n version = getVersion('Chrome');\n }\n // Strip incorrect OS versions.\n if (version && version.indexOf((data = /[\\d.]+$/.exec(os))) == 0 &&\n ua.indexOf('/' + data + '-') > -1) {\n os = trim(os.replace(data, ''));\n }\n // Ensure OS does not include the browser name.\n if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) {\n os = os.replace(RegExp(' *' + qualify(name) + ' *'), '');\n }\n // Add layout engine.\n if (layout && !/\\b(?:Avant|Nook)\\b/.test(name) && (\n /Browser|Lunascape|Maxthon/.test(name) ||\n name != 'Safari' && /^iOS/.test(os) && /\\bSafari\\b/.test(layout[1]) ||\n /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) {\n // Don't add layout details to description if they are falsey.\n (data = layout[layout.length - 1]) && description.push(data);\n }\n // Combine contextual information.\n if (description.length) {\n description = ['(' + description.join('; ') + ')'];\n }\n // Append manufacturer to description.\n if (manufacturer && product && product.indexOf(manufacturer) < 0) {\n description.push('on ' + manufacturer);\n }\n // Append product to description.\n if (product) {\n description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product);\n }\n // Parse the OS into an object.\n if (os) {\n data = / ([\\d.+]+)$/.exec(os);\n isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/';\n os = {\n 'architecture': 32,\n 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os,\n 'version': data ? data[1] : null,\n 'toString': function() {\n var version = this.version;\n return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');\n }\n };\n }\n // Add browser/OS architecture.\n if ((data = /\\b(?:AMD|IA|Win|WOW|x86_|x)64\\b/i.exec(arch)) && !/\\bi686\\b/i.test(arch)) {\n if (os) {\n os.architecture = 64;\n os.family = os.family.replace(RegExp(' *' + data), '');\n }\n if (\n name && (/\\bWOW64\\b/i.test(ua) ||\n (useFeatures && /\\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\\bWin64; x64\\b/i.test(ua)))\n ) {\n description.unshift('32-bit');\n }\n }\n // Chrome 39 and above on OS X is always 64-bit.\n else if (\n os && /^OS X/.test(os.family) &&\n name == 'Chrome' && parseFloat(version) >= 39\n ) {\n os.architecture = 64;\n }\n\n ua || (ua = null);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The platform object.\n *\n * @name platform\n * @type Object\n */\n var platform = {};\n\n /**\n * The platform description.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.description = ua;\n\n /**\n * The name of the browser's layout engine.\n *\n * The list of common layout engines include:\n * \"Blink\", \"EdgeHTML\", \"Gecko\", \"Trident\" and \"WebKit\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.layout = layout && layout[0];\n\n /**\n * The name of the product's manufacturer.\n *\n * The list of manufacturers include:\n * \"Apple\", \"Archos\", \"Amazon\", \"Asus\", \"Barnes & Noble\", \"BlackBerry\",\n * \"Google\", \"HP\", \"HTC\", \"LG\", \"Microsoft\", \"Motorola\", \"Nintendo\",\n * \"Nokia\", \"Samsung\" and \"Sony\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.manufacturer = manufacturer;\n\n /**\n * The name of the browser/environment.\n *\n * The list of common browser names include:\n * \"Chrome\", \"Electron\", \"Firefox\", \"Firefox for iOS\", \"IE\",\n * \"Microsoft Edge\", \"PhantomJS\", \"Safari\", \"SeaMonkey\", \"Silk\",\n * \"Opera Mini\" and \"Opera\"\n *\n * Mobile versions of some browsers have \"Mobile\" appended to their name:\n * eg. \"Chrome Mobile\", \"Firefox Mobile\", \"IE Mobile\" and \"Opera Mobile\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.name = name;\n\n /**\n * The alpha/beta release indicator.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.prerelease = prerelease;\n\n /**\n * The name of the product hosting the browser.\n *\n * The list of common products include:\n *\n * \"BlackBerry\", \"Galaxy S4\", \"Lumia\", \"iPad\", \"iPod\", \"iPhone\", \"Kindle\",\n * \"Kindle Fire\", \"Nexus\", \"Nook\", \"PlayBook\", \"TouchPad\" and \"Transformer\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.product = product;\n\n /**\n * The browser's user agent string.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.ua = ua;\n\n /**\n * The browser/environment version.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.version = name && version;\n\n /**\n * The name of the operating system.\n *\n * @memberOf platform\n * @type Object\n */\n platform.os = os || {\n\n /**\n * The CPU architecture the OS is built for.\n *\n * @memberOf platform.os\n * @type number|null\n */\n 'architecture': null,\n\n /**\n * The family of the OS.\n *\n * Common values include:\n * \"Windows\", \"Windows Server 2008 R2 / 7\", \"Windows Server 2008 / Vista\",\n * \"Windows XP\", \"OS X\", \"Linux\", \"Ubuntu\", \"Debian\", \"Fedora\", \"Red Hat\",\n * \"SuSE\", \"Android\", \"iOS\" and \"Windows Phone\"\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'family': null,\n\n /**\n * The version of the OS.\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'version': null,\n\n /**\n * Returns the OS string.\n *\n * @memberOf platform.os\n * @returns {string} The OS string.\n */\n 'toString': function() { return 'null'; }\n };\n\n platform.parse = parse;\n platform.toString = toStringPlatform;\n\n if (platform.version) {\n description.unshift(version);\n }\n if (platform.name) {\n description.unshift(name);\n }\n if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) {\n description.push(product ? '(' + os + ')' : 'on ' + os);\n }\n if (description.length) {\n platform.description = description.join(' ');\n }\n return platform;\n }\n\n /*--------------------------------------------------------------------------*/\n\n // Export platform.\n var platform = parse();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose platform on the global object to prevent errors when platform is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n root.platform = platform;\n\n // Define as an anonymous module so platform can be aliased through path mapping.\n define(function() {\n return platform;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for CommonJS support.\n forOwn(platform, function(value, key) {\n freeExports[key] = value;\n });\n }\n else {\n // Export to the global object.\n root.platform = platform;\n }\n}.call(this));\n","/*!\n* screenfull\n* v5.2.0 - 2021-11-03\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrÑ–bute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return e;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var t,\n e = {},\n r = Object.prototype,\n n = r.hasOwnProperty,\n o = Object.defineProperty || function (t, e, r) {\n t[e] = r.value;\n },\n i = \"function\" == typeof Symbol ? Symbol : {},\n a = i.iterator || \"@@iterator\",\n c = i.asyncIterator || \"@@asyncIterator\",\n u = i.toStringTag || \"@@toStringTag\";\n function define(t, e, r) {\n return Object.defineProperty(t, e, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), t[e];\n }\n try {\n define({}, \"\");\n } catch (t) {\n define = function define(t, e, r) {\n return t[e] = r;\n };\n }\n function wrap(t, e, r, n) {\n var i = e && e.prototype instanceof Generator ? e : Generator,\n a = Object.create(i.prototype),\n c = new Context(n || []);\n return o(a, \"_invoke\", {\n value: makeInvokeMethod(t, r, c)\n }), a;\n }\n function tryCatch(t, e, r) {\n try {\n return {\n type: \"normal\",\n arg: t.call(e, r)\n };\n } catch (t) {\n return {\n type: \"throw\",\n arg: t\n };\n }\n }\n e.wrap = wrap;\n var h = \"suspendedStart\",\n l = \"suspendedYield\",\n f = \"executing\",\n s = \"completed\",\n y = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var p = {};\n define(p, a, function () {\n return this;\n });\n var d = Object.getPrototypeOf,\n v = d && d(d(values([])));\n v && v !== r && n.call(v, a) && (p = v);\n var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n function defineIteratorMethods(t) {\n [\"next\", \"throw\", \"return\"].forEach(function (e) {\n define(t, e, function (t) {\n return this._invoke(e, t);\n });\n });\n }\n function AsyncIterator(t, e) {\n function invoke(r, o, i, a) {\n var c = tryCatch(t[r], t, o);\n if (\"throw\" !== c.type) {\n var u = c.arg,\n h = u.value;\n return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n invoke(\"next\", t, i, a);\n }, function (t) {\n invoke(\"throw\", t, i, a);\n }) : e.resolve(h).then(function (t) {\n u.value = t, i(u);\n }, function (t) {\n return invoke(\"throw\", t, i, a);\n });\n }\n a(c.arg);\n }\n var r;\n o(this, \"_invoke\", {\n value: function value(t, n) {\n function callInvokeWithMethodAndArg() {\n return new e(function (e, r) {\n invoke(t, n, e, r);\n });\n }\n return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(e, r, n) {\n var o = h;\n return function (i, a) {\n if (o === f) throw new Error(\"Generator is already running\");\n if (o === s) {\n if (\"throw\" === i) throw a;\n return {\n value: t,\n done: !0\n };\n }\n for (n.method = i, n.arg = a;;) {\n var c = n.delegate;\n if (c) {\n var u = maybeInvokeDelegate(c, n);\n if (u) {\n if (u === y) continue;\n return u;\n }\n }\n if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n if (o === h) throw o = s, n.arg;\n n.dispatchException(n.arg);\n } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n o = f;\n var p = tryCatch(e, r, n);\n if (\"normal\" === p.type) {\n if (o = n.done ? s : l, p.arg === y) continue;\n return {\n value: p.arg,\n done: n.done\n };\n }\n \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n }\n };\n }\n function maybeInvokeDelegate(e, r) {\n var n = r.method,\n o = e.iterator[n];\n if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n var i = tryCatch(o, e.iterator, r.arg);\n if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n var a = i.arg;\n return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n }\n function pushTryEntry(t) {\n var e = {\n tryLoc: t[0]\n };\n 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n }\n function resetTryEntry(t) {\n var e = t.completion || {};\n e.type = \"normal\", delete e.arg, t.completion = e;\n }\n function Context(t) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], t.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(e) {\n if (e || \"\" === e) {\n var r = e[a];\n if (r) return r.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) {\n var o = -1,\n i = function next() {\n for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n return next.value = t, next.done = !0, next;\n };\n return i.next = i;\n }\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), o(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n var e = \"function\" == typeof t && t.constructor;\n return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n }, e.mark = function (t) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n }, e.awrap = function (t) {\n return {\n __await: t\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n return this;\n }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n void 0 === i && (i = Promise);\n var a = new AsyncIterator(wrap(t, r, n, o), i);\n return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n return t.done ? t.value : a.next();\n });\n }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n return this;\n }), define(g, \"toString\", function () {\n return \"[object Generator]\";\n }), e.keys = function (t) {\n var e = Object(t),\n r = [];\n for (var n in e) r.push(n);\n return r.reverse(), function next() {\n for (; r.length;) {\n var t = r.pop();\n if (t in e) return next.value = t, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, e.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(e) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n },\n stop: function stop() {\n this.done = !0;\n var t = this.tryEntries[0].completion;\n if (\"throw\" === t.type) throw t.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(e) {\n if (this.done) throw e;\n var r = this;\n function handle(n, o) {\n return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n }\n for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n var i = this.tryEntries[o],\n a = i.completion;\n if (\"root\" === i.tryLoc) return handle(\"end\");\n if (i.tryLoc <= this.prev) {\n var c = n.call(i, \"catchLoc\"),\n u = n.call(i, \"finallyLoc\");\n if (c && u) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n } else if (c) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n } else {\n if (!u) throw new Error(\"try statement without catch or finally\");\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(t, e) {\n for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n var o = this.tryEntries[r];\n if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n var i = o;\n break;\n }\n }\n i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n var a = i ? i.completion : {};\n return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n },\n complete: function complete(t, e) {\n if (\"throw\" === t.type) throw t.arg;\n return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n },\n finish: function finish(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n }\n },\n \"catch\": function _catch(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.tryLoc === t) {\n var n = r.completion;\n if (\"throw\" === n.type) {\n var o = n.arg;\n resetTryEntry(r);\n }\n return o;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(e, r, n) {\n return this.delegate = {\n iterator: values(e),\n resultName: r,\n nextLoc: n\n }, \"next\" === this.method && (this.arg = t), y;\n }\n }, e;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default {\n api: 'https://api.eyeson.team',\n allowSafariSFU: true,\n screencapture: true\n};\n","export default {\n widescreen: false\n};\n","/*eslint no-console: 0*/\n\n/**\n * eyeson Logger implement debug|info|warn|error methods.\n **/\nexport default (function () {\n return {\n error: function (...args) {\n return console.error(...args);\n },\n warn: function (...args) {\n return console.warn(...args);\n },\n info: function (...args) {\n return console.log(...args);\n },\n debug: function (...args) {\n if (!console.debug) {\n return null;\n }\n return console.debug(...args);\n }\n };\n})();\n","/* eslint max-lines: off */\nimport Logger from './Logger.js';\n\n/**\n * eyeson Communications Api\n **/\nclass ComApi {\n constructor(uri, token) {\n this.uri = uri;\n this.token = token.replace(/\\W+/g, '');\n this.cache = { users: [] };\n this.errorCallback = null;\n this._handleError = this._handleError.bind(this);\n }\n\n _request(path, options = {}) {\n return fetch(new Request(this.uri + path), options).then(response => {\n const contentType = response.headers.get('content-type');\n\n if (\n contentType &&\n contentType.indexOf('application/json') !== -1 &&\n response.ok\n ) {\n return response.json();\n }\n\n // not json - e.g. broadcast stop\n if (response.ok) {\n return response.text();\n }\n\n throw new Error(`ComApiError: ${response.status}`);\n });\n }\n\n /**\n * NOTE: slightly adjusted from:\n * https://gist.github.com/ghinda/8442a57f22099bdb2e34\n **/\n /* eslint-disable */\n _objectToFormData(obj, form, namespace) {\n let fd = form || new FormData();\n let formKey = null;\n\n for (let property in obj) {\n if (!obj.hasOwnProperty(property)) {\n return;\n }\n if (namespace) {\n // adjusted, skip \"int props\" for layout api\n let prop = isNaN(parseInt(property)) ? property : '';\n formKey = namespace + '[' + prop + ']';\n } else {\n formKey = property;\n }\n // if the property is an object, but not a File, use recursivity.\n if (\n typeof obj[property] === 'object' &&\n !(obj[property] instanceof File)\n ) {\n this._objectToFormData(obj[property], fd, property);\n } else {\n // if it's a string or a File object\n fd.append(formKey, obj[property]);\n }\n }\n\n return fd;\n }\n /* eslint-enable */\n\n _post(path, data) {\n return this._request(path, {\n method: 'POST',\n body: this._objectToFormData(data)\n });\n }\n\n _put(path, data) {\n const formData = new FormData();\n /* eslint-disable guard-for-in */\n for (const key in data) {\n formData.append(key, data[key]);\n }\n /* eslint-enable */\n return this._request(path, {\n method: 'PUT',\n body: formData\n });\n }\n\n _handleError(error) {\n Logger.error('ComApi::handleError', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return false;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n /**\n * Fetch room details including the user and credentials from com-api.\n **/\n getRoom(callback) {\n return this._request(`/rooms/${this.token}`)\n .then(callback)\n .catch(error => {\n return callback ? callback({ error: error }) : { error: error };\n });\n }\n\n /**\n * Terminate meeting immediately for all users\n **/\n terminateMeeting() {\n return this._request(`/rooms/${this.token}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Retrieve user information. Will use cache on multiple requests.\n **/\n getUser(userId, callback) {\n const user = this.cache.users.find(cachedUser => cachedUser.id === userId);\n\n if (user) {\n callback(user);\n return null;\n }\n\n return this._request(`/rooms/${this.token}/users/${userId}`)\n .then(apiUser => {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n let extendedUser = this.addUserAttributes(apiUser, userId, userId);\n users.push(extendedUser);\n this.cache.users = users;\n callback(extendedUser);\n })\n .catch(this._handleError);\n }\n\n addUserAttributes(user, userId, clientId) {\n let largeAvatarUrl = user.avatar;\n\n try {\n largeAvatarUrl = `${user.avatar}?size=large`;\n } catch (error) {\n Logger.warn('ComApi::addUserAttributes missing', user);\n }\n\n return Object.assign(user, {\n id: userId,\n apiId: user.id,\n clientId: clientId,\n // sipId will be removed in future (2023)!\n sipId: clientId,\n largeAvatar: largeAvatarUrl\n });\n }\n\n /**\n * Remove user from current meeting.\n **/\n kickUser(userId) {\n return this._request(`/rooms/${this.token}/users/${userId}`, {\n method: 'DELETE'\n })\n .then(() => {\n const user = this.cache.users.find(\n cachedUser => cachedUser.id === userId\n );\n if (user) {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n this.cache.users = users;\n }\n })\n .catch(this._handleError);\n }\n\n /**\n * Request a guest user from api.\n **/\n /* eslint-disable camelcase */\n requestUser(user, callback) {\n return this._post(`/guests/${this.token}`, {\n name: user.name,\n email: user.email,\n custom_fields: {\n locale: user.locale || 'en'\n }\n })\n .then(callback)\n .catch(error => callback({ error: error }));\n }\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n startBroadcast(data, platform) {\n return this._post(`/rooms/${this.token}/broadcasts`, {\n platform: platform,\n player_url: data.playerUrl || '',\n stream_url: data.streamUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n publishBroadcast(data, platform) {\n return this._put(`/rooms/${this.token}/broadcasts/${platform}`, {\n player_url: data.playerUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Stop a broadcast from a platform.\n **/\n stopBroadcast(platform) {\n return this._request(`/rooms/${this.token}/broadcasts/${platform}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Stop all broadcasts.\n **/\n stopAllBroadcasts() {\n return this._request(`/rooms/${this.token}/broadcasts`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Start a recording.\n **/\n startRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'POST'\n });\n }\n\n /**\n * Stop a recording\n **/\n stopRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Set layout\n * params object either as { layout: 'auto' } or { users: [ id1, id2 ...] }\n **/\n setLayout(params) {\n return this._post(`/rooms/${this.token}/layout`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Set layer\n *\n * params object: {\n * insert: {\n * icon: user['avatar'],\n * title: \"#{user['name']}:\",\n * content: question.truncate(280)\n * }\n * }\n *\n **/\n setLayer(params) {\n return this._post(`/rooms/${this.token}/layers`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Clear front most layer\n **/\n clearFrontLayer() {\n return this._request(`/rooms/${this.token}/layers/1`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Take a snapshot of the current podium\n **/\n takeSnapshot() {\n return this._request(`/rooms/${this.token}/snapshot`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n\n getSnapshot(snapshotId, callback) {\n return this._request(`/rooms/${this.token}/snapshots/${snapshotId}`)\n .then(callback)\n .catch(error => {\n if (callback) {\n callback({ error });\n return;\n }\n this._handleError(error);\n });\n }\n\n /**\n * Start a playback\n **/\n startPlayback(playback) {\n return this._post(`/rooms/${this.token}/playbacks`, {\n playback: playback\n }).catch(this._handleError);\n }\n\n /**\n * Stop a playback identified by play_id\n **/\n stopPlayback(playback) {\n return this._request(`/rooms/${this.token}/playbacks/${playback.play_id}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Lock meeting to freeze current participants\n */\n lockMeeting() {\n return this._request(`/rooms/${this.token}/lock`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n}\n\nexport default ComApi;\n","/* eslint-disable */\n/**\n * Creates and returns a new, throttled version of the passed function, that,\n * when invoked repeatedly, will only actually call the original function at most\n * once per every wait milliseconds. Useful for rate-limiting events that occur\n * faster than you can keep up with.\n *\n * By default, throttle will execute the function as soon as you call it for the\n * first time, and, if you call it again any number of times during the wait\n * period, as soon as that period is over. If you'd like to disable the\n * leading-edge call, pass {leading: false}, and if you'd like to disable the\n * execution on the trailing-edge, pass {trailing: false}.\n *\n * @see http://underscorejs.org/#throttle\n **/\nexport default (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n};\n/* eslint-enable */\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import Logger from './../Logger.js';\n\nclass BaseEvent {\n constructor(context) {\n this.context = context;\n }\n\n handle(msg) {\n Logger.error('BaseEvent::handle is not implemented', msg);\n }\n}\n\nexport default BaseEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StartPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.startPlayback(msg.playback);\n }\n}\n\nclass StopPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.stopPlayback(msg.playback);\n }\n}\n\nexport { StartPlaybackEvent, StopPlaybackEvent };\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import BaseEvent from './BaseEvent.js';\n\nclass PublicEvent extends BaseEvent {\n handle(msg) {\n if (msg._src === 'client') {\n return;\n }\n\n Reflect.deleteProperty(msg, '_src');\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default PublicEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartAnnotationEvent extends PublicEvent {\n handle() {\n this.context.annotationLoop = window.setInterval(() => {\n this.context._api.createAnnotation(\n response => {\n return super.handle({ type: 'annotation', annotation: response });\n },\n () => {\n window.clearInterval(this.context.annotationLoop);\n }\n );\n }, 1000);\n }\n}\n\nclass StopAnnotationEvent extends PublicEvent {\n handle() {\n window.clearInterval(this.context.annotationLoop);\n this.context._api.stopAnnotation();\n }\n}\n\nexport { StartAnnotationEvent, StopAnnotationEvent };\n","import PublicEvent from './PublicEvent.js';\n\nclass StfuEvent extends PublicEvent {\n handle() {\n this.context._rtConnection.send({ type: 'stfu' });\n }\n}\n\nexport default StfuEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass IgnoreEvent extends BaseEvent {\n handle() {\n // do nothing.\n }\n}\n\nexport default IgnoreEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ForwardEvent extends BaseEvent {\n handle(msg) {\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default ForwardEvent;\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator ||\n !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const 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 const 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 let 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(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 const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\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 if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = 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.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 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'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/*\n * Copyright (c) 2017 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/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","/*\n * Copyright (c) 2016 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 */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","import screenfull from 'screenfull';\n\nclass FullscreenHelper {\n constructor() {\n this.onChange = this.onChange.bind(this);\n this.hasSupport = Boolean(screenfull.isEnabled);\n }\n\n toggle() {\n return this.isFullscreen() ? screenfull.exit() : screenfull.request();\n }\n\n canFullscreen() {\n return this.hasSupport;\n }\n\n isFullscreen() {\n return this.hasSupport && screenfull.isFullscreen;\n }\n\n onChange(callback) {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.on('change', () => callback(this.isFullscreen()));\n }\n\n off() {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.off('change');\n }\n}\n\nexport default FullscreenHelper;\n","/* eslint-disable max-lines */\nimport config from './config.js';\nimport Logger from './Logger.js';\nimport adapter from 'webrtc-adapter';\nimport platform from 'platform';\nimport FullscreenHelper from './FullscreenHelper.js';\n\nlet _canvasBlurSupport = null;\n\n/**\n * Feature Detector.\n **/\nexport default {\n environment: function () {\n return {\n canMix: this.canMix(),\n canPip: this.hasPipSupport(),\n canSFU: this.canSFU(),\n isPhone: this.isPhone(),\n inIframe: this.inIframe(),\n isIOSDevice: this.isIOSDevice(),\n canUseEyeson: this.canUseEyeson(),\n canFullscreen: this.canFullscreen(),\n hasMobileDevice: this.hasMobileDevice(),\n canToggleCamera: this.canToggleCamera(),\n canPresentFiles: this.canPresentFiles(),\n canScreenCapture: this.canScreenCapture(),\n canAdjustSettings: this.canAdjustDeviceSettings(),\n canStreamLocalMedia: this.canStreamLocalMedia(),\n isExperimentalBrowser: this.isExperimentalBrowser()\n };\n },\n\n platform: () => platform,\n\n /**\n * Test if browser should be able to use eyeson.\n * canDataChannel includes hasPeerConnection check\n **/\n canUseEyeson: function () {\n return (\n !this.isWebView() &&\n this.hasGetUserMedia() &&\n this.canDataChannel() &&\n this.isMinimumRequiredBrowser()\n );\n },\n\n hasGetUserMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices\n );\n },\n\n hasGetDisplayMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getDisplayMedia' in navigator.mediaDevices\n );\n },\n\n hasPeerConnection: function () {\n return 'RTCPeerConnection' in window;\n },\n\n hasCaptureStream: function () {\n return (\n 'captureStream' in HTMLMediaElement.prototype ||\n 'mozCaptureStream' in HTMLMediaElement.prototype\n );\n },\n\n hasCanvasCaptureSupport: function () {\n return (\n 'CanvasCaptureMediaStream' in window ||\n 'CanvasCaptureMediaStreamTrack' in window\n );\n },\n\n hasSenders: function () {\n return 'RTCRtpSender' in window;\n },\n\n /**\n * 07 Aug 2019 - Safari doesn't seem to fire the event properly.\n **/\n hasTrackOnUnmute: function () {\n if (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n ) {\n return false;\n }\n return 'onunmute' in MediaStreamTrack.prototype;\n },\n\n /**\n * https://caniuse.com/#feat=webp\n **/\n hasWebpSupport: function () {\n if (this.isChrome()) {\n return adapter.browserDetails.version >= 70;\n }\n if (this.isFF()) {\n return adapter.browserDetails.version >= 65;\n }\n\n return false;\n },\n /**\n * Test if user agent supports changing of audio output.\n **/\n canChangeAudioOutput: function () {\n if (!document) {\n return true;\n }\n return 'setSinkId' in HTMLMediaElement.prototype;\n },\n\n /**\n * Test if user agent supports changing the microphone.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeMicrophone: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports different microphones on multiple simultanious\n * getUserMedia streams.\n * Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038 (fixed since v101)\n **/\n canMultipleDifferentMicrophones: function () {\n return !(this.isFF() && this.browserVersion() < 101);\n },\n\n /**\n * Test if user agent supports remembering devices.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeCamera: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports screen capture feature.\n * on mobile hasGetDisplayMedia() is true, but still doesn't work:\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#Browser_compatibility\n * and https://caniuse.com/#feat=mdn-api_mediadevices_getdisplaymedia\n **/\n canScreenCapture: function () {\n if (\n !config.screencapture ||\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n this.hasMobileDevice()\n ) {\n return false;\n }\n return this.hasGetDisplayMedia() || (this.isFF() && this.hasGetUserMedia());\n },\n\n canPresentFiles: function () {\n if (\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n (this.isFF() && adapter.browserDetails.version <= 60) ||\n this.isIPhone() ||\n (this.isIOSDevice() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser())\n ) {\n return false;\n }\n return true;\n },\n\n canStreamLocalMedia: function () {\n const audioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof audioContext !== 'function') {\n return false;\n }\n const proto = audioContext.prototype;\n const acMethods = [\n 'createGain',\n 'createMediaStreamSource',\n 'createMediaElementSource',\n 'createMediaStreamDestination'\n ].every(method => typeof proto[method] === 'function');\n return acMethods && this.hasCanvasCaptureSupport();\n },\n\n /**\n * Unfortunately we had issues with higher resolution constraints on\n * Safari (iOS and Mac).\n **/\n requiresLowerConstraints: function () {\n return (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n );\n },\n\n browserName: function () {\n let name = adapter.browserDetails.browser.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n return name;\n },\n\n browserVersion: function () {\n if (adapter.browserDetails.browser === 'safari') {\n return adapter.extractVersion(navigator.userAgent, /Version\\/(\\d+)\\./, 1);\n }\n return adapter.browserDetails.version;\n },\n\n isEdge: function () {\n return adapter.browserDetails.browser === 'edge';\n },\n\n isFF: function () {\n return adapter.browserDetails.browser === 'firefox';\n },\n\n isChrome: function () {\n return adapter.browserDetails.browser === 'chrome';\n },\n\n isSafari: function () {\n return adapter.browserDetails.browser === 'safari';\n },\n\n isMinimumRequiredBrowser: function () {\n if (this.isChrome()) {\n return this.isMinimumRequiredChrome();\n }\n if (this.isFF()) {\n return this.isMinimumRequiredFF();\n }\n if (this.isSafari()) {\n return this.isMinimumRequiredSafari();\n }\n return false;\n },\n\n /**\n * 2021-01-18 Edge is not supported anymore due to PeerConnection\n * and other issues\n **/\n isMinimumRequiredEdge: function () {\n return false;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Firefox_version_history\n * A customer is on WinXP (hello 2019) and FF seems\n * to be locked at 52 with an extended support version on that OS.\n * May god have mercy on those poor souls.\n **/\n isMinimumRequiredFF: function () {\n if (!this.isFF()) {\n return false;\n }\n return adapter.browserDetails.version >= 52;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Google_Chrome_version_history\n **/\n isMinimumRequiredChrome: function () {\n if (!this.isChrome()) {\n return false;\n }\n return adapter.browserDetails.version >= 70;\n },\n\n isMinimumRequiredSafari: function () {\n if (!this.isSafari()) {\n return false;\n }\n return this.browserVersion() >= 10 || this.isWorkingIOSBrowser();\n },\n\n isWorkingIOSBrowser: function () {\n // EdgiOS, FxiOS, CriOS\n const iOSBrowser = / [a-zA-Z]+iOS\\//.test(navigator.userAgent);\n const operaTouch = navigator.userAgent.indexOf(' OPT/') > -1;\n return (iOSBrowser || operaTouch) && this.hasGetUserMedia();\n },\n\n isExperimentalBrowser: function () {\n return ['safari', 'edge'].includes(adapter.browserDetails.browser);\n },\n\n /**\n * Unfortunately Safari on iOS pauses the local camera during PIP,\n * and afterwards the remote video is frozen.\n **/\n hasPipSupport: function () {\n if (!document) {\n return true;\n }\n\n return Boolean(\n 'webkitSupportsPresentationMode' in HTMLVideoElement.prototype ||\n ('pictureInPictureEnabled' in document &&\n document.pictureInPictureEnabled)\n );\n },\n\n /**\n * Detect non-working pip in iOS webview\n **/\n iOSPipCheck: function () {\n return new Promise(resolve => {\n const support = this.hasPipSupport();\n if (!support || !this.isIOSDevice()) {\n resolve(support);\n return;\n }\n const video = document.createElement('video');\n video.preload = 'none';\n video.src = 'about:blank';\n video.onsuspend = () => {\n const wkEnabled =\n video.webkitSupportsPresentationMode('picture-in-picture');\n resolve(wkEnabled);\n };\n });\n },\n\n /**\n * Check user agent if it is an Android device.\n **/\n isAndroidDevice: function () {\n return Boolean(navigator.userAgent.match(/Android/i));\n },\n\n /**\n * Check user agent if it is an iOS device.\n * This check includes detection of \"Desktop mode\" on mobile devices\n **/\n isIOSDevice: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !window.MSStream\n );\n },\n\n /**\n * Check user agent if it is an iPhone.\n * This check includes detection of \"Desktop mode\" on iPhone.\n * To distinguish between iPad and iPhone in \"Desktio mode\",\n * we have to additionally check for aspect ratio\n **/\n isIPhone: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPhone/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' &&\n navigator.maxTouchPoints > 1 &&\n window.screen.height / window.screen.width >= 1.5)) &&\n !window.MSStream\n );\n },\n\n /**\n * As a solution for mobile sites, our Android engineers recommend to\n * specifically detect “mobile†in the User-Agent string as well as\n * “android.â€\n *\n * https://webmasters.googleblog.com/2011/03/mo-better-to-also-detect-mobile-user.html\n **/\n isAndroidPhone: function () {\n const isAndroid = /(android)/i.test(navigator.userAgent);\n const isMobile = /(mobile)/i.test(navigator.userAgent);\n return isAndroid && isMobile;\n },\n\n isMacOS: function () {\n if (typeof navigator.userAgentData !== 'undefined') {\n return navigator.userAgentData.platform === 'macOS';\n }\n return navigator.platform.indexOf('Mac') === 0;\n },\n\n /**\n * Is the app running inside an iFrame.\n * https://stackoverflow.com/a/326076/980524\n **/\n inIframe: function () {\n try {\n return window.self !== window.top;\n } catch (error) {\n return true;\n }\n },\n\n /**\n * Phone vs. tablet\n **/\n isPhone: function () {\n return this.isIPhone() || this.isAndroidPhone();\n },\n\n /**\n * ...\n **/\n hasMobileDevice: function () {\n return this.isIOSDevice() || this.isAndroidDevice();\n },\n\n /**\n * Is the app running on a touch device.\n * https://stackoverflow.com/a/4819886/980524\n * Note: touch device, might be a laptop with a touch display or those\n * dell tablets we have laying around here.\n **/\n isTouchDevice: function () {\n return Boolean('ontouchstart' in window || navigator.maxTouchPoints);\n },\n\n /**\n * iOS doesn't propagate tap events to react when we have display tooltips.\n * This results in annoying \"double taps\" from the user.\n * But the tooltips aren't designed for touch devices anyway.\n **/\n canDisplayTooltips: function () {\n return !this.isIOSDevice() && !this.isTestSuite();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canAdjustDeviceSettings: function () {\n return !this.isIOSDevice();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canToggleCamera: function () {\n return true;\n },\n\n /**\n * iPad file presentation has issues add cam to canvas\n **/\n canDrawCamera: function () {\n return !this.isIOSDevice();\n },\n\n canMix: function () {\n return (\n this.isChrome() &&\n this.canScreenCapture() &&\n this.hasCanvasCaptureSupport()\n );\n },\n\n /**\n * Browsers don't behave the same way when setting the .enabled property of\n * a MediaSTreamTrack to false.\n * In Chrome (as of May 2019) the activity indicator stays active even if\n * the track is disabled (enabled: false).\n * https://bugs.chromium.org/p/webrtc/issues/detail?id=5942\n * While in Firefox the indicator is turned off.\n */\n stopsDeviceActivityIndicatorOnDisable: function () {\n if (this.isFF()) {\n return true;\n }\n return false;\n },\n\n /**\n * Edge doesn't have this property and raises an error when trying to\n * access it.\n **/\n supportsBlurOnSVG: function () {\n return (\n typeof SVGElement !== 'undefined' &&\n typeof SVGElement.prototype.blur !== 'undefined'\n );\n },\n\n /**\n * Chrome will throw a SecurityException when trying to read the\n * `localStorage` property.\n **/\n hasLocalStorage: function () {\n try {\n const hasLocalStorage =\n typeof window.localStorage === 'object' && window.localStorage !== null;\n window.localStorage.setItem('eyeson.test', 'test');\n const canGet = window.localStorage.getItem('eyeson.test') === 'test';\n return hasLocalStorage && canGet;\n } catch (error) {\n Logger.debug('FeatureDetector::hasLocalStorage:', error.message);\n return false;\n }\n },\n\n canFullscreen: function () {\n return new FullscreenHelper().canFullscreen();\n },\n\n isFullscreen: function () {\n return new FullscreenHelper().isFullscreen();\n },\n\n /**\n * Check for SFU-mode support\n * VP8 codec required, in Safari available since v12.1\n **/\n canSFU: function () {\n let safariWithoutVP8 = false;\n if (this.isSafari()) {\n if (!config.allowSafariSFU) {\n return false;\n }\n if (this.isWorkingIOSBrowser()) {\n return true;\n }\n const uAVersion = navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/);\n if (uAVersion && uAVersion.length > 1) {\n safariWithoutVP8 =\n Number(uAVersion[1]) < 12 ||\n (Number(uAVersion[1]) === 12 && Number(uAVersion[2]) < 1);\n }\n }\n return !safariWithoutVP8 && !this.isTestSuite();\n },\n\n canDataChannel: function () {\n return (\n this.hasPeerConnection() &&\n typeof RTCPeerConnection.prototype.createDataChannel === 'function' &&\n 'RTCDataChannel' in window\n );\n },\n\n /**\n * SDP SSRC updates for SFU mode switch\n * Safari has a bug of broken mediastream when all ssrc's change\n **/\n disallowAudioSyncSrcChange: function () {\n return this.isSafari() && this.canSFU();\n },\n\n canShare: function () {\n return Boolean(navigator.share);\n },\n\n /**\n * https://developer.chrome.com/multidevice/user-agent#webview_user_agent\n *\n * If you’re attempting to differentiate between the WebView and Chrome for\n * Android, you should look for the presence of the Version/_X.X_ string in\n * the WebView user-agent string.\n *\n * In the newer versions of WebView, you can differentiate the WebView by\n * looking for the wv field as highlighted below\n **/\n isWebView: function () {\n return /Version\\/|wv/i.test(navigator.userAgent) && this.isAndroidDevice();\n },\n\n /* eslint-disable no-process-env */\n /* global process */\n isTestSuite: function () {\n return (\n process.env.NODE_ENV === 'test' ||\n adapter.browserDetails.browser === 'test-suite'\n );\n },\n /* eslint-enable no-process-env */\n\n /**\n * mobile Safari is not able to display canvas stream in video\n * https://stackoverflow.com/a/63948310\n */\n canVirtualBackground: function () {\n return (\n !this.isIOSDevice() &&\n Boolean(window.WebAssembly) &&\n typeof WebAssembly.validate === 'function' &&\n (typeof WebAssembly.instantiateStreaming === 'function' ||\n typeof WebAssembly.instantiate === 'function') &&\n Boolean(window.CanvasRenderingContext2D) &&\n typeof window.ImageData === 'function' &&\n typeof window.requestAnimationFrame === 'function'\n );\n },\n\n // eslint-disable-next-line max-statements\n canvasBlurSupport: function () {\n if (_canvasBlurSupport !== null) {\n return _canvasBlurSupport;\n }\n const filterSupport =\n window.CanvasRenderingContext2D &&\n 'filter' in CanvasRenderingContext2D.prototype;\n if (!filterSupport) {\n _canvasBlurSupport = false;\n return _canvasBlurSupport;\n }\n let canvas1 = document.createElement('canvas');\n let canvas2 = document.createElement('canvas');\n canvas1.width = 10;\n canvas1.height = 10;\n canvas2.width = 10;\n canvas2.height = 10;\n let ctx1 = canvas1.getContext('2d');\n let ctx2 = canvas2.getContext('2d');\n ctx1.filter = 'blur(5px)';\n ctx1.fillStyle = '#000000';\n ctx1.fillRect(3, 3, 4, 4);\n ctx2.fillStyle = '#000000';\n ctx2.fillRect(3, 3, 4, 4);\n let data1 = ctx1.getImageData(5, 5, 1, 1);\n let data2 = ctx2.getImageData(5, 5, 1, 1);\n _canvasBlurSupport = data1.data[3] !== data2.data[3];\n return _canvasBlurSupport;\n },\n\n /**\n * We've noticed many issues with Safari and stereo on desktop and mobile.\n * Even weired ones like https://developer.apple.com/forums/thread/672037.\n * On Android issues occur when output device is changed, especially buetooth\n * devices are difficult.\n */\n canStereo: function () {\n return !(this.isSafari() || this.isAndroidDevice());\n },\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/displaySurface\n canChooseDisplaySurface: function () {\n return (\n this.hasGetDisplayMedia() &&\n navigator.mediaDevices.getSupportedConstraints().displaySurface\n );\n },\n\n hasPipCamSupport: function () {\n return this.isChrome() && this.hasPipSupport();\n },\n\n canMonitorSystemPressure: function () {\n /* eslint-disable no-undef */\n return (\n typeof window.PressureObserver === 'function' &&\n Array.isArray(PressureObserver.supportedSources) &&\n PressureObserver.supportedSources.includes('cpu')\n );\n /* eslint-enable no-undef */\n }\n};\n/* eslint-enable max-lines */\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","/**\n * Ninja Stream\n **/\nclass NinjaStream {\n constructor() {\n this._stream = this.createStream();\n }\n\n get stream() {\n return this._stream;\n }\n\n /**\n * Create a dummy stream from a canvas element.\n **/\n // eslint-disable-next-line max-statements\n createStream() {\n const width = 0;\n const height = 0;\n let canvas = Object.assign(document.createElement('canvas'), {\n width,\n height\n });\n canvas.id = 'eyeson-ninja-stream';\n canvas.getContext('2d').fillRect(0, 0, width, height);\n let stream = canvas.captureStream();\n let [track] = stream.getVideoTracks();\n // adjust FF to identify NinjaStream track\n if (\n window.CanvasCaptureMediaStream &&\n stream instanceof window.CanvasCaptureMediaStream\n ) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n }\n return stream;\n }\n}\n\nexport default NinjaStream;\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\n\n/**\n * Wrapper around localStorage API in order to prefix keys to be stored and\n * offer default values on demand. If no localStorage is provided by\n * the user-agent, we use a temporary fallbackStorage.\n **/\nexport default (function () {\n const prefix = 'eyeson.';\n const fallbackStorage = {};\n const hasLocalStorage = FeatureDetector.hasLocalStorage();\n\n return {\n store: function (key, value) {\n if (!hasLocalStorage) {\n fallbackStorage[key] = value;\n return true;\n }\n try {\n window.localStorage.setItem(prefix + key, JSON.stringify(value));\n } catch (error) {\n Logger.error('LocalStorage::store', error);\n return false;\n }\n return true;\n },\n // eslint-disable-next-line max-statements\n load: function (key, defaultValueParam) {\n let defaultValue = defaultValueParam;\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n defaultValue = Object.assign({}, defaultValue);\n }\n if (!hasLocalStorage) {\n return fallbackStorage[key] || defaultValue;\n }\n let storedValue = window.localStorage.getItem(prefix + key);\n if (!storedValue) {\n return defaultValue;\n }\n try {\n return JSON.parse(storedValue);\n } catch (error) {\n Logger.error('LocalStorage::load', key, error);\n return defaultValue;\n }\n }\n };\n})();\n","// https://github.com/YuzuJS/setImmediate/blob/modern-browsers-only/setImmediate.js\nconst immediate = (() => {\n const stack = [];\n const target = '*';\n const messageName = 'com.eyeson.immediate';\n const handleMessage = event => {\n if (event.source === window && event.data === messageName) {\n event.stopPropagation();\n const fn = stack.shift();\n if (fn) {\n fn();\n }\n }\n };\n window.addEventListener('message', handleMessage);\n return fn => {\n stack.push(fn);\n window.postMessage(messageName, target);\n };\n})();\n\nexport default immediate;\n","/* eslint-disable max-lines */\nimport FeatureDetector from '../FeatureDetector.js';\nimport Logger from '../Logger';\n\nconst CanvasMedia =\n window.CanvasCaptureMediaStream || window.CanvasCaptureMediaStreamTrack;\n\nexport const hasAudio = stream => {\n return Boolean(\n stream &&\n stream.getAudioTracks().length > 0 &&\n stream.getAudioTracks()[0].enabled\n );\n};\n\nexport const hasVideo = stream => {\n return Boolean(\n stream &&\n stream.getVideoTracks().length > 0 &&\n stream.getVideoTracks()[0].enabled\n );\n};\n\nexport const disableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = false));\n }\n return stream;\n};\n\nexport const enableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = true));\n }\n return stream;\n};\n\nexport const toggleAudio = (stream, enabled) => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\nexport const toggleVideo = (stream, enabled) => {\n if (stream) {\n stream.getVideoTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\n// In order to be \"informed\" about track ending in compose_canvas where we\n// create offscreen/hidden video elements and need to clean them up afterwards,\n// we need to dispatch 'stopped' ourselves. The 'ended' event is not emitted\n// after stopping the track, as one might expect see:\n// https://stackoverflow.com/q/55953038/980524\nexport const stopTrack = track => {\n track.stop();\n return track.dispatchEvent(new Event('stopped'));\n};\n\nexport const stopStream = stream => {\n if (stream) {\n stream.getTracks().forEach(stopTrack);\n }\n};\n\nconst isScreenTrack = track => {\n return (\n /screen|monitor|window|web-contents-media-stream/i.test(track.label) ||\n track.type === 'screen-track' ||\n track.type === 'screen-video-track'\n );\n};\n\nconst isScreenPresentationTrack = track => {\n return isScreenTrack(track) && track.type !== 'screen-video-track';\n};\n\nexport const isScreenAsVideoTrack = track => {\n return isScreenTrack(track) && track.type === 'screen-video-track';\n};\n\nconst isCanvasTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id !== 'eyeson-ninja-stream' &&\n track.canvas.id !== 'eyeson-vbg-stream'\n );\n};\n\nexport const isNinjaStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-ninja-stream'\n );\n};\n\nexport const isVbgStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-vbg-stream'\n );\n};\n\nconst isCameraTrack = track => {\n return (\n !isCanvasTrack(track) && !isScreenTrack(track) && !isVbgStreamTrack(track)\n );\n};\n\nexport const getScreenTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenTrack);\n};\n\nexport const getScreenPresentationTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenPresentationTrack);\n};\n\nexport const getScreenAsVideoTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenAsVideoTrack);\n};\n\nexport const getCameraTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCameraTrack);\n};\n\nexport const getVbgTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isVbgStreamTrack);\n};\n\nexport const stopCamera = stream => {\n getCameraTracks(stream).forEach(stopTrack);\n};\n\nexport const disableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = false));\n return stream;\n};\n\nexport const enableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = true));\n return stream;\n};\n\nexport const toggleCamera = (stream, enabled) => {\n getCameraTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const toggleVbgTrack = (stream, enabled) => {\n getVbgTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const getCanvasTracks = stream => {\n // current FF implementation\n if (stream instanceof CanvasMedia) {\n return stream.getVideoTracks();\n }\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCanvasTrack);\n};\n\nexport const isScreenStream = stream => {\n return hasVideo(stream) && stream.getVideoTracks().some(isScreenTrack);\n};\n\nexport const isScreenPresentationStream = stream => {\n return (\n hasVideo(stream) && stream.getVideoTracks().some(isScreenPresentationTrack)\n );\n};\n\nexport const isCanvasStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n\n return stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isVBGStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n return hasVideo(stream) && stream.getVideoTracks().some(isVbgStreamTrack);\n};\n\nexport const isCameraStream = stream => {\n return (\n hasVideo(stream) &&\n !isScreenStream(stream) &&\n !isCanvasStream(stream) &&\n !isVBGStream(stream)\n );\n};\n\nexport const isCanvasPresentationStream = stream => {\n if (!stream) {\n return false;\n }\n return isCanvasStream(stream) && stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isPresentationStream = stream => {\n return isScreenPresentationStream(stream) || isCanvasStream(stream);\n};\n\nexport const hasCameraVideo = stream => {\n return getCameraTracks(stream).some(track => track.enabled);\n};\n\nexport const getFacingMode = stream => {\n const tracks = getCameraTracks(stream);\n if (tracks.length > 0) {\n const [track] = tracks;\n if (typeof track.getSettings === 'function') {\n const settings = track.getSettings();\n if (settings && 'facingMode' in settings) {\n return settings.facingMode;\n }\n }\n }\n return null;\n};\n\n// try to make FF's captureStream handling track based.\nexport const captureStream = canvas => {\n // NOTE: getContext is needed for firefox, otherwise we get an exception:\n // NS_ERROR_NOT_INITIALIZED when calling .captureStream on the canvas.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1257440\n canvas.getContext('2d');\n\n // 0 param is fps, but since that doesn't work cross browser, we use 0\n // and request frames manually.\n const stream = canvas.captureStream(20);\n const [track] = stream.getVideoTracks();\n if (!('requestFrame' in track)) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n track.requestFrame = () => stream.requestFrame();\n }\n\n return stream;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeAudioTrack = () => {\n try {\n const ac = new (window.AudioContext || window.webkitAudioContext)();\n const { stream } = ac.createMediaStreamDestination();\n const [track] = stream.getAudioTracks();\n track.type = 'fake-audio';\n track.enabled = false;\n stopStream(stream);\n ac.close();\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeAudioTrack Unable to create audio track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeVideoTrack = () => {\n try {\n const canvas = document.createElement('canvas');\n // Firefox needs some kind of kickass\n canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height);\n const stream = canvas.captureStream();\n const [track] = stream.getVideoTracks();\n track.type = 'fake-video';\n track.enabled = false;\n stopStream(stream);\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeVideoTrack Unable to create video track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nexport const createExternalStream = (stream, audioOnly = false) => {\n if (\n stream &&\n stream instanceof MediaStream &&\n stream.getTracks().length > 0\n ) {\n const aTrack = stream\n .getAudioTracks()\n .find(track => track.readyState === 'live');\n const vTrack = stream\n .getVideoTracks()\n .find(track => track.readyState === 'live');\n const audioTrack = aTrack || createFakeAudioTrack();\n const videoTrack = vTrack || createFakeVideoTrack();\n const tracks = [];\n if (audioTrack) {\n tracks.push(audioTrack);\n }\n if (videoTrack && !audioOnly) {\n tracks.push(videoTrack);\n }\n return new MediaStream(tracks);\n }\n return false;\n};\n","import immediate from './immediate.js';\n\nconst throttledAnimationFrame = (fn, fps) => {\n let raf = null;\n let focus = true;\n let abort = false;\n let animationFrameThen = 0;\n const frameRate = 1000 / fps;\n const throttledRAF = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n raf = requestAnimationFrame(throttledRAF);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n fn();\n };\n const throttledImmediate = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n immediate(throttledImmediate);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n if (!abort) {\n fn();\n }\n };\n const result = {\n requestAnimationFrame: () => {\n if (focus) {\n raf = requestAnimationFrame(throttledRAF);\n } else {\n if (abort) {\n abort = false;\n }\n immediate(throttledImmediate);\n }\n },\n cancelAnimationFrame: () => {\n abort = true;\n if (raf) {\n cancelAnimationFrame(raf);\n raf = null;\n }\n }\n };\n document.addEventListener('visibilitychange', () => {\n focus = document.visibilityState === 'visible';\n if (!focus && raf) {\n result.cancelAnimationFrame();\n result.requestAnimationFrame();\n }\n });\n return result;\n};\n\nexport default throttledAnimationFrame;\n","/**\n * importScript\n * lazy-load script files, promise-based\n */\nconst importScript = (url, integrity = null) => {\n return new Promise((resolve, reject) => {\n const src = new URL(url, location.href);\n const script = document.createElement('script');\n script.async = true;\n script.onload = () => {\n if (script.parentNode) {\n script.remove();\n }\n resolve(script);\n };\n script.onerror = () => {\n if (script.parentNode) {\n script.remove();\n }\n reject(new Error('Unable to initiate script ' + url));\n };\n if (integrity) {\n script.integrity = integrity.algo + '-' + integrity.hash;\n }\n script.src = src;\n document.head.append(script);\n });\n};\n\nexport default importScript;\n","const cacheStorageSupport = typeof window.CacheStorage === 'function';\n\nconst storeBlobURL = async (blobURL, path) => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const response = await fetch(blobURL);\n const blob = await response.blob();\n const cache = await caches.open('store');\n await cache.put(path, new Response(blob));\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nconst loadBlobURL = async path => {\n if (cacheStorageSupport) {\n try {\n const cache = await caches.open('store');\n const response = await cache.match(path);\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n return false;\n};\n\nconst deleteBlob = async path => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const cache = await caches.open('store');\n await cache.delete(path);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nexport default {\n storeBlobURL,\n loadBlobURL,\n deleteBlob\n};\n","/* eslint-disable max-statements */\n/* eslint-disable no-bitwise */\n/* eslint-disable id-length */\n// https://github.com/davidenke/context-filter-polyfill/blob/master/src/filters/blur.filter.ts\n\nconst _mulTable = [\n 1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107,\n 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221,\n 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103,\n 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119,\n 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151,\n 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13,\n 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75,\n 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229,\n 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183,\n 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37,\n 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61,\n 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207,\n 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178,\n 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153,\n 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133,\n 66, 131, 65, 129, 1\n];\nconst _shgTable = [\n 0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18,\n 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20,\n 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21,\n 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20,\n 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22,\n 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18,\n 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22,\n 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24,\n 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24,\n 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22,\n 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23,\n 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25,\n 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25,\n 22, 25, 25, 25, 24, 25, 24, 25, 18\n];\n\nconst canvasBlur = () => {\n let _canvas = null;\n let _ctx = null;\n let _previous = false;\n let _r = null;\n let _g = null;\n let _b = null;\n let _vmin = null;\n let _vmax = null;\n\n const run = (imageBitmap, radius = 0) => {\n if (_previous && _canvas) {\n _previous = false;\n return _canvas;\n }\n _previous = true;\n const amount = parseFloat(radius);\n\n const { width, height } = imageBitmap;\n if (!_canvas) {\n _canvas = document.createElement('canvas');\n _ctx = _canvas.getContext('2d', { alpha: false, desynchronized: true });\n _canvas.width = width;\n _canvas.height = height;\n }\n _ctx.drawImage(imageBitmap, 0, 0);\n const imageData = _ctx.getImageData(0, 0, width, height);\n const { data } = imageData;\n\n // http://www.quasimondo.com/BoxBlurForCanvas/FastBlur.js\n const wm = width - 1;\n const hm = height - 1;\n const rad1 = amount + 1;\n\n const mulSum = _mulTable[amount];\n const shgSum = _shgTable[amount];\n\n if (!_r) {\n _r = new Uint32Array(data.length / 4);\n _g = new Uint32Array(data.length / 4);\n _b = new Uint32Array(data.length / 4);\n\n _vmin = new Uint32Array(width);\n _vmax = new Uint32Array(width);\n }\n\n let iterations = 2;\n let p = 0;\n let p1 = 0;\n let p2 = 0;\n\n while (iterations-- > 0) {\n let yw = 0;\n let yi = 0;\n\n for (let y = 0; y < height; y++) {\n let rsum = data[yw] * rad1;\n let gsum = data[yw + 1] * rad1;\n let bsum = data[yw + 2] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n p = yw + ((i > wm ? wm : i) << 2);\n rsum += data[p++];\n gsum += data[p++];\n bsum += data[p++];\n }\n\n for (let x = 0; x < width; x++) {\n _r[yi] = rsum;\n _g[yi] = gsum;\n _b[yi] = bsum;\n\n if (y === 0) {\n _vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n _vmax[x] = (p = x - amount) > 0 ? p << 2 : 0;\n }\n\n p1 = yw + _vmin[x];\n p2 = yw + _vmax[x];\n\n rsum += data[p1++] - data[p2++];\n gsum += data[p1++] - data[p2++];\n bsum += data[p1++] - data[p2++];\n\n yi++;\n }\n yw += width << 2;\n }\n\n for (let x = 0; x < width; x++) {\n let yp = x;\n let rsum = _r[yp] * rad1;\n let gsum = _g[yp] * rad1;\n let bsum = _b[yp] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n yp += i > hm ? 0 : width;\n rsum += _r[yp];\n gsum += _g[yp];\n bsum += _b[yp];\n }\n\n yi = x << 2;\n\n for (let y = 0; y < height; y++) {\n data[yi] = (rsum * mulSum) >>> shgSum;\n data[yi + 1] = (gsum * mulSum) >>> shgSum;\n data[yi + 2] = (bsum * mulSum) >>> shgSum;\n\n if (x === 0) {\n _vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n _vmax[y] = (p = y - amount) > 0 ? p * width : 0;\n }\n\n p1 = x + _vmin[y];\n p2 = x + _vmax[y];\n\n rsum += _r[p1] - _r[p2];\n gsum += _g[p1] - _g[p2];\n bsum += _b[p1] - _b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n _ctx.putImageData(imageData, 0, 0);\n\n return _canvas;\n };\n\n const reset = () => {\n _canvas = null;\n _ctx = null;\n _previous = false;\n _r = null;\n _g = null;\n _b = null;\n _vmin = null;\n _vmax = null;\n };\n\n return { run, reset };\n};\n\nexport default canvasBlur;\n","/* eslint-disable max-lines */\n/* eslint-disable max-statements */\nimport FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport LocalStorage from './LocalStorage.js';\nimport throttledAnimationFrame from './utils/throttledAnimationFrame.js';\nimport importScript from './utils/importScript.js';\nimport { stopStream, stopTrack, getVbgTracks } from './utils/StreamHelpers.js';\nimport cacheStorage from './utils/cacheStorage.js';\nimport canvasBlur from './utils/canvasBlur.js';\n\nwindow.exports = window.exports || {};\n\nconst OffscreenCanvasSupport =\n typeof window.OffscreenCanvas === 'function' &&\n (() => {\n try {\n new OffscreenCanvas(1, 1).getContext('2d');\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n })();\nconst OffscreenCanvasBlurSupport =\n OffscreenCanvasSupport &&\n Boolean(window.OffscreenCanvasRenderingContext2D) &&\n 'filter' in OffscreenCanvasRenderingContext2D.prototype;\nconst ImageBitmapSupport = typeof window.createImageBitmap === 'function';\nconst TrackProcessorSupport =\n typeof window.MediaStreamTrackProcessor === 'function';\nconst SIMDSupport =\n window.WebAssembly &&\n WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7,\n 0, 65, 0, 253, 15, 26, 11\n ])\n );\nconst EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nconst _max = Math.max;\n\nconst _frameRate = 20;\nconst _stateChange = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\nconst _segmentationModel = {\n id: 'selfie_landscape',\n name: 'selfie_segmentation_landscape',\n width: 256,\n height: 144,\n pixelCount: 36864\n};\n\nlet _tflite = null;\nlet _tfliteReady = false;\nlet _tfliteLoading = false;\nlet _inputMemoryOffset = null;\nlet _outputMemoryOffset = null;\n\nlet _localImageFile = null;\nlet _localImageFileBackup = null;\n\nconst initiateTFLite = async () => {\n if (_tflite) {\n return;\n }\n _tfliteLoading = true;\n _stateChange.dispatchEvent(new Event('change'));\n const loading = await Promise.all([\n SIMDSupport\n ? importScript('vendor/tflite/tflite-simd.js')\n : importScript('vendor/tflite/tflite.js'),\n fetch(`vendor/tflite/models/${_segmentationModel.name}.tflite`)\n ]);\n _tflite =\n await window.exports[\n SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule'\n ]();\n const model = await loading[1].arrayBuffer();\n const modelBufferOffset = _tflite._getModelBufferMemoryOffset();\n _tflite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);\n _tflite._loadModel(model.byteLength);\n _inputMemoryOffset = _tflite._getInputMemoryOffset() / 4;\n _outputMemoryOffset = _tflite._getOutputMemoryOffset() / 4;\n _tfliteLoading = false;\n _tfliteReady = true;\n _stateChange.dispatchEvent(new Event('change'));\n};\n\nconst createOffscreenCanvas = (width, height, options = {}, type) => {\n const result = {\n canvas: null,\n ctx: null\n };\n const extra = type === 'blur' && OffscreenCanvasBlurSupport;\n if (OffscreenCanvasSupport && extra) {\n result.canvas = new OffscreenCanvas(width, height);\n result.ctx = result.canvas.getContext('2d', options);\n return result;\n }\n result.canvas = document.createElement('canvas');\n result.canvas.width = width;\n result.canvas.height = height;\n result.ctx = result.canvas.getContext(\n '2d',\n Object.assign({ desynchronized: true }, options)\n );\n return result;\n};\n\n(async () => {\n const virtualBackgroundType = LocalStorage.load('virtualBackgroundType');\n if (virtualBackgroundType === 'image:blob') {\n const url = await cacheStorage.loadBlobURL('/virtualBackgroundLocalImage');\n if (url) {\n _localImageFile = url;\n }\n }\n})();\n\nconst loadImage = (url, instance) => {\n return new Promise(resolve => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(true);\n }\n if (url === 'blob' && !_localImageFile) {\n resolve(null);\n return;\n }\n const img = new Image();\n img.onerror = () => resolve(null);\n img.onload = () => resolve(img);\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url === 'blob' && _localImageFile ? _localImageFile : url;\n }).then(img => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(false);\n }\n return img;\n });\n};\n\nconst checkImageLoad = url => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = () => reject(new TypeError('Invalid image file'));\n img.onload = () => resolve();\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url;\n });\n};\n\nconst loadImageFile = (() => {\n let input = null;\n return callbackFN => {\n if (!input) {\n input = Object.assign(document.createElement('input'), {\n type: 'file',\n accept: 'image/*'\n });\n }\n input.onchange = ({ target: { files } }) => {\n if (files.length > 0) {\n const url = URL.createObjectURL(files[0]);\n checkImageLoad(url).then(() => {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = url;\n callbackFN();\n }, callbackFN);\n }\n input.onchange = null;\n input.value = '';\n };\n input.click();\n };\n})();\n\nconst createImageCanvas = (image, width, height) => {\n const hRatio = width / image.width;\n const vRatio = height / image.height;\n const ratio = _max(hRatio, vRatio);\n const imgWidth = image.width * ratio;\n const imgHeight = image.height * ratio;\n const centerShiftX = (width - imgWidth) / 2;\n const centerShiftY = (height - imgHeight) / 2;\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n canvas.ctx.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n centerShiftX,\n centerShiftY,\n imgWidth,\n imgHeight\n );\n return canvas.canvas;\n};\n\nconst createGeneraliCanvas = (image, width, height) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(image, 15, 15);\n return canvas.canvas;\n};\n\nconst createGradientCanvas = (width, height, options) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n const gradient = ctx.createLinearGradient(\n options.startX,\n options.startY,\n options.endX,\n options.endY\n );\n gradient.addColorStop(0, options.color1);\n gradient.addColorStop(1, options.color2);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n return canvas.canvas;\n};\n\nconst createBlurCanvas = (instance, width, height, blur) => {\n const length = blur * 2;\n const fullLength = length * 2;\n const bigWidth = width + fullLength;\n const bigHeight = height + fullLength;\n instance.blurCanvas = createOffscreenCanvas(\n bigWidth,\n bigHeight,\n {\n alpha: false\n },\n 'blur'\n );\n instance.imageCanvas = createOffscreenCanvas(bigWidth, bigHeight, {\n alpha: false\n });\n instance.blurCanvas.ctx.filter = `blur(${blur}px)`;\n};\n\nconst _allowedTypesCheck =\n /^(off|eyeson|generali:.*|color:.+|image:.+|blur:\\d+)/;\n\nconst setState = () => {\n if (_tfliteReady) {\n return 'ready';\n }\n if (_tfliteLoading) {\n return 'initialize';\n }\n return '';\n};\n\nclass VirtualBackgroundMixer {\n constructor(name = 'global') {\n Logger.info('VirtualBackgroundMixer::constructor', name);\n this.name = name;\n this.canvas = null;\n this.ctx = null;\n this.originalStream = null;\n this.outStream = null;\n this.video = null;\n this.reader = null;\n this.size = { width: 0, height: 0 };\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.playPromise = null;\n this.abort = false;\n this.paused = false;\n this.raf = throttledAnimationFrame(this.drawVideo.bind(this), 20);\n this.backgroundOld = null;\n this.backgroundType = null;\n this.backgroundValue = null;\n this.blurInit = false;\n this.blurCanvas = null;\n this.canvasBlur = canvasBlur();\n this.imageCanvas = null;\n this.state = setState();\n this.loadingListener = [];\n this.handleStateChange = () => {\n const state = setState();\n this.state = state;\n this.emitLoading(state === 'initialize');\n };\n _stateChange.addEventListener('change', this.handleStateChange);\n }\n\n static isTypeAllowed(type) {\n return _allowedTypesCheck.test(type);\n }\n\n static async checkExternalImage(type) {\n if (/^image:([\\w]+:)?\\/\\//i.test(type)) {\n const url = type.substring(6);\n await checkImageLoad(url);\n }\n }\n\n static loadLocalImage(callbackFN) {\n loadImageFile(callbackFN);\n }\n\n static getImageBlobOrFallback(isBlobAvailable = true) {\n if (_localImageFile && isBlobAvailable) {\n return 'image:blob';\n }\n return 'blur:8';\n }\n\n storeLocalImageFile() {\n if (_localImageFile) {\n _localImageFileBackup = _localImageFile;\n }\n }\n\n resetLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = _localImageFileBackup;\n _localImageFileBackup = null;\n }\n }\n\n saveLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFileBackup);\n }\n _localImageFileBackup = null;\n }\n }\n\n updateCache(type) {\n if (type === 'image:blob') {\n if (_localImageFile) {\n cacheStorage.storeBlobURL(\n _localImageFile,\n '/virtualBackgroundLocalImage'\n );\n }\n } else {\n cacheStorage.deleteBlob('/virtualBackgroundLocalImage');\n }\n }\n\n onLoading(listener) {\n this.loadingListener.push(listener);\n }\n\n offLoading(listener) {\n this.loadingListener = this.loadingListener.filter(fn => fn !== listener);\n }\n\n emitLoading(loading) {\n this.loadingListener.forEach(listener => listener(loading));\n }\n\n initiateStream(userMediaStream) {\n Logger.info('VirtualBackgroundMixer::initiate', this.name);\n initiateTFLite();\n const videoTracks = userMediaStream.getVideoTracks();\n if (videoTracks.length === 0) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'missing track'\n );\n return userMediaStream;\n }\n const [videoTrack] = videoTracks;\n const trackSettings = videoTrack.getSettings();\n if (\n videoTrack.readyState !== 'live' ||\n !trackSettings.width ||\n !trackSettings.height\n ) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n '0 width or height, or not ready',\n videoTrack.readyState,\n trackSettings.width,\n trackSettings.height\n );\n return userMediaStream;\n }\n if (this.originalStream) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'existing originalStream!',\n this.originalStream.id,\n userMediaStream.id\n );\n if (this.originalStream.id !== userMediaStream.id) {\n this.stopOriginalStream();\n }\n this.terminate();\n }\n this.originalStream = userMediaStream;\n this.canvas = document.createElement('canvas');\n this.canvas.id = 'eyeson-vbg-stream';\n this.ctx = this.canvas.getContext('2d', { desynchronized: true });\n this.ctx.imageSmoothingEnabled = false;\n this.size.width = trackSettings.width;\n this.size.height = trackSettings.height;\n this.canvas.width = trackSettings.width;\n this.canvas.height = trackSettings.height;\n const canvasStream = this.canvas.captureStream(_frameRate);\n const [canvasTrack] = canvasStream.getVideoTracks();\n if (!canvasTrack.canvas) {\n canvasTrack.type = 'canvas-track';\n canvasTrack.canvas = this.canvas;\n }\n const settings = {};\n if (typeof canvasTrack.getSettings === 'function') {\n Object.assign(settings, canvasTrack.getSettings());\n }\n Object.assign(settings, trackSettings);\n canvasTrack.getSettings = () => settings;\n canvasTrack.srcLabel = videoTrack.label;\n canvasTrack.srcDeviceId = trackSettings.deviceId;\n this.outStream = new MediaStream([canvasTrack]);\n userMediaStream\n .getAudioTracks()\n .forEach(track => this.outStream.addTrack(track));\n this.start();\n return this.outStream;\n }\n\n start() {\n Logger.info('VirtualBackgroundMixer::start', this.name);\n let canvas = null;\n let video = null;\n const { width, height } = this.size;\n if (!width || !height) {\n Logger.warn(\n 'VirtualBackgroundMixer::start 0 width or height',\n this.name,\n width,\n height\n );\n return;\n }\n if (TrackProcessorSupport) {\n try {\n const [track] = this.originalStream.getVideoTracks();\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n this.reader = processor.readable.getReader();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!this.reader) {\n video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = this.originalStream;\n this.video = video;\n }\n this.segmentationMask = new ImageData(\n _segmentationModel.width,\n _segmentationModel.height\n );\n canvas = createOffscreenCanvas(\n _segmentationModel.width,\n _segmentationModel.height,\n { willReadFrequently: true }\n );\n this.segmentationMaskCanvas = canvas.canvas;\n this.segmentationMaskCtx = canvas.ctx;\n this.segmentationMaskCtx.imageSmoothingEnabled = false;\n if (video && !ImageBitmapSupport) {\n canvas = createOffscreenCanvas(width, height);\n this.videoCanvas = canvas.canvas;\n this.videoCtx = canvas.ctx;\n }\n this.abort = false;\n this.paused = false;\n this.blurInit = false;\n this.canvasBlur.reset();\n this.initBackground();\n if (this.reader) {\n Logger.info(\n 'VirtualBackgroundMixer::start::videoTrackProcessor',\n this.name\n );\n this.raf.requestAnimationFrame();\n } else {\n video.onloadeddata = () => {\n Logger.info(\n 'VirtualBackgroundMixer::start::video.loadeddata',\n this.name\n );\n this.raf.requestAnimationFrame();\n };\n this.playPromise = video.play();\n this.playPromise.catch(error => {\n Logger.error(\n 'VirtualBackgroundMixer::start::video.play',\n this.name,\n error\n );\n });\n }\n }\n\n // eslint-disable-next-line complexity\n async drawVideo() {\n let frame = null;\n if (this.abort) {\n return;\n }\n const {\n ctx,\n size,\n paused,\n segmentationMask,\n segmentationMaskCtx,\n segmentationMaskCanvas\n } = this;\n if (this.reader) {\n try {\n const { value } = await this.reader.read();\n if (value) {\n value.width = value.displayWidth;\n value.height = value.displayHeight;\n frame = value;\n }\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!_tfliteReady || paused) {\n ctx.drawImage(frame || this.video, 0, 0);\n } else {\n if (!frame) {\n if (ImageBitmapSupport) {\n try {\n frame = await createImageBitmap(this.video);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n } else {\n this.videoCtx.drawImage(this.video, 0, 0);\n frame = this.videoCanvas;\n }\n }\n if (this.abort) {\n return;\n }\n if (frame && frame.width > 0 && frame.height > 0) {\n segmentationMaskCtx.drawImage(\n frame,\n 0,\n 0,\n frame.width,\n frame.height,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const imageData = segmentationMaskCtx.getImageData(\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const { data } = imageData;\n const heap = _tflite.HEAPF32;\n const maskData = segmentationMask.data;\n const { pixelCount } = _segmentationModel;\n for (\n let heapIndex = 0, imgIndex = 0, index = 0, indexId = 0;\n index < pixelCount;\n index++\n ) {\n indexId = index * 3;\n heapIndex = _inputMemoryOffset + indexId;\n imgIndex = index * 4;\n heap[heapIndex] = data[imgIndex] / 255;\n heap[heapIndex + 1] = data[imgIndex + 1] / 255;\n heap[heapIndex + 2] = data[imgIndex + 2] / 255;\n }\n _tflite._runInference();\n for (\n let index = 0, indexOut = 0, person = 0.0;\n index < pixelCount;\n index++\n ) {\n person = heap[_outputMemoryOffset + index];\n // Sets only the alpha component of each pixel\n indexOut = index * 4;\n maskData[indexOut + 3] = 255 * person;\n }\n segmentationMaskCtx.putImageData(segmentationMask, 0, 0);\n ctx.globalCompositeOperation = 'copy';\n ctx.filter = 'blur(2px)';\n ctx.drawImage(\n segmentationMaskCanvas,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height,\n 0,\n 0,\n size.width,\n size.height\n );\n ctx.globalCompositeOperation = 'source-in';\n ctx.filter = 'none';\n ctx.drawImage(frame, 0, 0);\n if (this.backgroundType) {\n this.drawBackground(frame);\n }\n }\n }\n if (!paused && this.paused) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n if (frame && typeof frame.close === 'function') {\n frame.close();\n }\n if (!this.abort) {\n this.raf.requestAnimationFrame();\n }\n }\n\n suspend() {\n const { ctx } = this;\n this.paused = true;\n if (ctx) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n }\n\n resume() {\n this.paused = false;\n }\n\n drawBackground(frame) {\n const {\n backgroundType,\n ctx,\n blurCanvas,\n imageCanvas,\n backgroundValue,\n size\n } = this;\n if (!backgroundType || !ctx) {\n return;\n }\n ctx.globalCompositeOperation = 'destination-over';\n if (backgroundType === 'blur') {\n if (FeatureDetector.canvasBlurSupport()) {\n const length = Number(backgroundValue) * 2;\n const fullLength = length * 2;\n if (!this.blurInit) {\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n 0,\n 0,\n size.width + fullLength,\n size.height + fullLength\n );\n this.blurInit = true;\n }\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n length,\n length,\n size.width,\n size.height\n );\n blurCanvas.ctx.drawImage(imageCanvas.canvas, 0, 0);\n ctx.drawImage(\n blurCanvas.canvas,\n length,\n length,\n size.width,\n size.height,\n 0,\n 0,\n size.width,\n size.height\n );\n } else {\n const blurred = this.canvasBlur.run(frame, backgroundValue);\n ctx.drawImage(blurred, 0, 0);\n }\n } else if (backgroundType === 'color') {\n ctx.fillStyle = backgroundValue;\n ctx.fillRect(0, 0, size.width, size.height);\n } else if (imageCanvas) {\n ctx.drawImage(imageCanvas, 0, 0);\n } else {\n ctx.drawImage(frame, 0, 0);\n }\n }\n\n async initBackground() {\n const { backgroundType, backgroundValue } = this;\n const { width, height } = this.size;\n let done = false;\n if (!width || !height) {\n return;\n }\n if (backgroundType === 'eyeson') {\n this.imageCanvas = createGradientCanvas(width, height, {\n startX: 0,\n startY: 0,\n endX: width,\n endY: 50,\n color1: '#ff7676',\n color2: '#9e206c'\n });\n done = true;\n } else if (backgroundType === 'generali') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createGeneraliCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'image') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createImageCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'blur') {\n this.blurInit = false;\n createBlurCanvas(this, width, height, Number(backgroundValue));\n this.canvasBlur.reset();\n done = true;\n } else {\n this.imageCanvas = null;\n done = true;\n }\n if (done) {\n this.backgroundOld = {\n type: backgroundType,\n value: backgroundValue\n };\n }\n }\n\n setBackgroundFallback() {\n const { backgroundOld } = this;\n if (backgroundOld) {\n this.backgroundType = backgroundOld.type;\n this.backgroundValue = backgroundOld.value;\n } else {\n if (!this.imageCanvas) {\n const { width, height } = this.size;\n this.blurInit = false;\n createBlurCanvas(this, width, height, 8);\n }\n this.backgroundType = 'blur';\n this.backgroundValue = '8';\n }\n }\n\n changeBackground(type) {\n Logger.info('VirtualBackgroundMixer::changeBackground', this.name, type);\n if (typeof type !== 'string') {\n return;\n }\n const colon = type.indexOf(':');\n if (colon === -1) {\n this.backgroundType = type === 'off' ? null : type;\n this.backgroundValue = null;\n } else {\n this.backgroundType = type.substring(0, colon);\n this.backgroundValue = type.substring(colon + 1);\n }\n if (!this.abort) {\n this.initBackground();\n }\n }\n\n stop() {\n Logger.info('VirtualBackgroundMixer::stop', this.name);\n this.abort = true;\n if (this.raf) {\n this.raf.cancelAnimationFrame();\n }\n if (this.video) {\n const { video, playPromise } = this;\n if (playPromise && video) {\n playPromise.then(() => video.pause());\n }\n this.video.onloadeddata = null;\n this.video = null;\n this.playPromise = null;\n }\n if (this.reader) {\n this.reader = null;\n }\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.backgroundOld = null;\n this.imageCanvas = null;\n this.blurCanvas = null;\n this.canvasBlur.reset();\n }\n\n stopOriginalStream() {\n Logger.info(\n 'VirtualBackgroundMixer::stopOriginalStream',\n this.name,\n this.originalStream\n );\n this.stop();\n stopStream(this.originalStream);\n }\n\n terminate() {\n Logger.info('VirtualBackgroundMixer::terminate', this.name);\n this.stop();\n if (this.outStream) {\n getVbgTracks(this.outStream).forEach(track => {\n stopTrack(track);\n Logger.info(\n 'VirtualBackgroundMixer::terminate stop track',\n this.name,\n track\n );\n });\n }\n this.originalStream = null;\n this.outStream = null;\n this.canvas = null;\n this.ctx = null;\n this.video = null;\n }\n\n destroy() {\n Logger.info('VirtualBackgroundMixer::destroy', this.name);\n _stateChange.removeEventListener('change', this.handleStateChange);\n this.loadingListener.length = 0;\n this.canvasBlur = null;\n }\n}\n\nexport default VirtualBackgroundMixer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport eyesonOptions from './options.js';\nimport LocalStorage from './LocalStorage.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst changedDevices = (listA, listB) => {\n if (listA.length !== listB.length) {\n return true;\n }\n for (\n let deviceA = null, found = false, { length } = listA, index = 0;\n index < length;\n index++\n ) {\n deviceA = listA[index];\n found = listB.find(deviceB => {\n return (\n deviceA.deviceId === deviceB.deviceId &&\n deviceA.groupId === deviceB.groupId &&\n deviceA.label === deviceB.label &&\n deviceA.kind === deviceB.kind\n );\n });\n if (!found) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * eyeson Device Manager used to handle cameras, microphones and speakers.\n **/\nclass DeviceManager {\n /* eslint-disable max-statements */\n constructor(options) {\n this.sinkId = 'default';\n this.options = options || { audio: true, video: true, eco: false };\n this.stream = null;\n this.cameras = [];\n this.listeners = [];\n this.speakers = [];\n this.microphones = [];\n this.constraints = {};\n this.terminationInProgress = false;\n this.virtualBackground = new VirtualBackgroundMixer('DeviceManager');\n this.virtualBackgroundType = 'off';\n\n DeviceManager.getSinkId().then(sinkId => (this.sinkId = sinkId));\n\n this.setStream = this.setStream.bind(this);\n this.handleError = this.handleError.bind(this);\n this.verifyStream = this.verifyStream.bind(this);\n this.storeConstraints = this.storeConstraints.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.initiateVirtualBackground = this.initiateVirtualBackground.bind(this);\n }\n /* eslint-enable max-statements */\n\n static getDevices() {\n if (!('mediaDevices' in navigator)) {\n return Promise.resolve([]);\n }\n return navigator.mediaDevices.enumerateDevices().then(devices => {\n // hack for safari ios and desktop because they hide existing devices to avoid fingerprinting: https://webkit.org/blog/7763/a-closer-look-into-webrtc/\n if (\n devices.length === 2 &&\n devices.every(\n device => device.kind === 'audioinput' && device.deviceId === ''\n )\n ) {\n return [\n { deviceId: '', groupId: '', kind: 'audioinput', label: '' },\n { deviceId: '', groupId: '', kind: 'videoinput', label: '' }\n ];\n }\n return devices;\n });\n }\n\n /**\n * Get constraints for specified options { audio: true, video: true }\n * If a specific device is chosen it has to be stored in localStorage or will\n * be ignored.\n **/\n static getConstraints(optionsParam) {\n const options = optionsParam || { audio: true, video: true };\n return DeviceManager.getDevices()\n .then(devices => {\n return DeviceManager.determineConstraintsForDevices(devices, options);\n })\n .catch(error => {\n Logger.error('DeviceManager::getConstraints ', error);\n });\n }\n\n /* eslint-disable max-statements, complexity */\n static determineConstraintsForDevices(devices, options) {\n const constraints = LocalStorage.load('mediaConstraints', options);\n const stereo = FeatureDetector.canStereo() && !options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n\n if (!('video' in constraints)) {\n constraints.video = true;\n }\n if (!('audio' in constraints)) {\n constraints.audio = audioConstraints;\n }\n\n if (constraints.video.deviceId) {\n const videoDeviceId = constraints.video.deviceId.exact;\n if (!devices.find(device => device.deviceId === videoDeviceId)) {\n constraints.video = options.video;\n }\n }\n if (constraints.audio.deviceId) {\n const audioDeviceId = constraints.audio.deviceId.exact;\n if (!devices.find(device => device.deviceId === audioDeviceId)) {\n constraints.audio = options.audio ? audioConstraints : false;\n }\n }\n\n if (options.video === false && !options.eco) {\n constraints.video = false;\n }\n if (options.video === true && constraints.video === false) {\n constraints.video = true;\n }\n if (\n (options.audio === true && constraints.audio === false) ||\n constraints.audio === true\n ) {\n constraints.audio = audioConstraints;\n }\n if (\n constraints.audio &&\n constraints.audio.channelCount !== audioConstraints.channelCount\n ) {\n constraints.audio.channelCount = audioConstraints.channelCount;\n }\n\n // In case we don't have a videoinput device but specify\n // video: true, we get NotFoundError in FF & DevicesNotFoundError in\n // Chrome.\n if (devices.filter(device => device.kind === 'videoinput').length === 0) {\n constraints.video = false;\n }\n\n DeviceManager.applyLastUsedDevices(constraints, devices);\n DeviceManager.applyWidescreen(constraints);\n\n return constraints;\n }\n /* eslint-enable max-statements, complexity */\n\n static applyLastUsedDevices(constraints, devices) {\n const videoId = LocalStorage.load('videoId');\n const audioId = LocalStorage.load('audioId');\n if (\n constraints.video === true &&\n videoId &&\n devices.find(device => device.deviceId === videoId)\n ) {\n constraints.video = { deviceId: { exact: videoId } };\n }\n if (\n constraints.audio &&\n audioId &&\n devices.find(device => device.deviceId === audioId)\n ) {\n constraints.audio.deviceId = { exact: audioId };\n }\n }\n\n static applyWidescreen(constraints) {\n const { widescreen } = eyesonOptions;\n if (widescreen) {\n if (constraints.video === true) {\n constraints.video = {};\n }\n if (constraints.video) {\n Object.assign(constraints.video, { width: 640, height: 360 });\n }\n } else if (\n typeof constraints.video === 'object' &&\n ('width' in constraints.video || 'height' in constraints.video)\n ) {\n Reflect.deleteProperty(constraints.video, 'width');\n Reflect.deleteProperty(constraints.video, 'height');\n }\n }\n\n /**\n * For now we handle the mobile options and constraints completely separately.\n * That way we can address the facingMode constraint.\n **/\n static getMobileConstraints(options) {\n let constraints = Object.assign({ audio: true, video: true }, options);\n DeviceManager.applyWidescreen(constraints);\n return Promise.resolve(constraints);\n }\n\n /**\n * Get sinkId.\n **/\n static getSinkId() {\n let sinkId = LocalStorage.load('sinkId', '');\n return DeviceManager.getDevices().then(devices => {\n if (!devices.find(device => device.deviceId === sinkId)) {\n sinkId = 'default';\n }\n return sinkId;\n });\n }\n\n /**\n * Return available devices in a friendly format.\n **/\n static fetchDevices() {\n return DeviceManager.getDevices().then(devices => {\n const speakers = devices.filter(device => device.kind === 'audiooutput');\n if (\n speakers.length > 0 &&\n speakers.findIndex(speaker => speaker.deviceId === 'default') === -1\n ) {\n speakers.unshift({\n deviceId: 'default',\n kind: 'audiooutput',\n groupId: 'default',\n label: 'System default'\n });\n }\n return {\n cameras: devices.filter(device => device.kind === 'videoinput'),\n microphones: devices.filter(device => device.kind === 'audioinput'),\n speakers: speakers\n };\n });\n }\n\n static fetchInputDevices() {\n return DeviceManager.getDevices().then(devices => {\n return devices.filter(device => device.kind.includes('input'));\n });\n }\n\n async setVirtualBackgroundType(type) {\n if (!VirtualBackgroundMixer.isTypeAllowed(type)) {\n Logger.warn(\n 'DeviceManage::setVirtualBackgroundType type not allowed',\n type\n );\n return;\n }\n await VirtualBackgroundMixer.checkExternalImage(type);\n const wasOff = this.virtualBackgroundType === 'off';\n const willBeOff = type === 'off';\n this.virtualBackgroundType = type;\n this.virtualBackground.changeBackground(type);\n if (this.stream && ((wasOff && !willBeOff) || (!wasOff && willBeOff))) {\n this.update();\n }\n }\n\n static getStoredVirtualBackgroundType(isBlobAvailable) {\n const type = LocalStorage.load('virtualBackgroundType', 'off');\n if (type === 'image:blob') {\n return VirtualBackgroundMixer.getImageBlobOrFallback(isBlobAvailable);\n }\n return type;\n }\n\n loadLocalImageForVirtualBackground(callbackFN) {\n VirtualBackgroundMixer.loadLocalImage(error => {\n if (!error) {\n this.setVirtualBackgroundType('image:blob');\n }\n callbackFN(error);\n });\n }\n\n /**\n * Sets cameras, microphones, and speakers and starts a video stream\n * with supplied options.\n **/\n start() {\n this.watchForNewDevices();\n\n return DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .then(() => DeviceManager.getConstraints(this.options))\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n stopStream() {\n if (!this.stream) {\n return;\n }\n if (this.virtualBackground.originalStream) {\n this.virtualBackground.stopOriginalStream();\n this.virtualBackground.terminate();\n } else {\n stopStream(this.stream);\n }\n this.stream = null;\n }\n\n /**\n * Stop the media stream. Since we call getUserMedia on gotDevices we don't\n * have a stream in that case.\n **/\n stop() {\n this.stopStream();\n }\n\n terminate() {\n navigator.mediaDevices.ondevicechange = null;\n this.terminationInProgress = true;\n window.setTimeout(() => {\n this.stop();\n this.virtualBackground.destroy();\n }, 10);\n }\n\n setDevices(devices) {\n const camHasChanged = changedDevices(this.cameras, devices.cameras);\n const micHasChanged = changedDevices(this.microphones, devices.microphones);\n const speakerHasChanged = changedDevices(this.speakers, devices.speakers);\n this.cameras = devices.cameras;\n this.microphones = devices.microphones;\n this.speakers = devices.speakers;\n this.options.audio =\n this.microphones.length > 0 ? this.options.audio : false;\n this.options.video = this.cameras.length > 0 ? this.options.video : false;\n if (camHasChanged || micHasChanged || speakerHasChanged) {\n this.emit(devices);\n }\n }\n\n watchForNewDevices() {\n navigator.mediaDevices.ondevicechange = () => {\n DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .catch(this.handleError);\n };\n }\n\n /**\n * Register listeners for changes on devices.\n **/\n onChange(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * Remove a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * Wrapper around mediaDevices getUserMedia. Ensures a running stream is\n * stopped and a new one started with newly defined constraints.\n **/\n update(constraints) {\n this.constraints = constraints || this.constraints;\n this.stop();\n\n this.watchForNewDevices();\n\n return navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n /**\n * Similar to update but instead of directly supplying constraints,\n * update with options.\n **/\n updateWithOptions(options, isMobile = false) {\n this.options = options || this.options;\n this.stop();\n\n this.watchForNewDevices();\n\n const constraintsFn = isMobile ? 'getMobileConstraints' : 'getConstraints';\n return DeviceManager[constraintsFn](this.options)\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n stream.getAudioTracks()[0].enabled = this.options.audio;\n }\n return stream;\n }\n\n initiateVirtualBackground(stream) {\n if (\n this.virtualBackgroundType !== 'off' &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return this.virtualBackground.initiateStream(stream);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n storeConstraints() {\n const { constraints } = this;\n const { video, audio } = constraints;\n Logger.debug('DeviceManager::storeConstraints', constraints);\n LocalStorage.store('mediaConstraints', constraints);\n LocalStorage.store('sinkId', this.sinkId);\n LocalStorage.store('virtualBackgroundType', this.virtualBackgroundType);\n if (video && video.deviceId && video.deviceId.exact) {\n LocalStorage.store('videoId', video.deviceId.exact);\n }\n if (audio && audio.deviceId && audio.deviceId.exact) {\n LocalStorage.store('audioId', audio.deviceId.exact);\n }\n this.virtualBackground.updateCache(this.virtualBackgroundType);\n }\n\n /**\n * Set active stream.\n *\n * NOTE: This can be called _after_ we have already stopped.\n **/\n // eslint-disable-next-line max-statements\n setStream(stream) {\n const firstRun = this.stream === null;\n this.stream = stream;\n if (this.terminationInProgress) {\n this.stop();\n return Promise.resolve();\n }\n const emitStreamUpdate = () => {\n this.emit({\n stream: this.stream,\n constraints: this.constraints,\n options: this.options\n });\n this.verifyStream();\n };\n if (firstRun) {\n return DeviceManager.fetchDevices().then(devices => {\n this.setDevices(devices);\n emitStreamUpdate();\n });\n }\n emitStreamUpdate();\n return Promise.resolve();\n }\n\n verifyStream() {\n if (\n this.constraints.video &&\n this.stream &&\n this.stream.getVideoTracks().length === 0 &&\n !this.options.eco\n ) {\n this.handleError({ name: 'EyesonCameraError' });\n }\n\n if (\n this.constraints.audio &&\n this.stream &&\n this.stream.getAudioTracks().length === 0\n ) {\n this.handleError({ name: 'EyesonMicrophoneError' });\n }\n }\n\n /**\n * Set video input selection.\n **/\n setVideoInput(deviceId) {\n let videoConstraints = {};\n Object.assign(videoConstraints, this.constraints.video, {\n deviceId: { exact: deviceId }\n });\n this.constraints.video = videoConstraints;\n return this.update();\n }\n\n /**\n * Set audio input selection.\n **/\n setAudioInput(deviceId, options = {}) {\n let audioConstraints = {};\n Object.assign(audioConstraints, this.constraints.audio, {\n deviceId: { exact: deviceId }\n });\n this.constraints.audio = audioConstraints;\n if (options.preventUpdate === true) {\n return Promise.resolve();\n }\n return this.update();\n }\n\n /**\n * Set and store audio output selection.\n **/\n setAudioOutput(sinkId) {\n this.sinkId = sinkId || 'default';\n LocalStorage.store('sinkId', this.sinkId);\n this.emit({ sinkId: this.sinkId });\n }\n\n handleError(error) {\n Logger.error('DeviceManager::', error);\n this.emit({ error: error, constraints: this.constraints });\n }\n\n /**\n * emit bound listeners about changes.\n **/\n emit(state) {\n this.listeners.forEach(listener => listener(state));\n }\n}\n\nexport default DeviceManager;\n/* eslint-enable max-lines */\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport NinjaStream from './NinjaStream.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport {\n stopTrack,\n captureStream,\n isCanvasPresentationStream,\n isScreenStream,\n isScreenPresentationStream,\n getScreenTracks,\n getScreenPresentationTracks,\n getCanvasTracks,\n getCameraTracks,\n toggleAudio,\n stopStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Options are basically what the user of MediaStreamBuilder \"wants\" to see in\n * the conference session. For example: no camera video -> options video: false\n * but we'd still have a media stream track with video because conference server\n * currently expects this behaviour and relies on mute_video command being\n * sent.\n **/\nclass MediaStreamBuilder {\n constructor(\n options = {\n eco: false,\n audio: true,\n video: true,\n screen: false,\n surface: null,\n screenStream: null,\n canvas: null,\n existingStream: null,\n micMixer: null,\n vbgMixer: null,\n isPresentation: false,\n virtualBackground: false,\n deviceMonitor: null\n }\n ) {\n this.options = options;\n this.tempStream = null;\n this.brokenTrackCallback = null;\n this.bindMethods();\n }\n\n bindMethods() {\n this.getMediaStream = this.getMediaStream.bind(this);\n this.addNinjaTrack = this.addNinjaTrack.bind(this);\n this.addCanvasTrack = this.addCanvasTrack.bind(this);\n this.addScreenTrack = this.addScreenTrack.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.adjustVideoTrack = this.adjustVideoTrack.bind(this);\n this.addScreenStreamTrack = this.addScreenStreamTrack.bind(this);\n this.initializeVirtualBackground =\n this.initializeVirtualBackground.bind(this);\n }\n\n /**\n * We always acquire a stream with at least audio enabled and adjust\n * the desired mute behaviour via the track.\n * Unless, we have no camera and microphones. In that case we use a\n * NinjaStream.\n * If the browser does not support updating the peerConnection\n * we acquire a audio and video stream and adjust the tracks accordingly.\n *\n * In case of replaceTrack support we stop the tracks before\n * acquiring a new stream. Since stopping a track also stops the source.\n * So, at least in Safari we'd stop the camera if the old and new track\n * use the same source.\n * Furthermore Safari on iOS behaves differently again. Camera muting\n * _sometimes_ freezes the remote stream video playback (audio fine).\n **/\n start() {\n Logger.debug('MediaStreamBuilder::start', this.options);\n const {\n existingStream,\n video,\n audio,\n screen,\n canvas,\n micMixer,\n screenStream\n } = this.options;\n if (\n FeatureDetector.isIOSDevice() &&\n existingStream &&\n typeof video === 'boolean' &&\n existingStream.active &&\n getCameraTracks(existingStream).length > 0 &&\n getCameraTracks(existingStream)[0].readyState !== 'ended'\n ) {\n // eslint-disable-next-line max-statements\n return new Promise(resolve => {\n const [vTrack] = getCameraTracks(existingStream);\n vTrack.enabled = video;\n vTrack.onended =\n video && this.brokenTrackCallback\n ? () => {\n Logger.error('iOS video track broken');\n existingStream.getTracks().forEach(track => track.stop());\n this.brokenTrackCallback();\n }\n : null;\n if (typeof audio === 'boolean') {\n toggleAudio(existingStream, audio);\n }\n if (canvas) {\n const newStream = new MediaStream(existingStream.getTracks());\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n newStream.addTrack(canvasTrack);\n resolve(newStream);\n return;\n }\n resolve(existingStream);\n });\n }\n\n if (FeatureDetector.isSafari() && screen && micMixer && !canvas) {\n return (\n screenStream ? Promise.resolve(screenStream) : this.getDisplayMedia()\n )\n .then(displayStream => {\n return DeviceManager.getConstraints().then(constraints => {\n const stream = new MediaStream();\n this.addScreenStreamTrack(stream, displayStream);\n this.tempStream = new MediaStream(displayStream.getTracks());\n return navigator.mediaDevices\n .getUserMedia({ audio: constraints.audio })\n .then(audioStream => {\n this.adjustAudioTrack(audioStream);\n audioStream\n .getTracks()\n .forEach(track => this.tempStream.addTrack(track));\n micMixer.mixScreenshareAudio(\n audioStream,\n displayStream,\n stream\n );\n if (micMixer.active) {\n micMixer.setMicOnlyStream(audioStream, displayStream);\n }\n return stream;\n });\n });\n })\n .then(stream => {\n this.tempStream = null;\n return stream;\n })\n .catch(error => {\n if (this.tempStream) {\n stopStream(this.tempStream);\n this.tempStream = null;\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n return DeviceManager.fetchInputDevices()\n .then(this.getMediaStream)\n .then(this.adjustVideoTrack)\n .then(this.adjustAudioTrack)\n .then(this.initializeVirtualBackground)\n .then(this.addCanvasTrack)\n .then(this.addScreenTrack)\n .then(this.addNinjaTrack)\n .then(stream => {\n this.tempStream = null;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.applyTempTracks();\n }\n return stream;\n })\n .catch(error => {\n this.cleanupTempStream();\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.discardTempTracks();\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n // eslint-disable-next-line max-statements\n getMediaStream(devices) {\n if (devices.length === 0) {\n this.options = { audio: false, video: false };\n this.tempStream = new NinjaStream().stream;\n return this.tempStream;\n }\n const { eco, video, existingStream } = this.options;\n const options = {\n video: FeatureDetector.hasCanvasCaptureSupport() || eco ? video : true,\n audio: true\n };\n if (video === false && !eco && FeatureDetector.isIOSDevice()) {\n options.video = true;\n }\n let { getConstraints } = DeviceManager;\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n stopStream(existingStream);\n }\n if (FeatureDetector.isPhone() || FeatureDetector.isIOSDevice()) {\n stopStream(existingStream);\n getConstraints = DeviceManager.getMobileConstraints;\n }\n return getConstraints(options).then(constraints => {\n return navigator.mediaDevices.getUserMedia(constraints).then(stream => {\n this.tempStream = stream;\n return stream;\n });\n });\n }\n\n /**\n * Adjust audio and video tracks according to the supplied options.\n * We stop the video track so the camera indicator isn't active.\n * We add a filler video track, unless we're in eco mode, which would result\n * in sdp with media section for video & recvonly. meaning we'd still\n * receive video.\n * In case of iOS we have the cam track that shouldn't get stopped to get turned\n * on again\n **/\n adjustVideoTrack(stream) {\n if (stream.getVideoTracks().length === 1) {\n const [vTrack] = stream.getVideoTracks();\n vTrack.enabled = this.options.video;\n if (this.options.video === false && !FeatureDetector.isIOSDevice()) {\n stopTrack(vTrack);\n }\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addVideoTrack(vTrack);\n }\n }\n return stream;\n }\n\n initializeVirtualBackground(stream) {\n const { screen, virtualBackground, vbgMixer } = this.options;\n if (\n !screen &&\n virtualBackground &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return vbgMixer.initiateStream(stream);\n }\n return stream;\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n const [aTrack] = stream.getAudioTracks();\n aTrack.enabled = this.options.audio;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addAudioTrack(aTrack);\n }\n }\n return stream;\n }\n\n addCanvasTrack(stream) {\n const { canvas, existingStream } = this.options;\n if (canvas) {\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n stream.addTrack(canvasTrack);\n }\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n stream.addTrack(canvasTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n async addScreenTrack(stream) {\n let { screenStream } = this.options;\n const { screen, existingStream, micMixer } = this.options;\n if (screen && micMixer) {\n if (screenStream === null || typeof screenStream === 'undefined') {\n screenStream = await this.getDisplayMedia();\n }\n const outStream = new MediaStream();\n this.addScreenStreamTrack(outStream, screenStream);\n micMixer.mixScreenshareAudio(stream, screenStream, outStream);\n if (micMixer.active) {\n micMixer.setMicOnlyStream(stream, screenStream);\n }\n this.tempStream = new MediaStream(\n stream.getTracks().concat(screenStream.getTracks())\n );\n return outStream;\n }\n // this is crazy! for now, we loose screen audio if there was any\n if (isScreenPresentationStream(existingStream)) {\n const [screenTrack] = getScreenPresentationTracks(existingStream);\n stream.addTrack(screenTrack);\n }\n return stream;\n }\n\n addScreenStreamTrack(stream, screenStream) {\n const [screenTrack] = screenStream.getVideoTracks();\n // options required for SAFARI\n screenTrack.type = this.options.isPresentation\n ? 'screen-track'\n : 'screen-video-track';\n if (stream) {\n stream.addTrack(screenTrack);\n }\n }\n\n getDisplayMedia() {\n if (FeatureDetector.hasGetDisplayMedia()) {\n const stereo = FeatureDetector.canStereo() && !this.options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n const videoConstraints = {\n // removed width constraint due to safari bug drawing a green line\n // width: { max: 1920 },\n height: { max: 1080 },\n frameRate: { max: 15 }\n };\n if (FeatureDetector.isChrome() && FeatureDetector.isMacOS()) {\n // disable audio processing to prevent down-mixing\n // unfortunately audio on entire screen (not supported on Mac) causes echo!\n audioConstraints.echoCancellation = false;\n }\n if (this.options.surface && FeatureDetector.canChooseDisplaySurface()) {\n videoConstraints.displaySurface = this.options.surface;\n }\n return navigator.mediaDevices.getDisplayMedia({\n audio: audioConstraints,\n video: videoConstraints,\n surfaceSwitching: 'include',\n selfBrowserSurface: 'include',\n systemAudio: 'include'\n });\n }\n return navigator.mediaDevices.getUserMedia({\n video: {\n mediaSource: 'screen',\n width: { max: 1920 },\n height: { max: 1040 },\n frameRate: { max: 15 }\n }\n });\n }\n\n addNinjaTrack(stream) {\n const { eco, video } = this.options;\n if (eco || !FeatureDetector.hasCanvasCaptureSupport()) {\n return stream;\n }\n if (stream.getVideoTracks().length === 0) {\n const [fillerTrack] = new NinjaStream().stream.getVideoTracks();\n fillerTrack.enabled = video;\n stream.addTrack(fillerTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n cleanupTempStream() {\n let { tempStream } = this;\n if (!tempStream) {\n return;\n }\n const { existingStream, screenStream } = this.options;\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n tempStream.removeTrack(canvasTrack);\n }\n if (isScreenStream(existingStream)) {\n const [screenTrack] = getScreenTracks(existingStream);\n tempStream.removeTrack(screenTrack);\n }\n if (isScreenPresentationStream(screenStream)) {\n const [screenTrack] = getScreenPresentationTracks(screenStream);\n tempStream.removeTrack(screenTrack);\n }\n stopStream(tempStream);\n this.tempStream = null;\n }\n\n onBrokenTrackError(callback) {\n this.brokenTrackCallback = callback;\n return this;\n }\n}\n\nexport default MediaStreamBuilder;\n","import Logger from './Logger.js';\nimport { stopStream, stopTrack } from './utils/StreamHelpers.js';\n\nclass MicMixer {\n constructor() {\n this.active = false;\n this.audioContext = null;\n this.acOut = null;\n this.micOnlyStream = null;\n this.originalStream = null;\n }\n\n setMicOnlyStream(audioStream, videoStream) {\n this.micOnlyStream = new MediaStream();\n const audioTracks = audioStream.getAudioTracks();\n const videoTracks = videoStream.getVideoTracks();\n if (audioTracks.length > 0) {\n this.micOnlyStream.addTrack(audioTracks[0]);\n }\n if (videoTracks.length > 0) {\n this.micOnlyStream.addTrack(videoTracks[0]);\n }\n return this.micOnlyStream;\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n getOriginalStream() {\n return this.originalStream;\n }\n\n stopOriginalStream() {\n stopStream(this.originalStream);\n }\n\n noMix(userMediaStream, outStream) {\n const audioTracks = userMediaStream.getAudioTracks();\n if (audioTracks.length > 0) {\n outStream.addTrack(audioTracks[0]);\n }\n }\n\n initMixScreenshareMix(userMediaStream, displayStream, outStream) {\n this.audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n this.acOut = this.audioContext.createMediaStreamDestination();\n this.audioContext\n .createMediaStreamSource(displayStream)\n .connect(this.acOut);\n this.audioContext\n .createMediaStreamSource(userMediaStream)\n .connect(this.acOut);\n outStream.addTrack(this.acOut.stream.getAudioTracks()[0]);\n }\n\n mixScreenshareAudio(userMediaStream, displayStream, outStream) {\n this.originalStream = displayStream;\n const displayAudio = displayStream.getAudioTracks();\n if (displayAudio.length === 0) {\n this.noMix(userMediaStream, outStream);\n } else {\n try {\n this.initMixScreenshareMix(userMediaStream, displayStream, outStream);\n this.active = true;\n } catch (exc) {\n Logger.error('MicMixer::mixScreenshareAudio', exc);\n stopTrack(displayAudio[0]);\n this.noMix(userMediaStream, outStream);\n }\n }\n }\n\n destroy() {\n this.stopOriginalStream();\n this.micOnlyStream = null;\n this.originalStream = null;\n if (this.audioContext) {\n stopStream(this.acOut.stream);\n this.audioContext.close().then(() => {\n this.audioContext = null;\n this.acOut = null;\n this.active = false;\n });\n return;\n }\n this.active = false;\n }\n}\n\nexport default MicMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst adjustMediaStreamTracks = (stream, audio, video) => {\n stream.getAudioTracks().forEach(track => (track.enabled = audio));\n stream.getVideoTracks().forEach(track => (track.enabled = video));\n};\n\n/**\n * ChangeLocalStream (optimization after PodiumEvent).\n **/\nclass ChangeLocalStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio, video, screen = false, surface }) {\n Logger.debug('ChangeLocalStreamEvent::handle');\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream, vbgMixer } = _session;\n const wasScreenAsVideo = Boolean(_session.micMixer);\n\n if (\n FeatureDetector.isIOSDevice() ||\n (FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !wasScreenAsVideo &&\n !localStream.wasScreenAsVideo)\n ) {\n if (vbgMixer) {\n if (video) {\n vbgMixer.resume();\n } else {\n vbgMixer.suspend();\n }\n if (\n vbgMixer.originalStream &&\n vbgMixer.originalStream !== localStream\n ) {\n adjustMediaStreamTracks(vbgMixer.originalStream, audio, video);\n }\n }\n adjustMediaStreamTracks(localStream, audio, video);\n localStream.locallyChanged = true;\n _session.emit({ type: 'stream_update', localStream });\n return;\n }\n\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n }\n\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n\n new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(stream => {\n stream.locallyChanged = true;\n stream.wasScreenAsVideo = wasScreenAsVideo;\n _session.setStream(stream);\n })\n .catch(error => {\n Logger.error('ChangeLocalStreamEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n _session.emit({ type: 'stop_screen_video' });\n }\n });\n }\n}\n\nexport default ChangeLocalStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport ForwardEvent from './ForwardEvent.js';\nimport ChangeLocalStreamEvent from './ChangeLocalStreamEvent.js';\nimport {\n isPresentationStream,\n isCameraStream,\n isVBGStream,\n hasAudio,\n hasVideo\n} from './../utils/StreamHelpers.js';\n\nclass PodiumEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n // For dev\n Logger.debug('PodiumEvent::handle', msg);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream } = _session;\n\n if (\n !msg.hasPresenter &&\n isPresentationStream(localStream) &&\n !_session.stopPresentingSet\n ) {\n _session.emit({ type: 'stop_presenting' });\n }\n\n if (_session && !_session.externalStream) {\n this.scanMessageForLocalStreamOptimization(localStream, msg);\n }\n\n new ForwardEvent(this.context).handle(msg);\n }\n\n // Optimization to avoid streaming when not on video podium.\n // First, we need a localStream, then we avoid adjustments when we initially\n // join the room (isSource) and finally if we're not on the podium,\n // but have a local camera stream with video, we change our local stream.\n //\n // We only re-activate the camera in the opposite case if the current\n // localStream was locallyChanged (through this optimization) since we\n // want to avoid situations where a user doesn't expect to be on the video\n // podium and we suddenly turned on their camera.\n //\n // Last case: someone else is presenting (screen share or canvas presentation)\n // we're still on the video podium but not actively presenting.\n // eslint-disable-next-line max-statements\n scanMessageForLocalStreamOptimization(localStream, msg) {\n const { video, isSource, isPresenter, hasPresenter, hasDesktopSources } =\n msg;\n\n if (!localStream) {\n return;\n }\n\n if (\n isSource &&\n ((!video && (isCameraStream(localStream) || isVBGStream(localStream))) ||\n (video &&\n !hasVideo(localStream) &&\n localStream.locallyChanged &&\n !hasPresenter))\n ) {\n const options = {\n audio: hasAudio(localStream),\n video: video\n };\n if (localStream.wasScreenAsVideo) {\n options.video = false;\n options.screen = true;\n }\n new ChangeLocalStreamEvent(this.context).handle(options);\n }\n\n if (video && !isPresenter && hasDesktopSources) {\n new ChangeLocalStreamEvent(this.context).handle({\n audio: hasAudio(localStream),\n video: false\n });\n }\n }\n}\n\nexport default PodiumEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SnapshotEvent extends BaseEvent {\n handle() {\n this.context._api.takeSnapshot();\n }\n}\n\nexport default SnapshotEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayerEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayer(msg.params);\n }\n}\n\nexport default SetLayerEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SendChatEvent extends BaseEvent {\n handle(msg) {\n if (!this.context._session) {\n throw new Error('Session does not exist');\n }\n this.context._session.send({\n type: 'chat',\n content: msg.content\n });\n }\n}\n\nexport default SendChatEvent;\n","import Logger from '../Logger';\nimport PublicEvent from './PublicEvent';\n\nclass StopRtmpEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopBroadcast('generic')\n .then(() => super.handle({ type: msg.type }))\n .catch(error => Logger.warn(error));\n }\n}\n\nexport default StopRtmpEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayoutEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayout(msg.params);\n }\n}\n\nexport default SetLayoutEvent;\n","import BaseEvent from './BaseEvent';\n\nconst fixUrlEnd = url => {\n if (!url.endsWith('/')) {\n return url + '/';\n }\n return url;\n};\n\nclass StartRtmpEvent extends BaseEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n const streamUrl = fixUrlEnd(msg.url) + msg.key;\n _api.startBroadcast({ streamUrl }, 'generic').catch(error => {\n _session.emit({\n type: 'start_broadcast_error',\n platform: 'generic',\n error: error\n });\n });\n }\n}\n\nexport default StartRtmpEvent;\n","const EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nclass EventEmitter {\n constructor() {\n this.listeners = new Map();\n this.target = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\n }\n\n onEvent(cb) {\n const fn = ({ detail }) => cb(detail);\n this.target.addEventListener('event', fn);\n this.listeners.set(cb, fn);\n }\n\n offEvent(cb) {\n const fn = this.listeners.get(cb);\n if (fn) {\n this.target.removeEventListener('event', fn);\n this.listeners.delete(cb);\n }\n }\n\n removeAllListeners() {\n const { listeners, target } = this;\n listeners.forEach(fn => target.removeEventListener('event', fn));\n listeners.clear();\n }\n\n emit(data) {\n const event = new CustomEvent('event', { detail: data });\n this.target.dispatchEvent(event);\n }\n}\n\nexport default EventEmitter;\n","import EventEmitter from './eventEmitter.js';\n\nclass Transport extends EventEmitter {\n constructor(options) {\n super();\n this.connection = null;\n this.options = options;\n this.wasOpen = false;\n }\n\n connect() {\n const { options } = this;\n this.wasOpen = false;\n const connection = new WebSocket(\n `${options.endpoint}?auth_token=${options.auth_token}`\n );\n connection.onopen = () => {\n this.wasOpen = true;\n this.emit({ type: 'connected' });\n };\n connection.onmessage = ({ data }) => {\n this.emit({ type: 'message', message: data });\n };\n connection.onerror = () => {\n this.emit({ type: 'transportError' });\n };\n connection.onclose = () => {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event\n this.destroy();\n };\n this.connection = connection;\n }\n\n isConnected() {\n const { connection } = this;\n if (connection) {\n return connection.readyState === WebSocket.OPEN;\n }\n return false;\n }\n\n send(message) {\n const { connection } = this;\n if (!connection) {\n return false;\n }\n connection.send(message);\n return true;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { connection, wasOpen } = this;\n if (connection) {\n this.connection = null;\n connection.onopen = null;\n connection.onmessage = null;\n connection.onerror = null;\n connection.onclose = null;\n if (connection.readyState <= WebSocket.OPEN) {\n connection.close();\n }\n this.emit({ type: 'disconnected', was_open: wasOpen });\n }\n this.removeAllListeners();\n }\n}\n\nexport default Transport;\n","// https://github.com/bluelovers/ws-string/blob/master/packages/crlf-normalize/src/index.ts\nconst R_CRLF = /\\r\\n|\\r(?!\\n)|\\n/g;\nconst CRLF = '\\r\\n';\nconst crlfNormalize = text => text.replace(R_CRLF, CRLF);\n\nexport default crlfNormalize;\n","// https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library\nconst parseJwtPayload = token => {\n try {\n return JSON.parse(atob(token.split('.')[1]));\n } catch (error) {\n return false;\n }\n};\n\nexport default parseJwtPayload;\n","const supportsRandomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function';\n\nconst uuid = () => {\n if (supportsRandomUUID) {\n return crypto.randomUUID();\n }\n let index = 0;\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, char => {\n const byte = bytes[index];\n index += 1;\n // eslint-disable-next-line no-bitwise\n return (char ^ (byte & (15 >> (char / 4)))).toString(16);\n });\n};\n\nexport default uuid;\n","/* eslint-disable max-lines */\nimport EventEmitter from './eventEmitter.js';\nimport Transport from './Transport.js';\nimport crlfNormalize from './crlfNormalize.js';\nimport parseJwtPayload from './parseJwtPayload.js';\nimport uuid from './uuid.js';\n\nconst checkUserAgentOptions = (options = {}) => {\n let failed = '';\n [\n 'client_id',\n 'conf_id',\n 'client_name',\n 'sessionDescriptionHandlerFactory',\n 'transportOptions'\n ].some(key => {\n if (!options[key]) {\n failed = key;\n return false;\n }\n return true;\n });\n if (!failed) {\n ['auth_token', 'endpoint'].some(key => {\n if (!options.transportOptions[key]) {\n failed = `transportOptions.${key}`;\n return false;\n }\n return true;\n });\n }\n if (failed) {\n throw new Error(`Invalid options - ${failed}`);\n }\n};\n\nconst slowdown = (fn, ms, ctx) => {\n const stack = [];\n let wait = false;\n const cb = (...args) => {\n if (wait) {\n stack.push(args);\n return;\n }\n wait = true;\n setTimeout(() => {\n wait = false;\n if (stack.length > 0) {\n const nextArgs = stack.shift();\n Reflect.apply(cb, null, nextArgs);\n }\n }, ms);\n Reflect.apply(fn, ctx, args);\n };\n return cb;\n};\n\nclass UserAgent extends EventEmitter {\n constructor(options) {\n super();\n checkUserAgentOptions(options);\n this.callId = null;\n this.sessionDescriptionHandler = null;\n this.options = options;\n this.initAuthToken();\n this.debouncedHandleSDPUpdate = slowdown(this.handleSdpUpdate, 250, this);\n }\n\n // eslint-disable-next-line max-statements\n async onMessage(message) {\n const obj = JSON.parse(message);\n const { type, data } = obj;\n this.verifySender(obj);\n if (type === 'call_accepted') {\n this.setCallId(data.call_id);\n await this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'accepted' });\n } else if (type === 'call_resumed') {\n this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'resumed' });\n } else if (type === 'call_rejected') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'reject',\n code: data.reject_code\n });\n this.terminate();\n } else if (type === 'call_terminated') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'bye',\n code: data.term_code\n });\n this.terminate();\n } else if (type === 'sdp_update') {\n this.debouncedHandleSDPUpdate(data);\n } else {\n data.type = type;\n this.emit({ type: 'message', data });\n }\n }\n\n initAuthToken() {\n const { options } = this;\n const jwt = parseJwtPayload(options.transportOptions.auth_token);\n if (\n jwt === false ||\n jwt.client_id !== options.client_id ||\n jwt.conf_id !== options.conf_id ||\n !jwt.exp\n ) {\n throw new Error('Invalid auth token');\n }\n }\n\n setCallId(callId) {\n this.callId = callId;\n }\n\n verifySender(message) {\n const { options } = this;\n if (\n !(message.from === options.conf_id && message.to === options.client_id)\n ) {\n // throw new Error('Invalid message sender');\n // eslint-disable-next-line no-console\n console.error(new Error('Invalid message sender', message));\n }\n }\n\n async handleSdpUpdate(data) {\n const { callId } = this;\n const { sdp } = data;\n if (!callId || callId !== data.call_id) {\n throw new Error('Invalid call id');\n }\n this.emit({ type: 'sdp_update', sdp });\n const answerSdp =\n await this.sessionDescriptionHandler.updateDescription(sdp);\n if (sdp.type === 'offer' && answerSdp) {\n const desc = {\n type: answerSdp.type,\n sdp: crlfNormalize(answerSdp.sdp)\n };\n this.message('sdp_update', {\n call_id: callId,\n sdp: desc\n });\n }\n }\n\n message(type = 'message', data = {}) {\n const { options } = this;\n const message = JSON.stringify({\n type,\n msg_id: uuid(),\n from: options.client_id,\n to: options.conf_id,\n data\n });\n this.transport.send(message);\n }\n\n connect() {\n const { options } = this;\n const transport = new Transport(options.transportOptions);\n this.transport = transport;\n this.termination = false;\n this.emit({ type: 'transportCreated', transport });\n transport.onEvent(event => {\n const { type } = event;\n if (type === 'connected') {\n if (!this.sessionDescriptionHandler) {\n this.sessionDescriptionHandler =\n options.sessionDescriptionHandlerFactory(\n options.sessionDescriptionHandlerFactoryOptions\n );\n this.emit({ type: 'registered' });\n }\n } else if (type === 'message') {\n this.onMessage(event.message);\n } else if (type === 'disconnected') {\n if (!this.termination) {\n this.emit({\n type: 'terminated',\n reason: 'disconnect',\n code: event.was_open ? 0 : -1\n });\n }\n }\n });\n transport.connect();\n }\n\n // eslint-disable-next-line max-statements\n async call() {\n const { sessionDescriptionHandler, options } = this;\n if (!sessionDescriptionHandler) {\n throw new Error('Invalid sessionDescriptionHandler');\n }\n const description = await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_start', {\n sdp: desc,\n display_name: options.client_name,\n mute_video: options.mute_video\n });\n }\n\n resume(authToken) {\n if (!this.callId) {\n throw new Error('Session was already closed');\n }\n this.options.transportOptions.auth_token = authToken;\n try {\n this.initAuthToken();\n } catch (error) {\n this.emit({ type: 'terminated', reason: 'disconnect', code: -1 });\n return;\n }\n const onReconnect = seppEvent => {\n if (seppEvent.type === 'transportCreated') {\n this.offEvent(onReconnect);\n // eslint-disable-next-line max-statements\n this.transport.onEvent(async transportEvent => {\n if (transportEvent.type === 'connected') {\n const { transport, sessionDescriptionHandler } = this;\n if (!this.callId) {\n transport.destroy();\n throw new Error('Session was already closed');\n }\n try {\n const description =\n await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_resume', {\n call_id: this.callId,\n sdp: desc\n });\n } catch (error) {\n transport.destroy();\n throw new Error('Unable to reconnect');\n }\n }\n });\n }\n };\n this.onEvent(onReconnect);\n this.connect();\n }\n\n // eslint-disable-next-line max-statements\n terminate() {\n const { sessionDescriptionHandler, transport, callId } = this;\n this.callId = null;\n if (sessionDescriptionHandler) {\n sessionDescriptionHandler.close();\n }\n if (transport) {\n if (transport.isConnected() && callId) {\n this.termination = true;\n this.message('call_terminate', {\n call_id: callId,\n term_code: 0\n });\n this.emit({ type: 'terminated', reason: 'terminate', code: 0 });\n }\n this.transport = null;\n transport.destroy();\n }\n }\n}\n\nexport default { UserAgent };\n","/**\n * This is where we keep the list of sip events we're interested in forwarding.\n **/\nexport default [\n 'chat',\n 'recording',\n 'memberlist',\n 'source_update',\n 'voice_activity'\n];\n","/**\n * Podium Facade.\n **/\nclass PodiumFacade {\n constructor(message, clientId) {\n const { src = [], psrc, asrc, vsrc, dsrc, dims } = message;\n this.clientId = clientId;\n this.sources = src;\n this.presenterIdx = psrc;\n this.audioSources = asrc;\n this.videoSources = vsrc;\n this.desktopSources = dsrc;\n this.dimensions = dims;\n this.userSourceIndex = src.indexOf(clientId);\n }\n\n get isSolo() {\n const uniqueSources = Array.from(new Set(this.sources));\n return uniqueSources.length === 1 && this.sources[0] === this.clientId;\n }\n\n get isSource() {\n return this.sources.includes(this.clientId);\n }\n\n get isPresenter() {\n return this.hasPresenter && this.presenter === this.clientId;\n }\n\n get presenter() {\n return this.hasPresenter && this.sources[this.presenterIdx];\n }\n\n get hasMedia() {\n return this.sources.some(source => /media/.test(source));\n }\n\n get hasPresenter() {\n return Number.isInteger(this.presenterIdx) && this.presenterIdx > -1;\n }\n\n get hasVideoSources() {\n return Boolean(this.videoSources);\n }\n\n get hasDesktopSources() {\n return Number.isInteger(this.desktopSources) && this.desktopSources > -1;\n }\n\n get hasAudioPosition() {\n return this.audioSources.includes(this.userSourceIndex);\n }\n\n get hasVideoPosition() {\n return this.videoSources.includes(this.userSourceIndex);\n }\n\n get hasMutedVideoPeers() {\n return (\n !this.hasDesktopSources &&\n this.videoSources.filter(source => source !== this.userSourceIndex)\n .length === 0\n );\n }\n\n get userDimensions() {\n const userVideoIndex = this.videoSources.indexOf(this.userSourceIndex);\n if (userVideoIndex > -1) {\n return this.dimensions[userVideoIndex];\n }\n return null;\n }\n}\n\nexport default PodiumFacade;\n","import Logger from './Logger.js';\nimport PodiumFacade from './PodiumFacade.js';\n\n/**\n * SipMessageTransformer\n **/\nclass SigMessageTransformer {\n constructor(clientId) {\n this.clientId = clientId;\n this.stamp = this.stamp.bind(this);\n this.default = this.default.bind(this);\n this.process = this.process.bind(this);\n this.sourceUpdate = this.sourceUpdate.bind(this);\n this.voiceActivity = this.voiceActivity.bind(this);\n }\n\n /**\n * Put a stamp with _src on the message.\n **/\n stamp(message) {\n return Object.assign({ _src: 'sig' }, message);\n }\n\n process(message) {\n /* eslint-disable camelcase */\n const transformation =\n {\n source_update: this.sourceUpdate,\n voice_activity: this.voiceActivity\n }[message.type] || this.default;\n /* eslint-enable camelcase */\n\n return transformation(this.stamp(message));\n }\n\n default(message) {\n Logger.debug('SipMessageTransformer::default', message);\n return message;\n }\n\n sourceUpdate(message) {\n Logger.debug('SipMessageTransformer::sourceUpdate', message);\n\n const podium = new PodiumFacade(message, this.clientId);\n\n const transformed = {\n type: 'podium',\n solo: podium.isSolo,\n audio: podium.hasAudioPosition,\n video: podium.hasVideoPosition,\n media: podium.hasMedia,\n sources: podium.sources,\n isSource: podium.isSource,\n presenter: podium.presenter,\n isPresenter: podium.isPresenter,\n hasPresenter: podium.hasPresenter,\n videoSources: podium.videoSources,\n userDimensions: podium.userDimensions,\n hasVideoSources: podium.hasVideoSources,\n hasDesktopSources: podium.hasDesktopSources,\n hasMutedVideoPeers: podium.hasMutedVideoPeers\n };\n\n return transformed;\n }\n\n voiceActivity(message) {\n Logger.debug('SipMessageTransformer::voiceActivity', message);\n\n // we rename the type here so we can use 'voice_activity' for passing to the\n // ui\n const transformed = Object.assign({\n type: 'voice_activity_raw',\n on: message.on,\n userId: message.cid\n });\n\n return transformed;\n }\n}\n\nexport default SigMessageTransformer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport 'webrtc-adapter';\nimport {\n stopTrack,\n getCanvasTracks,\n isCanvasPresentationStream\n} from './utils/StreamHelpers.js';\n\nconst _iceCheckingTimeout = 3000;\n\n/**\n * SessionDescriptionHandler\n */\nclass SessionDescriptionHandler {\n // eslint-disable-next-line max-statements\n constructor(options) {\n this.datachannel = null;\n this.peerConnection = null;\n this.localStream = null;\n this.remoteStream = null;\n this.connected = false;\n this.iceCheckingTimer = null;\n this.peerConnectionReady = null;\n this.options = options || {};\n this.connection = options.connection;\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.initPeerConnection();\n }\n\n /**\n * Gets the local description from the underlying media implementation\n */\n // eslint-disable-next-line max-statements\n async getDescription() {\n const { options, peerConnection } = this;\n Logger.debug('SessionDescriptionHandler::getDescription:', options);\n this.localStream = options.stream;\n const offer = await peerConnection.createOffer(options.RTCOfferOptions);\n options.SDPModifiers.active.forEach(modifier => {\n offer.sdp = modifier(offer.sdp);\n });\n await peerConnection.setLocalDescription(offer);\n await this.peerConnectionReady;\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug('SessionDescriptionHandler::getDescription offer', sdp);\n return { type: 'offer', sdp };\n }\n\n /**\n * Set the remote description to the underlying media implementation\n */\n async setDescription(sessionDescription) {\n const { datachannel } = this;\n Logger.debug(\n 'SessionDescriptionHandler::setDescription:',\n sessionDescription\n );\n if (sessionDescription && sessionDescription.sdp) {\n this.connection.seppMessaging = sessionDescription.sdp.includes(\n 'a=eyeson-sepp-messaging'\n );\n }\n await this.peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n if (datachannel.readyState === 'connecting') {\n await new Promise(resolve => {\n datachannel.onopen = () => {\n datachannel.onopen = null;\n resolve();\n };\n });\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateDescription(sessionDescription) {\n const { options, peerConnection } = this;\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription:',\n sessionDescription\n );\n if (sessionDescription.type === 'offer') {\n try {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n const answer = await peerConnection.createAnswer();\n options.SDPModifiers.active.forEach(modifier => {\n answer.sdp = modifier(answer.sdp);\n });\n await peerConnection.setLocalDescription(answer);\n this.options.remoteDescriptionUpdate(sessionDescription);\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription answer',\n sdp\n );\n return { type: 'answer', sdp };\n } catch (error) {\n Logger.error('SessionDescriptionHandler::updateDescription', error);\n }\n } else if (sessionDescription.type === 'answer') {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n }\n return null;\n }\n\n close() {\n Logger.debug('SessionDescriptionHandler::close');\n clearTimeout(this.iceCheckingTimer);\n if (this.peerConnection) {\n this.stopAllTracks();\n this.peerConnection.close();\n this.peerConnection = null;\n if (\n this.datachannel &&\n ['connecting', 'open'].includes(this.datachannel.readyState)\n ) {\n this.datachannel.close();\n this.datachannel = null;\n }\n Logger.debug(\n 'SessionDescriptionHandler::close ' +\n 'Stopped streams and closed peerConnection.'\n );\n }\n }\n\n // eslint-disable-next-line max-statements\n initPeerConnection() {\n const { options } = this;\n const pcOptions = this.buildPeerConnectionOptions();\n Logger.debug(\n 'SessionDescriptionHandler::initPeerConnection with',\n pcOptions\n );\n let resolveReady = null;\n this.peerConnectionReady = new Promise(resolve => (resolveReady = resolve));\n try {\n const pc = new RTCPeerConnection(pcOptions);\n this.peerConnection = pc;\n options.stream.getTracks().forEach(track => {\n pc.addTrack(track, options.stream);\n });\n const channel = pc.createDataChannel('data', { negotiated: true, id: 0 });\n this.handleDatachannel(channel);\n pc.onicecandidate = ({ candidate }) => {\n if (!candidate) {\n resolveReady();\n return;\n }\n Logger.debug(\n 'SessionDescriptionHandler::gotIceCandidate',\n candidate.candidate\n );\n };\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n resolveReady();\n }\n };\n if (options.sendOnly === true) {\n pc.addEventListener(\n 'connectionstatechange',\n this.handleConnectionStateChange\n );\n } else {\n pc.ontrack = this.handleOntrack.bind(this);\n }\n this.iceCheckingTimer = setTimeout(\n () => resolveReady(),\n _iceCheckingTimeout\n );\n } catch (error) {\n Logger.error(\n 'SessionDescriptionHandler::initPeerConnection failed:',\n error,\n this.connection.uaOptions\n );\n }\n }\n\n /**\n * Only signal (handleAccept) that we have a remote stream once ontrack\n * says so. Is called twice, once for audio and once for video track.\n */\n handleOntrack({ track, streams }) {\n const { options } = this;\n [this.remoteStream] = streams;\n Logger.debug('SessionDescriptionHandler::handleOntrack:', track.kind);\n track.onunmute = () => options.handleUnmute(track);\n options.handleAccept(this.remoteStream);\n }\n\n handleConnectionStateChange() {\n if (\n this.peerConnection.connectionState === 'connected' &&\n !this.connected\n ) {\n this.connected = true;\n this.options.handleAccept();\n }\n }\n\n handleDatachannel(channel) {\n this.datachannel = channel;\n this.connection.initDatachannel(channel);\n }\n\n /**\n * We need to re-format the iceServers here. SIP.js used to offer a\n * higher level api and we supplied the servers in a different format e.g:\n *\n * { stunServers: [\"stun:stun1.visocon.com:3478\"] }\n * { turnServers: [{ urls: [1,2,3], username: \"bob\", password: \"nob\" }] }\n *\n * We currently have the api set return the creds in that format.\n * The peerConnection however expects:\n *\n * {\n * \"iceServers\": [\n * { \"urls\": \"stun:stun1.visocon.com:3478\" },\n * { \"urls\": [1,2,3], \"username\": \"bob\", \"credential\": \"nob\" }\n * ]\n * }\n */\n buildPeerConnectionOptions() {\n const { options } = this;\n const iceServers = [{ urls: options.stun_servers }];\n options.turn_servers.forEach(turnServer => {\n turnServer.credential = turnServer.password;\n iceServers.push(turnServer);\n });\n const pcOptions = {\n sdpSemantics: 'unified-plan',\n iceServers\n };\n return pcOptions;\n }\n\n getLocalStream() {\n return this.localStream;\n }\n\n getRemoteStream() {\n return this.remoteStream;\n }\n\n setStream(newStream) {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n let oldStream = this.getLocalStream();\n this.localStream = newStream;\n\n this.stopUnusedTracks(oldStream, newStream);\n\n let [audioTrack] = newStream.getAudioTracks();\n // in case of multiple streams, the preferred video track is the\n // canvas presentation stream\n let [videoTrack] = isCanvasPresentationStream(newStream)\n ? getCanvasTracks(newStream)\n : newStream.getVideoTracks();\n\n if (!this.tracksExist()) {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n return;\n }\n const senders = this.peerConnection.getSenders();\n\n const audioSender = senders.find(\n sender => sender.track && sender.track.kind === 'audio'\n );\n const videoSender = senders.find(\n sender => sender.track && sender.track.kind === 'video'\n );\n Promise.all([\n audioSender ? audioSender.replaceTrack(audioTrack) : null,\n videoSender ? videoSender.replaceTrack(videoTrack) : null\n ])\n .then(() => {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n })\n .catch(reject);\n });\n }\n\n stopUnusedTracks(oldStream, newStream) {\n if (this.connection.hasExternalStream) {\n return;\n }\n const unusedTracks = oldStream\n .getTracks()\n .filter(track => !newStream.getTracks().includes(track));\n unusedTracks.forEach(stopTrack);\n }\n\n tracksExist() {\n return Boolean(\n this.peerConnection.getSenders().find(sender => sender.track !== null)\n );\n }\n\n scaleResolution(factor) {\n // factor 0.5 => scaleResolutionDownBy 2\n try {\n const ratio = Math.max(1.0 / Math.max(factor, 0.1), 1.0);\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].scaleResolutionDownBy !== ratio) {\n params.encodings[0].scaleResolutionDownBy = ratio;\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::scaleResolution failed:', error);\n }\n }\n\n // eslint-disable-next-line max-statements\n limitFramerate(fps) {\n try {\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].maxFramerate !== fps) {\n if (fps) {\n params.encodings[0].maxFramerate = fps;\n } else {\n Reflect.deleteProperty(params.encodings[0], 'maxFramerate');\n }\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::limitFramerate failed:', error);\n }\n }\n\n /**\n * Stop all tracks\n */\n stopAllTracks() {\n Logger.debug('SessionDescriptionHandler::stopAllTracks');\n let receivers = this.peerConnection.getReceivers\n ? this.peerConnection.getReceivers()\n : [];\n this.peerConnection\n .getSenders()\n .concat(receivers)\n .forEach(rtp => {\n if (rtp.track) {\n stopTrack(rtp.track);\n }\n });\n }\n}\n\nexport default SessionDescriptionHandler;\n/* eslint-enable max-lines */\n","import SEPP from './sepp/SEPP.js';\nimport Logger from './Logger.js';\nimport WHITELIST from './SigMessageWhitelist.js';\nimport SigMessageTransformer from './SigMessageTransformer.js';\nimport SessionDescriptionHandler from './SessionDescriptionHandler.js';\n\nconst maxMessageSize = 32 * 1024;\n\n/**\n * eyeson Sip Connection.\n *\n * Registers with provided sip credentials and handles events received.\n **/\nclass SigConnection {\n constructor(signaling, user) {\n this.listeners = [];\n this.messageListener = [];\n this.datachannel = null;\n this.uaOptions = this.initUserAgentOptions(signaling, user);\n this.clientId = this.uaOptions.client_id;\n this.userAgent = null;\n this.transformer = new SigMessageTransformer(this.clientId);\n this.seppMessaging = false;\n }\n\n initUserAgentOptions(signaling, user) {\n if (signaling.type !== 'sepp') {\n return {\n client_id: null\n };\n }\n const signalingOptions = signaling.options;\n const uaOptions = {\n client_id: signalingOptions.client_id,\n conf_id: signalingOptions.conf_id,\n client_name: user.name,\n mute_video: false,\n sessionDescriptionHandlerFactory: options => {\n return new SessionDescriptionHandler(options);\n },\n sessionDescriptionHandlerFactoryOptions: {\n stun_servers: signalingOptions.stun_servers,\n turn_servers: signalingOptions.turn_servers\n },\n transportOptions: {\n auth_token: signalingOptions.auth_token,\n endpoint: signalingOptions.endpoint\n }\n };\n return uaOptions;\n }\n\n /**\n * Connect and register to the configured WebSocket server.\n **/\n start() {\n return new Promise(resolve => {\n if (!this.uaOptions.client_id) {\n throw new TypeError('Invalid signaling data');\n }\n this.userAgent = new SEPP.UserAgent(this.uaOptions);\n resolve();\n });\n }\n\n /**\n * Start a session on current connection.\n **/\n startSession(options) {\n Object.assign(\n this.uaOptions.sessionDescriptionHandlerFactoryOptions,\n options\n );\n if (options.mediaOptions) {\n this.uaOptions.mute_video = !options.mediaOptions.video;\n }\n this.userAgent.onEvent(({ type, data }) => {\n if (type === 'registered') {\n // eslint-disable-next-line prefer-reflect\n this.userAgent.call();\n } else if (type === 'message') {\n this.handleMessage(data);\n }\n });\n this.userAgent.connect();\n return this.userAgent;\n }\n\n updateAuthAndRestartSession(roomData) {\n Logger.debug('updateAuthAndRestartSession', roomData);\n if (!roomData.error) {\n this.uaOptions.transportOptions.auth_token =\n roomData.signaling.options.auth_token;\n }\n this.userAgent.connect();\n }\n\n updateAuthAndResume(roomData) {\n Logger.debug('updateAuthAndResume', roomData);\n if (!this.userAgent) {\n Logger.warn('updateAuthAndResume', 'userAgent already gone');\n return;\n }\n if (roomData.error) {\n this.userAgent.resume(null);\n return;\n }\n this.userAgent.resume(roomData.signaling.options.auth_token);\n }\n\n initDatachannel(channel) {\n this.datachannel = channel;\n Logger.debug('SigConnection::initDatachannel', channel);\n channel.onmessage = event => {\n if (event.data === '{\"type\":\"ping\"}' && channel.readyState === 'open') {\n channel.send('{\"type\":\"pong\"}');\n return;\n }\n Logger.debug('SigConnection::dataChannelMessage', event.data);\n const message = JSON.parse(event.data);\n if (message.type === 'ack') {\n return;\n }\n this.handleMessage(message);\n };\n }\n\n /**\n * Stop listening for messages.\n **/\n // eslint-disable-next-line max-statements\n close() {\n const { datachannel, userAgent } = this;\n this.datachannel = null;\n this.userAgent = null;\n if (datachannel && datachannel.readyState === 'open') {\n datachannel.close();\n }\n if (userAgent) {\n userAgent.removeAllListeners();\n userAgent.terminate();\n }\n }\n\n /**\n * Parse, filter, transform and finally forward messages received from SIP\n * connection.\n **/\n onMessage(callback) {\n this.messageListener.push(callback);\n }\n\n handleMessage(message) {\n if (!WHITELIST.includes(message.type)) {\n Logger.debug(\n `SigConnection::handleMessage ignoring \"${message.type}\" message.`\n );\n return;\n }\n const transformedMessage = this.transformer.process(message);\n this.messageListener.forEach(cb => cb(transformedMessage));\n }\n\n /**\n * Transport a message over current connection.\n **/\n // eslint-disable-next-line max-statements\n send(msg) {\n if (this.seppMessaging) {\n this.sendSeppMessage(msg);\n return;\n }\n const { datachannel } = this;\n msg.cid = this.uaOptions.client_id;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (\n datachannel &&\n datachannel.readyState === 'open' &&\n data.length < maxMessageSize\n ) {\n Logger.debug('SigConnection::send datachannel', data);\n datachannel.send(data);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n\n // eslint-disable-next-line max-statements\n sendSeppMessage(msg) {\n const { userAgent } = this;\n if (userAgent && userAgent.callId) {\n msg.cid = this.uaOptions.client_id;\n msg.call_id = userAgent.callId;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (data.length < maxMessageSize) {\n Logger.debug('SigConnection::send sepp', msg);\n userAgent.message(msg.type, msg);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n }\n\n onError(errorHandler) {\n this.listeners.push(errorHandler);\n return this;\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n}\n\nexport default SigConnection;\n","import eyesonOptions from '../options.js';\nimport Logger from '../Logger.js';\nimport PublicEvent from './PublicEvent.js';\nimport SigConnection from '../SigConnection.js';\n\nconst startSigConnection = (context, signaling, user) => {\n context.connection = new SigConnection(signaling, user);\n context._connection\n .onError(msg => context.send(msg))\n .start()\n .then(() => context.send({ type: 'connection', connectionStatus: 'ready' }))\n .catch(() =>\n context.send({ type: 'connection', connectionStatus: 'transport_error' })\n );\n};\n\nclass RoomReceived extends PublicEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n super.handle(msg);\n this.context.rtData = msg.content;\n\n if (msg.content.ready !== true) {\n Logger.debug('RoomReceived not ready:', msg.content);\n return;\n }\n\n const { user, room, signaling, links, options } = msg.content;\n\n // Update eyeson's public data\n this.context._eyeson.room = room;\n this.context._eyeson.user = this.context._api.addUserAttributes(\n user,\n user.id,\n signaling.options.client_id\n );\n this.context._eyeson.links = links;\n eyesonOptions.widescreen = Boolean(options.widescreen);\n\n if (this.context._connection) {\n Logger.debug('RoomReceived double room_ready');\n return;\n }\n startSigConnection(this.context, signaling, user);\n }\n}\n\nexport default RoomReceived;\n","import PublicEvent from './PublicEvent.js';\n\nclass FetchRoomEvent extends PublicEvent {\n handle() {\n this.context._api.getRoom(room => {\n return super.handle({ type: 'fetch_room', room });\n });\n }\n}\n\nexport default FetchRoomEvent;\n","import BaseEvent from './BaseEvent.js';\n\n/**\n * Deletes a file using the com api.\n **/\nclass DeleteFileEvent extends BaseEvent {\n handle(msg) {\n this.context._api.deleteFile(msg.file);\n }\n}\n\nexport default DeleteFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\n/**\n * Uploads a file using the com api.\n **/\n\nclass UploadFileEvent extends PublicEvent {\n handle(msg) {\n this.context._api.uploadFile(msg.file, this.addFile.bind(this));\n }\n\n addFile(response) {\n super.handle({\n type: 'add_file',\n file: response\n });\n }\n}\n\nexport default UploadFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass ReceiveChatEvent extends PublicEvent {\n handle(msg) {\n // remove domain part to support legacy SIP user\n const userId = msg.cid.split('@').shift();\n\n this.msg = msg;\n this.context._api.getUser(userId, this.forwardMessage.bind(this));\n }\n\n forwardMessage(user) {\n const timestamp = Date.parse(this.msg.ts || this.msg.created_at);\n super.handle({\n type: this.msg.type,\n user: user,\n timestamp: new Date(timestamp),\n content: this.msg.content\n });\n }\n}\n\nexport default ReceiveChatEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport DeviceManager from '../DeviceManager.js';\nimport MicMixer from '../MicMixer.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport { getScreenAsVideoTracks, stopStream } from '../utils/StreamHelpers.js';\n\nclass StartStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({\n audio = true,\n video = true,\n virtualBackground = false,\n screen = false,\n surface = null\n }) {\n Logger.debug(\n `StartStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.options.virtualBackground = virtualBackground;\n if (_session.vbgMixer) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n _session.vbgMixer.changeBackground(type);\n }\n if (\n _session.localStream &&\n !FeatureDetector.canMultipleDifferentMicrophones()\n ) {\n stopStream(_session.localStream);\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n return new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(() => _session.send({ type: 'mute_video', on: !(video || screen) }))\n .then(() => {\n if (_session.externalStream) {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n }\n })\n .catch(error => {\n Logger.error('StartStreamEvent', error);\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n });\n }\n}\n\nexport default StartStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport {\n toggleAudio,\n toggleVideo,\n toggleCamera,\n toggleVbgTrack,\n isNinjaStreamTrack,\n isScreenAsVideoTrack,\n getScreenAsVideoTracks,\n isCanvasPresentationStream\n} from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ChangeStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio = true, video = true, screen = false, surface }) {\n Logger.debug(\n `ChangeStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n const changeStream = () => {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n if (\n FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !screen\n ) {\n const [videoTrack] = _session.localStream.getVideoTracks();\n const [audioTrack] = _session.localStream.getAudioTracks();\n if (\n !(video && isNinjaStreamTrack(videoTrack)) &&\n videoTrack.readyState !== 'ended' &&\n audioTrack.readyState !== 'ended' &&\n !isScreenAsVideoTrack(videoTrack)\n ) {\n if (_session.vbgMixer && _session.vbgMixer.originalStream) {\n _session.vbgMixer[video ? 'start' : 'stop']();\n toggleVbgTrack(_session.localStream, video);\n toggleCamera(_session.vbgMixer.originalStream, video);\n } else {\n toggleCamera(_session.localStream, video);\n }\n toggleAudio(_session.localStream, audio);\n resolve(_session.localStream);\n return;\n }\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: _session.localStream,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.screen = true;\n options.video = false;\n options.surface = surface;\n options.virtualBackground = false;\n options.vbgMixer = null;\n options.micMixer = _session.micMixer;\n }\n new MediaStreamBuilder(options)\n .onBrokenTrackError(() => {\n _session.emit({ type: 'broken_track_error' });\n })\n .start()\n .then(resolve)\n .catch(reject);\n });\n };\n\n if (_session.externalStream) {\n toggleAudio(_session.externalStream, audio);\n toggleVideo(_session.externalStream, video);\n _session.send({ type: 'mute_video', on: !video });\n return Promise.resolve();\n }\n\n return (\n changeStream()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(stream => {\n if (isCanvasPresentationStream(stream)) {\n _session.canvasMixer.setStream(stream);\n } else {\n _session.send({ type: 'mute_video', on: !(video || screen) });\n }\n })\n // eslint-disable-next-line max-statements\n .catch(err => {\n Logger.error(err);\n if (\n err instanceof Error &&\n [\n 'NotReadableError',\n 'DevicesNotFoundError',\n 'NotFoundError'\n ].includes(err.name)\n ) {\n _session.emit({ type: 'warning', name: 'error_' + err.name });\n }\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${err.name}`;\n if (err.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${err.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n })\n );\n }\n}\n\nexport default ChangeStreamEvent;\n","import Logger from '../Logger';\nimport BaseEvent from './BaseEvent';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from '../utils/StreamHelpers';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ReplaceStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const stream = createExternalStream(msg.stream);\n if (!stream) {\n Logger.error('ReplaceStreamEvent::handle invalid stream', msg.stream);\n return Promise.reject(new TypeError('Invalid stream'));\n }\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n\n _session.options.audio = hasAudio(stream);\n _session.options.video = hasVideo(stream);\n\n return _session\n .setStream(stream)\n .then(() => {\n _session.externalStream = stream;\n _connection.hasExternalStream = true;\n _session.send({ type: 'mute_video', on: !hasVideo(stream) });\n })\n .catch(err => {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n Logger.error(err);\n });\n }\n}\n\nexport default ReplaceStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\n\nclass ToggleCameraEvent extends BaseEvent {\n handle({ facingMode }) {\n Logger.debug('ToggleCameraEvent::handle', facingMode);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: { facingMode: facingMode },\n existingStream: _session.localStream,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(_session.setStream)\n .catch(Logger.error);\n }\n}\n\nexport default ToggleCameraEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass AcceptSessionEvent extends PublicEvent {\n handle(msg) {\n const {\n type,\n session: { sessionDescriptionHandler }\n } = msg;\n const localStream = sessionDescriptionHandler.getLocalStream();\n const remoteStream = sessionDescriptionHandler.getRemoteStream();\n super.handle({\n type,\n localStream,\n remoteStream\n });\n }\n}\n\nexport default AcceptSessionEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopRecordingEvent extends PublicEvent {\n handle(msg) {\n this.context._api.stopRecording(msg);\n }\n}\n\nexport default StopRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * VoiceActivityEvent\n **/\nclass VoiceActivityEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise(resolve => {\n this.context._api.getUser(id, resolve);\n });\n }\n\n handle(msg) {\n this.getUser(msg.userId).then(\n user => {\n this.context.send({ type: 'voice_activity', user: user, on: msg.on });\n },\n error => {\n Logger.error('VoiceActivityEvent::handle', error);\n }\n );\n }\n}\n\nexport default VoiceActivityEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartRecordingEvent extends PublicEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n\n _api\n .startRecording(msg)\n .catch(error => _session.emit({ type: 'recording_error', error: error }));\n }\n}\n\nexport default StartRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport { getScreenPresentationTracks } from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\nconst detectDisplaySurface = screenTrack => {\n if (screenTrack && typeof screenTrack.getSettings === 'function') {\n const settings = screenTrack.getSettings();\n if (\n Reflect.apply(Object.prototype.hasOwnProperty, settings, [\n 'displaySurface'\n ])\n ) {\n return settings.displaySurface;\n }\n }\n return '';\n};\n\nclass ScreenCaptureEvent extends BaseEvent {\n handle({ audio, screen = false, screenStream, surface }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n }\n _session.micMixer = new MicMixer();\n\n const onError = error => {\n Logger.error('ScreenCaptureEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'capture_error', name });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: false,\n screen: screen,\n surface: surface,\n screenStream: screenStream,\n existingStream: _session.localStream,\n micMixer: _session.micMixer,\n isPresentation: true,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n let present = 'screen';\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n });\n const displaySurface = detectDisplaySurface(screenTrack);\n if (displaySurface) {\n present = `screen-${displaySurface}`;\n }\n }\n _session.emit({ type: 'start_presenting', stream, present });\n })\n .catch(onError);\n }\n}\n\nexport default ScreenCaptureEvent;\n","import Logger from '../Logger.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport BaseEvent from './BaseEvent.js';\n\nclass StartPresentingEvent extends BaseEvent {\n streamVideo() {\n const { _session } = this.context;\n\n const onError = error => {\n Logger.error('StartPresentingEvent', error);\n if (!error.name.match(/notallowed|permission/i)) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(userMediaStream => {\n const stream = _session.videoPlayer.invokeStream(userMediaStream);\n return this.handle({ stream });\n })\n .catch(onError);\n }\n\n // eslint-disable-next-line max-statements\n async handle({ stream = null, present = '' }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n if (_session.videoPlayer && !_session.videoPlayer.isStreaming()) {\n this.streamVideo();\n } else {\n let presentationStream = stream || _session.localStream;\n if (_session.canvasMixer && _session.canvasMixer.stream) {\n // eslint-disable-next-line prefer-destructuring\n presentationStream = _session.canvasMixer.stream;\n }\n await _session.setStream(presentationStream);\n _session.send({ type: 'set_presenter', on: true });\n _session.send({ type: 'desktopstreaming', on: true });\n _session.emit({ type: 'presentation_started', present });\n }\n }\n}\n\nexport default StartPresentingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StopPresentingEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.canvasMixer) {\n if (_session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.stopOriginalStream();\n _session.canvasMixer.vbgMixer.terminate();\n _session.canvasMixer.vbgMixer = null;\n }\n _session.canvasMixer.stop();\n _session.canvasMixer = null;\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.videoPlayer) {\n _session.videoPlayer.destroy();\n _session.videoPlayer = null;\n }\n _session.send({ type: 'desktopstreaming', on: false });\n _session.send({ type: 'set_presenter', on: false });\n _session.emit({ type: 'presentation_ended' });\n _session.stopPresentingSet = true;\n }\n}\n\nexport default StopPresentingEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopBroadcastsEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopAllBroadcasts()\n .then(() => super.handle({ type: msg.type }));\n }\n}\n\nexport default StopBroadcastsEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ClearFrontLayerEvent extends BaseEvent {\n handle() {\n this.context._api.clearFrontLayer();\n }\n}\n\nexport default ClearFrontLayerEvent;\n","import ComApi from '../ComApi.js';\nimport PublicEvent from './PublicEvent.js';\n\n/**\n * Request a user from guest token.\n * use same error if meeting is locked due to backwards compatibility for mobile apps\n * error 423 Locked = meeting locked\n **/\nclass RequestGuestUserEvent extends PublicEvent {\n handle(msg) {\n return new ComApi(msg.api, msg.token).requestUser(\n { name: msg.name, email: msg.email, locale: msg.locale },\n response => {\n if (!response.access_key) {\n let isLocked = response.locked;\n if (response.error && response.error.message === 'ComApiError: 423') {\n isLocked = true;\n }\n super.handle({\n type: 'error',\n content: 'Request guest user failed',\n locked: isLocked\n });\n return;\n }\n super.handle({ type: 'guest_user', token: response.access_key });\n }\n );\n }\n}\n\nexport default RequestGuestUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SessionTerminationEvent extends BaseEvent {\n handle() {\n this.context._eyeson.destroy();\n }\n}\n\nexport default SessionTerminationEvent;\n","import Logger from './../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * We handle participants list update is separated in two actions: one to\n * add, one to remove. In order to keep it easy to handle, the user data is\n * fetched from api (or later received via websocket). Not to mess with\n * comApi current handling, we keep it here for a while.\n **/\nclass ParticipantListUpdateEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise((resolve, reject) => {\n if (!this.context._api) {\n reject(new Error('missing ComAPI'));\n return;\n }\n try {\n this.context._api.getUser(id, resolve);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n handle(msg) {\n (msg.add || []).forEach((user, idx, add) => {\n const id = user.cid;\n const { clientId } = this.context._connection;\n\n const initial = Boolean(add.find(addition => addition.cid === clientId));\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({\n type: 'add_user',\n user: apiUser,\n initial: initial\n });\n })\n .catch(error => Logger.error(error));\n });\n (msg.del || []).forEach(user => {\n const id = user;\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({ type: 'remove_user', userId: id, user: apiUser });\n })\n .catch(error => Logger.error(error));\n });\n this.context.send({ type: 'playback_update', playing: msg.media || [] });\n }\n}\n\nexport default ParticipantListUpdateEvent;\n","const toFixedNumber = number => Number(parseFloat(number).toFixed(2));\n\nconst scale = (width, height, max) => {\n const ratio = Math.min(max.width / width, max.height / height);\n const xScaled = toFixedNumber(width * ratio);\n const yScaled = toFixedNumber(height * ratio);\n\n return { width: xScaled, height: yScaled };\n};\n\nexport default scale;\n","/* eslint-disable */\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @see https://davidwalsh.name/javascript-debounce-function\n **/\nexport default (func, wait, immediate) => {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n};\n/* eslint-enable */\n","/* eslint-disable max-lines */\nimport scale from './utils/scale.js';\nimport Logger from './Logger.js';\nimport debounce from './utils/debounce.js';\n\nimport {\n isVBGStream,\n getVbgTracks,\n getScreenPresentationTracks,\n getCameraTracks,\n getCanvasTracks,\n stopStream\n} from './utils/StreamHelpers';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst FPS = 15;\nconst FPS_INTERVAL = 1000 / FPS;\nconst CAMERA_SMALL = { width: 220, height: 140 };\nconst CAMERA_MEDIUM = { width: 320, height: 240 };\nconst CAMERA_LARGE = { width: 420, height: 340 };\nconst CAMERA_NONE = { width: 0, height: 0 };\n\nconst supportsTrackProcessor =\n typeof window.MediaStreamTrackProcessor === 'function';\n\nconst defaultTrack = {\n getSettings: () => ({ width: 0, height: 0 }),\n addEventListener: () => null\n};\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\n// Note:\n// autoplay elements will stop playing in safari if not in viewport:\n// https://webkit.org/blog/6784/new-video-policies-for-ios/\n// that's the reason why we don't set autoplay\n// video.setAttribute('autoplay', '1');\n// but instead `.play` manually.\n// eslint-disable-next-line max-statements\nconst bindVideoToStream = stream => {\n const [track] = stream.getVideoTracks();\n if (!track) {\n return null;\n }\n if (supportsTrackProcessor) {\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n return processor.readable.getReader();\n }\n const { width, height } = track.getSettings();\n const video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = stream;\n track.addEventListener('stopped', () => {\n video.srcObject = null;\n });\n video\n .play()\n .catch(error =>\n Logger.warn('bindVideoToStream: play', error, error.message)\n );\n return video;\n};\n\n/* eslint-disable max-statements, id-length */\nconst fitImage = (target, source) => {\n const sourceAspectRatio = source.width / source.height;\n const targetAspectRatio = target.width / target.height;\n\n let { width, height } = target;\n let x = 0;\n let y = 0;\n\n // Image's aspect ratio is less than target's we fit on height\n // and place the image centrally along width\n if (sourceAspectRatio < targetAspectRatio) {\n width = source.width * (height / source.height);\n x = (target.width - width) / 2;\n }\n // Image's aspect ratio is greater than target's we fit on width\n // and place the image centrally along height\n if (sourceAspectRatio > targetAspectRatio) {\n height = source.height * (width / source.width);\n y = (target.height - height) / 2;\n }\n\n return { x: x, y: y, width: width, height: height };\n};\n/* eslint-enable max-statements */\n\nconst initIOSSettings = mixer => {\n // neccessary to run calcSizesAndPositions and draw functions\n // without camera\n mixer.cameraStream = { getVideoTracks: () => [] };\n mixer.screenStream = { getVideoTracks: () => [] };\n};\n\nconst getCanvasCaptureTrackCanvas = stream => {\n if (stream && stream.getVideoTracks().length > 0) {\n const [track] = stream.getVideoTracks();\n if ('canvas' in track) {\n return track.canvas;\n }\n }\n return null;\n};\n\nclass CanvasMixer {\n /* eslint-disable max-statements */\n constructor(canvas, stream) {\n this.canvas = canvas;\n this.stream = stream;\n this.camera = null;\n this.screen = null;\n this.canvasTrack = null;\n this.context = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true\n });\n this.xPos = 0;\n this.camSize = CAMERA_MEDIUM;\n this.isCanvasCapture = false;\n\n this.draw = this.draw.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onError = this.onError.bind(this);\n this.onRedraw = this.onRedraw.bind(this);\n this.setStream = this.setStream.bind(this);\n this.setCamera = this.setCamera.bind(this);\n this.drawFrame = this.drawFrame.bind(this);\n this.calcSizesAndPositions = this.calcSizesAndPositions.bind(this);\n\n this.bouncedDraw = debounce(this.draw, FPS_INTERVAL);\n }\n /* eslint-enable max-statements */\n\n onError(errorCallback) {\n this.errorCallback = errorCallback;\n }\n\n onRedraw(redrawCallback) {\n this.redrawCallback = redrawCallback;\n }\n\n // eslint-disable-next-line max-statements\n start() {\n const [canvasTrack] = getCanvasTracks(this.stream);\n this.canvasTrack = canvasTrack;\n if (isIOSDevice) {\n initIOSSettings(this);\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'none');\n } else {\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'medium');\n this.setStream(this.stream);\n }\n this.draw();\n }\n\n stop() {\n if (this.stream) {\n stopStream(this.stream);\n this.stream = null;\n this.camera = null;\n this.screen = null;\n this.screenStream = null;\n this.cameraStream = null;\n this.canvasTrack = null;\n }\n }\n\n // eslint-disable-next-line max-statements\n setStream(newStream) {\n this.stream = newStream;\n this.cameraStream = new MediaStream(\n isVBGStream(newStream)\n ? getVbgTracks(newStream)\n : getCameraTracks(newStream)\n );\n this.screenStream = new MediaStream(\n getScreenPresentationTracks(this.stream)\n );\n const originalCanvas = getCanvasCaptureTrackCanvas(this.cameraStream);\n if (originalCanvas) {\n this.isCanvasCapture = true;\n this.camera = originalCanvas;\n } else {\n this.isCanvasCapture = false;\n this.camera = bindVideoToStream(this.cameraStream);\n }\n this.screen = bindVideoToStream(this.screenStream);\n this.calcSizesAndPositions();\n this.redrawQueued = true;\n }\n\n setCamera(position, size) {\n this.cameraPosition = position || this.cameraPosition;\n this.cameraSizeInWords = size || this.cameraSizeInWords;\n this.redrawQueued = true;\n }\n\n calcSizesAndPositions() {\n // Fetch the latest settings (width and height) from the track directly,\n // otherwise resized windows won't be positioned/scaled correctly...\n const [screenTrack = defaultTrack] = this.screenStream.getVideoTracks();\n const screenStreamSettings = screenTrack.getSettings();\n const fitScreen = fitImage(this.canvas, screenStreamSettings);\n const [cameraTrack = defaultTrack] = this.cameraStream.getVideoTracks();\n const cameraTrackSettings = cameraTrack.getSettings();\n\n this.camSize = {\n small: CAMERA_SMALL,\n medium: CAMERA_MEDIUM,\n large: CAMERA_LARGE,\n none: CAMERA_NONE\n }[this.cameraSizeInWords];\n\n const scaledCam = scale(\n cameraTrackSettings.width,\n cameraTrackSettings.height,\n this.camSize\n );\n\n this.sizes = {\n screen: { width: fitScreen.width, height: fitScreen.height },\n camera: { width: scaledCam.width, height: scaledCam.height }\n };\n /* eslint-disable id-length, camelcase */\n const camPosition = {\n x:\n this.cameraPosition.horizontal === 'right'\n ? this.canvas.width - this.sizes.camera.width\n : 0,\n y:\n this.cameraPosition.vertical === 'bottom'\n ? this.canvas.height - this.sizes.camera.height\n : 0\n };\n this.positions = {\n screen: { x: fitScreen.x, y: fitScreen.y },\n camera: { x: camPosition.x, y: camPosition.y }\n };\n /* eslint-enable id-length */\n }\n\n /* eslint-disable max-statements */\n async draw() {\n try {\n if (!this.stream || !this.stream.active) {\n return;\n }\n\n // Doing this on every draw due to resizeable windows while screensharing\n this.calcSizesAndPositions();\n\n // In case we need to report back a redraw - doc/image can re-render\n if (this.redrawCallback && this.redrawQueued) {\n this.redrawCallback();\n this.redrawQueued = false;\n }\n\n // Actual drawing code\n const t0 = performance.now();\n if (this.screen) {\n let screenFrame = this.screen;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.screen instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.screen.read();\n screenFrame = result.value;\n }\n this.drawFrame(\n screenFrame,\n this.positions.screen,\n this.sizes.screen,\n false,\n true\n );\n }\n let cameraFrame = this.camera;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.camera instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.camera.read();\n cameraFrame = result.value;\n }\n this.drawFrame(\n cameraFrame,\n this.positions.camera,\n this.sizes.camera,\n this.isCanvasCapture,\n false\n );\n const t1 = performance.now();\n if (t1 - t0 >= FPS_INTERVAL) {\n Logger.warn(`Mixer::drawFrame took ${t1 - t0}ms.`);\n }\n\n // Request a frame so remote end receives updates reliably\n try {\n if (this.canvasTrack) {\n this.canvasTrack.requestFrame();\n }\n } catch (error) {\n Logger.warn(`CanvasMixer draw requestFrame error - ${error.message}`);\n }\n\n // Request another draw if the stream is still active\n this.bouncedDraw();\n } catch (error) {\n Logger.error(error);\n this.errorCallback(error);\n }\n }\n /* eslint-enable max-statements */\n\n // eslint-disable-next-line max-statements\n drawFrame(video, pos, size, isCanvasCapture, isScreenStream) {\n // Pollute the canvas even if we don't have a stream, so we force a frame\n // update.\n const { context, canvas } = this;\n if (\n !video ||\n (!isCanvasCapture &&\n video instanceof HTMLVideoElement &&\n (!video.srcObject || !video.srcObject.active))\n ) {\n const imgData = context.createImageData(1, 1);\n context.putImageData(imgData, 0, 0);\n return;\n }\n\n // Clear prev drawn frames only for screen streams, otherwise old frames\n // show up if the window is resized (smaller).\n if (isScreenStream && !isCanvasCapture) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n context.drawImage(video, pos.x, pos.y, size.width, size.height);\n if (supportsTrackProcessor && typeof video.close === 'function') {\n video.close();\n }\n }\n}\n\nexport default CanvasMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport CanvasMixer from '../CanvasMixer.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport {\n getScreenPresentationTracks,\n stopTrack\n} from '../utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from '../VirtualBackgroundMixer.js';\nimport DeviceManager from '../DeviceManager.js';\n\nclass StartMixerEvent extends BaseEvent {\n handle({\n audio,\n video,\n canvas,\n screen = false,\n surface,\n onRedraw,\n changeStream = false,\n present = 'mixer'\n }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n // if (_session.micMixer) {\n // _session.micMixer.destroy();\n // _session.micMixer = null;\n // }\n const vbgType = DeviceManager.getStoredVirtualBackgroundType();\n const vbgMixer = new VirtualBackgroundMixer('canvasmixer');\n vbgMixer.changeBackground(vbgType);\n\n const onError = error => {\n Logger.error('StartMixerEvent', error);\n if (!_session.canvasMixer && vbgMixer) {\n vbgMixer.terminate();\n }\n if (!error.name.match(/notallowed|permission/i) && screen) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n screen: screen,\n surface: surface,\n canvas: canvas,\n existingStream: _session.localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n stopTrack(screenTrack);\n });\n }\n _session.canvasMixer = new CanvasMixer(canvas, stream);\n _session.canvasMixer.vbgMixer = vbgMixer;\n _session.canvasMixer.onError(onError);\n _session.canvasMixer.onRedraw(onRedraw);\n _session.canvasMixer.start();\n return stream;\n })\n .then(stream => {\n if (changeStream) {\n _session.emit({ type: 'start_presenting', stream, present });\n } else {\n _session.emit({ type: 'stream_update', presentationStream: stream });\n }\n })\n .catch(onError);\n }\n}\n\nclass UpdateMixerEvent extends BaseEvent {\n handle({ position, size }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n _session.canvasMixer.setCamera(position, size);\n } catch (error) {\n Logger.error(error);\n }\n }\n}\n\nexport { StartMixerEvent, UpdateMixerEvent };\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\n\nconst videoFrameSupport =\n typeof HTMLVideoElement.prototype.requestVideoFrameCallback === 'function';\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass VideoPlayer {\n // eslint-disable-next-line max-statements\n constructor({\n canvas,\n file,\n onReady,\n onDuration,\n onTimeUpdate,\n onEnd,\n performAction\n }) {\n this.ac = null;\n this.acOut = null;\n this.gainNode = null;\n this.timer = null;\n this.canvas = canvas;\n this.url = URL.createObjectURL(file);\n this.ctx = canvas.getContext('2d');\n this.video = document.createElement('video');\n this.callback = { onReady, onDuration, onTimeUpdate, onEnd, performAction };\n this.errorCallback = null;\n this.boundDrawVideoFrame = this.drawVideoFrame.bind(this);\n this.boundInitCanvasStream = this.initCanvasStream.bind(this);\n this.isPlaying = false;\n this.blockTimeUpdate = false;\n this.micOnlyStream = null;\n this.userMediaStream = null;\n this.initTimeout = null;\n this.invokationTimer = null;\n this.initVideo();\n }\n\n drawVideoFrame() {\n this.ctx.drawImage(this.video, 0, 0);\n if (videoFrameSupport) {\n this.timer = this.video.requestVideoFrameCallback(\n this.boundDrawVideoFrame\n );\n } else {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n }\n\n // eslint-disable-next-line max-statements\n initVideo() {\n const { video } = this;\n video.playsInline = true;\n video.autoplay = Boolean(isIOSDevice);\n video.preload = '';\n video.onplaying = this.onVideoPlay.bind(this);\n video.onpause = this.onVideoPause.bind(this);\n video.onseeked = this.onVideoSeeked.bind(this);\n video.ontimeupdate = this.onVideoTimeUpdate.bind(this);\n video.onloadeddata = this.onVideoReady.bind(this);\n video.onerror = this.onVideoError.bind(this);\n video.onended = this.onVideoEnd.bind(this);\n this.initTimeout = setTimeout(() => this.onVideoError(), 6000);\n video.src = this.url;\n }\n\n // eslint-disable-next-line max-statements\n onVideoReady() {\n const { video, canvas } = this;\n clearTimeout(this.initTimeout);\n this.callback.onDuration(video.duration);\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n this.ac = new (window.AudioContext || window.webkitAudioContext)();\n this.gainNode = this.ac.createGain();\n this.ac.createMediaElementSource(video).connect(this.gainNode);\n this.gainNode.connect(this.ac.destination);\n if (videoFrameSupport) {\n this.timer = video.requestVideoFrameCallback(this.boundDrawVideoFrame);\n }\n this.callback.performAction(this.onVideoAction.bind(this));\n try {\n this.ctx.drawImage(video, 0, 0);\n } catch (error) {\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return;\n }\n this.callback.onReady();\n if (video.autoplay) {\n setTimeout(() => {\n video.pause();\n video.currentTime = 0;\n });\n }\n }\n\n onVideoAction(type, value) {\n if (type === 'play') {\n return this.onPlayAction();\n } else if (type === 'pause') {\n return this.onPauseAction();\n } else if (type === 'time') {\n this.onTimeAction(value);\n } else if (type === 'volume') {\n this.onVolumeAction(value);\n }\n return Promise.resolve();\n }\n\n onPlayAction() {\n const { video } = this;\n if (video.paused && !this.isPlaying) {\n return video.play().then(\n () => video.paused,\n () => video.paused\n );\n }\n return Promise.resolve(video.paused);\n }\n\n onPauseAction() {\n const { video } = this;\n if (!video.paused && this.isPlaying) {\n video.pause();\n }\n return Promise.resolve(video.paused);\n }\n\n onTimeAction(time) {\n const { video } = this;\n this.blockTimeUpdate = true;\n if (time >= video.duration) {\n video.currentTime = video.duration - 0.1;\n } else {\n video.currentTime = time;\n }\n this.blockTimeUpdate = false;\n }\n\n onVolumeAction(volume) {\n if (this.gainNode) {\n this.gainNode.gain.value = volume;\n }\n }\n\n onVideoPlay() {\n this.isPlaying = true;\n if (!videoFrameSupport) {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n }\n\n onVideoPause() {\n // also triggered on onended\n this.isPlaying = false;\n if (!videoFrameSupport && this.timer) {\n cancelAnimationFrame(this.timer);\n }\n }\n\n onVideoSeeked() {\n if (!videoFrameSupport && !this.isPlaying) {\n this.ctx.drawImage(this.video, 0, 0);\n }\n }\n\n onVideoTimeUpdate() {\n if (!this.blockTimeUpdate) {\n this.callback.onTimeUpdate(this.video.currentTime);\n }\n }\n\n onVideoError() {\n const { video } = this;\n const error =\n video && video.error ? video.error : new TypeError('VideoPlayer failed');\n Logger.error('VideoPlayer failed', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n }\n\n onVideoEnd() {\n this.callback.onEnd();\n }\n\n initCanvasStream() {\n this.ctx.drawImage(this.video, 0, 0);\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n\n // eslint-disable-next-line max-statements\n invokeStream(userMediaStream) {\n const canvasStream = this.canvas.captureStream(25);\n const [canvasStreamTrack] = canvasStream.getVideoTracks();\n // Firefox issue, track is no CanvasCaptureMediaStreamTrack\n if (!canvasStreamTrack.canvas) {\n canvasStreamTrack.type = 'canvas-track';\n canvasStreamTrack.canvas = this.canvas;\n }\n const outStream = new MediaStream([canvasStreamTrack]);\n this.acOut = this.ac.createMediaStreamDestination();\n this.gainNode.connect(this.acOut);\n this.ac.createMediaStreamSource(userMediaStream).connect(this.acOut);\n this.acOut.stream\n .getAudioTracks()\n .forEach(track => outStream.addTrack(track));\n this.userMediaStream = userMediaStream;\n this.micOnlyStream = new MediaStream(\n userMediaStream.getAudioTracks().concat(canvasStreamTrack)\n );\n if (!this.isPlaying) {\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n return outStream;\n }\n\n isStreaming() {\n return Boolean(this.micOnlyStream);\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { video } = this;\n clearTimeout(this.initTimeout);\n if (this.url) {\n URL.revokeObjectURL(this.url);\n this.url = null;\n }\n if (this.timer) {\n if (videoFrameSupport) {\n video.cancelVideoFrameCallback(this.timer);\n } else {\n cancelAnimationFrame(this.timer);\n }\n this.timer = null;\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n if (this.userMediaStream) {\n stopStream(this.userMediaStream);\n this.userMediaStream = null;\n }\n if (this.micOnlyStream) {\n stopStream(this.micOnlyStream);\n this.micOnlyStream = null;\n }\n if (this.acOut) {\n stopStream(this.acOut.stream);\n this.acOut = null;\n }\n if (this.ac) {\n this.gainNode.disconnect();\n this.ac.close().then(() => {\n this.ac = null;\n this.gainNode = null;\n });\n }\n if (video) {\n video.pause();\n video.onplaying = null;\n video.onpause = null;\n video.ontimeupdate = null;\n video.onloadeddata = null;\n video.onseeked = null;\n video.onerror = null;\n video.onended = null;\n this.video = null;\n }\n this.callback = null;\n this.errorCallback = null;\n this.ctx = null;\n this.canvas = null;\n this.boundDrawVideoFrame = null;\n }\n}\n\nexport default VideoPlayer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport VideoPlayer from '../VideoPlayer.js';\n\nclass StartMediaEvent extends BaseEvent {\n handle(message) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const onError = error => {\n Logger.error('StartMediaEvent', error);\n const name =\n error && (error instanceof MediaError || error instanceof DOMException)\n ? 'error_VideoError'\n : 'error_TypeError';\n _session.emit({ type: 'warning', name: name });\n _session.emit({ type: 'stop_presenting' });\n };\n\n try {\n _session.videoPlayer = new VideoPlayer(message);\n _session.videoPlayer.onError(onError);\n } catch (error) {\n onError(error);\n }\n }\n}\n\nexport { StartMediaEvent };\n","import BaseEvent from './BaseEvent.js';\n\nclass LockMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.lockMeeting();\n }\n}\n\nexport default LockMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass TerminateMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.terminateMeeting();\n }\n}\n\nexport default TerminateMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass KickUserEvent extends BaseEvent {\n handle(msg) {\n this.context._api.kickUser(msg.userId);\n }\n}\n\nexport default KickUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass VirtualBackgroundEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n if (msg.state === 'suspend') {\n _session.vbgMixer.suspend();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.suspend();\n }\n } else if (msg.state === 'resume') {\n _session.vbgMixer.resume();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.resume();\n }\n }\n }\n }\n}\n\nexport default VirtualBackgroundEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst destroySessionMicMixer = session => {\n if (session.micMixer) {\n session.micMixer.destroy();\n session.micMixer = null;\n }\n};\n\nconst getScreenErrorName = error => {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n return name;\n};\n\nclass ScreenVideoChangeEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n async handle({ surface }) {\n let screenStream = null;\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n const mediaStreamBuilder = new MediaStreamBuilder({ surface });\n screenStream = await mediaStreamBuilder.getDisplayMedia();\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n _session.emit({ type: 'warning', name: getScreenErrorName(error) });\n return;\n }\n destroySessionMicMixer(_session);\n _session.micMixer = new MicMixer();\n const options = {\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n screen: true,\n surface,\n micMixer: _session.micMixer,\n screenStream\n };\n try {\n const stream = await new MediaStreamBuilder(options).start();\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n _session.setStream(stream);\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n destroySessionMicMixer(_session);\n _session.emit({\n type: 'screen_capture_error',\n name: getScreenErrorName(error)\n });\n _session.emit({ type: 'screen_video_ended' });\n }\n }\n}\n\nexport default ScreenVideoChangeEvent;\n","import BaseEvent from './BaseEvent';\n\nclass ScreenVideoStoppedEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.emit({ type: 'screen_video_ended' });\n }\n}\n\nexport default ScreenVideoStoppedEvent;\n","import FeatureDetector from './FeatureDetector.js';\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass DeviceMonitor {\n constructor() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n this.audioTrack = null;\n this.videoTrack = null;\n this.audioEnded = null;\n this.videoEnded = null;\n this.boundOnAudioEnd = this.onAudioEnd.bind(this);\n this.boundOnVideoEnd = this.onVideoEnd.bind(this);\n this.listeners = [];\n }\n\n addAudioTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempAudioTrack = track;\n }\n }\n\n addVideoTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempVideoTrack = track;\n }\n }\n\n applyTempTracks() {\n this.clearTracks();\n if (this.tempAudioTrack) {\n this.audioTrack = this.tempAudioTrack;\n this.tempAudioTrack = null;\n this.audioTrack.addEventListener('ended', this.boundOnAudioEnd);\n }\n if (this.tempVideoTrack) {\n this.videoTrack = this.tempVideoTrack;\n this.tempVideoTrack = null;\n this.videoTrack.addEventListener('ended', this.boundOnVideoEnd);\n }\n }\n\n discardTempTracks() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n }\n\n onAudioEnd() {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n return;\n }\n this.audioEnded = setTimeout(() => {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n } else {\n this.emit({ type: 'audio_device_ended' });\n }\n }, 1000);\n }\n\n onVideoEnd() {\n this.videoEnded = setTimeout(() => {\n if (!this.audioEnded) {\n this.emit({ type: 'video_device_ended' });\n }\n }, 1000);\n }\n\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n clearTracks() {\n clearTimeout(this.audioEnded);\n clearTimeout(this.videoEnded);\n if (this.audioTrack) {\n this.audioTrack.removeEventListener('ended', this.boundOnAudioEnd);\n this.audioTrack = null;\n }\n if (this.videoTrack) {\n this.videoTrack.removeEventListener('ended', this.boundOnVideoEnd);\n this.videoTrack = null;\n }\n this.audioEnded = null;\n this.videoEnded = null;\n }\n\n destroy() {\n this.listeners.length = 0;\n this.discardTempTracks();\n this.clearTracks();\n }\n}\n\nexport default DeviceMonitor;\n","import FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport eyesonOptions from './options.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceManager from './DeviceManager.js';\nimport DeviceMonitor from './DeviceMonitor.js';\n\nclass PipCam {\n constructor(session) {\n this.video = null;\n this.stream = null;\n this.canvasStream = null;\n this.vbgMixer = null;\n this.deviceMonitor = null;\n this.session = session;\n this.isActive = false;\n this.startTimer = null;\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n const { session } = this;\n if (!FeatureDetector.hasPipCamSupport()) {\n session.emit({ type: 'pip_cam_warning_unsupported' });\n return;\n }\n try {\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n this.initFakeStream();\n await this.initVideoAndPip();\n await this.initCamera();\n clearTimeout(this.startTimer);\n this.isActive = true;\n session.emit({ type: 'pip_cam', active: true });\n } catch (error) {\n this.onError(error);\n }\n }\n\n onError(error) {\n const { session } = this;\n clearTimeout(this.startTimer);\n Logger.error('PipCam error', error);\n if (session) {\n session.emit({ type: 'pip_cam_error' });\n session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateCamera() {\n if (!this.isActive) {\n return;\n }\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n try {\n video.srcObject = canvasStream;\n await video.play();\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n await this.initCamera();\n clearTimeout(this.startTimer);\n } catch (error) {\n this.onError(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n initFakeStream() {\n const { widescreen } = eyesonOptions;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d', { alpha: false });\n canvas.width = 640;\n canvas.height = widescreen ? 360 : 480;\n ctx.fillStyle = '#404040';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n // https://aydos.com/svgedit/\n const path = new Path2D(\n widescreen\n ? 'M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n : 'M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n );\n ctx.fillStyle = '#212121';\n ctx.fill(path);\n this.canvasStream = canvas.captureStream();\n }\n\n async initVideoAndPip() {\n const video = document.createElement('video');\n this.video = video;\n video.muted = true;\n video.playsInline = true;\n video.onleavepictureinpicture = () => this.onExitPip();\n video.onpause = ({ target }) => this.onVideoPause(target);\n video.srcObject = this.canvasStream;\n await video.play();\n await video.requestPictureInPicture();\n }\n\n // eslint-disable-next-line max-statements\n async initCamera() {\n const { virtualBackground } = this.session.options;\n if (virtualBackground) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer('PipCam');\n this.vbgMixer.changeBackground(type);\n }\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(event => this.onDeviceEvent(event));\n\n const options = {\n audio: false,\n video: true,\n virtualBackground: virtualBackground,\n vbgMixer: this.vbgMixer,\n deviceMonitor: this.deviceMonitor\n };\n this.stream = await new MediaStreamBuilder(options).start();\n this.video.srcObject = this.stream;\n await this.video.play();\n }\n\n onExitPip() {\n if (this.session) {\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n onVideoPause(video) {\n // eslint-disable-next-line no-empty-function\n setTimeout(() => video.play().catch(() => {}));\n }\n\n onDeviceEvent({ type }) {\n if (type.endsWith('_ended')) {\n clearTimeout(this.startTimer);\n if (this.session) {\n this.session.emit({ type: 'pip_cam_warning_video_ended' });\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n }\n\n // eslint-disable-next-line max-statements\n async stop() {\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n clearTimeout(this.startTimer);\n if (video) {\n video.onpause = null;\n video.onleavepictureinpicture = null;\n if (document.pictureInPictureElement === video) {\n try {\n await document.exitPictureInPicture();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n video.srcObject = null;\n this.video = null;\n }\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n if (canvasStream) {\n stopStream(canvasStream);\n this.canvasStream = null;\n }\n if (this.isActive) {\n if (this.session) {\n this.session.emit({ type: 'pip_cam', active: false });\n }\n this.isActive = false;\n }\n }\n\n async destroy() {\n await this.stop();\n this.session = null;\n }\n}\n\nexport default PipCam;\n","import BaseEvent from './BaseEvent.js';\nimport PipCam from '../PipCam.js';\n\nclass StartPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: _session.pipCam.isActive });\n return;\n }\n _session.pipCam = new PipCam(_session);\n _session.pipCam.start();\n }\n}\n\nclass StopPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (!_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: false });\n return;\n }\n _session.pipCam.destroy();\n _session.pipCam = null;\n }\n}\n\nclass UpdatePipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.pipCam.updateCamera();\n }\n }\n}\n\nexport { StartPipCamEvent, StopPipCamEvent, UpdatePipCamEvent };\n","import PublicEvent from './PublicEvent.js';\nimport ChangeStreamEvent from './ChangeStreamEvent.js';\nimport { hasAudio, hasVideo } from '../utils/StreamHelpers.js';\nimport Logger from '../Logger.js';\nimport DeviceManager from '../DeviceManager.js';\nimport LocalStorage from '../LocalStorage.js';\nimport FeatureDetector from '../FeatureDetector.js';\n\nclass AudioDeviceEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n const video = hasVideo(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AudioDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass VideoDeviceEndEvent extends PublicEvent {\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n } catch (error) {\n Logger.error('VideoDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass AllDevicesEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AllDevicesEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nexport { AudioDeviceEndEvent, VideoDeviceEndEvent, AllDevicesEndEvent };\n","import Logger from './Logger.js';\n\nimport {\n StopPlaybackEvent,\n StartPlaybackEvent\n} from './events/PlaybackEvents.js';\n\nimport {\n StartAnnotationEvent,\n StopAnnotationEvent\n} from './events/AnnotationEvents.js';\n\nimport StfuEvent from './events/StfuEvent.js';\nimport IgnoreEvent from './events/IgnoreEvent.js';\nimport PublicEvent from './events/PublicEvent.js';\nimport PodiumEvent from './events/PodiumEvent.js';\nimport ForwardEvent from './events/ForwardEvent.js';\nimport SnapshotEvent from './events/SnapshotEvent.js';\nimport SetLayerEvent from './events/SetLayerEvent.js';\nimport SendChatEvent from './events/SendChatEvent.js';\nimport StopRtmpEvent from './events/StopRtmpEvent.js';\nimport SetLayoutEvent from './events/SetLayoutEvent.js';\nimport StartRtmpEvent from './events/StartRtmpEvent.js';\nimport RoomReceivedEvent from './events/RoomReceivedEvent.js';\nimport FetchRoomEvent from './events/FetchRoomEvent.js';\nimport DeleteFileEvent from './events/DeleteFileEvent.js';\nimport UploadFileEvent from './events/UploadFileEvent.js';\nimport ReceiveChatEvent from './events/ReceiveChatEvent.js';\nimport StartStreamEvent from './events/StartStreamEvent.js';\nimport ChangeStreamEvent from './events/ChangeStreamEvent.js';\nimport ReplaceStreamEvent from './events/ReplaceStreamEvent.js';\nimport ToggleCameraEvent from './events/ToggleCameraEvent.js';\nimport AcceptSessionEvent from './events/AcceptSessionEvent.js';\nimport StopRecordingEvent from './events/StopRecordingEvent.js';\nimport VoiceActivityEvent from './events/VoiceActivityEvent.js';\nimport StartRecordingEvent from './events/StartRecordingEvent.js';\nimport StartScreenCaptureEvent from './events/ScreenCaptureEvent.js';\nimport StartPresentingEvent from './events/StartPresentingEvent.js';\nimport StopPresentingEvent from './events/StopPresentingEvent.js';\nimport StopBroadcastsEvent from './events/StopBroadcastsEvent.js';\nimport ClearFrontLayerEvent from './events/ClearFrontLayerEvent.js';\nimport RequestGuestUserEvent from './events/RequestGuestUserEvent.js';\nimport SessionTerminationEvent from './events/SessionTerminationEvent.js';\nimport ParticipantListUpdateEvent from './events/ParticipantListUpdateEvent.js';\nimport { StartMixerEvent, UpdateMixerEvent } from './events/MixerEvents.js';\nimport { StartMediaEvent } from './events/MediaEvents.js';\nimport LockMeetingEvent from './events/LockMeetingEvent.js';\nimport TerminateMeetingEvent from './events/TerminateMeetingEvent.js';\nimport KickUserEvent from './events/KickUserEvent.js';\nimport VirtualBackgroundEvent from './events/VirtualBackgroundEvent.js';\nimport ScreenVideoChangeEvent from './events/ScreenVideoChangeEvent.js';\nimport ScreenVideoStoppedEvent from './events/ScreenVideoStoppedEvent.js';\nimport {\n StartPipCamEvent,\n StopPipCamEvent,\n UpdatePipCamEvent\n} from './events/PipCamEvents.js';\nimport {\n AudioDeviceEndEvent,\n VideoDeviceEndEvent,\n AllDevicesEndEvent\n} from './events/DeviceEndEvents.js';\n\n/**\n * Event Handler uses the connection credentials for the room and\n * the user to setup a (monitored) connection, start a session and\n * listen for any events.\n **/\nclass EventHandler {\n constructor() {\n this.listeners = [];\n this._eyeson = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n\n this.send = this.send.bind(this);\n }\n\n /* eslint-disable max-statements */\n destroy() {\n if (this._monitor) {\n this._monitor.destroy();\n }\n if (this._connection) {\n this._connection.close();\n }\n if (this._rtConnection) {\n this._rtConnection.close();\n }\n if (this._session) {\n if (this._session.vbgMixer) {\n this._session.vbgMixer.stopOriginalStream();\n this._session.vbgMixer.terminate();\n this._session.vbgMixer.destroy();\n }\n this._session.end();\n }\n this._api = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n }\n /* eslint-enable max-statements */\n\n set connection(con) {\n if (this._connection) {\n Logger.error(\n 'A connection is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._connection = con;\n this._connection.onMessage(this.send);\n }\n\n get connection() {\n return null;\n }\n\n set rtConnection(con) {\n if (this._rtConnection) {\n Logger.error(\n 'A real-time connection is already set. If you are trying to start' +\n ' a new session you have the close the current before.'\n );\n return;\n }\n this._rtConnection = con;\n this._rtConnection.onMessage(this.send);\n }\n\n get rtConnection() {\n return null;\n }\n\n set monitor(mon) {\n if (this._monitor) {\n Logger.error(\n 'A monitor is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._monitor = mon;\n this._monitor.onEvent(this.send);\n }\n\n get monitor() {\n return this._monitor;\n }\n\n set session(ses) {\n if (this._session) {\n Logger.error(\n 'A session is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._session = ses;\n this._session.onEvent(this.send);\n }\n\n get session() {\n return null;\n }\n\n set api(api) {\n this._api = api;\n }\n\n get api() {\n return null;\n }\n\n set rtData(data) {\n this._rtData = data;\n }\n\n get rtData() {\n return null;\n }\n\n set eyeson(eyeson) {\n this._eyeson = eyeson;\n }\n\n get eyeson() {\n return null;\n }\n\n /**\n * Register a new listener.\n **/\n onReceive(callback) {\n Logger.debug('EventHandler::onReceive');\n this.listeners.push(callback);\n }\n\n /**\n * Unregisters a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n /* eslint-disable camelcase */\n send(msg) {\n if (!msg.silenced) {\n Logger.debug('EventHandler::send', msg);\n }\n new ({\n stfu: ForwardEvent,\n chat: ReceiveChatEvent,\n accept: AcceptSessionEvent,\n podium: PodiumEvent,\n snapshot: SnapshotEvent,\n send_chat: SendChatEvent,\n set_layer: SetLayerEvent,\n set_layout: SetLayoutEvent,\n fetch_room: FetchRoomEvent,\n room_ready: RoomReceivedEvent,\n room_setup: RoomReceivedEvent,\n memberlist: ParticipantListUpdateEvent,\n upload_file: UploadFileEvent,\n delete_file: DeleteFileEvent,\n request_stfu: StfuEvent,\n change_stream: ChangeStreamEvent,\n replace_stream: ReplaceStreamEvent,\n toggle_camera: ToggleCameraEvent,\n stop_playback: StopPlaybackEvent,\n playback_update: ForwardEvent,\n start_playback: StartPlaybackEvent,\n start_stream: StartStreamEvent,\n stop_recording: StopRecordingEvent,\n start_screen_capture: StartScreenCaptureEvent,\n stop_broadcasts: StopBroadcastsEvent,\n start_recording: StartRecordingEvent,\n stop_presenting: StopPresentingEvent,\n start_presenting: StartPresentingEvent,\n stop_annotation: StopAnnotationEvent,\n start_annotation: StartAnnotationEvent,\n clear_front_layer: ClearFrontLayerEvent,\n request_guest_user: RequestGuestUserEvent,\n voice_activity_raw: VoiceActivityEvent,\n start_mixer: StartMixerEvent,\n update_mixer: UpdateMixerEvent,\n lock_meeting: LockMeetingEvent,\n terminate_meeting: TerminateMeetingEvent,\n kick_user: KickUserEvent,\n session_termination: SessionTerminationEvent,\n start_media: StartMediaEvent,\n change_screen_video: ScreenVideoChangeEvent,\n stop_screen_video: ScreenVideoStoppedEvent,\n stop_rtmp: StopRtmpEvent,\n start_rtmp: StartRtmpEvent,\n suspend_virtual_background: VirtualBackgroundEvent,\n audio_device_ended: AudioDeviceEndEvent,\n video_device_ended: VideoDeviceEndEvent,\n all_devices_ended: AllDevicesEndEvent,\n start_pip_cam: StartPipCamEvent,\n stop_pip_cam: StopPipCamEvent,\n update_pip_cam: UpdatePipCamEvent,\n\n capture_error: ForwardEvent,\n voice_activity: ForwardEvent,\n options_update: ForwardEvent,\n ext_not_installed: ForwardEvent,\n broadcasts_update: ForwardEvent,\n presentation_ended: ForwardEvent,\n\n recording: IgnoreEvent,\n ext_cancel: IgnoreEvent,\n ext_installed: IgnoreEvent,\n message_status: IgnoreEvent,\n moderator_info: IgnoreEvent\n }[msg.type] || PublicEvent)(this).handle(msg);\n }\n /* eslint-enable camelcase */\n}\n\nexport default EventHandler;\n","import FeatureDetector from './FeatureDetector.js';\n\n/**\n * Add 'Visoweb' identifier to origin field of sdp. Believe this is still\n * relevant for some remotes.\n **/\nconst addOriginToSDP = sdp => {\n return sdp.replace('o=-', 'o=Visoweb');\n};\n\n/**\n * Add session attribute to disable sfu mode from the client.\n **/\n// eslint-disable-next-line max-statements\nconst addSessionAttributes = sdp => {\n // double check config.allowSafariSFU on runtime\n const splitSDP = sdp.split('\\r\\n');\n const tLineIdx = splitSDP.findIndex(line => line.startsWith('t='));\n let addIndex = 1;\n if (FeatureDetector.canSFU()) {\n // insert sfuLine after tLine (timing), delete 0 elements\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=sfu-capable');\n addIndex++;\n if (FeatureDetector.disallowAudioSyncSrcChange()) {\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=disallow-audio-ssrc-change');\n addIndex++;\n }\n }\n if (FeatureDetector.canDataChannel()) {\n splitSDP.splice(\n tLineIdx + addIndex,\n 0,\n 'a=eyeson-datachan-capable',\n 'a=eyeson-datachan-keepalive',\n 'a=eyeson-sepp-messaging'\n );\n }\n return splitSDP.join('\\r\\n');\n};\n\n// eslint-disable-next-line max-statements\nconst addStereo = sdp => {\n const stereo = FeatureDetector.canStereo();\n const codecMatch = sdp.match(/^a=rtpmap:(\\d+) opus/m);\n if (codecMatch) {\n const fmtpRegExp = new RegExp(`^a=fmtp:${codecMatch[1]} (.+)$`, 'm');\n const fmtpMatch = sdp.match(fmtpRegExp);\n if (fmtpMatch) {\n const options = {};\n fmtpMatch[1].split(';').forEach(entry => {\n const [key, value] = entry.split('=');\n options[key] = value;\n });\n options['stereo'] = stereo ? '1' : '0';\n // options['sprop-stereo'] = '1';\n const result = Object.entries(options)\n .map(([key, value]) => `${key}=${value}`)\n .join(';');\n return sdp.replace(fmtpRegExp, `a=fmtp:${codecMatch[1]} ${result}`);\n }\n }\n return sdp;\n};\n\nconst sendOnly = sdp => {\n const lines = sdp.split('\\r\\n');\n let doIt = false;\n lines.forEach((line, row) => {\n if (line.startsWith('m=audio') || line.startsWith('m=video')) {\n doIt = true;\n } else if (line.startsWith('m=application')) {\n doIt = false;\n } else if (line === 'a=sendrecv' && doIt) {\n lines[row] = 'a=sendonly';\n }\n });\n return lines.join('\\r\\n');\n};\n\nconst getModifiers = options => {\n const modifiers = {\n active: [addStereo],\n passive: [addOriginToSDP, addSessionAttributes]\n };\n if (options.sendOnly === true) {\n modifiers.active.push(sendOnly);\n }\n return modifiers;\n};\n\nexport { getModifiers };\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport { getModifiers } from './SDPModifiers.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceMonitor from './DeviceMonitor.js';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Conference Session is starting a session from active connection,\n * delegating events to registered listeners.\n **/\nclass ConferenceSession {\n /* eslint-disable max-statements */\n constructor(connection, comApi, options = {}) {\n this.options = options;\n this.options.RTCConstraints = Object.assign(\n {},\n this.defaultRTCConstraints,\n { offerToReceiveVideo: !this.options.eco }\n );\n this.accepted = false;\n this.listeners = [];\n this.restarting = false;\n this.connection = connection;\n this.comApi = comApi;\n this.sipSession = null;\n this.startAttempts = 0;\n this.maxStartAttempts = 3;\n this.tryAuthUpdate = true;\n this.tryResume = true;\n this.tryWaitResume = true;\n this.resumeTimer = null;\n this.waitResumeTimer = null;\n\n this.end = this.end.bind(this);\n this.emit = this.emit.bind(this);\n this.setStream = this.setStream.bind(this);\n this.endSession = this.endSession.bind(this);\n this.initSession = this.initSession.bind(this);\n this.handleFailed = this.handleFailed.bind(this);\n this.handleAccept = this.handleAccept.bind(this);\n this.handleUnmute = this.handleUnmute.bind(this);\n this.restartSession = this.restartSession.bind(this);\n this.tryRecoveryFrom = this.tryRecoveryFrom.bind(this);\n this.terminateSession = this.terminateSession.bind(this);\n this.remoteDescriptionUpdate = this.remoteDescriptionUpdate.bind(this);\n }\n /* eslint-enable max-statements */\n\n get peerConnection() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.peerConnection;\n }\n return null;\n }\n\n get localStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.localStream;\n }\n return null;\n }\n\n get remoteStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.remoteStream;\n }\n return null;\n }\n\n get defaultRTCConstraints() {\n return { offerToReceiveAudio: true, offerToReceiveVideo: true };\n }\n\n /**\n * Request stream and invoke session start.\n **/\n start() {\n if (this.options.stream) {\n this.initExternalStream();\n return;\n }\n this.initDeviceMonitor();\n this.initVirtualBackground();\n new MediaStreamBuilder(this.options)\n .start()\n .then(this.initSession)\n .catch(this.handleFailed);\n }\n\n initExternalStream() {\n const audioOnly = !hasVideo(this.options.stream) && this.options.eco;\n const stream = createExternalStream(this.options.stream, audioOnly);\n if (!stream) {\n this.handleFailed({ name: 'invalid_stream' });\n return;\n }\n this.externalStream = stream;\n this.options.audio = hasAudio(stream);\n this.options.video = hasVideo(stream);\n this.initSession(this.externalStream);\n }\n\n initVirtualBackground() {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer();\n this.vbgMixer.changeBackground(type);\n this.options.vbgMixer = this.vbgMixer;\n }\n\n initDeviceMonitor() {\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(msg => this.emit(msg));\n this.options.deviceMonitor = this.deviceMonitor;\n }\n\n buildSessionOptions(stream) {\n const { options } = this;\n if (options.sendOnly === true) {\n options.RTCConstraints = {};\n }\n return {\n stream: stream,\n sendOnly: options.sendOnly,\n SDPModifiers: getModifiers({\n sendOnly: options.sendOnly\n }),\n connection: this.connection,\n handleAccept: this.handleAccept,\n handleUnmute: this.handleUnmute,\n RTCConstraints: options.RTCConstraints,\n remoteDescriptionUpdate: this.remoteDescriptionUpdate,\n mediaOptions: { audio: options.audio, video: options.video }\n };\n }\n\n /**\n * Init session and start stream.\n **/\n // eslint-disable-next-line max-statements\n initSession(stream) {\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n const options = this.buildSessionOptions(stream);\n this.sipSession = this.connection.startSession(options);\n this.onUnmute(stream);\n this.sipSession.onEvent(event => {\n if (event.type === 'accepted') {\n this.adjustVideoPodium();\n } else if (event.type === 'resumed') {\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n } else if (event.type === 'terminated') {\n this.handleTermination(event.reason, event.code);\n }\n });\n if (this.externalStream) {\n this.connection.hasExternalStream = true;\n }\n\n if (window) {\n window.addEventListener(\n FeatureDetector.isIOSDevice() ? 'pagehide' : 'beforeunload',\n this.endSession\n );\n }\n }\n\n /**\n * End a conference session.\n **/\n end() {\n this.listeners = [];\n this.endSession();\n this.accepted = false;\n this.sipSession = null;\n this.connection = null;\n }\n\n /**\n * Before terminating the session, remove all listeners and stop all\n * streams.\n **/\n endSession() {\n Logger.debug('ConferenceSession::endSession');\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if (this.sipSession) {\n this.sipSession.removeAllListeners();\n this.terminateSession();\n }\n if (this.connection) {\n this.connection.close();\n }\n if (this.deviceMonitor) {\n this.deviceMonitor.destroy();\n }\n }\n /* eslint-enable max-statements */\n\n /**\n * Depending on the state of the session, this function may send a CANCEL\n * request, a non-2xx final response, a BYE request, or even no request at\n * all.\n * https://sipjs.com/api/0.7.0/session/#terminateoptions\n **/\n terminateSession() {\n Logger.debug('ConferenceSession::terminateSession');\n try {\n this.sipSession.terminate();\n } catch (error) {\n Logger.error(error);\n }\n }\n\n /**\n * Replace the active stream with newStream and emit 'stream_update' with the\n * new stream.\n *\n * In case of an error (as will be the case in current EDGE (May 2019))\n * report back the current streams.\n **/\n // eslint-disable-next-line max-statements\n async setStream(newStream) {\n if (!this.sipSession) {\n return null;\n }\n try {\n const { sessionDescriptionHandler } = this.sipSession;\n const streams = await sessionDescriptionHandler.setStream(newStream);\n this.stopPresentingSet = false;\n if (this.micMixer && this.micMixer.active) {\n streams.newStream = this.micMixer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n if (this.videoPlayer && this.videoPlayer.isStreaming()) {\n streams.newStream = this.videoPlayer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n this.onUnmute(streams.newStream);\n this.emit({\n type: 'stream_update',\n localStream: streams.newStream,\n stream: streams.remoteStream\n });\n return streams.newStream;\n } catch (error) {\n Logger.error('ConferenceSession::setStream', error);\n this.emit({\n type: 'stream_update',\n localStream: this.localStream,\n stream: this.remoteStream\n });\n return this.localStream;\n }\n }\n\n /**\n * Trigger local track unmuted event.\n * Used to prevent iOS issue black video after incoming call.\n */\n onUnmute(stream) {\n if (stream) {\n stream.getTracks().forEach(track => {\n track.onunmute = () =>\n this.emit({ type: 'local_track_unmuted', track: track });\n });\n }\n }\n\n /**\n * Register a session monitor.\n **/\n setMonitor(monitor) {\n this.monitor = monitor;\n }\n\n /**\n * Forward accept event, build expected message format.\n **/\n handleAccept(remoteStream) {\n if (this.monitor) {\n this.monitor.observe(this.peerConnection);\n }\n if (!this.accepted) {\n this.emit({ type: 'accept', session: this.sipSession });\n this.accepted = true;\n }\n if (remoteStream) {\n this.emit({ type: 'stream_update', stream: remoteStream });\n }\n }\n\n handleUnmute(track) {\n this.emit({ type: 'track_unmuted', track: track });\n }\n\n remoteDescriptionUpdate(sdpWrapper) {\n Logger.debug('ConferenceSession::remoteDescriptionUpdate', sdpWrapper.sdp);\n let sfu = false;\n\n const splitSDP = sdpWrapper.sdp.split('\\r\\n');\n const sfuLine = splitSDP.find(line => line.startsWith('a=sfu-mode'));\n\n if (sfuLine) {\n sfu = sfuLine.includes('on');\n }\n\n this.emit({ type: 'remote_description_update', update: { sfu: sfu } });\n }\n\n /**\n * Once we have accepted the session, we need to adjust the video podium,\n * according to the current options.\n **/\n adjustVideoPodium() {\n this.send({ type: 'mute_video', on: !this.options.video });\n }\n\n /**\n * On Termination log to debug what happened.\n **/\n // eslint-disable-next-line max-statements\n handleTermination(reason, code) {\n Logger.debug('ConfSession::handleTermination', reason, code);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if ((reason === 'bye' && code === 200) || reason === 'terminate') {\n this.handleExit();\n } else if (reason === 'disconnect') {\n if (code === -1) {\n if (this.tryAuthUpdate) {\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data =>\n this.connection.updateAuthAndRestartSession(data)\n );\n return;\n } else if (this.tryWaitResume && this.connection) {\n this.tryWaitResume = false;\n this.waitResumeTimer = setTimeout(() => {\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n }, 5000);\n this.resumeTimer = setTimeout(() => {\n this.handleFailed({ name: 503 });\n }, 15000);\n return;\n }\n this.handleFailed({ name: 503 });\n } else {\n if (this.tryResume && this.connection) {\n this.tryResume = false;\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n this.resumeTimer = setTimeout(\n () => this.handleFailed({ name: 410 }),\n 10000\n );\n return;\n }\n this.handleFailed({ name: 410 });\n }\n } else {\n this.handleFailed({ name: code });\n }\n if (!this.restarting) {\n this.emit({ type: 'session_termination' });\n }\n }\n\n /**\n * Forward exit event\n **/\n handleExit() {\n this.emit({ type: 'exit', reason: 'bye' });\n }\n\n /**\n * Forward failed event unless we attempt a recovery.\n **/\n handleFailed(reason) {\n Logger.warn('ConferenceSession::handleFailed: ', reason);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n let key = 'Desert';\n if (reason && reason.name) {\n key = reason.name;\n }\n\n if (this.tryRecoveryFrom(key)) {\n return;\n }\n\n const name =\n {\n NotFoundError: 'devices',\n NotAllowedError: 'permission',\n DevicesNotFoundError: 'devices',\n PermissionDeniedError: 'permission',\n NotReadableError: 'not_readable',\n 403: 'session_in_use',\n 410: 'abrupt_disconnect',\n 413: 'request_too_large',\n 426: 'ice_error',\n 486: 'session_in_use',\n 607: 'meeting_locked'\n }[key] || 'session_failed';\n\n this.emit({\n type: 'error',\n name: name,\n code: this.errorCodeName(key, name)\n });\n }\n\n errorCodeName(key, name) {\n if (\n [\n 'permission',\n 'devices',\n 'not_readable',\n 'meeting_locked',\n 'session_in_use',\n 'transport_error'\n ].includes(name)\n ) {\n return '';\n }\n return String(key);\n }\n\n /**\n * Conference session may recover from `failure` if a recovery for that\n * `failure` is known and its condition applies.\n **/\n tryRecoveryFrom(failure) {\n Logger.debug('ConferenceSession::tryRecoveryFrom: ', failure);\n\n const recovery = {\n 404: {\n condition: () => this.startAttempts < this.maxStartAttempts,\n action: () => this.restartSession()\n }\n }[failure];\n\n if (this.startAttempts >= this.maxStartAttempts) {\n this.restarting = false;\n return false;\n }\n\n return Boolean(recovery && recovery.condition() && recovery.action());\n }\n\n /**\n * End the previously started session, but keep already registered listeners.\n **/\n restartSession() {\n Logger.debug('ConferenceSession::restartSession: ', this.startAttempts);\n this.restarting = true;\n this.startAttempts += 1;\n\n setTimeout(() => {\n this.endSession();\n this.start();\n }, 1000);\n\n return true;\n }\n\n /**\n * Register event listeners.\n **/\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n /**\n * Transport a message over the connection.\n **/\n send(msg) {\n return this.connection.send(msg);\n }\n}\n\nexport default ConferenceSession;\n\n/* eslint-enable max-lines */\n","import Logger from '../Logger.js';\n\nconst Status = {\n NO_CONNECTION: 3,\n BAD: 2,\n OK: 1,\n GOOD: 0\n};\n\nconst calculateStatus = (\n packetLossRate = 0,\n jitter = 0,\n roundTripTime = 0,\n nackRate = 0\n) => {\n if (\n roundTripTime > 1 ||\n packetLossRate > 0.2 ||\n jitter > 0.5 ||\n nackRate > 0.2\n ) {\n return Status.BAD;\n }\n if (\n roundTripTime > 0.3 ||\n packetLossRate > 0.1 ||\n jitter > 0.3 ||\n nackRate > 0.1\n ) {\n return Status.OK;\n }\n return Status.GOOD;\n};\n\nconst getOldestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time < result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst getNewestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time > result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst addHistory = (history, entry) => {\n if (history.length < 3) {\n history.push(Object.assign({}, entry));\n return;\n }\n Object.assign(getOldestHistoryEntry(history), entry);\n};\n\n// eslint-disable-next-line max-statements\nconst getHistoryAverage = history => {\n const { length } = history;\n const result = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n bitrateSend: 0,\n bitrateRecv: 0,\n status: Status.GOOD\n };\n const newest = getNewestHistoryEntry(history);\n for (const entry of history) {\n result.jitter += entry.jitter;\n result.packetLoss += entry.packetLoss;\n result.roundTripTime += entry.roundTripTime;\n result.nack += entry.nack;\n result.bitrateSend += entry.bitrateSend;\n result.bitrateRecv += entry.bitrateRecv;\n }\n result.jitter = newest.jitter === null ? null : result.jitter / length;\n result.packetLoss =\n newest.packetLoss === null ? null : result.packetLoss / length;\n result.roundTripTime =\n newest.roundTripTime === null ? null : result.roundTripTime / length;\n result.nack = newest.nack === null ? null : result.nack / length;\n result.bitrateSend /= length;\n result.bitrateRecv /= length;\n result.status = calculateStatus(\n result.packetLoss,\n result.jitter,\n result.roundTripTime,\n result.nack\n );\n return result;\n};\n\nclass ConnectionStatistics {\n constructor() {\n this.peerConnection = null;\n this.timer = null;\n this.listeners = [];\n this.history = [];\n this.entry = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n time: 0,\n bitrateSend: 0,\n bitrateRecv: 0\n };\n this.lastStat = {\n time: null,\n bytesSent: null,\n bytesReceived: null,\n audio: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null\n },\n in: {\n packetsReceived: null\n }\n },\n video: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null,\n nackCount: null\n },\n in: {\n bytesReceived: null\n }\n }\n };\n this.boundPrintStats = this.printStats.bind(this);\n }\n\n init(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n // eslint-disable-next-line max-statements\n async printStats() {\n const { peerConnection, entry, lastStat, history } = this;\n const stats = await peerConnection.getStats();\n const now = Date.now();\n let statsCurrentRoundTripTime = null;\n Object.keys(entry).forEach(key => {\n entry[key] = 0;\n });\n entry.jitter = null;\n entry.packetLoss = null;\n entry.roundTripTime = null;\n entry.nack = null;\n entry.time = now;\n\n // eslint-disable-next-line max-statements, complexity\n stats.forEach(report => {\n if (report.type === 'inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const received = Math.max(\n report.bytesReceived - lastStat[kind].in.bytesReceived,\n 0\n );\n entry.bitrateRecv += (received * 8) / diff;\n }\n lastStat[kind].in.bytesReceived = report.bytesReceived;\n } else if (report.type === 'outbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const sent = report.bytesSent - lastStat[kind].out.bytesSent;\n entry.bitrateSend += (sent * 8) / diff;\n }\n lastStat[kind].out.bytesSent = report.bytesSent;\n } else if (report.type === 'remote-inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat[kind]) {\n const outbound = stats.get(report.localId);\n const hasRTT = typeof report.roundTripTime !== 'undefined';\n const hasJitter = typeof report.jitter !== 'undefined';\n const hasPacketLoss = typeof report.packetsLost !== 'undefined';\n const hasNackCount = typeof outbound.nackCount !== 'undefined';\n if (lastStat.time) {\n const lost = report.packetsLost - lastStat[kind].out.packetsLost;\n const packets =\n outbound.packetsSent - lastStat[kind].out.packetsSent;\n const packetLossRate = packets > 0 ? lost / packets : 0;\n entry.jitter = hasJitter\n ? Math.max(entry.jitter, packets > 0 ? report.jitter : 0)\n : null;\n entry.packetLoss = hasPacketLoss\n ? Math.max(entry.packetLoss, packetLossRate)\n : null;\n entry.roundTripTime = hasRTT\n ? Math.max(entry.roundTripTime, report.roundTripTime)\n : null;\n if (kind === 'video') {\n const nack = outbound.nackCount - lastStat[kind].out.nackCount;\n const nackRate = packets > 0 ? nack / packets : 0;\n entry.nack = hasNackCount ? Math.max(entry.nack, nackRate) : null;\n }\n }\n if (kind === 'video') {\n lastStat[kind].out.nackCount = outbound.nackCount;\n }\n lastStat[kind].out.packetsSent = outbound.packetsSent;\n lastStat[kind].out.packetsLost = report.packetsLost;\n }\n } else if (\n report.type === 'candidate-pair' &&\n report.state === 'succeeded' &&\n 'currentRoundTripTime' in report\n ) {\n statsCurrentRoundTripTime = report.currentRoundTripTime;\n }\n });\n if (entry.roundTripTime === null && statsCurrentRoundTripTime !== null) {\n entry.roundTripTime = statsCurrentRoundTripTime;\n }\n addHistory(history, entry);\n const average = getHistoryAverage(history);\n if (navigator.onLine === false) {\n average.status = Status.BAD;\n }\n if (\n ['disconnected', 'failed', 'closed'].includes(\n peerConnection.iceConnectionState\n )\n ) {\n average.status = Status.NO_CONNECTION;\n }\n this.emit(average);\n lastStat.time = now;\n }\n\n getCurrentStatistics() {\n return getHistoryAverage(this.history);\n }\n\n onUpdate(listener) {\n const { listeners, timer } = this;\n if (listeners.length === 0 && timer === null) {\n this.timer = setInterval(this.boundPrintStats, 1000);\n this.peerConnection.addEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n window.addEventListener('offline', this.boundPrintStats);\n }\n listeners.push(listener);\n }\n\n emit(statistics) {\n this.listeners.forEach(listener => {\n try {\n listener(statistics);\n } catch (err) {\n Logger.error('ConnectionStatistics::emit', err);\n }\n });\n }\n\n destroy() {\n clearInterval(this.timer);\n window.removeEventListener('offline', this.boundPrintStats);\n if (this.peerConnection) {\n this.peerConnection.removeEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n this.peerConnection = null;\n }\n this.timer = null;\n this.history.length = 0;\n this.listeners.length = 0;\n }\n}\n\nConnectionStatistics.Status = Status;\n\nexport default ConnectionStatistics;\n","import Logger from './Logger.js';\nimport ConnectionStatistics from './utils/ConnectionStatistics.js';\n/**\n * Connection Monitor informs about on and offline and ice state changes.\n * I.e. when the connection to the conf server (from a webRTC point of view)\n * is breaking up or degrading.\n **/\nclass ConnectionMonitor {\n constructor() {\n this.pc = null;\n this.statistics = new ConnectionStatistics();\n this.listeners = [];\n this.disconnectTimer = null;\n this.prevIceState = 'initial';\n this.onOffline = this.onOffline.bind(this);\n this.handleIceStateChange = this.handleIceStateChange.bind(this);\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.addEventListeners();\n }\n\n addEventListeners() {\n window.addEventListener('offline', this.onOffline);\n }\n\n onOffline() {\n this.emit({ type: 'offline' });\n }\n\n observe(peerConnection) {\n if (this.pc) {\n return;\n }\n this.pc = peerConnection;\n this.pc.oniceconnectionstatechange = this.handleIceStateChange;\n this.pc.onconnectionstatechange = this.handleConnectionStateChange;\n this.statistics.init(peerConnection);\n this.emit({ type: 'statistics_ready', statistics: this.statistics });\n }\n\n destroy() {\n const { pc, statistics } = this;\n clearTimeout(this.disconnectTimer);\n if (statistics) {\n statistics.destroy();\n this.statistics = null;\n }\n if (pc) {\n pc.onconnectionstatechange = null;\n pc.oniceconnectionstatechange = null;\n this.pc = null;\n }\n window.removeEventListener('offline', this.onOffline);\n }\n\n onEvent(listener) {\n this.listeners.push(listener);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n handleConnectionStateChange(event) {\n if (event.currentTarget) {\n Logger.warn(\n 'connectionStateChange: ',\n event.currentTarget.connectionState\n );\n }\n }\n\n /* eslint-disable max-statements */\n handleIceStateChange(event) {\n // event doesn't have a current target in EDGE\n if (!event.currentTarget) {\n return;\n }\n\n const { iceConnectionState: currentIceState } = event.currentTarget;\n\n if (currentIceState === 'disconnected') {\n this.emit({ type: 'warning', name: 'ice_disconnected' });\n // As of Chrome 76 failed is no longer emitted\n // https://bugs.chromium.org/p/chromium/issues/detail?id=982793&q=ice%20failed&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified\n //\n // We use a 2 seconds delay to re-check the connection.\n clearTimeout(this.disconnectTimer);\n this.disconnectTimer = window.setTimeout(() => {\n if (this.pc && this.pc.iceConnectionState !== 'connected') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Goldfinger' });\n }\n }, 2000);\n }\n\n if (currentIceState === 'failed') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Thunderball' });\n }\n\n if (\n this.prevIceState === 'disconnected' &&\n ['completed', 'connected'].includes(currentIceState)\n ) {\n this.emit({ type: 'clear_warning', name: 'ice_disconnected' });\n }\n\n this.prevIceState = currentIceState;\n }\n /* eslint-enable max-statements */\n}\n\nexport default ConnectionMonitor;\n","var adapters = {\n logger: self.console,\n WebSocket: self.WebSocket\n};\n\nvar logger = {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now());\n adapters.logger.log(\"[ActionCable]\", ...messages);\n }\n }\n};\n\nconst now = () => (new Date).getTime();\n\nconst secondsSince = time => (now() - time) / 1e3;\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this);\n this.connection = connection;\n this.reconnectAttempts = 0;\n }\n start() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n addEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);\n }\n }\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(\"ConnectionMonitor stopped\");\n }\n }\n isRunning() {\n return this.startedAt && !this.stoppedAt;\n }\n recordPing() {\n this.pingedAt = now();\n }\n recordConnect() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n logger.log(\"ConnectionMonitor recorded connect\");\n }\n recordDisconnect() {\n this.disconnectedAt = now();\n logger.log(\"ConnectionMonitor recorded disconnect\");\n }\n startPolling() {\n this.stopPolling();\n this.poll();\n }\n stopPolling() {\n clearTimeout(this.pollTimeout);\n }\n poll() {\n this.pollTimeout = setTimeout((() => {\n this.reconnectIfStale();\n this.poll();\n }), this.getPollInterval());\n }\n getPollInterval() {\n const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));\n const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;\n const jitter = jitterMax * Math.random();\n return staleThreshold * 1e3 * backoff * (1 + jitter);\n }\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);\n } else {\n logger.log(\"ConnectionMonitor reopening\");\n this.connection.reopen();\n }\n }\n }\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt;\n }\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;\n }\n disconnectedRecently() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n }\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout((() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);\n this.connection.reopen();\n }\n }), 200);\n }\n }\n}\n\nConnectionMonitor.staleThreshold = 6;\n\nConnectionMonitor.reconnectionBackoffRate = .15;\n\nvar INTERNAL = {\n message_types: {\n welcome: \"welcome\",\n disconnect: \"disconnect\",\n ping: \"ping\",\n confirmation: \"confirm_subscription\",\n rejection: \"reject_subscription\"\n },\n disconnect_reasons: {\n unauthorized: \"unauthorized\",\n invalid_request: \"invalid_request\",\n server_restart: \"server_restart\"\n },\n default_mount_path: \"/cable\",\n protocols: [ \"actioncable-v1-json\", \"actioncable-unsupported\" ]\n};\n\nconst {message_types: message_types, protocols: protocols} = INTERNAL;\n\nconst supportedProtocols = protocols.slice(0, protocols.length - 1);\n\nconst indexOf = [].indexOf;\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this);\n this.consumer = consumer;\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ConnectionMonitor(this);\n this.disconnected = true;\n }\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n }\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);\n return false;\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);\n if (this.webSocket) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n }\n close({allowReconnect: allowReconnect} = {\n allowReconnect: true\n }) {\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isOpen()) {\n return this.webSocket.close();\n }\n }\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`);\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error);\n } finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n }\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol;\n }\n }\n isOpen() {\n return this.isState(\"open\");\n }\n isActive() {\n return this.isState(\"open\", \"connecting\");\n }\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;\n }\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0;\n }\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase();\n }\n }\n }\n return null;\n }\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this);\n this.webSocket[`on${eventName}`] = handler;\n }\n }\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {};\n }\n }\n}\n\nConnection.reopenDelay = 500;\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) {\n return;\n }\n const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`);\n return this.close({\n allowReconnect: reconnect\n });\n\n case message_types.ping:\n return this.monitor.recordPing();\n\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier);\n return this.subscriptions.notify(identifier, \"connected\");\n\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close(event) {\n logger.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error() {\n logger.log(\"WebSocket onerror event\");\n }\n};\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key];\n object[key] = value;\n }\n }\n return object;\n};\n\nclass Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer;\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n perform(action, data = {}) {\n data.action = action;\n return this.send(data);\n }\n send(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n }\n unsubscribe() {\n return this.consumer.subscriptions.remove(this);\n }\n}\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions;\n this.pendingSubscriptions = [];\n }\n guarantee(subscription) {\n if (this.pendingSubscriptions.indexOf(subscription) == -1) {\n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`);\n this.pendingSubscriptions.push(subscription);\n } else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`);\n }\n this.startGuaranteeing();\n }\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`);\n this.pendingSubscriptions = this.pendingSubscriptions.filter((s => s !== subscription));\n }\n startGuaranteeing() {\n this.stopGuaranteeing();\n this.retrySubscribing();\n }\n stopGuaranteeing() {\n clearTimeout(this.retryTimeout);\n }\n retrySubscribing() {\n this.retryTimeout = setTimeout((() => {\n if (this.subscriptions && typeof this.subscriptions.subscribe === \"function\") {\n this.pendingSubscriptions.map((subscription => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`);\n this.subscriptions.subscribe(subscription);\n }));\n }\n }), 500);\n }\n}\n\nclass Subscriptions {\n constructor(consumer) {\n this.consumer = consumer;\n this.guarantor = new SubscriptionGuarantor(this);\n this.subscriptions = [];\n }\n create(channelName, mixin) {\n const channel = channelName;\n const params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n const subscription = new Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n }\n add(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.subscribe(subscription);\n return subscription;\n }\n remove(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n }\n reject(identifier) {\n return this.findAll(identifier).map((subscription => {\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n return subscription;\n }));\n }\n forget(subscription) {\n this.guarantor.forget(subscription);\n this.subscriptions = this.subscriptions.filter((s => s !== subscription));\n return subscription;\n }\n findAll(identifier) {\n return this.subscriptions.filter((s => s.identifier === identifier));\n }\n reload() {\n return this.subscriptions.map((subscription => this.subscribe(subscription)));\n }\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));\n }\n notify(subscription, callbackName, ...args) {\n let subscriptions;\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [ subscription ];\n }\n return subscriptions.map((subscription => typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined));\n }\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription);\n }\n }\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`);\n this.findAll(identifier).map((subscription => this.guarantor.forget(subscription)));\n }\n sendCommand(subscription, command) {\n const {identifier: identifier} = subscription;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n }\n}\n\nclass Consumer {\n constructor(url) {\n this._url = url;\n this.subscriptions = new Subscriptions(this);\n this.connection = new Connection(this);\n }\n get url() {\n return createWebSocketURL(this._url);\n }\n send(data) {\n return this.connection.send(data);\n }\n connect() {\n return this.connection.open();\n }\n disconnect() {\n return this.connection.close({\n allowReconnect: false\n });\n }\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n }\n}\n\nfunction createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url();\n }\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n}\n\nfunction createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url);\n}\n\nfunction getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport { Connection, ConnectionMonitor, Consumer, INTERNAL, Subscription, SubscriptionGuarantor, Subscriptions, adapters, createConsumer, createWebSocketURL, getConfig, logger };\n","import Logger from './Logger.js';\nimport { createConsumer } from '@rails/actioncable';\n\n/**\n * Registers with provided token and room.\n **/\nclass ActionCableConnection {\n constructor(uri) {\n this.channels = {};\n this.onMessageHandler = this.defaultMessageHandler;\n\n this.onReceived = this.onReceived.bind(this);\n this.offMessage = this.offMessage.bind(this);\n this.onConnected = this.onConnected.bind(this);\n this.startSession = this.startSession.bind(this);\n this.onDisconnected = this.onDisconnected.bind(this);\n\n this.cable = createConsumer(uri);\n }\n\n startSession() {\n this.channels.RoomChannel = this.cable.subscriptions.create(\n { channel: 'RoomChannel' },\n {\n connected: this.onConnected,\n received: this.onReceived,\n disconnected: this.onDisconnected\n }\n );\n this.channels.UserChannel = this.cable.subscriptions.create(\n { channel: 'UserChannel' },\n { received: this.onReceived }\n );\n }\n\n onConnected() {\n if (this.disconnectTimestamp) {\n this.handleReconnect();\n }\n Logger.debug('ActionCableConnection::onConnected');\n }\n\n handleReconnect() {\n this.onMessageHandler({ type: 'reconnect' });\n }\n\n onReceived(msg) {\n Logger.debug('ActionCableConnection::onReceived', msg);\n msg._src = 'actioncable';\n this.onMessageHandler(msg);\n }\n\n onDisconnected() {\n Logger.debug('ActionCableConnection::onDisconnected');\n this.disconnectTimestamp = Date.now();\n this.onMessageHandler({ type: 'disconnect' });\n }\n\n onMessage(onMessageHandler) {\n if (typeof onMessageHandler !== 'function') {\n return;\n }\n this.onMessageHandler = onMessageHandler;\n }\n\n offMessage() {\n this.onMessageHandler = this.defaultMessageHandler;\n }\n\n defaultMessageHandler(msg) {\n Logger.debug('ActionCableConnection::defaultMessageHandler: ', msg);\n }\n\n /**\n * msg has the format { channel: 'xyz', type: 'abc' }\n **/\n send({ channel = 'RoomChannel', type = 'ping' }) {\n const subscription = this.channels[channel];\n\n if (!subscription) {\n Logger.warn(\n 'ActionCableConnection::send no subscription found! ',\n channel\n );\n return;\n }\n\n subscription.perform(type);\n }\n\n close() {\n this.cable.disconnect();\n this.offMessage();\n this.channels = {};\n this.cable = null;\n }\n}\n\nexport default ActionCableConnection;\n","import config from './config.js';\nimport options from './options.js';\nimport ComApi from './ComApi.js';\nimport Logger from './Logger.js';\nimport throttle from './utils/throttle.js';\nimport EventHandler from './EventHandler.js';\nimport ConferenceSession from './ConferenceSession.js';\nimport ConnectionMonitor from './ConnectionMonitor.js';\nimport ActionCableConnection from './ActionCableConnection.js';\n\n/**\n * Initial connection status change updater.\n **/\nconst updateStatus = (eyeson, status) =>\n eyeson.core.eventHandler.send({\n type: 'connection',\n connectionStatus: status\n });\n\nconst keepRoomAlive = eyeson => {\n eyeson.core.keepRoomAlive = setInterval(() => {\n eyeson.core.rtConnection.send({ type: 'user_joins' });\n }, 30000);\n};\n\n/**\n * Remove this once WSS messages arrive reliably.\n **/\nconst pollingFallback = eyeson => {\n let counter = 1;\n eyeson.core.pollingFallbackInterval = setInterval(() => {\n const { core } = eyeson;\n if (counter === 200) {\n Logger.debug(\n 'eyeson::pollingFallback: max count exceeded, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n if (core.eventHandler._connection) {\n Logger.debug(\n 'eyeson::pollingFallback: connection set, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n core.comApi.getRoom(data => {\n if (data.ready === true) {\n Logger.debug('eyeson::pollingFallback: room ready');\n core.eventHandler.send({ type: 'room_ready', content: data });\n return;\n }\n Logger.debug('eyeson::pollingFallback: room not ready', counter);\n counter += 1;\n });\n }, 5000);\n};\n\n/**\n * Load initial room data.\n **/\nconst loadInitialInfos = eyeson => {\n const { core } = eyeson;\n const { broadcasts } = core.eventHandler._rtData;\n if (broadcasts) {\n core.eventHandler.send({\n type: 'broadcasts_update',\n broadcasts: broadcasts\n });\n }\n};\n\n/**\n * Join a session and listen to any events. eventHandler keeps all the\n * stuff.\n **/\n// eslint-disable-next-line max-statements\nconst joinSession = (eyeson, mediaOptions) => {\n const { core } = eyeson;\n if (!core.eventHandler._connection) {\n Logger.error(\n 'You tried to join a session that is not yet available. ' +\n 'Before calling join, a connection status of connected has ' +\n 'to be received.'\n );\n return;\n }\n\n const session = new ConferenceSession(\n core.eventHandler._connection,\n core.comApi,\n mediaOptions\n );\n session.setMonitor(core.eventHandler.monitor);\n core.eventHandler.session = session;\n\n session.start();\n loadInitialInfos(eyeson);\n clearInterval(core.keepRoomAlive);\n eyeson.session = session;\n};\n\n/**\n * Initialise our connections.\n **/\nconst prepareConnection = eyeson => {\n const { core } = eyeson;\n updateStatus(eyeson, 'fetch_room');\n\n core.eventHandler.eyeson = eyeson;\n\n core.comApi.onError(() =>\n core.eventHandler.send({ type: 'warning', name: 'error:comapi' })\n );\n\n // eslint-disable-next-line max-statements\n core.comApi.getRoom(data => {\n if (data.error) {\n Logger.warn('eyeson::prepareConnection', data.error);\n updateStatus(eyeson, 'access_denied');\n return;\n }\n updateStatus(eyeson, 'received_room');\n\n core.rtConnection = new ActionCableConnection(data.links.websocket);\n core.eventHandler.rtConnection = core.rtConnection;\n core.rtConnection.startSession();\n\n core.eventHandler.monitor = new ConnectionMonitor();\n core.eventHandler.api = core.comApi;\n keepRoomAlive(eyeson);\n pollingFallback(eyeson);\n });\n};\n\n/****** The following represents the public API, adapt with caution! *********/\nclass eyesonClass {\n /****** Public data ********************************************************/\n constructor() {\n /**\n * The room, user and links to be updated when fetched from the ComAPI.\n */\n this.config = config;\n this.core = { eventHandler: new EventHandler() };\n this.room = {};\n this.user = {};\n this.links = {};\n this.options = options;\n }\n /****** Public helper methods **********************************************/\n\n /**\n * Attach event listener\n **/\n onEvent(listener) {\n if (typeof listener !== 'function') {\n Logger.error(\n 'A listener to eyeson events has to be of type function.' +\n ' The argument passed to onEvent is of type ' +\n typeof listener +\n '.'\n );\n return;\n }\n this.core.eventHandler.onReceive(listener);\n }\n\n /**\n * Remove event listener\n **/\n offEvent(listener) {\n this.core.eventHandler.removeListener(listener);\n }\n\n /**\n * Prepare required core connections.\n **/\n connect(token) {\n Logger.debug('eyeson::connect', token);\n this.core.comApi = new ComApi(this.config.api, token);\n prepareConnection(this);\n }\n\n /**\n * Join a session with supplied mediaOptions (audio/video).\n **/\n join(mediaOptions) {\n Logger.debug('eyeson::join', mediaOptions);\n joinSession(this, mediaOptions);\n }\n\n /**\n * Start an eyeson room meeting.\n **/\n start(token, mediaOptions = { audio: true, video: true }) {\n Logger.debug('eyeson::start');\n const joinOnConnect = event => {\n if (event.connectionStatus !== 'ready') {\n return;\n }\n this.offEvent(joinOnConnect);\n this.join(mediaOptions);\n };\n this.onEvent(joinOnConnect);\n this.connect(token);\n }\n\n /**\n * Destroy and cleanup a session.\n **/\n destroy() {\n const { core } = this;\n Logger.debug('eyeson::destroy');\n clearInterval(core.keepRoomAlive);\n clearInterval(core.pollingFallbackInterval);\n core.eventHandler.destroy();\n core.eventHandler = new EventHandler();\n }\n\n /**\n * Receive an event from client.\n **/\n send(msg) {\n msg._src = 'client';\n return this.core.eventHandler.send(msg);\n }\n\n /**\n * When invoked repeatedly, will only actually call the original function at\n * most once per every wait milliseconds.\n **/\n throttledSend(msg) {\n if (!this._throttledSend) {\n this._throttledSend = throttle(message => this.send(message), 500);\n }\n\n return this._throttledSend(msg);\n }\n\n /**\n * Create a new instance\n */\n createInstance() {\n // eslint-disable-next-line new-cap\n return new eyesonClass();\n }\n}\n\n// eslint-disable-next-line new-cap\nconst instance = new eyesonClass();\n\nexport default instance;\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import Logger from '../Logger.js';\n\nclass GiphyApi {\n constructor(roomUrl) {\n this.roomUrl = roomUrl;\n }\n\n search(query) {\n return this.request(`${this.roomUrl}/search?q=${query}`).then(\n ({ data }) => data\n );\n }\n\n random() {\n return this.request(`${this.roomUrl}/random`).then(({ data }) => data);\n }\n\n trending() {\n return this.request(`${this.roomUrl}/trending?limit=9`).then(({ data }) =>\n this.staff().then(staffGifs => [...data, ...staffGifs])\n );\n }\n\n staff() {\n return this.request(`${this.roomUrl}/staff`).then(({ data }) => data);\n }\n\n randomForQuery(query) {\n return new Promise((res, rej) => {\n this.search(query)\n .then(data => {\n if (!Array.isArray(data)) {\n return [];\n }\n return data.filter(img => img.images.original_mp4.mp4_size >= 40000);\n })\n .then(largerGifs => {\n if (largerGifs.length === 0) {\n throw new TypeError('No data found');\n }\n res(largerGifs[Math.floor(Math.random() * largerGifs.length)]);\n })\n .catch(rej);\n });\n }\n\n request(url) {\n return fetch(new Request(url))\n .then(response => response.json())\n .catch(error => {\n Logger.warn('GiphyApi', url, error);\n return { data: [] };\n });\n }\n}\n\nexport default GiphyApi;\n","import Logger from './Logger.js';\n\nconst updateInterval = 100;\n\n/**\n * Sound Meter that generates a number correlated to audio volume. The meter\n * itself displays nothing, but it makes the instantaneous and time-decaying\n * volumes available for inspection. It also reports on the fraction of samples\n * that were at or near the top of the measurement range.\n **/\nclass SoundMeter {\n // eslint-disable-next-line max-statements\n constructor() {\n this.level = 0;\n this.instant = 0;\n this.silenceDuration = 0;\n this.intervalCounter = 0;\n this.track = null;\n this.context = null;\n this.source = null;\n this.analyser = null;\n this.volumes = null;\n this.listener = [];\n this.timer = null;\n this.errorTimer = null;\n this.boundOnTrackEnded = this.onTrackEnded.bind(this);\n this.initError = false;\n this.init();\n }\n\n /**\n * Initialize audio context and prepare script processor to read input\n * channel data.\n **/\n init() {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof AudioContext === 'undefined') {\n Logger.error(\n 'AudioContext is not available. Probably the current' +\n ' user agent does not support this feature. Use the feature detector' +\n ' to hide not supported elements. Any call on onUpdate will not' +\n ' send values.'\n );\n return;\n }\n this.context = new AudioContext();\n\n this.context.onstatechange = ({ target }) => {\n if (target.state === 'suspended') {\n Logger.error('SoundMeter::init AudioContext: ', target.state);\n }\n };\n }\n\n /**\n * Connect to a media stream.\n **/\n // eslint-disable-next-line max-statements\n connectToSource(stream) {\n if (!this.context) {\n return this;\n }\n if (!stream || stream.getAudioTracks().length < 1) {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n Logger.debug('SoundMeter::connectToSource', stream);\n [this.track] = stream.getAudioTracks();\n if (this.track.readyState !== 'live') {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n this.track.addEventListener('ended', this.boundOnTrackEnded);\n this.source = this.context.createMediaStreamSource(stream);\n const analyser = this.context.createAnalyser();\n analyser.fftSize = 512;\n analyser.minDecibels = -127;\n analyser.maxDecibels = 0;\n analyser.smoothingTimeConstant = 0.5;\n this.source.connect(analyser);\n this.analyser = analyser;\n this.volumes = new Uint8Array(analyser.frequencyBinCount);\n if (!this.running && this.listener.length > 0) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n return this;\n }\n\n /**\n * Read audio level. Avoids triggering a re-render of the device-dialog\n * when the change is below 1% which wouldn't be noticable anyways.\n *\n * NOTE: When an USB Microphone is abruptly disconnected. The\n * intervalCounter reacts: when switching to a different mic, it seems to\n * take a bit to not return 0.00 for the audio level.\n **/\n // eslint-disable-next-line max-statements\n analyse() {\n const { analyser, volumes, level } = this;\n if (!analyser) {\n return;\n }\n analyser.getByteFrequencyData(volumes);\n let volumeSum = 0;\n for (const volume of volumes) {\n volumeSum += volume;\n }\n const averageVolume = volumeSum / volumes.length;\n const instant = Math.min(Math.round((averageVolume * 100) / 127), 100);\n\n // Handle microphone disconnect\n if (level === 0 && instant === 0 && this.intervalCounter === 10) {\n this.silenceDuration++;\n if (this.silenceDuration > 30 && !this.errorTimer) {\n this.errorTimer = setTimeout(() => {\n this.emit({ warning: 'MicrophoneSilenceWarning' });\n this.resetSilenceCounter();\n }, 1000);\n }\n }\n\n if (level !== instant) {\n // Clear a MicrophoneError once we get a signal, intervalCounter might be\n // too low sometimes.\n if (this.silenceDuration > 0) {\n this.resetSilenceCounter();\n }\n const diff = Math.abs(level - instant);\n if (diff >= 1) {\n this.level = instant;\n this.emit({ value: instant });\n }\n }\n if (this.intervalCounter < 10) {\n this.intervalCounter++;\n }\n }\n\n resetSilenceCounter() {\n clearTimeout(this.errorTimer);\n this.errorTimer = null;\n this.silenceDuration = 0;\n }\n\n /**\n * Stop read interval and disconnect from stream.\n **/\n // eslint-disable-next-line max-statements\n stop() {\n this.offUpdate();\n if (this.track) {\n this.track.removeEventListener('ended', this.boundOnTrackEnded);\n this.track = null;\n }\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n this.volumes = null;\n if (this.context && this.context.stop && this.context.state !== 'closed') {\n this.context.onstatechange = null;\n this.context.close();\n this.context = null;\n }\n }\n\n onUpdate(listener) {\n this.listener.push(listener);\n if (this.initError) {\n this.onTrackEnded();\n return;\n }\n if (!this.running && this.context && this.track) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n }\n\n offUpdate() {\n clearTimeout(this.errorTimer);\n this.listener.length = 0;\n if (this.running) {\n clearInterval(this.timer);\n this.running = false;\n }\n }\n\n onTrackEnded() {\n this.emit({ error: 'EyesonMicrophoneError' });\n this.stop();\n }\n\n emit(message) {\n this.listener.forEach(fn => fn(message));\n }\n}\n\nexport default SoundMeter;\n","import Logger from './Logger.js';\nimport FeatureDetector from './FeatureDetector.js';\n\n// sampleRate in Herz (Hz) to perform the check\nconst sampleRate = 1;\n\n// https://developer.chrome.com/docs/web-platform/compute-pressure/\nclass SystemPressureMonitor {\n constructor() {\n this._listener = [];\n this._monitor = null;\n this._running = false;\n this.state = null;\n }\n\n onUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener.push(listener);\n }\n }\n\n offUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener = this._listener.filter(fn => fn !== listener);\n } else {\n this._listener.length = 0;\n }\n }\n\n _emit(records) {\n // states are 'nominal', 'fair', 'serious', 'critical'\n // https://github.com/w3c/compute-pressure#design-considerations\n const { state } = records[records.length - 1];\n if (state === this.state) {\n return;\n }\n this.state = state;\n Logger.debug('SystemPressureMonitor::emit', state);\n this._listener.forEach(fn => {\n try {\n fn(state);\n } catch (error) {\n Logger.error('SystemPressureMonitor::emit', error);\n }\n });\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n if (FeatureDetector.canMonitorSystemPressure() === false) {\n Logger.error('SystemPressureMonitor is not supported');\n return;\n }\n try {\n if (!this._monitor) {\n // eslint-disable-next-line no-undef\n this._monitor = new PressureObserver(this._emit.bind(this), {\n sampleRate\n });\n }\n if (!this._running) {\n await this._monitor.observe('cpu');\n this._running = true;\n }\n if (this.state === null) {\n this._emit([{ state: 'nominal' }]);\n }\n Logger.debug('SystemPressureMonitor::start');\n } catch (error) {\n Logger.error('SystemPressureMonitor::start', error);\n }\n }\n\n stop() {\n if (this._monitor && this._running) {\n this._monitor.disconnect();\n this._running = false;\n }\n }\n\n destroy() {\n this.stop();\n this.offUpdate();\n this.state = null;\n this._monitor = null;\n }\n}\n\nexport default SystemPressureMonitor;\n","import eyeson from './src/eyeson.js';\n\nimport Logger from './src/Logger.js';\nimport MicMixer from './src/MicMixer.js';\nimport GiphyApi from './src/utils/GiphyApi.js';\nimport debounce from './src/utils/debounce.js';\nimport throttle from './src/utils/throttle.js';\nimport immediate from './src/utils/immediate.js';\nimport SoundMeter from './src/SoundMeter.js';\nimport LocalStorage from './src/LocalStorage.js';\nimport DeviceManager from './src/DeviceManager.js';\nimport FeatureDetector from './src/FeatureDetector.js';\nimport FullscreenHelper from './src/FullscreenHelper.js';\nimport MediaStreamBuilder from './src/MediaStreamBuilder.js';\nimport * as StreamHelpers from './src/utils/StreamHelpers.js';\nimport ConnectionStatistics from './src/utils/ConnectionStatistics.js';\nimport SystemPressureMonitor from './src/SystemPressureMonitor.js';\n\nexport {\n Logger,\n MicMixer,\n GiphyApi,\n debounce,\n throttle,\n immediate,\n SoundMeter,\n LocalStorage,\n StreamHelpers,\n DeviceManager,\n FeatureDetector,\n FullscreenHelper,\n MediaStreamBuilder,\n ConnectionStatistics,\n SystemPressureMonitor,\n};\n\nexport default eyeson;\n"],"names":["objectTypes","root","window","this","freeExports","exports","freeModule","module","nodeType","freeGlobal","g","global","self","maxSafeInteger","Math","pow","reOpera","objectProto","Object","prototype","hasOwnProperty","toString","capitalize","string","String","charAt","toUpperCase","slice","format","trim","test","forOwn","object","callback","key","call","getClassOf","value","qualify","replace","reduce","array","accumulator","index","length","each","platform","parse","ua","context","isCustomContext","nav","navigator","userAgent","data","isSpecialCasedOS","property","type","likeChrome","objectClass","airRuntimeClass","enviroClass","javaClass","java","phantomClass","rhino","environment","alpha","beta","doc","document","opera","operamini","operaClass","arch","description","prerelease","useFeatures","version","layout","result","guess","RegExp","pattern","exec","label","name","guesses","getName","product","getProduct","manufacturer","getManufacturer","os","split","cleanupOS","getOS","getVersion","patterns","push","unshift","indexOf","parseFloat","runtime","flash","system","Capabilities","phantom","major","minor","patch","documentMode","toFixed","lang","System","getProperty","require","join","e","process","browser","versions","electron","node","nw","appMinorVersion","external","parseInt","family","architecture","cpuClass","isCommonjs","fn","val","fnMap","i","l","ret","eventNameMap","change","fullscreenchange","error","fullscreenerror","screenfull","request","element","options","Promise","resolve","reject","onFullScreenEntered","off","bind","on","returnPromise","documentElement","requestFullscreen","then","catch","exit","isFullscreen","onFullScreenExit","exitFullscreen","toggle","onchange","onerror","event","eventName","addEventListener","removeEventListener","raw","defineProperties","get","Boolean","fullscreenElement","enumerable","isEnabled","fullscreenEnabled","SDPUtils","random","substring","localCName","generateIdentifier","splitLines","blob","map","line","splitSections","part","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","parseCandidate","parts","candidate","foundation","component","protocol","toLowerCase","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","undefined","writeCandidate","sdp","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","id","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","find","existingFeedback","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","stream","track","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","_typeof","_regeneratorRuntime","__esModule","t","r","n","o","defineProperty","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","arg","h","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","displayName","isGeneratorFunction","constructor","mark","setPrototypeOf","__proto__","awrap","async","reverse","pop","prev","stop","rval","handle","complete","finish","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","definition","prop","nmd","paths","children","_classCallCheck","instance","Constructor","_toPropertyKey","input","hint","prim","toPrimitive","res","Number","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","api","allowSafariSFU","screencapture","widescreen","_console","console","apply","arguments","warn","_console2","info","_console3","log","debug","_console4","ComApi","token","cache","users","errorCallback","_handleError","path","fetch","Request","response","contentType","headers","ok","json","text","concat","status","form","namespace","fd","FormData","formKey","File","append","_objectToFormData","_request","body","formData","Logger","userId","_this","user","cachedUser","apiUser","extendedUser","addUserAttributes","clientId","largeAvatarUrl","avatar","assign","apiId","sipId","largeAvatar","_this2","_post","email","custom_fields","locale","player_url","playerUrl","stream_url","streamUrl","_put","snapshotId","_this3","playback","play_id","func","wait","args","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","setTimeout","_setPrototypeOf","_inherits","subClass","superClass","_assertThisInitialized","ReferenceError","_possibleConstructorReturn","_getPrototypeOf","BaseEvent","msg","StartPlaybackEvent","_BaseEvent","_super","_createSuper","_api","startPlayback","StopPlaybackEvent","_BaseEvent2","_super2","stopPlayback","_get","Reflect","receiver","base","desc","getOwnPropertyDescriptor","PublicEvent","_src","deleteProperty","listeners","StartAnnotationEvent","_PublicEvent","annotationLoop","setInterval","createAnnotation","annotation","clearInterval","StopAnnotationEvent","_PublicEvent2","stopAnnotation","StfuEvent","_rtConnection","send","IgnoreEvent","ForwardEvent","_arrayLikeToArray","arr","len","arr2","Array","_unsupportedIterableToArray","minLen","from","_slicedToArray","isArray","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","wrapPeerConnectionEvent","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","has","unwrappedCb","delete","size","disableLog","bool","disableWarnings","deprecated","oldMethod","newMethod","isObject","compactObject","isObj","isEmptyObject","walkStats","stats","resultSet","endsWith","filterStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","shimGetUserMedia","browserDetails","mediaDevices","constraintsToChrome_","mandatory","optional","cc","ideal","exact","min","max","oldname_","oc","mix","advanced","shimConstraints_","constraints","audio","remap","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","some","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","DOMException","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","splice","origAddStream","addStream","origRemoveStream","removeStream","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","successCallbackWrapper_","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","RTCSessionDescription","signalingState","oldStream","nativeMethod","methodObj","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","streamid","shimPeerConnection","webkitRTCPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","code","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","encodings","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","all","finally","shimCreateAnswer","origCreateAnswer","createAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","toJSON","sdpMid","sdpMLineIndex","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","mLine","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","getMaxMessageSize","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","adapter","shimChrome","shimFirefox","shimSafari","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","commonShim","browserShim","adapterFactory","FullscreenHelper","onChange","hasSupport","_canvasBlurSupport","canMix","canPip","hasPipSupport","canSFU","isPhone","inIframe","isIOSDevice","canUseEyeson","canFullscreen","hasMobileDevice","canToggleCamera","canPresentFiles","canScreenCapture","canAdjustSettings","canAdjustDeviceSettings","canStreamLocalMedia","isExperimentalBrowser","isWebView","hasGetUserMedia","canDataChannel","isMinimumRequiredBrowser","hasGetDisplayMedia","hasPeerConnection","hasCaptureStream","HTMLMediaElement","hasCanvasCaptureSupport","hasSenders","hasTrackOnUnmute","isSafari","browserVersion","isWorkingIOSBrowser","hasWebpSupport","isChrome","isFF","canChangeAudioOutput","canChangeMicrophone","isOldSafari","isTestSuite","canMultipleDifferentMicrophones","canChangeCamera","config","isIPhone","audioContext","every","requiresLowerConstraints","browserName","txt","isEdge","isMinimumRequiredChrome","isMinimumRequiredFF","isMinimumRequiredSafari","isMinimumRequiredEdge","iOSBrowser","operaTouch","HTMLVideoElement","pictureInPictureEnabled","iOSPipCheck","support","createElement","preload","src","onsuspend","wkEnabled","webkitSupportsPresentationMode","isAndroidDevice","maxTouchPoints","MSStream","screen","isAndroidPhone","isAndroid","isMobile","isMacOS","userAgentData","top","isTouchDevice","canDisplayTooltips","canDrawCamera","stopsDeviceActivityIndicatorOnDisable","supportsBlurOnSVG","SVGElement","blur","hasLocalStorage","localStorage","setItem","canGet","getItem","safariWithoutVP8","uAVersion","disallowAudioSyncSrcChange","canShare","share","canVirtualBackground","WebAssembly","validate","instantiateStreaming","instantiate","CanvasRenderingContext2D","ImageData","requestAnimationFrame","canvasBlurSupport","canvas1","canvas2","ctx1","getContext","ctx2","fillStyle","fillRect","data1","getImageData","data2","canStereo","canChooseDisplaySurface","displaySurface","hasPipCamSupport","canMonitorSystemPressure","PressureObserver","supportedSources","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","NinjaStream","_stream","createStream","canvas","captureStream","CanvasCaptureMediaStream","fallbackStorage","FeatureDetector","store","load","defaultValueParam","defaultValue","storedValue","stack","messageName","CanvasMedia","CanvasCaptureMediaStreamTrack","hasAudio","enabled","hasVideo","disableAudio","enableAudio","toggleAudio","toggleVideo","stopTrack","stopStream","isScreenTrack","isScreenPresentationTrack","isScreenAsVideoTrack","isCanvasTrack","isNinjaStreamTrack","isVbgStreamTrack","isCameraTrack","getScreenTracks","getScreenPresentationTracks","getScreenAsVideoTracks","getCameraTracks","getVbgTracks","stopCamera","disableCamera","enableCamera","toggleCamera","toggleVbgTrack","getCanvasTracks","isScreenStream","isScreenPresentationStream","isCanvasStream","isVBGStream","isCameraStream","isCanvasPresentationStream","isPresentationStream","hasCameraVideo","getFacingMode","settings","requestFrame","createExternalStream","audioOnly","aTrack","vTrack","audioTrack","ac","createMediaStreamDestination","close","createFakeAudioTrack","videoTrack","createFakeVideoTrack","source","stopPropagation","postMessage","fps","raf","focus","abort","animationFrameThen","throttledRAF","elapsed","throttledImmediate","immediate","_requestAnimationFrame","cancelAnimationFrame","_cancelAnimationFrame","visibilityState","integrity","URL","location","href","script","onload","parentNode","remove","algo","hash","head","cacheStorageSupport","CacheStorage","storeBlobURL","_ref","_callee","blobURL","_context","caches","open","put","Response","t0","_x","_x2","loadBlobURL","_ref2","_callee2","_context2","createObjectURL","_x3","deleteBlob","_ref3","_callee3","_context3","_x4","_mulTable","_shgTable","_canvas","_ctx","_previous","_r","_g","_b","_vmin","_vmax","run","imageBitmap","amount","desynchronized","drawImage","imageData","wm","hm","rad1","mulSum","shgSum","Uint32Array","iterations","p1","p2","yw","yi","rsum","gsum","bsum","x","yp","putImageData","OffscreenCanvasSupport","OffscreenCanvas","OffscreenCanvasBlurSupport","OffscreenCanvasRenderingContext2D","ImageBitmapSupport","createImageBitmap","TrackProcessorSupport","MediaStreamTrackProcessor","SIMDSupport","Uint8Array","EventTargetConstructorSupport","EventTarget","_max","_stateChange","_segmentationModel","_tflite","_tfliteReady","_tfliteLoading","_inputMemoryOffset","_outputMemoryOffset","_localImageFile","_localImageFileBackup","initiateTFLite","loading","model","modelBufferOffset","importScript","arrayBuffer","_getModelBufferMemoryOffset","HEAPU8","_loadModel","_getInputMemoryOffset","_getOutputMemoryOffset","createOffscreenCanvas","ctx","LocalStorage","cacheStorage","loadImage","state","emitLoading","img","Image","host","crossOrigin","checkImageLoad","loadImageFile","callbackFN","accept","files","revokeObjectURL","click","createImageCanvas","image","hRatio","vRatio","ratio","imgWidth","imgHeight","centerShiftX","centerShiftY","createGeneraliCanvas","createGradientCanvas","gradient","createLinearGradient","startX","startY","endX","endY","addColorStop","color1","color2","createBlurCanvas","fullLength","bigWidth","bigHeight","blurCanvas","imageCanvas","_allowedTypesCheck","setState","VirtualBackgroundMixer","originalStream","outStream","reader","segmentationMaskCanvas","segmentationMaskCtx","segmentationMask","videoCanvas","videoCtx","playPromise","paused","throttledAnimationFrame","drawVideo","backgroundOld","backgroundType","backgroundValue","blurInit","canvasBlur","loadingListener","handleStateChange","_checkExternalImage","_initBackground","_drawVideo","listener","userMediaStream","videoTracks","trackSettings","stopOriginalStream","terminate","imageSmoothingEnabled","canvasTrack","srcLabel","srcDeviceId","start","_this$size","processor","readable","getReader","playsInline","muted","srcObject","willReadFrequently","initBackground","onloadeddata","play","frame","_yield$this$reader$re","heap","maskData","pixelCount","heapIndex","imgIndex","_index","person","read","displayWidth","displayHeight","t1","HEAPF32","_runInference","globalCompositeOperation","drawBackground","blurred","_callee4","_this$size2","_image","_context4","setBackgroundFallback","_this$size3","pause","_this4","_callee5","_context5","changedDevices","listA","listB","_ret","_loop","_deviceA","_found","deviceB","groupId","deviceA","found","DeviceManager","sinkId","eco","cameras","speakers","microphones","terminationInProgress","virtualBackground","virtualBackgroundType","getSinkId","setStream","handleError","verifyStream","storeConstraints","adjustAudioTrack","initiateVirtualBackground","_setVirtualBackgroundType","wasOff","willBeOff","isTypeAllowed","checkExternalImage","changeBackground","update","loadLocalImage","setVirtualBackgroundType","watchForNewDevices","fetchDevices","setDevices","getConstraints","ondevicechange","destroy","camHasChanged","micHasChanged","speakerHasChanged","emit","_this5","_this6","initiateStream","updateCache","_this7","firstRun","emitStreamUpdate","videoConstraints","audioConstraints","preventUpdate","device","optionsParam","getDevices","determineConstraintsForDevices","channelCount","videoDeviceId","audioDeviceId","applyLastUsedDevices","applyWidescreen","videoId","audioId","eyesonOptions","findIndex","speaker","isBlobAvailable","getImageBlobOrFallback","MediaStreamBuilder","surface","screenStream","existingStream","micMixer","vbgMixer","isPresentation","deviceMonitor","tempStream","brokenTrackCallback","bindMethods","_addScreenTrack","getMediaStream","addNinjaTrack","addCanvasTrack","addScreenTrack","adjustVideoTrack","addScreenStreamTrack","initializeVirtualBackground","_this$options","active","onended","canvasStream","displayStream","audioStream","mixScreenshareAudio","setMicOnlyStream","fetchInputDevices","applyTempTracks","cleanupTempStream","discardTempTracks","_this$options2","getMobileConstraints","addVideoTrack","_this$options3","addAudioTrack","_this$options4","_this$options5","_getScreenPresentatio","_getScreenPresentatio2","screenTrack","echoCancellation","surfaceSwitching","selfBrowserSurface","systemAudio","_this$options6","fillerTrack","_this$options7","MicMixer","acOut","micOnlyStream","videoStream","audioTracks","createMediaStreamSource","connect","displayAudio","noMix","initMixScreenshareMix","exc","adjustMediaStreamTracks","ChangeLocalStreamEvent","_ref$screen","_session","localStream","wasScreenAsVideo","resume","suspend","locallyChanged","PodiumEvent","hasPresenter","stopPresentingSet","scanMessageForLocalStreamOptimization","isSource","isPresenter","hasDesktopSources","SnapshotEvent","takeSnapshot","SetLayerEvent","setLayer","SendChatEvent","content","StopRtmpEvent","stopBroadcast","SetLayoutEvent","setLayout","StartRtmpEvent","_this$context","startBroadcast","EventEmitter","detail","clear","CustomEvent","_EventEmitter","Transport","connection","wasOpen","WebSocket","endpoint","auth_token","onopen","onmessage","onclose","OPEN","was_open","removeAllListeners","R_CRLF","atob","supportsRandomUUID","crypto","randomUUID","bytes","getRandomValues","char","byte","UserAgent","_call","_handleSdpUpdate","_onMessage","failed","transportOptions","checkUserAgentOptions","callId","sessionDescriptionHandler","initAuthToken","debouncedHandleSDPUpdate","ms","_len","_key","nextArgs","slowdown","handleSdpUpdate","verifySender","setCallId","call_id","setDescription","termination","reason","reject_code","term_code","jwt","parseJwtPayload","client_id","conf_id","exp","to","answerSdp","updateDescription","crlfNormalize","msg_id","uuid","transport","onEvent","sessionDescriptionHandlerFactory","sessionDescriptionHandlerFactoryOptions","onMessage","display_name","client_name","mute_video","authToken","onReconnect","seppEvent","offEvent","transportEvent","isConnected","PodiumFacade","_message$src","psrc","asrc","vsrc","dsrc","dims","sources","presenterIdx","audioSources","videoSources","desktopSources","dimensions","userSourceIndex","Set","presenter","isInteger","userVideoIndex","SigMessageTransformer","stamp","sourceUpdate","voiceActivity","source_update","voice_activity","podium","solo","isSolo","hasAudioPosition","hasVideoPosition","hasMedia","userDimensions","hasVideoSources","hasMutedVideoPeers","cid","SessionDescriptionHandler","datachannel","peerConnection","remoteStream","connected","iceCheckingTimer","peerConnectionReady","handleConnectionStateChange","initPeerConnection","_updateDescription","_setDescription","_getDescription","offer","RTCOfferOptions","SDPModifiers","modifier","localDescription","passive","sessionDescription","seppMessaging","remoteDescriptionUpdate","answer","stopAllTracks","pcOptions","buildPeerConnectionOptions","resolveReady","negotiated","handleDatachannel","onicecandidate","onicegatheringstatechange","iceGatheringState","sendOnly","ontrack","handleOntrack","uaOptions","onunmute","handleUnmute","handleAccept","initDatachannel","stun_servers","turn_servers","turnServer","credential","getLocalStream","stopUnusedTracks","tracksExist","audioSender","videoSender","replaceTrack","hasExternalStream","factor","rtp","SigConnection","signaling","messageListener","initUserAgentOptions","transformer","signalingOptions","SEPP","mediaOptions","handleMessage","roomData","WHITELIST","transformedMessage","sendSeppMessage","errorHandler","RoomReceived","rtData","ready","_msg$content","room","links","_eyeson","_connection","connectionStatus","startSigConnection","FetchRoomEvent","getRoom","DeleteFileEvent","deleteFile","file","UploadFileEvent","uploadFile","addFile","ReceiveChatEvent","getUser","forwardMessage","ts","created_at","StartStreamEvent","_ref$audio","_ref$video","_ref$virtualBackgroun","_ref$surface","getStoredVirtualBackgroundType","ChangeStreamEvent","onBrokenTrackError","canvasMixer","ReplaceStreamEvent","ToggleCameraEvent","AcceptSessionEvent","session","getRemoteStream","StopRecordingEvent","stopRecording","VoiceActivityEvent","StartRecordingEvent","startRecording","ScreenCaptureEvent","present","detectDisplaySurface","StartPresentingEvent","_handle","videoPlayer","invokeStream","_ref$stream","_ref$present","presentationStream","isStreaming","streamVideo","StopPresentingEvent","StopBroadcastsEvent","stopAllBroadcasts","ClearFrontLayerEvent","clearFrontLayer","RequestGuestUserEvent","requestUser","access_key","isLocked","locked","SessionTerminationEvent","ParticipantListUpdateEvent","add","initial","addition","del","playing","toFixedNumber","number","callNow","FPS_INTERVAL","CAMERA_SMALL","CAMERA_MEDIUM","CAMERA_LARGE","CAMERA_NONE","supportsTrackProcessor","defaultTrack","bindVideoToStream","_track$getSettings","CanvasMixer","camera","xPos","camSize","isCanvasCapture","draw","onRedraw","setCamera","drawFrame","calcSizesAndPositions","bouncedDraw","debounce","_draw","redrawCallback","mixer","cameraStream","horizontal","vertical","originalCanvas","getCanvasCaptureTrackCanvas","redrawQueued","position","cameraPosition","cameraSizeInWords","sourceAspectRatio","targetAspectRatio","_this$screenStream$ge3","screenStreamSettings","fitScreen","_this$cameraStream$ge3","cameraTrackSettings","small","medium","large","none","scaledCam","scale","sizes","camPosition","positions","screenFrame","cameraFrame","_result","performance","ReadableStreamDefaultReader","clearRect","imgData","createImageData","StartMixerEvent","_ref$changeStream","changeStream","vbgType","UpdateMixerEvent","videoFrameSupport","requestVideoFrameCallback","VideoPlayer","onReady","onDuration","onTimeUpdate","onEnd","performAction","gainNode","timer","boundDrawVideoFrame","drawVideoFrame","boundInitCanvasStream","initCanvasStream","isPlaying","blockTimeUpdate","initTimeout","invokationTimer","initVideo","autoplay","onplaying","onVideoPlay","onpause","onVideoPause","onseeked","onVideoSeeked","ontimeupdate","onVideoTimeUpdate","onVideoReady","onVideoError","onVideoEnd","duration","videoWidth","videoHeight","createGain","createMediaElementSource","destination","onVideoAction","currentTime","onPlayAction","onPauseAction","onTimeAction","onVolumeAction","time","volume","gain","canvasStreamTrack","cancelVideoFrameCallback","disconnect","StartMediaEvent","MediaError","LockMeetingEvent","lockMeeting","TerminateMeetingEvent","terminateMeeting","KickUserEvent","kickUser","VirtualBackgroundEvent","destroySessionMicMixer","getScreenErrorName","ScreenVideoChangeEvent","mediaStreamBuilder","_getScreenAsVideoTrac","_getScreenAsVideoTrac2","ScreenVideoStoppedEvent","DeviceMonitor","tempAudioTrack","tempVideoTrack","audioEnded","videoEnded","boundOnAudioEnd","onAudioEnd","boundOnVideoEnd","clearTracks","PipCam","isActive","startTimer","_destroy","_stop","_initCamera","_initVideoAndPip","_updateCamera","_start","initFakeStream","initVideoAndPip","initCamera","Path2D","fill","onleavepictureinpicture","onExitPip","requestPictureInPicture","onDeviceEvent","pictureInPictureElement","exitPictureInPicture","_callee6","_context6","StartPipCamEvent","pipCam","StopPipCamEvent","UpdatePipCamEvent","_BaseEvent3","_super3","updateCamera","AudioDeviceEndEvent","_tracks","mediaConstraints","newAudioDevice","VideoDeviceEndEvent","_handle2","AllDevicesEndEvent","_PublicEvent3","_handle3","_tracks2","_track$getSettings2","EventHandler","_monitor","end","con","mon","ses","_rtData","eyeson","silenced","stfu","chat","snapshot","send_chat","set_layer","set_layout","fetch_room","room_ready","RoomReceivedEvent","room_setup","memberlist","upload_file","delete_file","request_stfu","change_stream","replace_stream","toggle_camera","stop_playback","playback_update","start_playback","start_stream","stop_recording","start_screen_capture","StartScreenCaptureEvent","stop_broadcasts","start_recording","stop_presenting","start_presenting","stop_annotation","start_annotation","clear_front_layer","request_guest_user","voice_activity_raw","start_mixer","update_mixer","lock_meeting","terminate_meeting","kick_user","session_termination","start_media","change_screen_video","stop_screen_video","stop_rtmp","start_rtmp","suspend_virtual_background","audio_device_ended","video_device_ended","all_devices_ended","start_pip_cam","stop_pip_cam","update_pip_cam","capture_error","options_update","ext_not_installed","broadcasts_update","presentation_ended","recording","ext_cancel","ext_installed","message_status","moderator_info","addOriginToSDP","addSessionAttributes","splitSDP","tLineIdx","startsWith","addIndex","addStereo","stereo","codecMatch","fmtpRegExp","fmtpMatch","entry","_entry$split2","entries","doIt","row","getModifiers","modifiers","ConferenceSession","comApi","RTCConstraints","defaultRTCConstraints","accepted","restarting","sipSession","startAttempts","maxStartAttempts","tryAuthUpdate","tryResume","tryWaitResume","resumeTimer","waitResumeTimer","endSession","initSession","handleFailed","restartSession","tryRecoveryFrom","terminateSession","_setStream","initExternalStream","initDeviceMonitor","initVirtualBackground","buildSessionOptions","startSession","onUnmute","adjustVideoPodium","handleTermination","getMicOnlyStream","monitor","observe","sdpWrapper","sfu","sfuLine","handleExit","updateAuthAndRestartSession","updateAuthAndResume","NotFoundError","NotAllowedError","NotReadableError","errorCodeName","failure","recovery","condition","action","Status","NO_CONNECTION","BAD","OK","GOOD","addHistory","history","getOldestHistoryEntry","getHistoryAverage","_step","jitter","packetLoss","roundTripTime","nack","bitrateSend","bitrateRecv","newest","getNewestHistoryEntry","_iterator","_createForOfIteratorHelper","packetLossRate","nackRate","calculateStatus","ConnectionStatistics","lastStat","bytesSent","bytesReceived","out","packetsSent","packetsLost","in","packetsReceived","nackCount","boundPrintStats","printStats","_printStats","statsCurrentRoundTripTime","average","mediaType","diff","received","localId","hasRTT","hasJitter","hasPacketLoss","hasNackCount","lost","packets","currentRoundTripTime","onLine","statistics","ConnectionMonitor","disconnectTimer","prevIceState","onOffline","handleIceStateChange","addEventListeners","oniceconnectionstatechange","onconnectionstatechange","init","currentTarget","currentIceState","adapters","logger","messages","getTime","secondsSince","visibilityDidChange","reconnectAttempts","isRunning","startedAt","stoppedAt","startPolling","staleThreshold","stopPolling","recordPing","pingedAt","recordConnect","disconnectedAt","recordDisconnect","poll","pollTimeout","reconnectIfStale","getPollInterval","reconnectionBackoffRate","connectionIsStale","refreshedAt","disconnectedRecently","reopen","isOpen","INTERNAL","message_types","welcome","ping","confirmation","rejection","disconnect_reasons","unauthorized","invalid_request","server_restart","default_mount_path","protocols","supportedProtocols","Connection","consumer","subscriptions","disconnected","webSocket","getState","uninstallEventHandlers","installEventHandlers","allowReconnect","reopenDelay","getProtocol","isState","isProtocolSupported","states","events","handler","identifier","reconnect","reload","confirmSubscription","notify","notifyAll","willAttemptReconnect","Subscription","mixin","properties","extend","perform","command","unsubscribe","SubscriptionGuarantor","pendingSubscriptions","guarantee","subscription","startGuaranteeing","forget","stopGuaranteeing","retrySubscribing","retryTimeout","subscribe","Subscriptions","guarantor","channelName","ensureActiveConnection","findAll","sendCommand","callbackName","Consumer","_url","createWebSocketURL","createConsumer","querySelector","getAttribute","getConfig","ActionCableConnection","onMessageHandler","defaultMessageHandler","onReceived","offMessage","onConnected","onDisconnected","cable","RoomChannel","UserChannel","disconnectTimestamp","handleReconnect","_ref$channel","_ref$type","updateStatus","core","eventHandler","prepareConnection","rtConnection","websocket","keepRoomAlive","counter","pollingFallbackInterval","pollingFallback","eyesonClass","onReceive","removeListener","setMonitor","broadcasts","loadInitialInfos","joinSession","joinOnConnect","_throttledSend","throttle","_toConsumableArray","iter","GiphyApi","roomUrl","query","staff","staffGifs","_ref4","rej","search","images","original_mp4","mp4_size","largerGifs","floor","SoundMeter","level","instant","silenceDuration","intervalCounter","analyser","volumes","errorTimer","boundOnTrackEnded","onTrackEnded","initError","onstatechange","_stream$getAudioTrack2","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","frequencyBinCount","running","analyse","getByteFrequencyData","volumeSum","averageVolume","round","warning","resetSilenceCounter","abs","offUpdate","SystemPressureMonitor","_listener","_running","records","_emit","sampleRate"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/eyeson.js b/dist/eyeson.js index 87cbcc79f527f4e4bfaadc921fd016414660a222..dd98c9f2ee3d51c56692af6fb76b927570432995 100644 --- a/dist/eyeson.js +++ b/dist/eyeson.js @@ -10,5 +10,5 @@ * v5.2.0 - 2021-11-03 * (c) Sindre Sorhus; MIT License */ -!function(){"use strict";var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},n=e.exports,r=function(){for(var e,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],r=0,i=n.length,o={};r<i;r++)if((e=n[r])&&e[1]in t){for(r=0;r<e.length;r++)o[n[0][r]]=e[r];return o}return!1}(),i={change:r.fullscreenchange,error:r.fullscreenerror},o={request:function(e,n){return new Promise(function(i,o){var s=function(){this.off("change",s),i()}.bind(this);this.on("change",s);var a=(e=e||t.documentElement)[r.requestFullscreen](n);a instanceof Promise&&a.then(s).catch(o)}.bind(this))},exit:function(){return new Promise(function(e,n){if(this.isFullscreen){var i=function(){this.off("change",i),e()}.bind(this);this.on("change",i);var o=t[r.exitFullscreen]();o instanceof Promise&&o.then(i).catch(n)}else e()}.bind(this))},toggle:function(e,t){return this.isFullscreen?this.exit():this.request(e,t)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,n){var r=i[e];r&&t.addEventListener(r,n,!1)},off:function(e,n){var r=i[e];r&&t.removeEventListener(r,n,!1)},raw:r};r?(Object.defineProperties(o,{isFullscreen:{get:function(){return Boolean(t[r.fullscreenElement])}},element:{enumerable:!0,get:function(){return t[r.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return Boolean(t[r.fullscreenEnabled])}}}),n?e.exports=o:window.screenfull=o):n?e.exports={isEnabled:!1}:window.screenfull={isEnabled:!1}}()},539:e=>{"use strict";const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},t.getDescription=function(e){const n=t.splitSections(e);return n&&n[0]},t.getMediaSections=function(e){const n=t.splitSections(e);return n.shift(),n},t.matchPrefix=function(e,n){return t.splitLines(e).filter((e=>0===e.indexOf(n)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let e=8;e<t.length;e+=2)switch(t[e]){case"raddr":n.relatedAddress=t[e+1];break;case"rport":n.relatedPort=parseInt(t[e+1],10);break;case"tcptype":n.tcpType=t[e+1];break;case"ufrag":n.ufrag=t[e+1],n.usernameFragment=t[e+1];break;default:void 0===n[t[e]]&&(n[t[e]]=t[e+1])}return n},t.writeCandidate=function(e){const t=[];t.push(e.foundation);const n=e.component;"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);const r=e.type;return t.push("typ"),t.push(r),"host"!==r&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},t.parseIceOptions=function(e){return e.substring(14).split(" ")},t.parseRtpMap=function(e){let t=e.substring(9).split(" ");const n={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),n.name=t[0],n.clockRate=parseInt(t[1],10),n.channels=3===t.length?parseInt(t[2],10):1,n.numChannels=n.channels,n},t.writeRtpMap=function(e){let t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);const n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},t.parseExtmap=function(e){const t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let n;const r=e.substring(e.indexOf(" ")+1).split(";");for(let e=0;e<r.length;e++)n=r[e].trim().split("="),t[n[0].trim()]=n[1];return t},t.writeFmtp=function(e){let t="",n=e.payloadType;if(void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){const r=[];Object.keys(e.parameters).forEach((t=>{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)})),t+="a=fmtp:"+n+" "+r.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const n=t.matchPrefix(e,"a=mid:")[0];if(n)return n.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let i=3;i<r.length;i++){const o=r[i],s=t.matchPrefix(e,"a=rtpmap:"+o+" ")[0];if(s){const r=t.parseRtpMap(s),i=t.matchPrefix(e,"a=fmtp:"+o+" ");switch(r.parameters=i.length?t.parseFmtp(i[0]):{},r.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+o+" ").map(t.parseRtcpFb),n.codecs.push(r),r.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(r.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const u=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));u.length>0&&u[0].length>1&&u[0][0]===a&&(c=u[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;i=e||t.generateSessionId();return"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let e=0;e<r.length;e++)switch(r[e]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[e].substring(2)}return n?t.getDirection(n):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const n=t.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}},t.parseOLine=function(e){const n=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:n[0],sessionId:n[1],sessionVersion:parseInt(n[2],10),netType:n[3],addressType:n[4],address:n[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const n=t.splitLines(e);for(let e=0;e<n.length;e++)if(n[e].length<2||"="!==n[e].charAt(1))return!1;return!0},e.exports=t},61:(e,t,n)=>{var r=n(698).default;function i(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */e.exports=i=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,o=n.hasOwnProperty,s=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},c=a.iterator||"@@iterator",u=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag";function d(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(e){d=function(e,t,n){return e[t]=n}}function h(e,t,n,r){var i=t&&t.prototype instanceof m?t:m,o=Object.create(i.prototype),a=new P(r||[]);return s(o,"_invoke",{value:C(e,n,a)}),o}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=h;var p={};function m(){}function v(){}function y(){}var g={};d(g,c,(function(){return this}));var b=Object.getPrototypeOf,S=b&&b(b(E([])));S&&S!==n&&o.call(S,c)&&(g=S);var k=y.prototype=m.prototype=Object.create(g);function w(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function x(e,t){function n(i,s,a,c){var u=f(e[i],e,s);if("throw"!==u.type){var l=u.arg,d=l.value;return d&&"object"==r(d)&&o.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,c)}),(function(e){n("throw",e,a,c)})):t.resolve(d).then((function(e){l.value=e,a(l)}),(function(e){return n("throw",e,a,c)}))}c(u.arg)}var i;s(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,i){n(e,r,t,i)}))}return i=i?i.then(o,o):o()}})}function C(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var s=n.delegate;if(s){var a=T(s,n);if(a){if(a===p)continue;return a}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=f(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===p)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}function T(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,T(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),p;var i=f(r,e.iterator,t.arg);if("throw"===i.type)return t.method="throw",t.arg=i.arg,t.delegate=null,p;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function R(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function P(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(R,this),this.reset(!0)}function E(e){if(e||""===e){var t=e[c];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n<e.length;)if(o.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}throw new TypeError(r(e)+" is not iterable")}return v.prototype=y,s(k,"constructor",{value:y,configurable:!0}),s(y,"constructor",{value:v,configurable:!0}),v.displayName=d(y,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,y):(e.__proto__=y,d(e,l,"GeneratorFunction")),e.prototype=Object.create(k),e},t.awrap=function(e){return{__await:e}},w(x.prototype),d(x.prototype,u,(function(){return this})),t.AsyncIterator=x,t.async=function(e,n,r,i,o){void 0===o&&(o=Promise);var s=new x(h(e,n,r,i),o);return t.isGeneratorFunction(n)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},w(k),d(k,l,"Generator"),d(k,c,(function(){return this})),d(k,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=E,P.prototype={constructor:P,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(_),!e)for(var t in this)"t"===t.charAt(0)&&o.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,r){return s.type="throw",s.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r],s=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var a=o.call(i,"catchLoc"),c=o.call(i,"finallyLoc");if(a&&c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(a){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var s=i?i.completion:{};return s.type=e,s.arg=t,i?(this.method="next",this.next=i.finallyLoc,p):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;_(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},t}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},698:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},687:(e,t,n)=>{var r=n(61)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={id:r,loaded:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var r={};return(()=>{"use strict";n.r(r),n.d(r,{ConnectionStatistics:()=>vo,DeviceManager:()=>Bn,FeatureDetector:()=>Xe,FullscreenHelper:()=>Je,GiphyApi:()=>Uo,LocalStorage:()=>nt,Logger:()=>p,MediaStreamBuilder:()=>Ln,MicMixer:()=>Fn,SoundMeter:()=>Ho,StreamHelpers:()=>s,SystemPressureMonitor:()=>zo,debounce:()=>li,default:()=>Go,immediate:()=>qt,throttle:()=>v});var e={};n.r(e),n.d(e,{fixNegotiationNeeded:()=>le,shimAddTrackRemoveTrack:()=>ce,shimAddTrackRemoveTrackWithNative:()=>ae,shimGetDisplayMedia:()=>te,shimGetSendersWithDtmf:()=>ie,shimGetStats:()=>oe,shimGetUserMedia:()=>ee,shimMediaStream:()=>ne,shimOnTrack:()=>re,shimPeerConnection:()=>ue,shimSenderReceiverGetStats:()=>se});var t={};n.r(t),n.d(t,{shimAddTransceiver:()=>be,shimCreateAnswer:()=>we,shimCreateOffer:()=>ke,shimGetDisplayMedia:()=>he,shimGetParameters:()=>Se,shimGetUserMedia:()=>de,shimOnTrack:()=>fe,shimPeerConnection:()=>pe,shimRTCDataChannel:()=>ge,shimReceiverGetStats:()=>ve,shimRemoveStream:()=>ye,shimSenderGetStats:()=>me});var i={};n.r(i),n.d(i,{shimAudioContext:()=>Oe,shimCallbacksAPI:()=>Te,shimConstraints:()=>_e,shimCreateOfferLegacy:()=>Me,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>xe,shimRTCIceServerUrls:()=>Pe,shimRemoteStreamsAPI:()=>Ce,shimTrackEventTransceiver:()=>Ee});var o={};n.r(o),n.d(o,{removeExtmapAllowMixed:()=>Ve,shimAddIceCandidateNullOrEmpty:()=>Ue,shimConnectionState:()=>je,shimMaxMessageSize:()=>Le,shimParameterlessSetLocalDescription:()=>Ne,shimRTCIceCandidate:()=>Ie,shimRTCIceCandidateRelayProtocol:()=>Be,shimSendThrowTypeError:()=>Fe});var s={};function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e){var t=function(e,t){if("object"!==a(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==a(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===a(t)?t:String(t)}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function d(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}n.r(s),n.d(s,{captureStream:()=>zt,createExternalStream:()=>Gt,disableAudio:()=>dt,disableCamera:()=>Mt,enableAudio:()=>ht,enableCamera:()=>Ot,getCameraTracks:()=>_t,getCanvasTracks:()=>It,getFacingMode:()=>Ht,getScreenAsVideoTracks:()=>Rt,getScreenPresentationTracks:()=>Tt,getScreenTracks:()=>Ct,getVbgTracks:()=>Pt,hasAudio:()=>ut,hasCameraVideo:()=>Wt,hasVideo:()=>lt,isCameraStream:()=>Vt,isCanvasPresentationStream:()=>Ut,isCanvasStream:()=>Ft,isNinjaStreamTrack:()=>kt,isPresentationStream:()=>Nt,isScreenAsVideoTrack:()=>bt,isScreenPresentationStream:()=>Lt,isScreenStream:()=>Bt,isVBGStream:()=>jt,isVbgStreamTrack:()=>wt,stopCamera:()=>Et,stopStream:()=>vt,stopTrack:()=>mt,toggleAudio:()=>ft,toggleCamera:()=>At,toggleVbgTrack:()=>Dt,toggleVideo:()=>pt});const h={api:"https://api.eyeson.team",allowSafariSFU:!0,screencapture:!0},f={widescreen:!1},p={error:function(){var e;return(e=console).error.apply(e,arguments)},warn:function(){var e;return(e=console).warn.apply(e,arguments)},info:function(){var e;return(e=console).log.apply(e,arguments)},debug:function(){var e;return console.debug?(e=console).debug.apply(e,arguments):null}};const m=function(){function e(t,n){c(this,e),this.uri=t,this.token=n.replace(/\W+/g,""),this.cache={users:[]},this.errorCallback=null,this._handleError=this._handleError.bind(this)}return d(e,[{key:"_request",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return fetch(new Request(this.uri+e),t).then((function(e){var t=e.headers.get("content-type");if(t&&-1!==t.indexOf("application/json")&&e.ok)return e.json();if(e.ok)return e.text();throw new Error("ComApiError: ".concat(e.status))}))}},{key:"_objectToFormData",value:function(e,t,n){var r=t||new FormData,i=null;for(var o in e){if(!e.hasOwnProperty(o))return;if(n)i=n+"["+(isNaN(parseInt(o))?o:"")+"]";else i=o;"object"!==a(e[o])||e[o]instanceof File?r.append(i,e[o]):this._objectToFormData(e[o],r,o)}return r}},{key:"_post",value:function(e,t){return this._request(e,{method:"POST",body:this._objectToFormData(t)})}},{key:"_put",value:function(e,t){var n=new FormData;for(var r in t)n.append(r,t[r]);return this._request(e,{method:"PUT",body:n})}},{key:"_handleError",value:function(e){return p.error("ComApi::handleError",e),this.errorCallback&&this.errorCallback(e),!1}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"getRoom",value:function(e){return this._request("/rooms/".concat(this.token)).then(e).catch((function(t){return e?e({error:t}):{error:t}}))}},{key:"terminateMeeting",value:function(){return this._request("/rooms/".concat(this.token),{method:"DELETE"}).catch(this._handleError)}},{key:"getUser",value:function(e,t){var n=this,r=this.cache.users.find((function(t){return t.id===e}));return r?(t(r),null):this._request("/rooms/".concat(this.token,"/users/").concat(e)).then((function(r){var i=n.cache.users.filter((function(t){return t.id!==e})),o=n.addUserAttributes(r,e,e);i.push(o),n.cache.users=i,t(o)})).catch(this._handleError)}},{key:"addUserAttributes",value:function(e,t,n){var r=e.avatar;try{r="".concat(e.avatar,"?size=large")}catch(t){p.warn("ComApi::addUserAttributes missing",e)}return Object.assign(e,{id:t,apiId:e.id,clientId:n,sipId:n,largeAvatar:r})}},{key:"kickUser",value:function(e){var t=this;return this._request("/rooms/".concat(this.token,"/users/").concat(e),{method:"DELETE"}).then((function(){if(t.cache.users.find((function(t){return t.id===e}))){var n=t.cache.users.filter((function(t){return t.id!==e}));t.cache.users=n}})).catch(this._handleError)}},{key:"requestUser",value:function(e,t){return this._post("/guests/".concat(this.token),{name:e.name,email:e.email,custom_fields:{locale:e.locale||"en"}}).then(t).catch((function(e){return t({error:e})}))}},{key:"startBroadcast",value:function(e,t){return this._post("/rooms/".concat(this.token,"/broadcasts"),{platform:t,player_url:e.playerUrl||"",stream_url:e.streamUrl})}},{key:"publishBroadcast",value:function(e,t){return this._put("/rooms/".concat(this.token,"/broadcasts/").concat(t),{player_url:e.playerUrl})}},{key:"stopBroadcast",value:function(e){return this._request("/rooms/".concat(this.token,"/broadcasts/").concat(e),{method:"DELETE"})}},{key:"stopAllBroadcasts",value:function(){return this._request("/rooms/".concat(this.token,"/broadcasts"),{method:"DELETE"})}},{key:"startRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"POST"})}},{key:"stopRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"DELETE"}).catch(this._handleError)}},{key:"setLayout",value:function(e){return this._post("/rooms/".concat(this.token,"/layout"),e).catch(this._handleError)}},{key:"setLayer",value:function(e){return this._post("/rooms/".concat(this.token,"/layers"),e).catch(this._handleError)}},{key:"clearFrontLayer",value:function(){return this._request("/rooms/".concat(this.token,"/layers/1"),{method:"DELETE"}).catch(this._handleError)}},{key:"takeSnapshot",value:function(){return this._request("/rooms/".concat(this.token,"/snapshot"),{method:"POST"}).catch(this._handleError)}},{key:"getSnapshot",value:function(e,t){var n=this;return this._request("/rooms/".concat(this.token,"/snapshots/").concat(e)).then(t).catch((function(e){t?t({error:e}):n._handleError(e)}))}},{key:"startPlayback",value:function(e){return this._post("/rooms/".concat(this.token,"/playbacks"),{playback:e}).catch(this._handleError)}},{key:"stopPlayback",value:function(e){return this._request("/rooms/".concat(this.token,"/playbacks/").concat(e.play_id),{method:"DELETE"}).catch(this._handleError)}},{key:"lockMeeting",value:function(){return this._request("/rooms/".concat(this.token,"/lock"),{method:"POST"}).catch(this._handleError)}}]),e}(),v=function(e,t,n){var r,i,o,s=null,a=0;n||(n={});var c=function(){a=!1===n.leading?0:Date.now(),s=null,o=e.apply(r,i),s||(r=i=null)};return function(){var u=Date.now();a||!1!==n.leading||(a=u);var l=t-(u-a);return r=this,i=arguments,l<=0||l>t?(s&&(clearTimeout(s),s=null),a=u,o=e.apply(r,i),s||(r=i=null)):s||!1===n.trailing||(s=setTimeout(c,l)),o}};function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e,t){if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return b(e)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}const w=function(){function e(t){c(this,e),this.context=t}return d(e,[{key:"handle",value:function(e){p.error("BaseEvent::handle is not implemented",e)}}]),e}();function x(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var C=function(e){g(n,e);var t=x(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.startPlayback(e.playback)}}]),n}(w),T=function(e){g(n,e);var t=x(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopPlayback(e.playback)}}]),n}(w);function R(){return R="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=k(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},R.apply(this,arguments)}function _(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const P=function(e){g(n,e);var t=_(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){"client"!==e._src&&(Reflect.deleteProperty(e,"_src"),this.context.listeners.forEach((function(t){return t(e)})))}}]),n}(w);function E(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var M=function(e){g(n,e);var t=E(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context.annotationLoop=window.setInterval((function(){e.context._api.createAnnotation((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"annotation",annotation:t})}),(function(){window.clearInterval(e.context.annotationLoop)}))}),1e3)}}]),n}(P),O=function(e){g(n,e);var t=E(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){window.clearInterval(this.context.annotationLoop),this.context._api.stopAnnotation()}}]),n}(P);function A(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const D=function(e){g(n,e);var t=A(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._rtConnection.send({type:"stfu"})}}]),n}(P);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const B=function(e){g(n,e);var t=I(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){}}]),n}(w);function L(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const F=function(e){g(n,e);var t=L(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context.listeners.forEach((function(t){return t(e)}))}}]),n}(w);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(e){if("string"==typeof e)return j(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}function U(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,s,a=[],c=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(a.push(r.value),a.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return a}}(e,t)||V(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}let N=!0,W=!0;function H(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function z(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function G(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(N=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function q(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(W=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function $(){if("object"==typeof window){if(N)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function J(e,t){W&&console.warn(e+" is deprecated, please use "+t+" instead.")}function K(e){return"[object Object]"===Object.prototype.toString.call(e)}function X(e){return K(e)?Object.keys(e).reduce((function(t,n){const r=K(e[n]),i=r?X(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function Y(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?Y(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{Y(e,e.get(t),n)}))})))}function Q(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&Y(e,n,i)}))})),i}const Z=$;function ee(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),Z("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return Z("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function te(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,o=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:o||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function ne(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function re(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else z(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function ie(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function oe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},o=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(o(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(o(i(t)))},n])})).then(n,r)}}function se(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ae(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function ce(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ae(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function ue(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function le(e,t){z(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}function de(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){J("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function he(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function fe(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function pe(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function me(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function ve(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function ye(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){J("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function ge(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function be(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function Se(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function ke(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function we(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function xe(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function Ce(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function Te(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function Re(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(_e(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function _e(e){return e&&void 0!==e.video?Object.assign({},e,{video:X(e.video)}):e}function Pe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;n<e.iceServers.length;n++){let r=e.iceServers[n];void 0===r.urls&&r.url?(J("RTCIceServer.url","RTCIceServer.urls"),r=JSON.parse(JSON.stringify(r)),r.urls=r.url,delete r.url,t.push(r)):t.push(e.iceServers[n])}e.iceServers=t}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function Ee(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Me(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Oe(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var Ae=n(539),De=n.n(Ae);function Ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=De().parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,z(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function Be(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||z(e,"icecandidate",(e=>{if(e.candidate){const t=De().parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function Le(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=De().splitSections(e.sdp);return t.shift(),t.some((e=>{const t=De().parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=De().matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function Fe(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},z(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function je(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function Ve(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function Ue(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function Ne(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const We=function({window:n}={},r={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const s=$,a=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=H(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=H(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=H(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(n),c={browserDetails:a,commonShim:o,extractVersion:H,disableLog:G,disableWarnings:q,sdp:Ae};switch(a.browser){case"chrome":if(!e||!ue||!r.shimChrome)return s("Chrome shim is not included in this adapter release."),c;if(null===a.version)return s("Chrome shim can not determine version, not shimming."),c;s("adapter.js shimming chrome."),c.browserShim=e,Ue(n,a),Ne(n),ee(n,a),ne(n),ue(n,a),re(n),ce(n,a),ie(n),oe(n),se(n),le(n,a),Ie(n),Be(n),je(n),Le(n,a),Fe(n),Ve(n,a);break;case"firefox":if(!t||!pe||!r.shimFirefox)return s("Firefox shim is not included in this adapter release."),c;s("adapter.js shimming firefox."),c.browserShim=t,Ue(n,a),Ne(n),de(n,a),pe(n,a),fe(n),ye(n),me(n),ve(n),ge(n),be(n),Se(n),ke(n),we(n),Ie(n),je(n),Le(n,a),Fe(n);break;case"safari":if(!i||!r.shimSafari)return s("Safari shim is not included in this adapter release."),c;s("adapter.js shimming safari."),c.browserShim=i,Ue(n,a),Ne(n),Pe(n),Me(n),Te(n),xe(n),Ce(n),Ee(n),Re(n),Oe(n),Ie(n),Be(n),Le(n,a),Fe(n),Ve(n,a);break;default:s("Unsupported browser!")}return c}({window:"undefined"==typeof window?void 0:window}),He=We;var ze=n(795),Ge=n.n(ze),qe=n(577),$e=n.n(qe);const Je=function(){function e(){c(this,e),this.onChange=this.onChange.bind(this),this.hasSupport=Boolean($e().isEnabled)}return d(e,[{key:"toggle",value:function(){return this.isFullscreen()?$e().exit():$e().request()}},{key:"canFullscreen",value:function(){return this.hasSupport}},{key:"isFullscreen",value:function(){return this.hasSupport&&$e().isFullscreen}},{key:"onChange",value:function(e){var t=this;this.hasSupport&&$e().on("change",(function(){return e(t.isFullscreen())}))}},{key:"off",value:function(){this.hasSupport&&$e().off("change")}}]),e}();var Ke=null;const Xe={environment:function(){return{canMix:this.canMix(),canPip:this.hasPipSupport(),canSFU:this.canSFU(),isPhone:this.isPhone(),inIframe:this.inIframe(),isIOSDevice:this.isIOSDevice(),canUseEyeson:this.canUseEyeson(),canFullscreen:this.canFullscreen(),hasMobileDevice:this.hasMobileDevice(),canToggleCamera:this.canToggleCamera(),canPresentFiles:this.canPresentFiles(),canScreenCapture:this.canScreenCapture(),canAdjustSettings:this.canAdjustDeviceSettings(),canStreamLocalMedia:this.canStreamLocalMedia(),isExperimentalBrowser:this.isExperimentalBrowser()}},platform:function(){return Ge()},canUseEyeson:function(){return!this.isWebView()&&this.hasGetUserMedia()&&this.canDataChannel()&&this.isMinimumRequiredBrowser()},hasGetUserMedia:function(){return"mediaDevices"in navigator&&"getUserMedia"in navigator.mediaDevices},hasGetDisplayMedia:function(){return"mediaDevices"in navigator&&"getDisplayMedia"in navigator.mediaDevices},hasPeerConnection:function(){return"RTCPeerConnection"in window},hasCaptureStream:function(){return"captureStream"in HTMLMediaElement.prototype||"mozCaptureStream"in HTMLMediaElement.prototype},hasCanvasCaptureSupport:function(){return"CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window},hasSenders:function(){return"RTCRtpSender"in window},hasTrackOnUnmute:function(){return!(this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())&&"onunmute"in MediaStreamTrack.prototype},hasWebpSupport:function(){return this.isChrome()?He.browserDetails.version>=70:!!this.isFF()&&He.browserDetails.version>=65},canChangeAudioOutput:function(){return!document||"setSinkId"in HTMLMediaElement.prototype},canChangeMicrophone:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canMultipleDifferentMicrophones:function(){return!(this.isFF()&&this.browserVersion()<101)},canChangeCamera:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canScreenCapture:function(){return!(!h.screencapture||this.isTestSuite()||!this.canUseEyeson()||this.hasMobileDevice())&&(this.hasGetDisplayMedia()||this.isFF()&&this.hasGetUserMedia())},canPresentFiles:function(){return!(this.isTestSuite()||!this.canUseEyeson()||this.isFF()&&He.browserDetails.version<=60||this.isIPhone()||this.isIOSDevice()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())},canStreamLocalMedia:function(){var e=window.AudioContext||window.webkitAudioContext;if("function"!=typeof e)return!1;var t=e.prototype;return["createGain","createMediaStreamSource","createMediaElementSource","createMediaStreamDestination"].every((function(e){return"function"==typeof t[e]}))&&this.hasCanvasCaptureSupport()},requiresLowerConstraints:function(){return this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser()},browserName:function(){return He.browserDetails.browser.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))},browserVersion:function(){return"safari"===He.browserDetails.browser?He.extractVersion(navigator.userAgent,/Version\/(\d+)\./,1):He.browserDetails.version},isEdge:function(){return"edge"===He.browserDetails.browser},isFF:function(){return"firefox"===He.browserDetails.browser},isChrome:function(){return"chrome"===He.browserDetails.browser},isSafari:function(){return"safari"===He.browserDetails.browser},isMinimumRequiredBrowser:function(){return this.isChrome()?this.isMinimumRequiredChrome():this.isFF()?this.isMinimumRequiredFF():!!this.isSafari()&&this.isMinimumRequiredSafari()},isMinimumRequiredEdge:function(){return!1},isMinimumRequiredFF:function(){return!!this.isFF()&&He.browserDetails.version>=52},isMinimumRequiredChrome:function(){return!!this.isChrome()&&He.browserDetails.version>=70},isMinimumRequiredSafari:function(){return!!this.isSafari()&&(this.browserVersion()>=10||this.isWorkingIOSBrowser())},isWorkingIOSBrowser:function(){var e=/ [a-zA-Z]+iOS\//.test(navigator.userAgent),t=navigator.userAgent.indexOf(" OPT/")>-1;return(e||t)&&this.hasGetUserMedia()},isExperimentalBrowser:function(){return["safari","edge"].includes(He.browserDetails.browser)},hasPipSupport:function(){return!document||Boolean("webkitSupportsPresentationMode"in HTMLVideoElement.prototype||"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled)},iOSPipCheck:function(){var e=this;return new Promise((function(t){var n=e.hasPipSupport();if(n&&e.isIOSDevice()){var r=document.createElement("video");r.preload="none",r.src="about:blank",r.onsuspend=function(){var e=r.webkitSupportsPresentationMode("picture-in-picture");t(e)}}else t(n)}))},isAndroidDevice:function(){return Boolean(navigator.userAgent.match(/Android/i))},isIOSDevice:function(){return(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!window.MSStream},isIPhone:function(){return(/iPhone/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1&&window.screen.height/window.screen.width>=1.5)&&!window.MSStream},isAndroidPhone:function(){var e=/(android)/i.test(navigator.userAgent),t=/(mobile)/i.test(navigator.userAgent);return e&&t},isMacOS:function(){return void 0!==navigator.userAgentData?"macOS"===navigator.userAgentData.platform:0===navigator.platform.indexOf("Mac")},inIframe:function(){try{return window.self!==window.top}catch(e){return!0}},isPhone:function(){return this.isIPhone()||this.isAndroidPhone()},hasMobileDevice:function(){return this.isIOSDevice()||this.isAndroidDevice()},isTouchDevice:function(){return Boolean("ontouchstart"in window||navigator.maxTouchPoints)},canDisplayTooltips:function(){return!this.isIOSDevice()&&!this.isTestSuite()},canAdjustDeviceSettings:function(){return!this.isIOSDevice()},canToggleCamera:function(){return!0},canDrawCamera:function(){return!this.isIOSDevice()},canMix:function(){return this.isChrome()&&this.canScreenCapture()&&this.hasCanvasCaptureSupport()},stopsDeviceActivityIndicatorOnDisable:function(){return!!this.isFF()},supportsBlurOnSVG:function(){return"undefined"!=typeof SVGElement&&void 0!==SVGElement.prototype.blur},hasLocalStorage:function(){try{var e="object"===a(window.localStorage)&&null!==window.localStorage;window.localStorage.setItem("eyeson.test","test");var t="test"===window.localStorage.getItem("eyeson.test");return e&&t}catch(e){return p.debug("FeatureDetector::hasLocalStorage:",e.message),!1}},canFullscreen:function(){return(new Je).canFullscreen()},isFullscreen:function(){return(new Je).isFullscreen()},canSFU:function(){var e=!1;if(this.isSafari()){if(!h.allowSafariSFU)return!1;if(this.isWorkingIOSBrowser())return!0;var t=navigator.userAgent.match(/Version\/(\d+).(\d+)/);t&&t.length>1&&(e=Number(t[1])<12||12===Number(t[1])&&Number(t[2])<1)}return!e&&!this.isTestSuite()},canDataChannel:function(){return this.hasPeerConnection()&&"function"==typeof RTCPeerConnection.prototype.createDataChannel&&"RTCDataChannel"in window},disallowAudioSyncSrcChange:function(){return this.isSafari()&&this.canSFU()},canShare:function(){return Boolean(navigator.share)},isWebView:function(){return/Version\/|wv/i.test(navigator.userAgent)&&this.isAndroidDevice()},isTestSuite:function(){return"test-suite"===He.browserDetails.browser},canVirtualBackground:function(){return!this.isIOSDevice()&&Boolean(window.WebAssembly)&&"function"==typeof WebAssembly.validate&&("function"==typeof WebAssembly.instantiateStreaming||"function"==typeof WebAssembly.instantiate)&&Boolean(window.CanvasRenderingContext2D)&&"function"==typeof window.ImageData&&"function"==typeof window.requestAnimationFrame},canvasBlurSupport:function(){if(null!==Ke)return Ke;if(!(window.CanvasRenderingContext2D&&"filter"in CanvasRenderingContext2D.prototype))return Ke=!1;var e=document.createElement("canvas"),t=document.createElement("canvas");e.width=10,e.height=10,t.width=10,t.height=10;var n=e.getContext("2d"),r=t.getContext("2d");n.filter="blur(5px)",n.fillStyle="#000000",n.fillRect(3,3,4,4),r.fillStyle="#000000",r.fillRect(3,3,4,4);var i=n.getImageData(5,5,1,1),o=r.getImageData(5,5,1,1);return Ke=i.data[3]!==o.data[3]},canStereo:function(){return!(this.isSafari()||this.isAndroidDevice())},canChooseDisplaySurface:function(){return this.hasGetDisplayMedia()&&navigator.mediaDevices.getSupportedConstraints().displaySurface},hasPipCamSupport:function(){return this.isChrome()&&this.hasPipSupport()},canMonitorSystemPressure:function(){return"function"==typeof window.PressureObserver&&Array.isArray(PressureObserver.supportedSources)&&PressureObserver.supportedSources.includes("cpu")}};function Ye(e,t,n,r,i,o,s){try{var a=e[o](s),c=a.value}catch(e){return void n(e)}a.done?t(c):Promise.resolve(c).then(r,i)}function Qe(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function s(e){Ye(o,r,i,s,a,"next",e)}function a(e){Ye(o,r,i,s,a,"throw",e)}s(void 0)}))}}var Ze=n(687),et=n.n(Ze);const tt=function(){function e(){c(this,e),this._stream=this.createStream()}return d(e,[{key:"stream",get:function(){return this._stream}},{key:"createStream",value:function(){var e=Object.assign(document.createElement("canvas"),{width:0,height:0});e.id="eyeson-ninja-stream",e.getContext("2d").fillRect(0,0,0,0);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return window.CanvasCaptureMediaStream&&t instanceof window.CanvasCaptureMediaStream&&(n.type="canvas-track",n.canvas=e),t}}]),e}(),nt=(rt="eyeson.",it={},ot=Xe.hasLocalStorage(),{store:function(e,t){if(!ot)return it[e]=t,!0;try{window.localStorage.setItem(rt+e,JSON.stringify(t))}catch(e){return p.error("LocalStorage::store",e),!1}return!0},load:function(e,t){var n=t;if("object"!==a(n)||Array.isArray(n)||(n=Object.assign({},n)),!ot)return it[e]||n;var r=window.localStorage.getItem(rt+e);if(!r)return n;try{return JSON.parse(r)}catch(t){return p.error("LocalStorage::load",e,t),n}}});var rt,it,ot,st,at,ct=window.CanvasCaptureMediaStream||window.CanvasCaptureMediaStreamTrack,ut=function(e){return Boolean(e&&e.getAudioTracks().length>0&&e.getAudioTracks()[0].enabled)},lt=function(e){return Boolean(e&&e.getVideoTracks().length>0&&e.getVideoTracks()[0].enabled)},dt=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!1})),e},ht=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!0})),e},ft=function(e,t){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=t})),e},pt=function(e,t){return e&&e.getVideoTracks().forEach((function(e){return e.enabled=t})),e},mt=function(e){return e.stop(),e.dispatchEvent(new Event("stopped"))},vt=function(e){e&&e.getTracks().forEach(mt)},yt=function(e){return/screen|monitor|window|web-contents-media-stream/i.test(e.label)||"screen-track"===e.type||"screen-video-track"===e.type},gt=function(e){return yt(e)&&"screen-video-track"!==e.type},bt=function(e){return yt(e)&&"screen-video-track"===e.type},St=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"!==e.canvas.id&&"eyeson-vbg-stream"!==e.canvas.id)},kt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"===e.canvas.id)},wt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-vbg-stream"===e.canvas.id)},xt=function(e){return!St(e)&&!yt(e)&&!wt(e)},Ct=function(e){return e?e.getVideoTracks().filter(yt):[]},Tt=function(e){return e?e.getVideoTracks().filter(gt):[]},Rt=function(e){return e?e.getVideoTracks().filter(bt):[]},_t=function(e){return e?e.getVideoTracks().filter(xt):[]},Pt=function(e){return e?e.getVideoTracks().filter(wt):[]},Et=function(e){_t(e).forEach(mt)},Mt=function(e){return _t(e).forEach((function(e){return e.enabled=!1})),e},Ot=function(e){return _t(e).forEach((function(e){return e.enabled=!0})),e},At=function(e,t){return _t(e).forEach((function(e){return e.enabled=t})),e},Dt=function(e,t){return Pt(e).forEach((function(e){return e.enabled=t})),e},It=function(e){return e instanceof ct?e.getVideoTracks():e?e.getVideoTracks().filter(St):[]},Bt=function(e){return lt(e)&&e.getVideoTracks().some(yt)},Lt=function(e){return lt(e)&&e.getVideoTracks().some(gt)},Ft=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&e.getVideoTracks().some(St)},jt=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&(lt(e)&&e.getVideoTracks().some(wt))},Vt=function(e){return lt(e)&&!Bt(e)&&!Ft(e)&&!jt(e)},Ut=function(e){return!!e&&(Ft(e)&&e.getVideoTracks().some(St))},Nt=function(e){return Lt(e)||Ft(e)},Wt=function(e){return _t(e).some((function(e){return e.enabled}))},Ht=function(e){var t=_t(e);if(t.length>0){var n=U(t,1)[0];if("function"==typeof n.getSettings){var r=n.getSettings();if(r&&"facingMode"in r)return r.facingMode}}return null},zt=function(e){e.getContext("2d");var t=e.captureStream(20),n=U(t.getVideoTracks(),1)[0];return"requestFrame"in n||(n.type="canvas-track",n.canvas=e,n.requestFrame=function(){return t.requestFrame()}),t},Gt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&e instanceof MediaStream&&e.getTracks().length>0){var n=e.getAudioTracks().find((function(e){return"live"===e.readyState})),r=e.getVideoTracks().find((function(e){return"live"===e.readyState})),i=n||function(){try{var e=new(window.AudioContext||window.webkitAudioContext),t=e.createMediaStreamDestination().stream,n=U(t.getAudioTracks(),1)[0];return n.type="fake-audio",n.enabled=!1,vt(t),e.close(),n}catch(e){p.warn("StreamHelpers::createFakeAudioTrack Unable to create audio track",e)}return null}(),o=r||function(){try{var e=document.createElement("canvas");e.getContext("2d").fillRect(0,0,e.width,e.height);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return n.type="fake-video",n.enabled=!1,vt(t),n}catch(e){p.warn("StreamHelpers::createFakeVideoTrack Unable to create video track",e)}return null}(),s=[];return i&&s.push(i),o&&!t&&s.push(o),new MediaStream(s)}return!1};const qt=(st=[],at="com.eyeson.immediate",window.addEventListener("message",(function(e){if(e.source===window&&e.data===at){e.stopPropagation();var t=st.shift();t&&t()}})),function(e){st.push(e),window.postMessage(at,"*")});const $t=function(e,t){var n=null,r=!0,i=!1,o=0,s=1e3/t,a=function t(){var r=Date.now(),i=r-o;i<=s?n=requestAnimationFrame(t):(o=r-i%s,e())},c=function t(){var n=Date.now(),r=n-o;r<=s?qt(t):(o=n-r%s,i||e())},u={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){r?n=requestAnimationFrame(a):(i&&(i=!1),qt(c))})),cancelAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){i=!0,n&&(cancelAnimationFrame(n),n=null)}))};return document.addEventListener("visibilitychange",(function(){!(r="visible"===document.visibilityState)&&n&&(u.cancelAnimationFrame(),u.requestAnimationFrame())})),u};const Jt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return new Promise((function(n,r){var i=new URL(e,location.href),o=document.createElement("script");o.async=!0,o.onload=function(){o.parentNode&&o.remove(),n(o)},o.onerror=function(){o.parentNode&&o.remove(),r(new Error("Unable to initiate script "+e))},t&&(o.integrity=t.algo+"-"+t.hash),o.src=i,document.head.append(o)}))};var Kt="function"==typeof window.CacheStorage;const Xt={storeBlobURL:function(){var e=Qe(et().mark((function e(t,n){var r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,fetch(t);case 5:return r=e.sent,e.next=8,r.blob();case 8:return i=e.sent,e.next=11,caches.open("store");case 11:return o=e.sent,e.next=14,o.put(n,new Response(i));case 14:e.next=18;break;case 16:e.prev=16,e.t0=e.catch(2);case 18:case"end":return e.stop()}}),e,null,[[2,16]])})));return function(t,n){return e.apply(this,arguments)}}(),loadBlobURL:function(){var e=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Kt){e.next=16;break}return e.prev=1,e.next=4,caches.open("store");case 4:return n=e.sent,e.next=7,n.match(t);case 7:return r=e.sent,e.next=10,r.blob();case 10:return i=e.sent,e.abrupt("return",URL.createObjectURL(i));case 14:e.prev=14,e.t0=e.catch(1);case 16:return e.abrupt("return",!1);case 17:case"end":return e.stop()}}),e,null,[[1,14]])})));return function(t){return e.apply(this,arguments)}}(),deleteBlob:function(){var e=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,caches.open("store");case 5:return n=e.sent,e.next=8,n.delete(t);case 8:e.next=12;break;case 10:e.prev=10,e.t0=e.catch(2);case 12:case"end":return e.stop()}}),e,null,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()};var Yt=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],Qt=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];const Zt=function(){var e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null;return{run:function(c){if(n&&e)return n=!1,e;n=!0;var u=parseFloat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),l=c.width,d=c.height;e||(e=document.createElement("canvas"),t=e.getContext("2d",{alpha:!1,desynchronized:!0}),e.width=l,e.height=d),t.drawImage(c,0,0);var h=t.getImageData(0,0,l,d),f=h.data,p=l-1,m=d-1,v=u+1,y=Yt[u],g=Qt[u];r||(r=new Uint32Array(f.length/4),i=new Uint32Array(f.length/4),o=new Uint32Array(f.length/4),s=new Uint32Array(l),a=new Uint32Array(l));for(var b=2,S=0,k=0,w=0;b-- >0;){for(var x=0,C=0,T=0;T<d;T++){for(var R=f[x]*v,_=f[x+1]*v,P=f[x+2]*v,E=1;E<=u;E++)S=x+((E>p?p:E)<<2),R+=f[S++],_+=f[S++],P+=f[S++];for(var M=0;M<l;M++)r[C]=R,i[C]=_,o[C]=P,0===T&&(s[M]=((S=M+v)<p?S:p)<<2,a[M]=(S=M-u)>0?S<<2:0),k=x+s[M],w=x+a[M],R+=f[k++]-f[w++],_+=f[k++]-f[w++],P+=f[k++]-f[w++],C++;x+=l<<2}for(var O=0;O<l;O++){for(var A=O,D=r[A]*v,I=i[A]*v,B=o[A]*v,L=1;L<=u;L++)D+=r[A+=L>m?0:l],I+=i[A],B+=o[A];C=O<<2;for(var F=0;F<d;F++)f[C]=D*y>>>g,f[C+1]=I*y>>>g,f[C+2]=B*y>>>g,0===O&&(s[F]=((S=F+v)<m?S:m)*l,a[F]=(S=F-u)>0?S*l:0),k=O+s[F],w=O+a[F],D+=r[k]-r[w],I+=i[k]-i[w],B+=o[k]-o[w],C+=l<<2}}return t.putImageData(h,0,0),e},reset:function(){e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null}}};window.exports=window.exports||{};var en="function"==typeof window.OffscreenCanvas&&function(){try{return new OffscreenCanvas(1,1).getContext("2d"),!0}catch(e){}return!1}(),tn=en&&Boolean(window.OffscreenCanvasRenderingContext2D)&&"filter"in OffscreenCanvasRenderingContext2D.prototype,nn="function"==typeof window.createImageBitmap,rn="function"==typeof window.MediaStreamTrackProcessor,on=window.WebAssembly&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])),sn=function(){try{return new EventTarget,!0}catch(e){}return!1}(),an=Math.max,cn=sn?new EventTarget:document.createElement("i"),un="selfie_segmentation_landscape",ln=256,dn=144,hn=36864,fn=null,pn=!1,mn=!1,vn=null,yn=null,gn=null,bn=null,Sn=function(){var e=Qe(et().mark((function e(){var t,n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!fn){e.next=2;break}return e.abrupt("return");case 2:return mn=!0,cn.dispatchEvent(new Event("change")),e.next=6,Promise.all([Jt(on?"vendor/tflite/tflite-simd.js":"vendor/tflite/tflite.js"),fetch("vendor/tflite/models/".concat(un,".tflite"))]);case 6:return t=e.sent,e.next=9,window.exports[on?"createTFLiteSIMDModule":"createTFLiteModule"]();case 9:return fn=e.sent,e.next=12,t[1].arrayBuffer();case 12:n=e.sent,r=fn._getModelBufferMemoryOffset(),fn.HEAPU8.set(new Uint8Array(n),r),fn._loadModel(n.byteLength),vn=fn._getInputMemoryOffset()/4,yn=fn._getOutputMemoryOffset()/4,mn=!1,pn=!0,cn.dispatchEvent(new Event("change"));case 21:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),kn=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={canvas:null,ctx:null};return en&&("blur"===(arguments.length>3?arguments[3]:void 0)&&tn)?(r.canvas=new OffscreenCanvas(e,t),r.ctx=r.canvas.getContext("2d",n),r):(r.canvas=document.createElement("canvas"),r.canvas.width=e,r.canvas.height=t,r.ctx=r.canvas.getContext("2d",Object.assign({desynchronized:!0},n)),r)};Qe(et().mark((function e(){var t;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("image:blob"!==nt.load("virtualBackgroundType")){e.next=6;break}return e.next=4,Xt.loadBlobURL("/virtualBackgroundLocalImage");case 4:(t=e.sent)&&(gn=t);case 6:case"end":return e.stop()}}),e)})))();var wn,xn=function(e,t){return new Promise((function(n){if(t&&"ready"===t.state&&t.emitLoading(!0),"blob"!==e||gn){var r=new Image;r.onerror=function(){return n(null)},r.onload=function(){return n(r)},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src="blob"===e&&gn?gn:e}else n(null)})).then((function(e){return t&&"ready"===t.state&&t.emitLoading(!1),e}))},Cn=function(e){return new Promise((function(t,n){var r=new Image;r.onerror=function(){return n(new TypeError("Invalid image file"))},r.onload=function(){return t()},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src=e}))},Tn=(wn=null,function(e){wn||(wn=Object.assign(document.createElement("input"),{type:"file",accept:"image/*"})),wn.onchange=function(t){var n=t.target.files;if(n.length>0){var r=URL.createObjectURL(n[0]);Cn(r).then((function(){gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=r,e()}),e)}wn.onchange=null,wn.value=""},wn.click()}),Rn=function(e,t,n){var r=t/e.width,i=n/e.height,o=an(r,i),s=e.width*o,a=e.height*o,c=(t-s)/2,u=(n-a)/2,l=kn(t,n,{alpha:!1});return l.ctx.drawImage(e,0,0,e.width,e.height,c,u,s,a),l.canvas},_n=function(e,t,n){var r=kn(t,n,{alpha:!1}),i=r.ctx;return i.fillStyle="#ffffff",i.fillRect(0,0,t,n),i.drawImage(e,15,15),r.canvas},Pn=function(e,t,n){var r=kn(e,t,{alpha:!1}),i=r.ctx,o=i.createLinearGradient(n.startX,n.startY,n.endX,n.endY);return o.addColorStop(0,n.color1),o.addColorStop(1,n.color2),i.fillStyle=o,i.fillRect(0,0,e,t),r.canvas},En=function(e,t,n,r){var i=2*(2*r),o=t+i,s=n+i;e.blurCanvas=kn(o,s,{alpha:!1},"blur"),e.imageCanvas=kn(o,s,{alpha:!1}),e.blurCanvas.ctx.filter="blur(".concat(r,"px)")},Mn=/^(off|eyeson|generali:.*|color:.+|image:.+|blur:\d+)/,On=function(){return pn?"ready":mn?"initialize":""},An=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";c(this,e),p.info("VirtualBackgroundMixer::constructor",n),this.name=n,this.canvas=null,this.ctx=null,this.originalStream=null,this.outStream=null,this.video=null,this.reader=null,this.size={width:0,height:0},this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.playPromise=null,this.abort=!1,this.paused=!1,this.raf=$t(this.drawVideo.bind(this),20),this.backgroundOld=null,this.backgroundType=null,this.backgroundValue=null,this.blurInit=!1,this.blurCanvas=null,this.canvasBlur=Zt(),this.imageCanvas=null,this.state=On(),this.loadingListener=[],this.handleStateChange=function(){var e=On();t.state=e,t.emitLoading("initialize"===e)},cn.addEventListener("change",this.handleStateChange)}var t,n,r;return d(e,[{key:"storeLocalImageFile",value:function(){gn&&(bn=gn)}},{key:"resetLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=bn,bn=null)}},{key:"saveLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(bn),bn=null)}},{key:"updateCache",value:function(e){"image:blob"===e?gn&&Xt.storeBlobURL(gn,"/virtualBackgroundLocalImage"):Xt.deleteBlob("/virtualBackgroundLocalImage")}},{key:"onLoading",value:function(e){this.loadingListener.push(e)}},{key:"offLoading",value:function(e){this.loadingListener=this.loadingListener.filter((function(t){return t!==e}))}},{key:"emitLoading",value:function(e){this.loadingListener.forEach((function(t){return t(e)}))}},{key:"initiateStream",value:function(e){var t=this;p.info("VirtualBackgroundMixer::initiate",this.name),Sn();var n=e.getVideoTracks();if(0===n.length)return p.warn("VirtualBackgroundMixer::initiate",this.name,"missing track"),e;var r=U(n,1)[0],i=r.getSettings();if("live"!==r.readyState||!i.width||!i.height)return p.warn("VirtualBackgroundMixer::initiate",this.name,"0 width or height, or not ready",r.readyState,i.width,i.height),e;this.originalStream&&(p.warn("VirtualBackgroundMixer::initiate",this.name,"existing originalStream!",this.originalStream.id,e.id),this.originalStream.id!==e.id&&this.stopOriginalStream(),this.terminate()),this.originalStream=e,this.canvas=document.createElement("canvas"),this.canvas.id="eyeson-vbg-stream",this.ctx=this.canvas.getContext("2d",{desynchronized:!0}),this.ctx.imageSmoothingEnabled=!1,this.size.width=i.width,this.size.height=i.height,this.canvas.width=i.width,this.canvas.height=i.height;var o=U(this.canvas.captureStream(20).getVideoTracks(),1)[0];o.canvas||(o.type="canvas-track",o.canvas=this.canvas);var s={};return"function"==typeof o.getSettings&&Object.assign(s,o.getSettings()),Object.assign(s,i),o.getSettings=function(){return s},o.srcLabel=r.label,o.srcDeviceId=i.deviceId,this.outStream=new MediaStream([o]),e.getAudioTracks().forEach((function(e){return t.outStream.addTrack(e)})),this.start(),this.outStream}},{key:"start",value:function(){var e=this;p.info("VirtualBackgroundMixer::start",this.name);var t=null,n=null,r=this.size,i=r.width,o=r.height;if(i&&o){if(rn)try{var s=U(this.originalStream.getVideoTracks(),1)[0],a=new MediaStreamTrackProcessor(s);this.reader=a.readable.getReader()}catch(e){}this.reader||((n=document.createElement("video")).playsInline=!0,n.muted=!0,n.width=i,n.height=o,n.srcObject=this.originalStream,this.video=n),this.segmentationMask=new ImageData(ln,dn),t=kn(ln,dn,{willReadFrequently:!0}),this.segmentationMaskCanvas=t.canvas,this.segmentationMaskCtx=t.ctx,this.segmentationMaskCtx.imageSmoothingEnabled=!1,n&&!nn&&(t=kn(i,o),this.videoCanvas=t.canvas,this.videoCtx=t.ctx),this.abort=!1,this.paused=!1,this.blurInit=!1,this.canvasBlur.reset(),this.initBackground(),this.reader?(p.info("VirtualBackgroundMixer::start::videoTrackProcessor",this.name),this.raf.requestAnimationFrame()):(n.onloadeddata=function(){p.info("VirtualBackgroundMixer::start::video.loadeddata",e.name),e.raf.requestAnimationFrame()},this.playPromise=n.play(),this.playPromise.catch((function(t){p.error("VirtualBackgroundMixer::start::video.play",e.name,t)})))}else p.warn("VirtualBackgroundMixer::start 0 width or height",this.name,i,o)}},{key:"drawVideo",value:(r=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c,u,l,d,h,f,p,m,v,y,g,b;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=null,!this.abort){e.next=3;break}return e.abrupt("return");case 3:if(n=this.ctx,r=this.size,i=this.paused,o=this.segmentationMask,s=this.segmentationMaskCtx,a=this.segmentationMaskCanvas,!this.reader){e.next=15;break}return e.prev=5,e.next=8,this.reader.read();case 8:c=e.sent,(u=c.value)&&(u.width=u.displayWidth,u.height=u.displayHeight,t=u),e.next=15;break;case 13:e.prev=13,e.t0=e.catch(5);case 15:if(pn&&!i){e.next=19;break}n.drawImage(t||this.video,0,0),e.next=36;break;case 19:if(t){e.next=33;break}if(!nn){e.next=31;break}return e.prev=21,e.next=24,createImageBitmap(this.video);case 24:t=e.sent,e.next=29;break;case 27:e.prev=27,e.t1=e.catch(21);case 29:e.next=33;break;case 31:this.videoCtx.drawImage(this.video,0,0),t=this.videoCanvas;case 33:if(!this.abort){e.next=35;break}return e.abrupt("return");case 35:if(t&&t.width>0&&t.height>0){for(s.drawImage(t,0,0,t.width,t.height,0,0,ln,dn),l=s.getImageData(0,0,ln,dn),d=l.data,h=fn.HEAPF32,f=o.data,p=hn,m=0,v=0,y=0;y<p;y++)v=4*y,h[m=vn+3*y]=d[v]/255,h[m+1]=d[v+1]/255,h[m+2]=d[v+2]/255;for(fn._runInference(),g=0,b=0;g<p;g++)b=h[yn+g],f[4*g+3]=255*b;s.putImageData(o,0,0),n.globalCompositeOperation="copy",n.filter="blur(2px)",n.drawImage(a,0,0,ln,dn,0,0,r.width,r.height),n.globalCompositeOperation="source-in",n.filter="none",n.drawImage(t,0,0),this.backgroundType&&this.drawBackground(t)}case 36:!i&&this.paused&&(n.filter="none",n.globalCompositeOperation="source-over"),t&&"function"==typeof t.close&&t.close(),this.abort||this.raf.requestAnimationFrame();case 39:case"end":return e.stop()}}),e,this,[[5,13],[21,27]])}))),function(){return r.apply(this,arguments)})},{key:"suspend",value:function(){var e=this.ctx;this.paused=!0,e&&(e.filter="none",e.globalCompositeOperation="source-over")}},{key:"resume",value:function(){this.paused=!1}},{key:"drawBackground",value:function(e){var t=this.backgroundType,n=this.ctx,r=this.blurCanvas,i=this.imageCanvas,o=this.backgroundValue,s=this.size;if(t&&n)if(n.globalCompositeOperation="destination-over","blur"===t)if(Xe.canvasBlurSupport()){var a=2*Number(o),c=2*a;this.blurInit||(i.ctx.drawImage(e,0,0,s.width,s.height,0,0,s.width+c,s.height+c),this.blurInit=!0),i.ctx.drawImage(e,0,0,s.width,s.height,a,a,s.width,s.height),r.ctx.drawImage(i.canvas,0,0),n.drawImage(r.canvas,a,a,s.width,s.height,0,0,s.width,s.height)}else{var u=this.canvasBlur.run(e,o);n.drawImage(u,0,0)}else"color"===t?(n.fillStyle=o,n.fillRect(0,0,s.width,s.height)):i?n.drawImage(i,0,0):n.drawImage(e,0,0)}},{key:"initBackground",value:(n=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.backgroundType,n=this.backgroundValue,r=this.size,i=r.width,o=r.height,s=!1,i&&o){e.next=5;break}return e.abrupt("return");case 5:if("eyeson"!==t){e.next=10;break}this.imageCanvas=Pn(i,o,{startX:0,startY:0,endX:i,endY:50,color1:"#ff7676",color2:"#9e206c"}),s=!0,e.next=27;break;case 10:if("generali"!==t){e.next=18;break}return this.setBackgroundFallback(),e.next=14,xn(n,this);case 14:(a=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=_n(a,i,o),s=!0),e.next=27;break;case 18:if("image"!==t){e.next=26;break}return this.setBackgroundFallback(),e.next=22,xn(n,this);case 22:(c=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=Rn(c,i,o),s=!0),e.next=27;break;case 26:"blur"===t?(this.blurInit=!1,En(this,i,o,Number(n)),this.canvasBlur.reset(),s=!0):(this.imageCanvas=null,s=!0);case 27:s&&(this.backgroundOld={type:t,value:n});case 28:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setBackgroundFallback",value:function(){var e=this.backgroundOld;if(e)this.backgroundType=e.type,this.backgroundValue=e.value;else{if(!this.imageCanvas){var t=this.size,n=t.width,r=t.height;this.blurInit=!1,En(this,n,r,8)}this.backgroundType="blur",this.backgroundValue="8"}}},{key:"changeBackground",value:function(e){if(p.info("VirtualBackgroundMixer::changeBackground",this.name,e),"string"==typeof e){var t=e.indexOf(":");-1===t?(this.backgroundType="off"===e?null:e,this.backgroundValue=null):(this.backgroundType=e.substring(0,t),this.backgroundValue=e.substring(t+1)),this.abort||this.initBackground()}}},{key:"stop",value:function(){if(p.info("VirtualBackgroundMixer::stop",this.name),this.abort=!0,this.raf&&this.raf.cancelAnimationFrame(),this.video){var e=this.video,t=this.playPromise;t&&e&&t.then((function(){return e.pause()})),this.video.onloadeddata=null,this.video=null,this.playPromise=null}this.reader&&(this.reader=null),this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.backgroundOld=null,this.imageCanvas=null,this.blurCanvas=null,this.canvasBlur.reset()}},{key:"stopOriginalStream",value:function(){p.info("VirtualBackgroundMixer::stopOriginalStream",this.name,this.originalStream),this.stop(),vt(this.originalStream)}},{key:"terminate",value:function(){var e=this;p.info("VirtualBackgroundMixer::terminate",this.name),this.stop(),this.outStream&&Pt(this.outStream).forEach((function(t){mt(t),p.info("VirtualBackgroundMixer::terminate stop track",e.name,t)})),this.originalStream=null,this.outStream=null,this.canvas=null,this.ctx=null,this.video=null}},{key:"destroy",value:function(){p.info("VirtualBackgroundMixer::destroy",this.name),cn.removeEventListener("change",this.handleStateChange),this.loadingListener.length=0,this.canvasBlur=null}}],[{key:"isTypeAllowed",value:function(e){return Mn.test(e)}},{key:"checkExternalImage",value:(t=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^image:([\w]+:)?\/\//i.test(t)){e.next=4;break}return n=t.substring(6),e.next=4,Cn(n);case 4:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImage",value:function(e){Tn(e)}},{key:"getImageBlobOrFallback",value:function(){return gn&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])?"image:blob":"blur:8"}}]),e}();const Dn=An;var In=function(e,t){if(e.length!==t.length)return!0;for(var n,r=function(n,r){if(n=e[a],!(r=t.find((function(e){return n.deviceId===e.deviceId&&n.groupId===e.groupId&&n.label===e.label&&n.kind===e.kind}))))return{v:!0};i=n,o=r},i=null,o=!1,s=e.length,a=0;a<s;a++)if(n=r(i,o))return n.v;return!1};const Bn=function(){function e(t){var n=this;c(this,e),this.sinkId="default",this.options=t||{audio:!0,video:!0,eco:!1},this.stream=null,this.cameras=[],this.listeners=[],this.speakers=[],this.microphones=[],this.constraints={},this.terminationInProgress=!1,this.virtualBackground=new Dn("DeviceManager"),this.virtualBackgroundType="off",e.getSinkId().then((function(e){return n.sinkId=e})),this.setStream=this.setStream.bind(this),this.handleError=this.handleError.bind(this),this.verifyStream=this.verifyStream.bind(this),this.storeConstraints=this.storeConstraints.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.initiateVirtualBackground=this.initiateVirtualBackground.bind(this)}var t;return d(e,[{key:"setVirtualBackgroundType",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Dn.isTypeAllowed(t)){e.next=3;break}return p.warn("DeviceManage::setVirtualBackgroundType type not allowed",t),e.abrupt("return");case 3:return e.next=5,Dn.checkExternalImage(t);case 5:n="off"===this.virtualBackgroundType,r="off"===t,this.virtualBackgroundType=t,this.virtualBackground.changeBackground(t),this.stream&&(n&&!r||!n&&r)&&this.update();case 10:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImageForVirtualBackground",value:function(e){var t=this;Dn.loadLocalImage((function(n){n||t.setVirtualBackgroundType("image:blob"),e(n)}))}},{key:"start",value:function(){var t=this;return this.watchForNewDevices(),e.fetchDevices().then((function(e){return t.setDevices(e)})).then((function(){return e.getConstraints(t.options)})).then((function(e){return t.constraints=e,navigator.mediaDevices.getUserMedia({video:!t.options.eco&&t.constraints.video,audio:t.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"stopStream",value:function(){this.stream&&(this.virtualBackground.originalStream?(this.virtualBackground.stopOriginalStream(),this.virtualBackground.terminate()):vt(this.stream),this.stream=null)}},{key:"stop",value:function(){this.stopStream()}},{key:"terminate",value:function(){var e=this;navigator.mediaDevices.ondevicechange=null,this.terminationInProgress=!0,window.setTimeout((function(){e.stop(),e.virtualBackground.destroy()}),10)}},{key:"setDevices",value:function(e){var t=In(this.cameras,e.cameras),n=In(this.microphones,e.microphones),r=In(this.speakers,e.speakers);this.cameras=e.cameras,this.microphones=e.microphones,this.speakers=e.speakers,this.options.audio=this.microphones.length>0&&this.options.audio,this.options.video=this.cameras.length>0&&this.options.video,(t||n||r)&&this.emit(e)}},{key:"watchForNewDevices",value:function(){var t=this;navigator.mediaDevices.ondevicechange=function(){e.fetchDevices().then((function(e){return t.setDevices(e)})).catch(t.handleError)}}},{key:"onChange",value:function(e){this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"update",value:function(e){return this.constraints=e||this.constraints,this.stop(),this.watchForNewDevices(),navigator.mediaDevices.getUserMedia(this.constraints).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"updateWithOptions",value:function(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.options=t||this.options,this.stop(),this.watchForNewDevices(),e[r?"getMobileConstraints":"getConstraints"](this.options).then((function(e){return n.constraints=e,navigator.mediaDevices.getUserMedia({video:!n.options.eco&&n.constraints.video,audio:n.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"adjustAudioTrack",value:function(e){return 1===e.getAudioTracks().length&&(e.getAudioTracks()[0].enabled=this.options.audio),e}},{key:"initiateVirtualBackground",value:function(e){return"off"!==this.virtualBackgroundType&&e&&1===e.getVideoTracks().length?this.virtualBackground.initiateStream(e):e}},{key:"storeConstraints",value:function(){var e=this.constraints,t=e.video,n=e.audio;p.debug("DeviceManager::storeConstraints",e),nt.store("mediaConstraints",e),nt.store("sinkId",this.sinkId),nt.store("virtualBackgroundType",this.virtualBackgroundType),t&&t.deviceId&&t.deviceId.exact&&nt.store("videoId",t.deviceId.exact),n&&n.deviceId&&n.deviceId.exact&&nt.store("audioId",n.deviceId.exact),this.virtualBackground.updateCache(this.virtualBackgroundType)}},{key:"setStream",value:function(t){var n=this,r=null===this.stream;if(this.stream=t,this.terminationInProgress)return this.stop(),Promise.resolve();var i=function(){n.emit({stream:n.stream,constraints:n.constraints,options:n.options}),n.verifyStream()};return r?e.fetchDevices().then((function(e){n.setDevices(e),i()})):(i(),Promise.resolve())}},{key:"verifyStream",value:function(){this.constraints.video&&this.stream&&0===this.stream.getVideoTracks().length&&!this.options.eco&&this.handleError({name:"EyesonCameraError"}),this.constraints.audio&&this.stream&&0===this.stream.getAudioTracks().length&&this.handleError({name:"EyesonMicrophoneError"})}},{key:"setVideoInput",value:function(e){var t={};return Object.assign(t,this.constraints.video,{deviceId:{exact:e}}),this.constraints.video=t,this.update()}},{key:"setAudioInput",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={};return Object.assign(n,this.constraints.audio,{deviceId:{exact:e}}),this.constraints.audio=n,!0===t.preventUpdate?Promise.resolve():this.update()}},{key:"setAudioOutput",value:function(e){this.sinkId=e||"default",nt.store("sinkId",this.sinkId),this.emit({sinkId:this.sinkId})}},{key:"handleError",value:function(e){p.error("DeviceManager::",e),this.emit({error:e,constraints:this.constraints})}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}],[{key:"getDevices",value:function(){return"mediaDevices"in navigator?navigator.mediaDevices.enumerateDevices().then((function(e){return 2===e.length&&e.every((function(e){return"audioinput"===e.kind&&""===e.deviceId}))?[{deviceId:"",groupId:"",kind:"audioinput",label:""},{deviceId:"",groupId:"",kind:"videoinput",label:""}]:e})):Promise.resolve([])}},{key:"getConstraints",value:function(t){var n=t||{audio:!0,video:!0};return e.getDevices().then((function(t){return e.determineConstraintsForDevices(t,n)})).catch((function(e){p.error("DeviceManager::getConstraints ",e)}))}},{key:"determineConstraintsForDevices",value:function(t,n){var r=nt.load("mediaConstraints",n),i={channelCount:Xe.canStereo()&&!n.eco?2:1};if("video"in r||(r.video=!0),"audio"in r||(r.audio=i),r.video.deviceId){var o=r.video.deviceId.exact;t.find((function(e){return e.deviceId===o}))||(r.video=n.video)}if(r.audio.deviceId){var s=r.audio.deviceId.exact;t.find((function(e){return e.deviceId===s}))||(r.audio=!!n.audio&&i)}return!1!==n.video||n.eco||(r.video=!1),!0===n.video&&!1===r.video&&(r.video=!0),(!0===n.audio&&!1===r.audio||!0===r.audio)&&(r.audio=i),r.audio&&r.audio.channelCount!==i.channelCount&&(r.audio.channelCount=i.channelCount),0===t.filter((function(e){return"videoinput"===e.kind})).length&&(r.video=!1),e.applyLastUsedDevices(r,t),e.applyWidescreen(r),r}},{key:"applyLastUsedDevices",value:function(e,t){var n=nt.load("videoId"),r=nt.load("audioId");!0===e.video&&n&&t.find((function(e){return e.deviceId===n}))&&(e.video={deviceId:{exact:n}}),e.audio&&r&&t.find((function(e){return e.deviceId===r}))&&(e.audio.deviceId={exact:r})}},{key:"applyWidescreen",value:function(e){f.widescreen?(!0===e.video&&(e.video={}),e.video&&Object.assign(e.video,{width:640,height:360})):"object"===a(e.video)&&("width"in e.video||"height"in e.video)&&(Reflect.deleteProperty(e.video,"width"),Reflect.deleteProperty(e.video,"height"))}},{key:"getMobileConstraints",value:function(t){var n=Object.assign({audio:!0,video:!0},t);return e.applyWidescreen(n),Promise.resolve(n)}},{key:"getSinkId",value:function(){var t=nt.load("sinkId","");return e.getDevices().then((function(e){return e.find((function(e){return e.deviceId===t}))||(t="default"),t}))}},{key:"fetchDevices",value:function(){return e.getDevices().then((function(e){var t=e.filter((function(e){return"audiooutput"===e.kind}));return t.length>0&&-1===t.findIndex((function(e){return"default"===e.deviceId}))&&t.unshift({deviceId:"default",kind:"audiooutput",groupId:"default",label:"System default"}),{cameras:e.filter((function(e){return"videoinput"===e.kind})),microphones:e.filter((function(e){return"audioinput"===e.kind})),speakers:t}}))}},{key:"fetchInputDevices",value:function(){return e.getDevices().then((function(e){return e.filter((function(e){return e.kind.includes("input")}))}))}},{key:"getStoredVirtualBackgroundType",value:function(e){var t=nt.load("virtualBackgroundType","off");return"image:blob"===t?Dn.getImageBlobOrFallback(e):t}}]),e}();const Ln=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{eco:!1,audio:!0,video:!0,screen:!1,surface:null,screenStream:null,canvas:null,existingStream:null,micMixer:null,vbgMixer:null,isPresentation:!1,virtualBackground:!1,deviceMonitor:null};c(this,e),this.options=t,this.tempStream=null,this.brokenTrackCallback=null,this.bindMethods()}var t;return d(e,[{key:"bindMethods",value:function(){this.getMediaStream=this.getMediaStream.bind(this),this.addNinjaTrack=this.addNinjaTrack.bind(this),this.addCanvasTrack=this.addCanvasTrack.bind(this),this.addScreenTrack=this.addScreenTrack.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.adjustVideoTrack=this.adjustVideoTrack.bind(this),this.addScreenStreamTrack=this.addScreenStreamTrack.bind(this),this.initializeVirtualBackground=this.initializeVirtualBackground.bind(this)}},{key:"start",value:function(){var e=this;p.debug("MediaStreamBuilder::start",this.options);var t=this.options,n=t.existingStream,r=t.video,i=t.audio,o=t.screen,s=t.canvas,a=t.micMixer,c=t.screenStream;return Xe.isIOSDevice()&&n&&"boolean"==typeof r&&n.active&&_t(n).length>0&&"ended"!==_t(n)[0].readyState?new Promise((function(t){var o=U(_t(n),1)[0];if(o.enabled=r,o.onended=r&&e.brokenTrackCallback?function(){p.error("iOS video track broken"),n.getTracks().forEach((function(e){return e.stop()})),e.brokenTrackCallback()}:null,"boolean"==typeof i&&ft(n,i),s){var a=new MediaStream(n.getTracks()),c=zt(s),u=U(It(c),1)[0];return a.addTrack(u),void t(a)}t(n)})):Xe.isSafari()&&o&&a&&!s?(c?Promise.resolve(c):this.getDisplayMedia()).then((function(t){return Bn.getConstraints().then((function(n){var r=new MediaStream;return e.addScreenStreamTrack(r,t),e.tempStream=new MediaStream(t.getTracks()),navigator.mediaDevices.getUserMedia({audio:n.audio}).then((function(n){return e.adjustAudioTrack(n),n.getTracks().forEach((function(t){return e.tempStream.addTrack(t)})),a.mixScreenshareAudio(n,t,r),a.active&&a.setMicOnlyStream(n,t),r}))}))})).then((function(t){return e.tempStream=null,t})).catch((function(t){return e.tempStream&&(vt(e.tempStream),e.tempStream=null),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)})):Bn.fetchInputDevices().then(this.getMediaStream).then(this.adjustVideoTrack).then(this.adjustAudioTrack).then(this.initializeVirtualBackground).then(this.addCanvasTrack).then(this.addScreenTrack).then(this.addNinjaTrack).then((function(t){return e.tempStream=null,e.options.deviceMonitor&&e.options.deviceMonitor.applyTempTracks(),t})).catch((function(t){return e.cleanupTempStream(),e.options.deviceMonitor&&e.options.deviceMonitor.discardTempTracks(),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)}))}},{key:"getMediaStream",value:function(e){var t=this;if(0===e.length)return this.options={audio:!1,video:!1},this.tempStream=(new tt).stream,this.tempStream;var n=this.options,r=n.eco,i=n.video,o=n.existingStream,s={video:!Xe.hasCanvasCaptureSupport()&&!r||i,audio:!0};!1===i&&!r&&Xe.isIOSDevice()&&(s.video=!0);var a=Bn.getConstraints;return Xe.canMultipleDifferentMicrophones()||vt(o),(Xe.isPhone()||Xe.isIOSDevice())&&(vt(o),a=Bn.getMobileConstraints),a(s).then((function(e){return navigator.mediaDevices.getUserMedia(e).then((function(e){return t.tempStream=e,e}))}))}},{key:"adjustVideoTrack",value:function(e){if(1===e.getVideoTracks().length){var t=U(e.getVideoTracks(),1)[0];t.enabled=this.options.video,!1!==this.options.video||Xe.isIOSDevice()||mt(t),this.options.deviceMonitor&&this.options.deviceMonitor.addVideoTrack(t)}return e}},{key:"initializeVirtualBackground",value:function(e){var t=this.options,n=t.screen,r=t.virtualBackground,i=t.vbgMixer;return!n&&r&&e&&1===e.getVideoTracks().length?i.initiateStream(e):e}},{key:"adjustAudioTrack",value:function(e){if(1===e.getAudioTracks().length){var t=U(e.getAudioTracks(),1)[0];t.enabled=this.options.audio,this.options.deviceMonitor&&this.options.deviceMonitor.addAudioTrack(t)}return e}},{key:"addCanvasTrack",value:function(e){var t=this.options,n=t.canvas,r=t.existingStream;if(n){var i=zt(n),o=U(It(i),1)[0];e.addTrack(o)}if(Ut(r)){var s=U(It(r),1)[0];e.addTrack(s)}return e}},{key:"addScreenTrack",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options.screenStream,r=this.options,i=r.screen,o=r.existingStream,s=r.micMixer,!i||!s){e.next=13;break}if(null!=n){e.next=7;break}return e.next=6,this.getDisplayMedia();case 6:n=e.sent;case 7:return a=new MediaStream,this.addScreenStreamTrack(a,n),s.mixScreenshareAudio(t,n,a),s.active&&s.setMicOnlyStream(t,n),this.tempStream=new MediaStream(t.getTracks().concat(n.getTracks())),e.abrupt("return",a);case 13:return Lt(o)&&(c=Tt(o),u=U(c,1),l=u[0],t.addTrack(l)),e.abrupt("return",t);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"addScreenStreamTrack",value:function(e,t){var n=U(t.getVideoTracks(),1)[0];n.type=this.options.isPresentation?"screen-track":"screen-video-track",e&&e.addTrack(n)}},{key:"getDisplayMedia",value:function(){if(Xe.hasGetDisplayMedia()){var e={channelCount:Xe.canStereo()&&!this.options.eco?2:1},t={height:{max:1080},frameRate:{max:15}};return Xe.isChrome()&&Xe.isMacOS()&&(e.echoCancellation=!1),this.options.surface&&Xe.canChooseDisplaySurface()&&(t.displaySurface=this.options.surface),navigator.mediaDevices.getDisplayMedia({audio:e,video:t,surfaceSwitching:"include",selfBrowserSurface:"include",systemAudio:"include"})}return navigator.mediaDevices.getUserMedia({video:{mediaSource:"screen",width:{max:1920},height:{max:1040},frameRate:{max:15}}})}},{key:"addNinjaTrack",value:function(e){var t=this.options,n=t.eco,r=t.video;if(n||!Xe.hasCanvasCaptureSupport())return e;if(0===e.getVideoTracks().length){var i=U((new tt).stream.getVideoTracks(),1)[0];i.enabled=r,e.addTrack(i)}return e}},{key:"cleanupTempStream",value:function(){var e=this.tempStream;if(e){var t=this.options,n=t.existingStream,r=t.screenStream;if(Ut(n)){var i=U(It(n),1)[0];e.removeTrack(i)}if(Bt(n)){var o=U(Ct(n),1)[0];e.removeTrack(o)}if(Lt(r)){var s=U(Tt(r),1)[0];e.removeTrack(s)}vt(e),this.tempStream=null}}},{key:"onBrokenTrackError",value:function(e){return this.brokenTrackCallback=e,this}}]),e}();const Fn=function(){function e(){c(this,e),this.active=!1,this.audioContext=null,this.acOut=null,this.micOnlyStream=null,this.originalStream=null}return d(e,[{key:"setMicOnlyStream",value:function(e,t){this.micOnlyStream=new MediaStream;var n=e.getAudioTracks(),r=t.getVideoTracks();return n.length>0&&this.micOnlyStream.addTrack(n[0]),r.length>0&&this.micOnlyStream.addTrack(r[0]),this.micOnlyStream}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"getOriginalStream",value:function(){return this.originalStream}},{key:"stopOriginalStream",value:function(){vt(this.originalStream)}},{key:"noMix",value:function(e,t){var n=e.getAudioTracks();n.length>0&&t.addTrack(n[0])}},{key:"initMixScreenshareMix",value:function(e,t,n){this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.acOut=this.audioContext.createMediaStreamDestination(),this.audioContext.createMediaStreamSource(t).connect(this.acOut),this.audioContext.createMediaStreamSource(e).connect(this.acOut),n.addTrack(this.acOut.stream.getAudioTracks()[0])}},{key:"mixScreenshareAudio",value:function(e,t,n){this.originalStream=t;var r=t.getAudioTracks();if(0===r.length)this.noMix(e,n);else try{this.initMixScreenshareMix(e,t,n),this.active=!0}catch(t){p.error("MicMixer::mixScreenshareAudio",t),mt(r[0]),this.noMix(e,n)}}},{key:"destroy",value:function(){var e=this;if(this.stopOriginalStream(),this.micOnlyStream=null,this.originalStream=null,this.audioContext)return vt(this.acOut.stream),void this.audioContext.close().then((function(){e.audioContext=null,e.acOut=null,e.active=!1}));this.active=!1}}]),e}();function jn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vn=function(e,t,n){e.getAudioTracks().forEach((function(e){return e.enabled=t})),e.getVideoTracks().forEach((function(e){return e.enabled=n}))};const Un=function(e){g(n,e);var t=jn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.screen,i=void 0!==r&&r,o=e.surface;p.debug("ChangeLocalStreamEvent::handle");var s=this.context._session;if(!s)throw new Error("Session does not exist");var a=s.localStream,c=s.vbgMixer,u=Boolean(s.micMixer);if(Xe.isIOSDevice()||Xe.stopsDeviceActivityIndicatorOnDisable()&&!u&&!a.wasScreenAsVideo)return c&&(n?c.resume():c.suspend(),c.originalStream&&c.originalStream!==a&&Vn(c.originalStream,t,n)),Vn(a,t,n),a.locallyChanged=!0,void s.emit({type:"stream_update",localStream:a});s.micMixer&&(s.micMixer.destroy(),s.micMixer=null),c&&(c.stopOriginalStream(),c.terminate());var l={audio:t,video:n,virtualBackground:s.options.virtualBackground,existingStream:a,vbgMixer:c,deviceMonitor:s.deviceMonitor};i&&(s.micMixer=new Fn,l.video=!1,l.screen=!0,l.surface=o,l.virtualBackground=!1,l.micMixer=s.micMixer),new Ln(l).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){s.emit({type:"stop_screen_video"})})),e})).then((function(e){e.locallyChanged=!0,e.wasScreenAsVideo=u,s.setStream(e)})).catch((function(e){if(p.error("ChangeLocalStreamEvent",e),i){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"screen_capture_error",name:t}),s.emit({type:"stop_screen_video"})}}))}}]),n}(w);function Nn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Wn=function(e){g(n,e);var t=Nn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){p.debug("PodiumEvent::handle",e);var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=t.localStream;e.hasPresenter||!Nt(n)||t.stopPresentingSet||t.emit({type:"stop_presenting"}),t&&!t.externalStream&&this.scanMessageForLocalStreamOptimization(n,e),new F(this.context).handle(e)}},{key:"scanMessageForLocalStreamOptimization",value:function(e,t){var n=t.video,r=t.isSource,i=t.isPresenter,o=t.hasPresenter,s=t.hasDesktopSources;if(e){if(r&&(!n&&(Vt(e)||jt(e))||n&&!lt(e)&&e.locallyChanged&&!o)){var a={audio:ut(e),video:n};e.wasScreenAsVideo&&(a.video=!1,a.screen=!0),new Un(this.context).handle(a)}n&&!i&&s&&new Un(this.context).handle({audio:ut(e),video:!1})}}}]),n}(w);function Hn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const zn=function(e){g(n,e);var t=Hn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.takeSnapshot()}}]),n}(w);function Gn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const qn=function(e){g(n,e);var t=Gn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayer(e.params)}}]),n}(w);function $n(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Jn=function(e){g(n,e);var t=$n(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(!this.context._session)throw new Error("Session does not exist");this.context._session.send({type:"chat",content:e.content})}}]),n}(w);function Kn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Xn=function(e){g(n,e);var t=Kn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopBroadcast("generic").then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})})).catch((function(e){return p.warn(e)}))}}]),n}(P);function Yn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Qn=function(e){g(n,e);var t=Yn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayout(e.params)}}]),n}(w);function Zn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const er=function(e){g(n,e);var t=Zn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t,n=this.context,r=n._api,i=n._session,o=((t=e.url).endsWith("/")?t:t+"/")+e.key;r.startBroadcast({streamUrl:o},"generic").catch((function(e){i.emit({type:"start_broadcast_error",platform:"generic",error:e})}))}}]),n}(w);var tr=function(){try{return new EventTarget,!0}catch(e){}return!1}();const nr=function(){function e(){c(this,e),this.listeners=new Map,this.target=tr?new EventTarget:document.createElement("i")}return d(e,[{key:"onEvent",value:function(e){var t=function(t){var n=t.detail;return e(n)};this.target.addEventListener("event",t),this.listeners.set(e,t)}},{key:"offEvent",value:function(e){var t=this.listeners.get(e);t&&(this.target.removeEventListener("event",t),this.listeners.delete(e))}},{key:"removeAllListeners",value:function(){var e=this.listeners,t=this.target;e.forEach((function(e){return t.removeEventListener("event",e)})),e.clear()}},{key:"emit",value:function(e){var t=new CustomEvent("event",{detail:e});this.target.dispatchEvent(t)}}]),e}();function rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ir=function(e){g(n,e);var t=rr(n);function n(e){var r;return c(this,n),(r=t.call(this)).connection=null,r.options=e,r.wasOpen=!1,r}return d(n,[{key:"connect",value:function(){var e=this,t=this.options;this.wasOpen=!1;var n=new WebSocket("".concat(t.endpoint,"?auth_token=").concat(t.auth_token));n.onopen=function(){e.wasOpen=!0,e.emit({type:"connected"})},n.onmessage=function(t){var n=t.data;e.emit({type:"message",message:n})},n.onerror=function(){e.emit({type:"transportError"})},n.onclose=function(){e.destroy()},this.connection=n}},{key:"isConnected",value:function(){var e=this.connection;return!!e&&e.readyState===WebSocket.OPEN}},{key:"send",value:function(e){var t=this.connection;return!!t&&(t.send(e),!0)}},{key:"destroy",value:function(){var e=this.connection,t=this.wasOpen;e&&(this.connection=null,e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.readyState<=WebSocket.OPEN&&e.close(),this.emit({type:"disconnected",was_open:t})),this.removeAllListeners()}}]),n}(nr);var or=/\r\n|\r(?!\n)|\n/g;const sr=function(e){return e.replace(or,"\r\n")};const ar=function(e){try{return JSON.parse(atob(e.split(".")[1]))}catch(e){return!1}};var cr="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID;const ur=function(){if(cr)return crypto.randomUUID();var e=0,t=crypto.getRandomValues(new Uint8Array(31));return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(function(n){var r=t[e];return e+=1,(n^r&15>>n/4).toString(16)}))};function lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var dr=function(e){g(o,e);var t,n,r,i=lr(o);function o(e){var t;return c(this,o),t=i.call(this),function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="";if(["client_id","conf_id","client_name","sessionDescriptionHandlerFactory","transportOptions"].some((function(n){return!!e[n]||(t=n,!1)})),t||["auth_token","endpoint"].some((function(n){return!!e.transportOptions[n]||(t="transportOptions.".concat(n),!1)})),t)throw new Error("Invalid options - ".concat(t))}(e),t.callId=null,t.sessionDescriptionHandler=null,t.options=e,t.initAuthToken(),t.debouncedHandleSDPUpdate=function(e,t,n){var r=[],i=!1;return function o(){for(var s=arguments.length,a=new Array(s),c=0;c<s;c++)a[c]=arguments[c];i?r.push(a):(i=!0,setTimeout((function(){if(i=!1,r.length>0){var e=r.shift();Reflect.apply(o,null,e)}}),t),Reflect.apply(e,n,a))}}(t.handleSdpUpdate,250,b(t)),t}return d(o,[{key:"onMessage",value:(r=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=JSON.parse(t),r=n.type,i=n.data,this.verifySender(n),"call_accepted"!==r){e.next=10;break}return this.setCallId(i.call_id),e.next=7,this.sessionDescriptionHandler.setDescription(i.sdp);case 7:this.emit({type:"accepted"}),e.next=11;break;case 10:"call_resumed"===r?(this.sessionDescriptionHandler.setDescription(i.sdp),this.emit({type:"resumed"})):"call_rejected"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"reject",code:i.reject_code}),this.terminate()):"call_terminated"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"bye",code:i.term_code}),this.terminate()):"sdp_update"===r?this.debouncedHandleSDPUpdate(i):(i.type=r,this.emit({type:"message",data:i}));case 11:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"initAuthToken",value:function(){var e=this.options,t=ar(e.transportOptions.auth_token);if(!1===t||t.client_id!==e.client_id||t.conf_id!==e.conf_id||!t.exp)throw new Error("Invalid auth token")}},{key:"setCallId",value:function(e){this.callId=e}},{key:"verifySender",value:function(e){var t=this.options;e.from===t.conf_id&&e.to===t.client_id||console.error(new Error("Invalid message sender",e))}},{key:"handleSdpUpdate",value:(n=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.callId,r=t.sdp,n&&n===t.call_id){e.next=4;break}throw new Error("Invalid call id");case 4:return this.emit({type:"sdp_update",sdp:r}),e.next=7,this.sessionDescriptionHandler.updateDescription(r);case 7:i=e.sent,"offer"===r.type&&i&&(o={type:i.type,sdp:sr(i.sdp)},this.message("sdp_update",{call_id:n,sdp:o}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"message",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"message",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.options,r=JSON.stringify({type:e,msg_id:ur(),from:n.client_id,to:n.conf_id,data:t});this.transport.send(r)}},{key:"connect",value:function(){var e=this,t=this.options,n=new ir(t.transportOptions);this.transport=n,this.termination=!1,this.emit({type:"transportCreated",transport:n}),n.onEvent((function(n){var r=n.type;"connected"===r?e.sessionDescriptionHandler||(e.sessionDescriptionHandler=t.sessionDescriptionHandlerFactory(t.sessionDescriptionHandlerFactoryOptions),e.emit({type:"registered"})):"message"===r?e.onMessage(n.message):"disconnected"===r&&(e.termination||e.emit({type:"terminated",reason:"disconnect",code:n.was_open?0:-1}))})),n.connect()}},{key:"call",value:(t=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.sessionDescriptionHandler,n=this.options,t){e.next=3;break}throw new Error("Invalid sessionDescriptionHandler");case 3:return e.next=5,t.getDescription();case 5:r=e.sent,i={type:r.type,sdp:sr(r.sdp)},this.message("call_start",{sdp:i,display_name:n.client_name,mute_video:n.mute_video});case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"resume",value:function(e){var t=this;if(!this.callId)throw new Error("Session was already closed");this.options.transportOptions.auth_token=e;try{this.initAuthToken()}catch(e){return void this.emit({type:"terminated",reason:"disconnect",code:-1})}this.onEvent((function e(n){"transportCreated"===n.type&&(t.offEvent(e),t.transport.onEvent(function(){var e=Qe(et().mark((function e(n){var r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("connected"!==n.type){e.next=17;break}if(r=t.transport,i=t.sessionDescriptionHandler,t.callId){e.next=5;break}throw r.destroy(),new Error("Session was already closed");case 5:return e.prev=5,e.next=8,i.getDescription();case 8:o=e.sent,s={type:o.type,sdp:sr(o.sdp)},t.message("call_resume",{call_id:t.callId,sdp:s}),e.next=17;break;case 13:throw e.prev=13,e.t0=e.catch(5),r.destroy(),new Error("Unable to reconnect");case 17:case"end":return e.stop()}}),e,null,[[5,13]])})));return function(t){return e.apply(this,arguments)}}()))})),this.connect()}},{key:"terminate",value:function(){var e=this.sessionDescriptionHandler,t=this.transport,n=this.callId;this.callId=null,e&&e.close(),t&&(t.isConnected()&&n&&(this.termination=!0,this.message("call_terminate",{call_id:n,term_code:0}),this.emit({type:"terminated",reason:"terminate",code:0})),this.transport=null,t.destroy())}}]),o}(nr);const hr={UserAgent:dr},fr=["chat","recording","memberlist","source_update","voice_activity"];const pr=function(){function e(t,n){c(this,e);var r=t.src,i=void 0===r?[]:r,o=t.psrc,s=t.asrc,a=t.vsrc,u=t.dsrc,l=t.dims;this.clientId=n,this.sources=i,this.presenterIdx=o,this.audioSources=s,this.videoSources=a,this.desktopSources=u,this.dimensions=l,this.userSourceIndex=i.indexOf(n)}return d(e,[{key:"isSolo",get:function(){return 1===Array.from(new Set(this.sources)).length&&this.sources[0]===this.clientId}},{key:"isSource",get:function(){return this.sources.includes(this.clientId)}},{key:"isPresenter",get:function(){return this.hasPresenter&&this.presenter===this.clientId}},{key:"presenter",get:function(){return this.hasPresenter&&this.sources[this.presenterIdx]}},{key:"hasMedia",get:function(){return this.sources.some((function(e){return/media/.test(e)}))}},{key:"hasPresenter",get:function(){return Number.isInteger(this.presenterIdx)&&this.presenterIdx>-1}},{key:"hasVideoSources",get:function(){return Boolean(this.videoSources)}},{key:"hasDesktopSources",get:function(){return Number.isInteger(this.desktopSources)&&this.desktopSources>-1}},{key:"hasAudioPosition",get:function(){return this.audioSources.includes(this.userSourceIndex)}},{key:"hasVideoPosition",get:function(){return this.videoSources.includes(this.userSourceIndex)}},{key:"hasMutedVideoPeers",get:function(){var e=this;return!this.hasDesktopSources&&0===this.videoSources.filter((function(t){return t!==e.userSourceIndex})).length}},{key:"userDimensions",get:function(){var e=this.videoSources.indexOf(this.userSourceIndex);return e>-1?this.dimensions[e]:null}}]),e}();const mr=function(){function e(t){c(this,e),this.clientId=t,this.stamp=this.stamp.bind(this),this.default=this.default.bind(this),this.process=this.process.bind(this),this.sourceUpdate=this.sourceUpdate.bind(this),this.voiceActivity=this.voiceActivity.bind(this)}return d(e,[{key:"stamp",value:function(e){return Object.assign({_src:"sig"},e)}},{key:"process",value:function(e){return({source_update:this.sourceUpdate,voice_activity:this.voiceActivity}[e.type]||this.default)(this.stamp(e))}},{key:"default",value:function(e){return p.debug("SipMessageTransformer::default",e),e}},{key:"sourceUpdate",value:function(e){p.debug("SipMessageTransformer::sourceUpdate",e);var t=new pr(e,this.clientId);return{type:"podium",solo:t.isSolo,audio:t.hasAudioPosition,video:t.hasVideoPosition,media:t.hasMedia,sources:t.sources,isSource:t.isSource,presenter:t.presenter,isPresenter:t.isPresenter,hasPresenter:t.hasPresenter,videoSources:t.videoSources,userDimensions:t.userDimensions,hasVideoSources:t.hasVideoSources,hasDesktopSources:t.hasDesktopSources,hasMutedVideoPeers:t.hasMutedVideoPeers}}},{key:"voiceActivity",value:function(e){return p.debug("SipMessageTransformer::voiceActivity",e),Object.assign({type:"voice_activity_raw",on:e.on,userId:e.cid})}}]),e}();var vr=function(){function e(t){c(this,e),this.datachannel=null,this.peerConnection=null,this.localStream=null,this.remoteStream=null,this.connected=!1,this.iceCheckingTimer=null,this.peerConnectionReady=null,this.options=t||{},this.connection=t.connection,this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.initPeerConnection()}var t,n,r;return d(e,[{key:"getDescription",value:(r=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.options,n=this.peerConnection,p.debug("SessionDescriptionHandler::getDescription:",t),this.localStream=t.stream,e.next=5,n.createOffer(t.RTCOfferOptions);case 5:return r=e.sent,t.SDPModifiers.active.forEach((function(e){r.sdp=e(r.sdp)})),e.next=9,n.setLocalDescription(r);case 9:return e.next=11,this.peerConnectionReady;case 11:return i=n.localDescription.sdp,t.SDPModifiers.passive.forEach((function(e){i=e(i)})),p.debug("SessionDescriptionHandler::getDescription offer",i),e.abrupt("return",{type:"offer",sdp:i});case 15:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"setDescription",value:(n=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.datachannel,p.debug("SessionDescriptionHandler::setDescription:",t),t&&t.sdp&&(this.connection.seppMessaging=t.sdp.includes("a=eyeson-sepp-messaging")),e.next=5,this.peerConnection.setRemoteDescription(new RTCSessionDescription(t));case 5:if(this.options.remoteDescriptionUpdate(t),"connecting"!==n.readyState){e.next=9;break}return e.next=9,new Promise((function(e){n.onopen=function(){n.onopen=null,e()}}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateDescription",value:(t=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options,r=this.peerConnection,p.debug("SessionDescriptionHandler::updateDescription:",t),"offer"!==t.type){e.next=24;break}return e.prev=3,e.next=6,r.setRemoteDescription(new RTCSessionDescription(t));case 6:return e.next=8,r.createAnswer();case 8:return i=e.sent,n.SDPModifiers.active.forEach((function(e){i.sdp=e(i.sdp)})),e.next=12,r.setLocalDescription(i);case 12:return this.options.remoteDescriptionUpdate(t),o=r.localDescription.sdp,n.SDPModifiers.passive.forEach((function(e){o=e(o)})),p.debug("SessionDescriptionHandler::updateDescription answer",o),e.abrupt("return",{type:"answer",sdp:o});case 19:e.prev=19,e.t0=e.catch(3),p.error("SessionDescriptionHandler::updateDescription",e.t0);case 22:e.next=28;break;case 24:if("answer"!==t.type){e.next=28;break}return e.next=27,r.setRemoteDescription(new RTCSessionDescription(t));case 27:this.options.remoteDescriptionUpdate(t);case 28:return e.abrupt("return",null);case 29:case"end":return e.stop()}}),e,this,[[3,19]])}))),function(e){return t.apply(this,arguments)})},{key:"close",value:function(){p.debug("SessionDescriptionHandler::close"),clearTimeout(this.iceCheckingTimer),this.peerConnection&&(this.stopAllTracks(),this.peerConnection.close(),this.peerConnection=null,this.datachannel&&["connecting","open"].includes(this.datachannel.readyState)&&(this.datachannel.close(),this.datachannel=null),p.debug("SessionDescriptionHandler::close Stopped streams and closed peerConnection."))}},{key:"initPeerConnection",value:function(){var e=this.options,t=this.buildPeerConnectionOptions();p.debug("SessionDescriptionHandler::initPeerConnection with",t);var n=null;this.peerConnectionReady=new Promise((function(e){return n=e}));try{var r=new RTCPeerConnection(t);this.peerConnection=r,e.stream.getTracks().forEach((function(t){r.addTrack(t,e.stream)}));var i=r.createDataChannel("data",{negotiated:!0,id:0});this.handleDatachannel(i),r.onicecandidate=function(e){var t=e.candidate;t?p.debug("SessionDescriptionHandler::gotIceCandidate",t.candidate):n()},r.onicegatheringstatechange=function(){"complete"===r.iceGatheringState&&n()},!0===e.sendOnly?r.addEventListener("connectionstatechange",this.handleConnectionStateChange):r.ontrack=this.handleOntrack.bind(this),this.iceCheckingTimer=setTimeout((function(){return n()}),3e3)}catch(e){p.error("SessionDescriptionHandler::initPeerConnection failed:",e,this.connection.uaOptions)}}},{key:"handleOntrack",value:function(e){var t=e.track,n=e.streams,r=this.options,i=U(n,1);this.remoteStream=i[0],p.debug("SessionDescriptionHandler::handleOntrack:",t.kind),t.onunmute=function(){return r.handleUnmute(t)},r.handleAccept(this.remoteStream)}},{key:"handleConnectionStateChange",value:function(){"connected"!==this.peerConnection.connectionState||this.connected||(this.connected=!0,this.options.handleAccept())}},{key:"handleDatachannel",value:function(e){this.datachannel=e,this.connection.initDatachannel(e)}},{key:"buildPeerConnectionOptions",value:function(){var e=this.options,t=[{urls:e.stun_servers}];return e.turn_servers.forEach((function(e){e.credential=e.password,t.push(e)})),{sdpSemantics:"unified-plan",iceServers:t}}},{key:"getLocalStream",value:function(){return this.localStream}},{key:"getRemoteStream",value:function(){return this.remoteStream}},{key:"setStream",value:function(e){var t=this;return new Promise((function(n,r){var i=t.getLocalStream();t.localStream=e,t.stopUnusedTracks(i,e);var o=U(e.getAudioTracks(),1)[0],s=U(Ut(e)?It(e):e.getVideoTracks(),1)[0];if(t.tracksExist()){var a=t.peerConnection.getSenders(),c=a.find((function(e){return e.track&&"audio"===e.track.kind})),u=a.find((function(e){return e.track&&"video"===e.track.kind}));Promise.all([c?c.replaceTrack(o):null,u?u.replaceTrack(s):null]).then((function(){n({newStream:e,remoteStream:t.remoteStream})})).catch(r)}else n({newStream:e,remoteStream:t.remoteStream})}))}},{key:"stopUnusedTracks",value:function(e,t){this.connection.hasExternalStream||e.getTracks().filter((function(e){return!t.getTracks().includes(e)})).forEach(mt)}},{key:"tracksExist",value:function(){return Boolean(this.peerConnection.getSenders().find((function(e){return null!==e.track})))}},{key:"scaleResolution",value:function(e){try{var t=Math.max(1/Math.max(e,.1),1),n=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),r=n.getParameters();r.encodings||(r.encodings=[{}]),r.encodings[0].scaleResolutionDownBy!==t&&(r.encodings[0].scaleResolutionDownBy=t,n.setParameters(r))}catch(e){p.error("SessionDescriptionHandler::scaleResolution failed:",e)}}},{key:"limitFramerate",value:function(e){try{var t=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),n=t.getParameters();n.encodings||(n.encodings=[{}]),n.encodings[0].maxFramerate!==e&&(e?n.encodings[0].maxFramerate=e:Reflect.deleteProperty(n.encodings[0],"maxFramerate"),t.setParameters(n))}catch(e){p.error("SessionDescriptionHandler::limitFramerate failed:",e)}}},{key:"stopAllTracks",value:function(){p.debug("SessionDescriptionHandler::stopAllTracks");var e=this.peerConnection.getReceivers?this.peerConnection.getReceivers():[];this.peerConnection.getSenders().concat(e).forEach((function(e){e.track&&mt(e.track)}))}}]),e}();const yr=vr;var gr=32768;const br=function(){function e(t,n){c(this,e),this.listeners=[],this.messageListener=[],this.datachannel=null,this.uaOptions=this.initUserAgentOptions(t,n),this.clientId=this.uaOptions.client_id,this.userAgent=null,this.transformer=new mr(this.clientId),this.seppMessaging=!1}return d(e,[{key:"initUserAgentOptions",value:function(e,t){if("sepp"!==e.type)return{client_id:null};var n=e.options;return{client_id:n.client_id,conf_id:n.conf_id,client_name:t.name,mute_video:!1,sessionDescriptionHandlerFactory:function(e){return new yr(e)},sessionDescriptionHandlerFactoryOptions:{stun_servers:n.stun_servers,turn_servers:n.turn_servers},transportOptions:{auth_token:n.auth_token,endpoint:n.endpoint}}}},{key:"start",value:function(){var e=this;return new Promise((function(t){if(!e.uaOptions.client_id)throw new TypeError("Invalid signaling data");e.userAgent=new hr.UserAgent(e.uaOptions),t()}))}},{key:"startSession",value:function(e){var t=this;return Object.assign(this.uaOptions.sessionDescriptionHandlerFactoryOptions,e),e.mediaOptions&&(this.uaOptions.mute_video=!e.mediaOptions.video),this.userAgent.onEvent((function(e){var n=e.type,r=e.data;"registered"===n?t.userAgent.call():"message"===n&&t.handleMessage(r)})),this.userAgent.connect(),this.userAgent}},{key:"updateAuthAndRestartSession",value:function(e){p.debug("updateAuthAndRestartSession",e),e.error||(this.uaOptions.transportOptions.auth_token=e.signaling.options.auth_token),this.userAgent.connect()}},{key:"updateAuthAndResume",value:function(e){p.debug("updateAuthAndResume",e),this.userAgent?e.error?this.userAgent.resume(null):this.userAgent.resume(e.signaling.options.auth_token):p.warn("updateAuthAndResume","userAgent already gone")}},{key:"initDatachannel",value:function(e){var t=this;this.datachannel=e,p.debug("SigConnection::initDatachannel",e),e.onmessage=function(n){if('{"type":"ping"}'!==n.data||"open"!==e.readyState){p.debug("SigConnection::dataChannelMessage",n.data);var r=JSON.parse(n.data);"ack"!==r.type&&t.handleMessage(r)}else e.send('{"type":"pong"}')}}},{key:"close",value:function(){var e=this.datachannel,t=this.userAgent;this.datachannel=null,this.userAgent=null,e&&"open"===e.readyState&&e.close(),t&&(t.removeAllListeners(),t.terminate())}},{key:"onMessage",value:function(e){this.messageListener.push(e)}},{key:"handleMessage",value:function(e){if(fr.includes(e.type)){var t=this.transformer.process(e);this.messageListener.forEach((function(e){return e(t)}))}else p.debug('SigConnection::handleMessage ignoring "'.concat(e.type,'" message.'))}},{key:"send",value:function(e){if(!this.seppMessaging){var t=this.datachannel;e.cid=this.uaOptions.client_id;var n=JSON.stringify(e);return"chat"===e.type&&n.length>=gr?(p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"})):t&&"open"===t.readyState&&n.length<gr?(p.debug("SigConnection::send datachannel",n),void t.send(n)):void p.error("SigConnection::send failed",e)}this.sendSeppMessage(e)}},{key:"sendSeppMessage",value:function(e){var t=this.userAgent;if(t&&t.callId){e.cid=this.uaOptions.client_id,e.call_id=t.callId;var n=JSON.stringify(e);if("chat"===e.type&&n.length>=gr)return p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"});if(n.length<gr)return p.debug("SigConnection::send sepp",e),void t.message(e.type,e);p.error("SigConnection::send failed",e)}}},{key:"onError",value:function(e){return this.listeners.push(e),this}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}]),e}();function Sr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const kr=function(e){g(n,e);var t=Sr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(R(k(n.prototype),"handle",this).call(this,e),this.context.rtData=e.content,!0===e.content.ready){var t=e.content,r=t.user,i=t.room,o=t.signaling,s=t.links,a=t.options;this.context._eyeson.room=i,this.context._eyeson.user=this.context._api.addUserAttributes(r,r.id,o.options.client_id),this.context._eyeson.links=s,f.widescreen=Boolean(a.widescreen),this.context._connection?p.debug("RoomReceived double room_ready"):function(e,t,n){e.connection=new br(t,n),e._connection.onError((function(t){return e.send(t)})).start().then((function(){return e.send({type:"connection",connectionStatus:"ready"})})).catch((function(){return e.send({type:"connection",connectionStatus:"transport_error"})}))}(this.context,o,r)}else p.debug("RoomReceived not ready:",e.content)}}]),n}(P);function wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const xr=function(e){g(n,e);var t=wr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context._api.getRoom((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"fetch_room",room:t})}))}}]),n}(P);function Cr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Tr=function(e){g(n,e);var t=Cr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.deleteFile(e.file)}}]),n}(w);function Rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const _r=function(e){g(n,e);var t=Rr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.uploadFile(e.file,this.addFile.bind(this))}},{key:"addFile",value:function(e){R(k(n.prototype),"handle",this).call(this,{type:"add_file",file:e})}}]),n}(P);function Pr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Er=function(e){g(n,e);var t=Pr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.cid.split("@").shift();this.msg=e,this.context._api.getUser(t,this.forwardMessage.bind(this))}},{key:"forwardMessage",value:function(e){var t=Date.parse(this.msg.ts||this.msg.created_at);R(k(n.prototype),"handle",this).call(this,{type:this.msg.type,user:e,timestamp:new Date(t),content:this.msg.content})}}]),n}(P);function Mr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Or=function(e){g(n,e);var t=Mr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.virtualBackground,s=void 0!==o&&o,a=e.screen,c=void 0!==a&&a,u=e.surface,l=void 0===u?null:u;p.debug("StartStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(c));var d=this.context,h=d._session,f=d._connection;if(!h)throw new Error("Session does not exist");if(h.micMixer&&(h.micMixer.destroy(),h.micMixer=null),h.options.virtualBackground=s,h.vbgMixer){var m=Bn.getStoredVirtualBackgroundType();h.vbgMixer.stopOriginalStream(),h.vbgMixer.terminate(),h.vbgMixer.changeBackground(m)}h.localStream&&!Xe.canMultipleDifferentMicrophones()&&vt(h.localStream);var v={audio:n,video:i,virtualBackground:h.options.virtualBackground,vbgMixer:h.vbgMixer,deviceMonitor:h.deviceMonitor};return c&&(h.micMixer=new Fn,v.video=!1,v.screen=!0,v.surface=l,v.virtualBackground=!1,v.micMixer=h.micMixer),new Ln(v).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_screen_video"})})),e})).then(h.setStream).then((function(){return h.send({type:"mute_video",on:!(i||c)})})).then((function(){h.externalStream&&(h.externalStream=null,f.hasExternalStream=!1)})).catch((function(e){if(p.error("StartStreamEvent",e),c){h.micMixer&&(h.micMixer.destroy(),h.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),h.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ar(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Dr=function(e){g(n,e);var t=Ar(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.screen,s=void 0!==o&&o,a=e.surface;p.debug("ChangeStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(s));var c=this.context._session;if(!c)throw new Error("Session does not exist");c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);return c.externalStream?(ft(c.externalStream,n),pt(c.externalStream,i),c.send({type:"mute_video",on:!i}),Promise.resolve()):new Promise((function(e,t){if(Xe.stopsDeviceActivityIndicatorOnDisable()&&!s){var r=U(c.localStream.getVideoTracks(),1)[0],o=U(c.localStream.getAudioTracks(),1)[0];if(!(i&&kt(r)||"ended"===r.readyState||"ended"===o.readyState||bt(r)))return c.vbgMixer&&c.vbgMixer.originalStream?(c.vbgMixer[i?"start":"stop"](),Dt(c.localStream,i),At(c.vbgMixer.originalStream,i)):At(c.localStream,i),ft(c.localStream,n),void e(c.localStream)}c.vbgMixer&&(c.vbgMixer.stopOriginalStream(),c.vbgMixer.terminate());var u={audio:n,video:i,virtualBackground:c.options.virtualBackground,existingStream:c.localStream,vbgMixer:c.vbgMixer,deviceMonitor:c.deviceMonitor};s&&(c.micMixer=new Fn,u.screen=!0,u.video=!1,u.surface=a,u.virtualBackground=!1,u.vbgMixer=null,u.micMixer=c.micMixer),new Ln(u).onBrokenTrackError((function(){c.emit({type:"broken_track_error"})})).start().then(e).catch(t)})).then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){c.emit({type:"stop_screen_video"})})),e})).then(c.setStream).then((function(e){Ut(e)?c.canvasMixer.setStream(e):c.send({type:"mute_video",on:!(i||s)})})).catch((function(e){if(p.error(e),e instanceof Error&&["NotReadableError","DevicesNotFoundError","NotFoundError"].includes(e.name)&&c.emit({type:"warning",name:"error_"+e.name}),s){c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),c.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ir(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Br=function(e){g(n,e);var t=Ir(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=Gt(e.stream);if(!t)return p.error("ReplaceStreamEvent::handle invalid stream",e.stream),Promise.reject(new TypeError("Invalid stream"));var n=this.context,r=n._session,i=n._connection;if(!r)throw new Error("Session does not exist");return r.micMixer&&(r.micMixer.destroy(),r.micMixer=null),r.vbgMixer&&(r.vbgMixer.stopOriginalStream(),r.vbgMixer.terminate()),r.options.audio=ut(t),r.options.video=lt(t),r.setStream(t).then((function(){r.externalStream=t,i.hasExternalStream=!0,r.send({type:"mute_video",on:!lt(t)})})).catch((function(e){r.externalStream=null,i.hasExternalStream=!1,p.error(e)}))}}]),n}(w);function Lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fr=function(e){g(n,e);var t=Lr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.facingMode;p.debug("ToggleCameraEvent::handle",t);var n=this.context._session;if(!n)throw new Error("Session does not exist");new Ln({audio:n.localStream.getAudioTracks()[0].enabled,video:{facingMode:t},existingStream:n.localStream,deviceMonitor:n.deviceMonitor}).start().then(n.setStream).catch(p.error)}}]),n}(w);function jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Vr=function(e){g(n,e);var t=jr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.type,r=e.session.sessionDescriptionHandler,i=r.getLocalStream(),o=r.getRemoteStream();R(k(n.prototype),"handle",this).call(this,{type:t,localStream:i,remoteStream:o})}}]),n}(P);function Ur(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Nr=function(e){g(n,e);var t=Ur(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopRecording(e)}}]),n}(P);function Wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hr=function(e){g(n,e);var t=Wr(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n){t.context._api.getUser(e,n)}))}},{key:"handle",value:function(e){var t=this;this.getUser(e.userId).then((function(n){t.context.send({type:"voice_activity",user:n,on:e.on})}),(function(e){p.error("VoiceActivityEvent::handle",e)}))}}]),n}(w);function zr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Gr=function(e){g(n,e);var t=zr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context,n=t._api,r=t._session;n.startRecording(e).catch((function(e){return r.emit({type:"recording_error",error:e})}))}}]),n}(P);function qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const $r=function(e){g(n,e);var t=qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.screen,r=void 0!==n&&n,i=e.screenStream,o=e.surface,s=this.context._session;if(!s)throw new Error("Session does not exist");s.micMixer&&s.micMixer.destroy(),s.micMixer=new Fn;new Ln({audio:t,video:!1,screen:r,surface:o,screenStream:i,existingStream:s.localStream,micMixer:s.micMixer,isPresentation:!0,deviceMonitor:s.deviceMonitor}).start().then((function(e){var t="screen",n=U(Tt(e),1)[0];if(n){n.addEventListener("ended",(function(){s.emit({type:"stop_presenting"})}));var r=function(e){if(e&&"function"==typeof e.getSettings){var t=e.getSettings();if(Reflect.apply(Object.prototype.hasOwnProperty,t,["displaySurface"]))return t.displaySurface}return""}(n);r&&(t="screen-".concat(r))}s.emit({type:"start_presenting",stream:e,present:t})})).catch((function(e){if(p.error("ScreenCaptureEvent",e),r){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"capture_error",name:t})}s.emit({type:"stop_presenting"})}))}}]),n}(w);function Jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Kr=function(e){g(r,e);var t,n=Jr(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"streamVideo",value:function(){var e=this,t=this.context._session;new Ln({audio:t.localStream.getAudioTracks()[0].enabled,video:!1,deviceMonitor:t.deviceMonitor}).start().then((function(n){var r=t.videoPlayer.invokeStream(n);return e.handle({stream:r})})).catch((function(e){p.error("StartPresentingEvent",e),e.name.match(/notallowed|permission/i)||t.emit({type:"capture_error",name:"error_".concat(e.name)}),t.emit({type:"stop_presenting"})}))}},{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.stream,r=void 0===n?null:n,i=t.present,o=void 0===i?"":i,s=this.context._session){e.next=4;break}throw new Error("Session does not exist");case 4:if(s.vbgMixer&&(s.vbgMixer.stopOriginalStream(),s.vbgMixer.terminate()),!s.videoPlayer||s.videoPlayer.isStreaming()){e.next=9;break}this.streamVideo(),e.next=16;break;case 9:return a=r||s.localStream,s.canvasMixer&&s.canvasMixer.stream&&(a=s.canvasMixer.stream),e.next=13,s.setStream(a);case 13:s.send({type:"set_presenter",on:!0}),s.send({type:"desktopstreaming",on:!0}),s.emit({type:"presentation_started",present:o});case 16:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Yr=function(e){g(n,e);var t=Xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.canvasMixer&&(e.canvasMixer.vbgMixer&&(e.canvasMixer.vbgMixer.stopOriginalStream(),e.canvasMixer.vbgMixer.terminate(),e.canvasMixer.vbgMixer=null),e.canvasMixer.stop(),e.canvasMixer=null),e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.videoPlayer&&(e.videoPlayer.destroy(),e.videoPlayer=null),e.send({type:"desktopstreaming",on:!1}),e.send({type:"set_presenter",on:!1}),e.emit({type:"presentation_ended"}),e.stopPresentingSet=!0}}]),n}(w);function Qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Zr=function(e){g(n,e);var t=Qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopAllBroadcasts().then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})}))}}]),n}(P);function ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ti=function(e){g(n,e);var t=ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.clearFrontLayer()}}]),n}(w);function ni(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ri=function(e){g(n,e);var t=ni(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;return new m(e.api,e.token).requestUser({name:e.name,email:e.email,locale:e.locale},(function(e){if(!e.access_key){var r=e.locked;return e.error&&"ComApiError: 423"===e.error.message&&(r=!0),void R(k(n.prototype),"handle",t).call(t,{type:"error",content:"Request guest user failed",locked:r})}R(k(n.prototype),"handle",t).call(t,{type:"guest_user",token:e.access_key})}))}}]),n}(P);function ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const oi=function(e){g(n,e);var t=ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._eyeson.destroy()}}]),n}(w);function si(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ai=function(e){g(n,e);var t=si(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n,r){if(t.context._api)try{t.context._api.getUser(e,n)}catch(e){r(e)}else r(new Error("missing ComAPI"))}))}},{key:"handle",value:function(e){var t=this;(e.add||[]).forEach((function(e,n,r){var i=e.cid,o=t.context._connection.clientId,s=Boolean(r.find((function(e){return e.cid===o})));t.getUser(i).then((function(e){t.context.send({type:"add_user",user:e,initial:s})})).catch((function(e){return p.error(e)}))})),(e.del||[]).forEach((function(e){var n=e;t.getUser(n).then((function(e){t.context.send({type:"remove_user",userId:n,user:e})})).catch((function(e){return p.error(e)}))})),this.context.send({type:"playback_update",playing:e.media||[]})}}]),n}(w);var ci=function(e){return Number(parseFloat(e).toFixed(2))};const ui=function(e,t,n){var r=Math.min(n.width/e,n.height/t);return{width:ci(e*r),height:ci(t*r)}},li=function(e,t,n){var r;return function(){var i=this,o=arguments,s=n&&!r;clearTimeout(r),r=setTimeout((function(){r=null,n||e.apply(i,o)}),t),s&&e.apply(i,o)}};var di=1e3/15,hi={width:220,height:140},fi={width:320,height:240},pi={width:420,height:340},mi={width:0,height:0},vi="function"==typeof window.MediaStreamTrackProcessor,yi={getSettings:function(){return{width:0,height:0}},addEventListener:function(){return null}},gi=Xe.isIOSDevice(),bi=function(e){var t=U(e.getVideoTracks(),1)[0];if(!t)return null;if(vi)return new MediaStreamTrackProcessor(t).readable.getReader();var n=t.getSettings(),r=n.width,i=n.height,o=document.createElement("video");return o.playsInline=!0,o.muted=!0,o.width=r,o.height=i,o.srcObject=e,t.addEventListener("stopped",(function(){o.srcObject=null})),o.play().catch((function(e){return p.warn("bindVideoToStream: play",e,e.message)})),o},Si=function(){function e(t,n){c(this,e),this.canvas=t,this.stream=n,this.camera=null,this.screen=null,this.canvasTrack=null,this.context=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),this.xPos=0,this.camSize=fi,this.isCanvasCapture=!1,this.draw=this.draw.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.onError=this.onError.bind(this),this.onRedraw=this.onRedraw.bind(this),this.setStream=this.setStream.bind(this),this.setCamera=this.setCamera.bind(this),this.drawFrame=this.drawFrame.bind(this),this.calcSizesAndPositions=this.calcSizesAndPositions.bind(this),this.bouncedDraw=li(this.draw,di)}var t;return d(e,[{key:"onError",value:function(e){this.errorCallback=e}},{key:"onRedraw",value:function(e){this.redrawCallback=e}},{key:"start",value:function(){var e,t=U(It(this.stream),1)[0];this.canvasTrack=t,gi?((e=this).cameraStream={getVideoTracks:function(){return[]}},e.screenStream={getVideoTracks:function(){return[]}},this.setCamera({horizontal:"right",vertical:"bottom"},"none")):(this.setCamera({horizontal:"right",vertical:"bottom"},"medium"),this.setStream(this.stream)),this.draw()}},{key:"stop",value:function(){this.stream&&(vt(this.stream),this.stream=null,this.camera=null,this.screen=null,this.screenStream=null,this.cameraStream=null,this.canvasTrack=null)}},{key:"setStream",value:function(e){this.stream=e,this.cameraStream=new MediaStream(jt(e)?Pt(e):_t(e)),this.screenStream=new MediaStream(Tt(this.stream));var t=function(e){if(e&&e.getVideoTracks().length>0){var t=U(e.getVideoTracks(),1)[0];if("canvas"in t)return t.canvas}return null}(this.cameraStream);t?(this.isCanvasCapture=!0,this.camera=t):(this.isCanvasCapture=!1,this.camera=bi(this.cameraStream)),this.screen=bi(this.screenStream),this.calcSizesAndPositions(),this.redrawQueued=!0}},{key:"setCamera",value:function(e,t){this.cameraPosition=e||this.cameraPosition,this.cameraSizeInWords=t||this.cameraSizeInWords,this.redrawQueued=!0}},{key:"calcSizesAndPositions",value:function(){var e,t,n,r,i,o,s,a,c=U(this.screenStream.getVideoTracks(),1)[0],u=(void 0===c?yi:c).getSettings(),l=(e=this.canvas,n=(t=u).width/t.height,r=e.width/e.height,i=e.width,o=e.height,s=0,a=0,n<r&&(i=t.width*(o/t.height),s=(e.width-i)/2),n>r&&(o=t.height*(i/t.width),a=(e.height-o)/2),{x:s,y:a,width:i,height:o}),d=U(this.cameraStream.getVideoTracks(),1)[0],h=(void 0===d?yi:d).getSettings();this.camSize={small:hi,medium:fi,large:pi,none:mi}[this.cameraSizeInWords];var f=ui(h.width,h.height,this.camSize);this.sizes={screen:{width:l.width,height:l.height},camera:{width:f.width,height:f.height}};var p={x:"right"===this.cameraPosition.horizontal?this.canvas.width-this.sizes.camera.width:0,y:"bottom"===this.cameraPosition.vertical?this.canvas.height-this.sizes.camera.height:0};this.positions={screen:{x:l.x,y:l.y},camera:{x:p.x,y:p.y}}}},{key:"draw",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,this.stream&&this.stream.active){e.next=3;break}return e.abrupt("return");case 3:if(this.calcSizesAndPositions(),this.redrawCallback&&this.redrawQueued&&(this.redrawCallback(),this.redrawQueued=!1),t=performance.now(),!this.screen){e.next=14;break}if(n=this.screen,!(vi&&this.screen instanceof ReadableStreamDefaultReader)){e.next=13;break}return e.next=11,this.screen.read();case 11:r=e.sent,n=r.value;case 13:this.drawFrame(n,this.positions.screen,this.sizes.screen,!1,!0);case 14:if(i=this.camera,!(vi&&this.camera instanceof ReadableStreamDefaultReader)){e.next=20;break}return e.next=18,this.camera.read();case 18:o=e.sent,i=o.value;case 20:this.drawFrame(i,this.positions.camera,this.sizes.camera,this.isCanvasCapture,!1),(s=performance.now())-t>=di&&p.warn("Mixer::drawFrame took ".concat(s-t,"ms."));try{this.canvasTrack&&this.canvasTrack.requestFrame()}catch(e){p.warn("CanvasMixer draw requestFrame error - ".concat(e.message))}this.bouncedDraw(),e.next=31;break;case 27:e.prev=27,e.t0=e.catch(0),p.error(e.t0),this.errorCallback(e.t0);case 31:case"end":return e.stop()}}),e,this,[[0,27]])}))),function(){return t.apply(this,arguments)})},{key:"drawFrame",value:function(e,t,n,r,i){var o=this.context,s=this.canvas;if(e&&(r||!(e instanceof HTMLVideoElement)||e.srcObject&&e.srcObject.active))i&&!r&&o.clearRect(0,0,s.width,s.height),o.drawImage(e,t.x,t.y,n.width,n.height),vi&&"function"==typeof e.close&&e.close();else{var a=o.createImageData(1,1);o.putImageData(a,0,0)}}}]),e}();const ki=Si;function wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var xi=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.canvas,i=e.screen,o=void 0!==i&&i,s=e.surface,a=e.onRedraw,c=e.changeStream,u=void 0!==c&&c,l=e.present,d=void 0===l?"mixer":l,h=this.context._session;if(!h)throw new Error("Session does not exist");var f=Bn.getStoredVirtualBackgroundType(),m=new Dn("canvasmixer");m.changeBackground(f);var v=function(e){p.error("StartMixerEvent",e),!h.canvasMixer&&m&&m.terminate(),!e.name.match(/notallowed|permission/i)&&o&&h.emit({type:"capture_error",name:"error_".concat(e.name)}),h.emit({type:"stop_presenting"})};new Ln({audio:t,video:n,virtualBackground:h.options.virtualBackground,screen:o,surface:s,canvas:r,existingStream:h.localStream,vbgMixer:m,deviceMonitor:h.deviceMonitor}).start().then((function(e){var t=U(Tt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_presenting"}),mt(t)})),h.canvasMixer=new ki(r,e),h.canvasMixer.vbgMixer=m,h.canvasMixer.onError(v),h.canvasMixer.onRedraw(a),h.canvasMixer.start(),e})).then((function(e){u?h.emit({type:"start_presenting",stream:e,present:d}):h.emit({type:"stream_update",presentationStream:e})})).catch(v)}}]),n}(w),Ci=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.position,n=e.size,r=this.context._session;if(!r)throw new Error("Session does not exist");try{r.canvasMixer.setCamera(t,n)}catch(e){p.error(e)}}}]),n}(w),Ti="function"==typeof HTMLVideoElement.prototype.requestVideoFrameCallback,Ri=Xe.isIOSDevice();const _i=function(){function e(t){var n=t.canvas,r=t.file,i=t.onReady,o=t.onDuration,s=t.onTimeUpdate,a=t.onEnd,u=t.performAction;c(this,e),this.ac=null,this.acOut=null,this.gainNode=null,this.timer=null,this.canvas=n,this.url=URL.createObjectURL(r),this.ctx=n.getContext("2d"),this.video=document.createElement("video"),this.callback={onReady:i,onDuration:o,onTimeUpdate:s,onEnd:a,performAction:u},this.errorCallback=null,this.boundDrawVideoFrame=this.drawVideoFrame.bind(this),this.boundInitCanvasStream=this.initCanvasStream.bind(this),this.isPlaying=!1,this.blockTimeUpdate=!1,this.micOnlyStream=null,this.userMediaStream=null,this.initTimeout=null,this.invokationTimer=null,this.initVideo()}return d(e,[{key:"drawVideoFrame",value:function(){this.ctx.drawImage(this.video,0,0),this.timer=Ti?this.video.requestVideoFrameCallback(this.boundDrawVideoFrame):requestAnimationFrame(this.boundDrawVideoFrame)}},{key:"initVideo",value:function(){var e=this,t=this.video;t.playsInline=!0,t.autoplay=Boolean(Ri),t.preload="",t.onplaying=this.onVideoPlay.bind(this),t.onpause=this.onVideoPause.bind(this),t.onseeked=this.onVideoSeeked.bind(this),t.ontimeupdate=this.onVideoTimeUpdate.bind(this),t.onloadeddata=this.onVideoReady.bind(this),t.onerror=this.onVideoError.bind(this),t.onended=this.onVideoEnd.bind(this),this.initTimeout=setTimeout((function(){return e.onVideoError()}),6e3),t.src=this.url}},{key:"onVideoReady",value:function(){var e=this.video,t=this.canvas;clearTimeout(this.initTimeout),this.callback.onDuration(e.duration),t.width=e.videoWidth,t.height=e.videoHeight,this.ac=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.ac.createGain(),this.ac.createMediaElementSource(e).connect(this.gainNode),this.gainNode.connect(this.ac.destination),Ti&&(this.timer=e.requestVideoFrameCallback(this.boundDrawVideoFrame)),this.callback.performAction(this.onVideoAction.bind(this));try{this.ctx.drawImage(e,0,0)}catch(e){return void(this.errorCallback&&this.errorCallback(e))}this.callback.onReady(),e.autoplay&&setTimeout((function(){e.pause(),e.currentTime=0}))}},{key:"onVideoAction",value:function(e,t){return"play"===e?this.onPlayAction():"pause"===e?this.onPauseAction():("time"===e?this.onTimeAction(t):"volume"===e&&this.onVolumeAction(t),Promise.resolve())}},{key:"onPlayAction",value:function(){var e=this.video;return e.paused&&!this.isPlaying?e.play().then((function(){return e.paused}),(function(){return e.paused})):Promise.resolve(e.paused)}},{key:"onPauseAction",value:function(){var e=this.video;return!e.paused&&this.isPlaying&&e.pause(),Promise.resolve(e.paused)}},{key:"onTimeAction",value:function(e){var t=this.video;this.blockTimeUpdate=!0,e>=t.duration?t.currentTime=t.duration-.1:t.currentTime=e,this.blockTimeUpdate=!1}},{key:"onVolumeAction",value:function(e){this.gainNode&&(this.gainNode.gain.value=e)}},{key:"onVideoPlay",value:function(){this.isPlaying=!0,Ti||(this.timer=requestAnimationFrame(this.boundDrawVideoFrame)),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null)}},{key:"onVideoPause",value:function(){this.isPlaying=!1,!Ti&&this.timer&&cancelAnimationFrame(this.timer)}},{key:"onVideoSeeked",value:function(){Ti||this.isPlaying||this.ctx.drawImage(this.video,0,0)}},{key:"onVideoTimeUpdate",value:function(){this.blockTimeUpdate||this.callback.onTimeUpdate(this.video.currentTime)}},{key:"onVideoError",value:function(){var e=this.video,t=e&&e.error?e.error:new TypeError("VideoPlayer failed");p.error("VideoPlayer failed",t),this.errorCallback&&this.errorCallback(t)}},{key:"onVideoEnd",value:function(){this.callback.onEnd()}},{key:"initCanvasStream",value:function(){this.ctx.drawImage(this.video,0,0),this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)}},{key:"invokeStream",value:function(e){var t=U(this.canvas.captureStream(25).getVideoTracks(),1)[0];t.canvas||(t.type="canvas-track",t.canvas=this.canvas);var n=new MediaStream([t]);return this.acOut=this.ac.createMediaStreamDestination(),this.gainNode.connect(this.acOut),this.ac.createMediaStreamSource(e).connect(this.acOut),this.acOut.stream.getAudioTracks().forEach((function(e){return n.addTrack(e)})),this.userMediaStream=e,this.micOnlyStream=new MediaStream(e.getAudioTracks().concat(t)),this.isPlaying||(this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)),n}},{key:"isStreaming",value:function(){return Boolean(this.micOnlyStream)}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"destroy",value:function(){var e=this,t=this.video;clearTimeout(this.initTimeout),this.url&&(URL.revokeObjectURL(this.url),this.url=null),this.timer&&(Ti?t.cancelVideoFrameCallback(this.timer):cancelAnimationFrame(this.timer),this.timer=null),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null),this.userMediaStream&&(vt(this.userMediaStream),this.userMediaStream=null),this.micOnlyStream&&(vt(this.micOnlyStream),this.micOnlyStream=null),this.acOut&&(vt(this.acOut.stream),this.acOut=null),this.ac&&(this.gainNode.disconnect(),this.ac.close().then((function(){e.ac=null,e.gainNode=null}))),t&&(t.pause(),t.onplaying=null,t.onpause=null,t.ontimeupdate=null,t.onloadeddata=null,t.onseeked=null,t.onerror=null,t.onended=null,this.video=null),this.callback=null,this.errorCallback=null,this.ctx=null,this.canvas=null,this.boundDrawVideoFrame=null}}]),e}();function Pi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ei=function(e){g(n,e);var t=Pi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=function(e){p.error("StartMediaEvent",e);var n=e&&(e instanceof MediaError||e instanceof DOMException)?"error_VideoError":"error_TypeError";t.emit({type:"warning",name:n}),t.emit({type:"stop_presenting"})};try{t.videoPlayer=new _i(e),t.videoPlayer.onError(n)}catch(e){n(e)}}}]),n}(w);function Mi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Oi=function(e){g(n,e);var t=Mi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.lockMeeting()}}]),n}(w);function Ai(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Di=function(e){g(n,e);var t=Ai(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.terminateMeeting()}}]),n}(w);function Ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Bi=function(e){g(n,e);var t=Ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.kickUser(e.userId)}}]),n}(w);function Li(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fi=function(e){g(n,e);var t=Li(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");t.vbgMixer&&("suspend"===e.state?(t.vbgMixer.suspend(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.suspend()):"resume"===e.state&&(t.vbgMixer.resume(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.resume()))}}]),n}(w);function ji(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vi=function(e){e.micMixer&&(e.micMixer.destroy(),e.micMixer=null)},Ui=function(e){var t="error_Screen_".concat(e.name);return e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),t};const Ni=function(e){g(r,e);var t,n=ji(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.surface,r=null,i=this.context._session){e.next=5;break}throw new Error("Session does not exist");case 5:return e.prev=5,o=new Ln({surface:n}),e.next=9,o.getDisplayMedia();case 9:r=e.sent,e.next=17;break;case 12:return e.prev=12,e.t0=e.catch(5),p.error("ScreenVideoChangeEvent",e.t0),i.emit({type:"warning",name:Ui(e.t0)}),e.abrupt("return");case 17:return Vi(i),i.micMixer=new Fn,s={audio:i.localStream.getAudioTracks()[0].enabled,video:!1,screen:!0,surface:n,micMixer:i.micMixer,screenStream:r},e.prev=20,e.next=23,new Ln(s).start();case 23:a=e.sent,c=Rt(a),u=U(c,1),(l=u[0])&&l.addEventListener("ended",(function(){i.emit({type:"stop_screen_video"})})),i.setStream(a),e.next=35;break;case 29:e.prev=29,e.t1=e.catch(20),p.error("ScreenVideoChangeEvent",e.t1),Vi(i),i.emit({type:"screen_capture_error",name:Ui(e.t1)}),i.emit({type:"screen_video_ended"});case 35:case"end":return e.stop()}}),e,this,[[5,12],[20,29]])}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hi=function(e){g(n,e);var t=Wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.emit({type:"screen_video_ended"})}}]),n}(w);var zi=Xe.isIOSDevice();const Gi=function(){function e(){c(this,e),this.tempAudioTrack=null,this.tempVideoTrack=null,this.audioTrack=null,this.videoTrack=null,this.audioEnded=null,this.videoEnded=null,this.boundOnAudioEnd=this.onAudioEnd.bind(this),this.boundOnVideoEnd=this.onVideoEnd.bind(this),this.listeners=[]}return d(e,[{key:"addAudioTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempAudioTrack=e)}},{key:"addVideoTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempVideoTrack=e)}},{key:"applyTempTracks",value:function(){this.clearTracks(),this.tempAudioTrack&&(this.audioTrack=this.tempAudioTrack,this.tempAudioTrack=null,this.audioTrack.addEventListener("ended",this.boundOnAudioEnd)),this.tempVideoTrack&&(this.videoTrack=this.tempVideoTrack,this.tempVideoTrack=null,this.videoTrack.addEventListener("ended",this.boundOnVideoEnd))}},{key:"discardTempTracks",value:function(){this.tempAudioTrack=null,this.tempVideoTrack=null}},{key:"onAudioEnd",value:function(){var e=this;if(this.videoEnded)return clearTimeout(this.videoEnded),void this.emit({type:"all_devices_ended"});this.audioEnded=setTimeout((function(){e.videoEnded?(clearTimeout(e.videoEnded),e.emit({type:"all_devices_ended"})):e.emit({type:"audio_device_ended"})}),1e3)}},{key:"onVideoEnd",value:function(){var e=this;this.videoEnded=setTimeout((function(){e.audioEnded||e.emit({type:"video_device_ended"})}),1e3)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"clearTracks",value:function(){clearTimeout(this.audioEnded),clearTimeout(this.videoEnded),this.audioTrack&&(this.audioTrack.removeEventListener("ended",this.boundOnAudioEnd),this.audioTrack=null),this.videoTrack&&(this.videoTrack.removeEventListener("ended",this.boundOnVideoEnd),this.videoTrack=null),this.audioEnded=null,this.videoEnded=null}},{key:"destroy",value:function(){this.listeners.length=0,this.discardTempTracks(),this.clearTracks()}}]),e}();const qi=function(){function e(t){c(this,e),this.video=null,this.stream=null,this.canvasStream=null,this.vbgMixer=null,this.deviceMonitor=null,this.session=t,this.isActive=!1,this.startTimer=null}var t,n,r,i,o,s;return d(e,[{key:"start",value:(s=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.session,Xe.hasPipCamSupport()){e.next=4;break}return t.emit({type:"pip_cam_warning_unsupported"}),e.abrupt("return");case 4:return e.prev=4,this.startTimer=setTimeout((function(){return n.onError(new Error("Starting timeout 5s"))}),5e3),this.initFakeStream(),e.next=9,this.initVideoAndPip();case 9:return e.next=11,this.initCamera();case 11:clearTimeout(this.startTimer),this.isActive=!0,t.emit({type:"pip_cam",active:!0}),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return s.apply(this,arguments)})},{key:"onError",value:function(e){var t=this.session;clearTimeout(this.startTimer),p.error("PipCam error",e),t?(t.emit({type:"pip_cam_error"}),t.emit({type:"stop_pip_cam"})):this.stop()}},{key:"updateCamera",value:(o=Qe(et().mark((function e(){var t,n,r,i,o,s=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.isActive){e.next=2;break}return e.abrupt("return");case 2:return t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,this.startTimer=setTimeout((function(){return s.onError(new Error("Starting timeout 5s"))}),5e3),e.prev=4,t.srcObject=r,e.next=8,t.play();case 8:return o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),e.next=13,this.initCamera();case 13:clearTimeout(this.startTimer),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return o.apply(this,arguments)})},{key:"initFakeStream",value:function(){var e=f.widescreen,t=document.createElement("canvas"),n=t.getContext("2d",{alpha:!1});t.width=640,t.height=e?360:480,n.fillStyle="#404040",n.fillRect(0,0,t.width,t.height);var r=new Path2D(e?"M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z":"M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z");n.fillStyle="#212121",n.fill(r),this.canvasStream=t.captureStream()}},{key:"initVideoAndPip",value:(i=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=document.createElement("video"),this.video=t,t.muted=!0,t.playsInline=!0,t.onleavepictureinpicture=function(){return n.onExitPip()},t.onpause=function(e){var t=e.target;return n.onVideoPause(t)},t.srcObject=this.canvasStream,e.next=9,t.play();case 9:return e.next=11,t.requestPictureInPicture();case 11:case"end":return e.stop()}}),e,this)}))),function(){return i.apply(this,arguments)})},{key:"initCamera",value:(r=Qe(et().mark((function e(){var t,n,r,i=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(t=this.session.options.virtualBackground)&&(n=Bn.getStoredVirtualBackgroundType(),this.vbgMixer=new Dn("PipCam"),this.vbgMixer.changeBackground(n)),this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(e){return i.onDeviceEvent(e)})),r={audio:!1,video:!0,virtualBackground:t,vbgMixer:this.vbgMixer,deviceMonitor:this.deviceMonitor},e.next=7,new Ln(r).start();case 7:return this.stream=e.sent,this.video.srcObject=this.stream,e.next=11,this.video.play();case 11:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"onExitPip",value:function(){this.session?this.session.emit({type:"stop_pip_cam"}):this.stop()}},{key:"onVideoPause",value:function(e){setTimeout((function(){return e.play().catch((function(){}))}))}},{key:"onDeviceEvent",value:function(e){e.type.endsWith("_ended")&&(clearTimeout(this.startTimer),this.session?(this.session.emit({type:"pip_cam_warning_video_ended"}),this.session.emit({type:"stop_pip_cam"})):this.stop())}},{key:"stop",value:(n=Qe(et().mark((function e(){var t,n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,clearTimeout(this.startTimer),!t){e.next=15;break}if(t.onpause=null,t.onleavepictureinpicture=null,document.pictureInPictureElement!==t){e.next=13;break}return e.prev=6,e.next=9,document.exitPictureInPicture();case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(6);case 13:t.srcObject=null,this.video=null;case 15:o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),r&&(vt(r),this.canvasStream=null),this.isActive&&(this.session&&this.session.emit({type:"pip_cam",active:!1}),this.isActive=!1);case 20:case"end":return e.stop()}}),e,this,[[6,11]])}))),function(){return n.apply(this,arguments)})},{key:"destroy",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.stop();case 2:this.session=null;case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}();function $i(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ji=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?e.emit({type:"pip_cam",active:e.pipCam.isActive}):(e.pipCam=new qi(e),e.pipCam.start())}}]),n}(w),Ki=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?(e.pipCam.destroy(),e.pipCam=null):e.emit({type:"pip_cam",active:!1})}}]),n}(w),Xi=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam&&e.pipCam.updateCamera()}}]),n}(w);function Yi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Qi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h,f;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),o=lt(n.localStream),e.next=6,new Dr(this.context).handle({audio:i,video:o});case 6:if(!((s=n.localStream.getAudioTracks())&&s.length>0)){e.next=16;break}return a=U(s,1),c=a[0],e.next=11,Bn.fetchInputDevices();case 11:u=e.sent,l=c.getSettings(),d=l.deviceId,h=u.find((function(e){return e.deviceId===d})),Xe.canMultipleDifferentMicrophones()||((f=nt.load("mediaConstraints")).audio={deviceId:{exact:d}},nt.store("mediaConstraints",f),nt.store("audioId",d)),h&&(t.newAudioDevice=h.label);case 16:e.next=21;break;case 18:e.prev=18,e.t0=e.catch(1),p.error("AudioDeviceEndEvent",e.t0);case 21:R(k(r.prototype),"handle",this).call(this,t);case 22:case"end":return e.stop()}}),e,this,[[1,18]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),Zi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Dr(this.context).handle({audio:i,video:!1});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(1),p.error("VideoDeviceEndEvent",e.t0);case 10:R(k(r.prototype),"handle",this).call(this,t);case 11:case"end":return e.stop()}}),e,this,[[1,7]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),eo=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Dr(this.context).handle({audio:i,video:!1});case 5:if(!((o=n.localStream.getAudioTracks())&&o.length>0)){e.next=15;break}return s=U(o,1),a=s[0],e.next=10,Bn.fetchInputDevices();case 10:c=e.sent,u=a.getSettings(),l=u.deviceId,d=c.find((function(e){return e.deviceId===l})),Xe.canMultipleDifferentMicrophones()||((h=nt.load("mediaConstraints")).audio={deviceId:{exact:l}},nt.store("mediaConstraints",h),nt.store("audioId",l)),d&&(t.newAudioDevice=d.label);case 15:e.next=20;break;case 17:e.prev=17,e.t0=e.catch(1),p.error("AllDevicesEndEvent",e.t0);case 20:R(k(r.prototype),"handle",this).call(this,t);case 21:case"end":return e.stop()}}),e,this,[[1,17]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),to=function(){function e(){c(this,e),this.listeners=[],this._eyeson=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null,this.send=this.send.bind(this)}return d(e,[{key:"destroy",value:function(){this._monitor&&this._monitor.destroy(),this._connection&&this._connection.close(),this._rtConnection&&this._rtConnection.close(),this._session&&(this._session.vbgMixer&&(this._session.vbgMixer.stopOriginalStream(),this._session.vbgMixer.terminate(),this._session.vbgMixer.destroy()),this._session.end()),this._api=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null}},{key:"connection",get:function(){return null},set:function(e){this._connection?p.error("A connection is already set. If you are trying to start a new session you have to end the current one first."):(this._connection=e,this._connection.onMessage(this.send))}},{key:"rtConnection",get:function(){return null},set:function(e){this._rtConnection?p.error("A real-time connection is already set. If you are trying to start a new session you have the close the current before."):(this._rtConnection=e,this._rtConnection.onMessage(this.send))}},{key:"monitor",get:function(){return this._monitor},set:function(e){this._monitor?p.error("A monitor is already set. If you are trying to start a new session you have to end the current one first."):(this._monitor=e,this._monitor.onEvent(this.send))}},{key:"session",get:function(){return null},set:function(e){this._session?p.error("A session is already set. If you are trying to start a new session you have to end the current one first."):(this._session=e,this._session.onEvent(this.send))}},{key:"api",get:function(){return null},set:function(e){this._api=e}},{key:"rtData",get:function(){return null},set:function(e){this._rtData=e}},{key:"eyeson",get:function(){return null},set:function(e){this._eyeson=e}},{key:"onReceive",value:function(e){p.debug("EventHandler::onReceive"),this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"send",value:function(e){e.silenced||p.debug("EventHandler::send",e),new({stfu:F,chat:Er,accept:Vr,podium:Wn,snapshot:zn,send_chat:Jn,set_layer:qn,set_layout:Qn,fetch_room:xr,room_ready:kr,room_setup:kr,memberlist:ai,upload_file:_r,delete_file:Tr,request_stfu:D,change_stream:Dr,replace_stream:Br,toggle_camera:Fr,stop_playback:T,playback_update:F,start_playback:C,start_stream:Or,stop_recording:Nr,start_screen_capture:$r,stop_broadcasts:Zr,start_recording:Gr,stop_presenting:Yr,start_presenting:Kr,stop_annotation:O,start_annotation:M,clear_front_layer:ti,request_guest_user:ri,voice_activity_raw:Hr,start_mixer:xi,update_mixer:Ci,lock_meeting:Oi,terminate_meeting:Di,kick_user:Bi,session_termination:oi,start_media:Ei,change_screen_video:Ni,stop_screen_video:Hi,stop_rtmp:Xn,start_rtmp:er,suspend_virtual_background:Fi,audio_device_ended:Qi,video_device_ended:Zi,all_devices_ended:eo,start_pip_cam:Ji,stop_pip_cam:Ki,update_pip_cam:Xi,capture_error:F,voice_activity:F,options_update:F,ext_not_installed:F,broadcasts_update:F,presentation_ended:F,recording:B,ext_cancel:B,ext_installed:B,message_status:B,moderator_info:B}[e.type]||P)(this).handle(e)}}]),e}();const no=to;var ro=function(e){return e.replace("o=-","o=Visoweb")},io=function(e){var t=e.split("\r\n"),n=t.findIndex((function(e){return e.startsWith("t=")})),r=1;return Xe.canSFU()&&(t.splice(n+r,0,"a=sfu-capable"),r++,Xe.disallowAudioSyncSrcChange()&&(t.splice(n+r,0,"a=disallow-audio-ssrc-change"),r++)),Xe.canDataChannel()&&t.splice(n+r,0,"a=eyeson-datachan-capable","a=eyeson-datachan-keepalive","a=eyeson-sepp-messaging"),t.join("\r\n")},oo=function(e){var t=Xe.canStereo(),n=e.match(/^a=rtpmap:(\d+) opus/m);if(n){var r=new RegExp("^a=fmtp:".concat(n[1]," (.+)$"),"m"),i=e.match(r);if(i){var o={};i[1].split(";").forEach((function(e){var t=U(e.split("="),2),n=t[0],r=t[1];o[n]=r})),o.stereo=t?"1":"0";var s=Object.entries(o).map((function(e){var t=U(e,2),n=t[0],r=t[1];return"".concat(n,"=").concat(r)})).join(";");return e.replace(r,"a=fmtp:".concat(n[1]," ").concat(s))}}return e},so=function(e){var t=e.split("\r\n"),n=!1;return t.forEach((function(e,r){e.startsWith("m=audio")||e.startsWith("m=video")?n=!0:e.startsWith("m=application")?n=!1:"a=sendrecv"===e&&n&&(t[r]="a=sendonly")})),t.join("\r\n")},ao=function(e){var t={active:[oo],passive:[ro,io]};return!0===e.sendOnly&&t.active.push(so),t};const co=function(){function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};c(this,e),this.options=r,this.options.RTCConstraints=Object.assign({},this.defaultRTCConstraints,{offerToReceiveVideo:!this.options.eco}),this.accepted=!1,this.listeners=[],this.restarting=!1,this.connection=t,this.comApi=n,this.sipSession=null,this.startAttempts=0,this.maxStartAttempts=3,this.tryAuthUpdate=!0,this.tryResume=!0,this.tryWaitResume=!0,this.resumeTimer=null,this.waitResumeTimer=null,this.end=this.end.bind(this),this.emit=this.emit.bind(this),this.setStream=this.setStream.bind(this),this.endSession=this.endSession.bind(this),this.initSession=this.initSession.bind(this),this.handleFailed=this.handleFailed.bind(this),this.handleAccept=this.handleAccept.bind(this),this.handleUnmute=this.handleUnmute.bind(this),this.restartSession=this.restartSession.bind(this),this.tryRecoveryFrom=this.tryRecoveryFrom.bind(this),this.terminateSession=this.terminateSession.bind(this),this.remoteDescriptionUpdate=this.remoteDescriptionUpdate.bind(this)}var t;return d(e,[{key:"peerConnection",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.peerConnection:null}},{key:"localStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.localStream:null}},{key:"remoteStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.remoteStream:null}},{key:"defaultRTCConstraints",get:function(){return{offerToReceiveAudio:!0,offerToReceiveVideo:!0}}},{key:"start",value:function(){this.options.stream?this.initExternalStream():(this.initDeviceMonitor(),this.initVirtualBackground(),new Ln(this.options).start().then(this.initSession).catch(this.handleFailed))}},{key:"initExternalStream",value:function(){var e=!lt(this.options.stream)&&this.options.eco,t=Gt(this.options.stream,e);t?(this.externalStream=t,this.options.audio=ut(t),this.options.video=lt(t),this.initSession(this.externalStream)):this.handleFailed({name:"invalid_stream"})}},{key:"initVirtualBackground",value:function(){var e=Bn.getStoredVirtualBackgroundType();this.vbgMixer=new Dn,this.vbgMixer.changeBackground(e),this.options.vbgMixer=this.vbgMixer}},{key:"initDeviceMonitor",value:function(){var e=this;this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(t){return e.emit(t)})),this.options.deviceMonitor=this.deviceMonitor}},{key:"buildSessionOptions",value:function(e){var t=this.options;return!0===t.sendOnly&&(t.RTCConstraints={}),{stream:e,sendOnly:t.sendOnly,SDPModifiers:ao({sendOnly:t.sendOnly}),connection:this.connection,handleAccept:this.handleAccept,handleUnmute:this.handleUnmute,RTCConstraints:t.RTCConstraints,remoteDescriptionUpdate:this.remoteDescriptionUpdate,mediaOptions:{audio:t.audio,video:t.video}}}},{key:"initSession",value:function(e){var t=this;this.tryResume=!0,this.tryAuthUpdate=!0,this.tryWaitResume=!0;var n=this.buildSessionOptions(e);this.sipSession=this.connection.startSession(n),this.onUnmute(e),this.sipSession.onEvent((function(e){"accepted"===e.type?t.adjustVideoPodium():"resumed"===e.type?(clearTimeout(t.resumeTimer),clearTimeout(t.waitResumeTimer),t.tryResume=!0,t.tryAuthUpdate=!0,t.tryWaitResume=!0):"terminated"===e.type&&t.handleTermination(e.reason,e.code)})),this.externalStream&&(this.connection.hasExternalStream=!0),window&&window.addEventListener(Xe.isIOSDevice()?"pagehide":"beforeunload",this.endSession)}},{key:"end",value:function(){this.listeners=[],this.endSession(),this.accepted=!1,this.sipSession=null,this.connection=null}},{key:"endSession",value:function(){p.debug("ConferenceSession::endSession"),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),this.sipSession&&(this.sipSession.removeAllListeners(),this.terminateSession()),this.connection&&this.connection.close(),this.deviceMonitor&&this.deviceMonitor.destroy()}},{key:"terminateSession",value:function(){p.debug("ConferenceSession::terminateSession");try{this.sipSession.terminate()}catch(e){p.error(e)}}},{key:"setStream",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.sipSession){e.next=2;break}return e.abrupt("return",null);case 2:return e.prev=2,n=this.sipSession.sessionDescriptionHandler,e.next=6,n.setStream(t);case 6:return r=e.sent,this.stopPresentingSet=!1,this.micMixer&&this.micMixer.active&&(r.newStream=this.micMixer.getMicOnlyStream(),n.localStream=r.newStream),this.videoPlayer&&this.videoPlayer.isStreaming()&&(r.newStream=this.videoPlayer.getMicOnlyStream(),n.localStream=r.newStream),this.onUnmute(r.newStream),this.emit({type:"stream_update",localStream:r.newStream,stream:r.remoteStream}),e.abrupt("return",r.newStream);case 15:return e.prev=15,e.t0=e.catch(2),p.error("ConferenceSession::setStream",e.t0),this.emit({type:"stream_update",localStream:this.localStream,stream:this.remoteStream}),e.abrupt("return",this.localStream);case 20:case"end":return e.stop()}}),e,this,[[2,15]])}))),function(e){return t.apply(this,arguments)})},{key:"onUnmute",value:function(e){var t=this;e&&e.getTracks().forEach((function(e){e.onunmute=function(){return t.emit({type:"local_track_unmuted",track:e})}}))}},{key:"setMonitor",value:function(e){this.monitor=e}},{key:"handleAccept",value:function(e){this.monitor&&this.monitor.observe(this.peerConnection),this.accepted||(this.emit({type:"accept",session:this.sipSession}),this.accepted=!0),e&&this.emit({type:"stream_update",stream:e})}},{key:"handleUnmute",value:function(e){this.emit({type:"track_unmuted",track:e})}},{key:"remoteDescriptionUpdate",value:function(e){p.debug("ConferenceSession::remoteDescriptionUpdate",e.sdp);var t=!1,n=e.sdp.split("\r\n").find((function(e){return e.startsWith("a=sfu-mode")}));n&&(t=n.includes("on")),this.emit({type:"remote_description_update",update:{sfu:t}})}},{key:"adjustVideoPodium",value:function(){this.send({type:"mute_video",on:!this.options.video})}},{key:"handleTermination",value:function(e,t){var n=this;if(p.debug("ConfSession::handleTermination",e,t),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),"bye"===e&&200===t||"terminate"===e)this.handleExit();else if("disconnect"===e)if(-1===t){if(this.tryAuthUpdate)return this.tryAuthUpdate=!1,void this.comApi.getRoom((function(e){return n.connection.updateAuthAndRestartSession(e)}));if(this.tryWaitResume&&this.connection)return this.tryWaitResume=!1,this.waitResumeTimer=setTimeout((function(){n.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)}))}),5e3),void(this.resumeTimer=setTimeout((function(){n.handleFailed({name:503})}),15e3));this.handleFailed({name:503})}else{if(this.tryResume&&this.connection)return this.tryResume=!1,this.tryAuthUpdate=!1,this.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)})),void(this.resumeTimer=setTimeout((function(){return n.handleFailed({name:410})}),1e4));this.handleFailed({name:410})}else this.handleFailed({name:t});this.restarting||this.emit({type:"session_termination"})}},{key:"handleExit",value:function(){this.emit({type:"exit",reason:"bye"})}},{key:"handleFailed",value:function(e){p.warn("ConferenceSession::handleFailed: ",e),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer);var t="Desert";if(e&&e.name&&(t=e.name),!this.tryRecoveryFrom(t)){var n={NotFoundError:"devices",NotAllowedError:"permission",DevicesNotFoundError:"devices",PermissionDeniedError:"permission",NotReadableError:"not_readable",403:"session_in_use",410:"abrupt_disconnect",413:"request_too_large",426:"ice_error",486:"session_in_use",607:"meeting_locked"}[t]||"session_failed";this.emit({type:"error",name:n,code:this.errorCodeName(t,n)})}}},{key:"errorCodeName",value:function(e,t){return["permission","devices","not_readable","meeting_locked","session_in_use","transport_error"].includes(t)?"":String(e)}},{key:"tryRecoveryFrom",value:function(e){var t=this;p.debug("ConferenceSession::tryRecoveryFrom: ",e);var n={404:{condition:function(){return t.startAttempts<t.maxStartAttempts},action:function(){return t.restartSession()}}}[e];return this.startAttempts>=this.maxStartAttempts?(this.restarting=!1,!1):Boolean(n&&n.condition()&&n.action())}},{key:"restartSession",value:function(){var e=this;return p.debug("ConferenceSession::restartSession: ",this.startAttempts),this.restarting=!0,this.startAttempts+=1,setTimeout((function(){e.endSession(),e.start()}),1e3),!0}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"send",value:function(e){return this.connection.send(e)}}]),e}();function uo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return lo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return lo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function lo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ho={NO_CONNECTION:3,BAD:2,OK:1,GOOD:0},fo=function(e,t){e.length<3?e.push(Object.assign({},t)):Object.assign(function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time<t.time&&(t=e[r]);return t}(e),t)},po=function(e){var t,n=e.length,r={jitter:0,packetLoss:0,roundTripTime:0,nack:0,bitrateSend:0,bitrateRecv:0,status:ho.GOOD},i=function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time>t.time&&(t=e[r]);return t}(e),o=uo(e);try{for(o.s();!(t=o.n()).done;){var s=t.value;r.jitter+=s.jitter,r.packetLoss+=s.packetLoss,r.roundTripTime+=s.roundTripTime,r.nack+=s.nack,r.bitrateSend+=s.bitrateSend,r.bitrateRecv+=s.bitrateRecv}}catch(e){o.e(e)}finally{o.f()}return r.jitter=null===i.jitter?null:r.jitter/n,r.packetLoss=null===i.packetLoss?null:r.packetLoss/n,r.roundTripTime=null===i.roundTripTime?null:r.roundTripTime/n,r.nack=null===i.nack?null:r.nack/n,r.bitrateSend/=n,r.bitrateRecv/=n,r.status=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n>1||e>.2||t>.5||r>.2?ho.BAD:n>.3||e>.1||t>.3||r>.1?ho.OK:ho.GOOD}(r.packetLoss,r.jitter,r.roundTripTime,r.nack),r},mo=function(){function e(){c(this,e),this.peerConnection=null,this.timer=null,this.listeners=[],this.history=[],this.entry={jitter:0,packetLoss:0,roundTripTime:0,nack:0,time:0,bitrateSend:0,bitrateRecv:0},this.lastStat={time:null,bytesSent:null,bytesReceived:null,audio:{out:{packetsSent:null,packetsLost:null,bytesSent:null},in:{packetsReceived:null}},video:{out:{packetsSent:null,packetsLost:null,bytesSent:null,nackCount:null},in:{bytesReceived:null}}},this.boundPrintStats=this.printStats.bind(this)}var t;return d(e,[{key:"init",value:function(e){this.peerConnection=e}},{key:"printStats",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.peerConnection,n=this.entry,r=this.lastStat,i=this.history,e.next=3,t.getStats();case 3:o=e.sent,s=Date.now(),a=null,Object.keys(n).forEach((function(e){n[e]=0})),n.jitter=null,n.packetLoss=null,n.roundTripTime=null,n.nack=null,n.time=s,o.forEach((function(e){if("inbound-rtp"===e.type){var t=e.kind||e.mediaType;if(r.time){var i=(s-r.time)/1e3,c=Math.max(e.bytesReceived-r[t].in.bytesReceived,0);n.bitrateRecv+=8*c/i}r[t].in.bytesReceived=e.bytesReceived}else if("outbound-rtp"===e.type){var u=e.kind||e.mediaType;if(r.time){var l=(s-r.time)/1e3,d=e.bytesSent-r[u].out.bytesSent;n.bitrateSend+=8*d/l}r[u].out.bytesSent=e.bytesSent}else if("remote-inbound-rtp"===e.type){var h=e.kind||e.mediaType;if(r[h]){var f=o.get(e.localId),p=void 0!==e.roundTripTime,m=void 0!==e.jitter,v=void 0!==e.packetsLost,y=void 0!==f.nackCount;if(r.time){var g=e.packetsLost-r[h].out.packetsLost,b=f.packetsSent-r[h].out.packetsSent,S=b>0?g/b:0;if(n.jitter=m?Math.max(n.jitter,b>0?e.jitter:0):null,n.packetLoss=v?Math.max(n.packetLoss,S):null,n.roundTripTime=p?Math.max(n.roundTripTime,e.roundTripTime):null,"video"===h){var k=f.nackCount-r[h].out.nackCount,w=b>0?k/b:0;n.nack=y?Math.max(n.nack,w):null}}"video"===h&&(r[h].out.nackCount=f.nackCount),r[h].out.packetsSent=f.packetsSent,r[h].out.packetsLost=e.packetsLost}}else"candidate-pair"===e.type&&"succeeded"===e.state&&"currentRoundTripTime"in e&&(a=e.currentRoundTripTime)})),null===n.roundTripTime&&null!==a&&(n.roundTripTime=a),fo(i,n),c=po(i),!1===navigator.onLine&&(c.status=ho.BAD),["disconnected","failed","closed"].includes(t.iceConnectionState)&&(c.status=ho.NO_CONNECTION),this.emit(c),r.time=s;case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"getCurrentStatistics",value:function(){return po(this.history)}},{key:"onUpdate",value:function(e){var t=this.listeners,n=this.timer;0===t.length&&null===n&&(this.timer=setInterval(this.boundPrintStats,1e3),this.peerConnection.addEventListener("iceconnectionstatechange",this.boundPrintStats),window.addEventListener("offline",this.boundPrintStats)),t.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){try{t(e)}catch(e){p.error("ConnectionStatistics::emit",e)}}))}},{key:"destroy",value:function(){clearInterval(this.timer),window.removeEventListener("offline",this.boundPrintStats),this.peerConnection&&(this.peerConnection.removeEventListener("iceconnectionstatechange",this.boundPrintStats),this.peerConnection=null),this.timer=null,this.history.length=0,this.listeners.length=0}}]),e}();mo.Status=ho;const vo=mo;const yo=function(){function e(){c(this,e),this.pc=null,this.statistics=new vo,this.listeners=[],this.disconnectTimer=null,this.prevIceState="initial",this.onOffline=this.onOffline.bind(this),this.handleIceStateChange=this.handleIceStateChange.bind(this),this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.addEventListeners()}return d(e,[{key:"addEventListeners",value:function(){window.addEventListener("offline",this.onOffline)}},{key:"onOffline",value:function(){this.emit({type:"offline"})}},{key:"observe",value:function(e){this.pc||(this.pc=e,this.pc.oniceconnectionstatechange=this.handleIceStateChange,this.pc.onconnectionstatechange=this.handleConnectionStateChange,this.statistics.init(e),this.emit({type:"statistics_ready",statistics:this.statistics}))}},{key:"destroy",value:function(){var e=this.pc,t=this.statistics;clearTimeout(this.disconnectTimer),t&&(t.destroy(),this.statistics=null),e&&(e.onconnectionstatechange=null,e.oniceconnectionstatechange=null,this.pc=null),window.removeEventListener("offline",this.onOffline)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"handleConnectionStateChange",value:function(e){e.currentTarget&&p.warn("connectionStateChange: ",e.currentTarget.connectionState)}},{key:"handleIceStateChange",value:function(e){var t=this;if(e.currentTarget){var n=e.currentTarget.iceConnectionState;"disconnected"===n&&(this.emit({type:"warning",name:"ice_disconnected"}),clearTimeout(this.disconnectTimer),this.disconnectTimer=window.setTimeout((function(){t.pc&&"connected"!==t.pc.iceConnectionState&&t.emit({type:"error",name:"ice_failed",code:"Goldfinger"})}),2e3)),"failed"===n&&this.emit({type:"error",name:"ice_failed",code:"Thunderball"}),"disconnected"===this.prevIceState&&["completed","connected"].includes(n)&&this.emit({type:"clear_warning",name:"ice_disconnected"}),this.prevIceState=n}}}]),e}();var go={logger:self.console,WebSocket:self.WebSocket},bo={log(...e){this.enabled&&(e.push(Date.now()),go.logger.log("[ActionCable]",...e))}};const So=()=>(new Date).getTime(),ko=e=>(So()-e)/1e3;class wo{constructor(e){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=e,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=So(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),bo.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=So(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),bo.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=So()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,bo.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=So(),bo.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout((()=>{this.reconnectIfStale(),this.poll()}),this.getPollInterval())}getPollInterval(){const{staleThreshold:e,reconnectionBackoffRate:t}=this.constructor;return 1e3*e*Math.pow(1+t,Math.min(this.reconnectAttempts,10))*(1+(0===this.reconnectAttempts?1:t)*Math.random())}reconnectIfStale(){this.connectionIsStale()&&(bo.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${ko(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?bo.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${ko(this.disconnectedAt)} s`):(bo.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return ko(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&ko(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){"visible"===document.visibilityState&&setTimeout((()=>{!this.connectionIsStale()&&this.connection.isOpen()||(bo.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())}),200)}}wo.staleThreshold=6,wo.reconnectionBackoffRate=.15;var xo={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:Co,protocols:To}=xo,Ro=To.slice(0,To.length-1),_o=[].indexOf;class Po{constructor(e){this.open=this.open.bind(this),this.consumer=e,this.subscriptions=this.consumer.subscriptions,this.monitor=new wo(this),this.disconnected=!0}send(e){return!!this.isOpen()&&(this.webSocket.send(JSON.stringify(e)),!0)}open(){return this.isActive()?(bo.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1):(bo.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${To}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new go.WebSocket(this.consumer.url,To),this.installEventHandlers(),this.monitor.start(),!0)}close({allowReconnect:e}={allowReconnect:!0}){if(e||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(bo.log(`Reopening WebSocket, current state is ${this.getState()}`),!this.isActive())return this.open();try{return this.close()}catch(e){bo.log("Failed to reopen WebSocket",e)}finally{bo.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}isProtocolSupported(){return _o.call(Ro,this.getProtocol())>=0}isState(...e){return _o.call(e,this.getState())>=0}getState(){if(this.webSocket)for(let e in go.WebSocket)if(go.WebSocket[e]===this.webSocket.readyState)return e.toLowerCase();return null}installEventHandlers(){for(let e in this.events){const t=this.events[e].bind(this);this.webSocket[`on${e}`]=t}}uninstallEventHandlers(){for(let e in this.events)this.webSocket[`on${e}`]=function(){}}}Po.reopenDelay=500,Po.prototype.events={message(e){if(!this.isProtocolSupported())return;const{identifier:t,message:n,reason:r,reconnect:i,type:o}=JSON.parse(e.data);switch(o){case Co.welcome:return this.monitor.recordConnect(),this.subscriptions.reload();case Co.disconnect:return bo.log(`Disconnecting. Reason: ${r}`),this.close({allowReconnect:i});case Co.ping:return this.monitor.recordPing();case Co.confirmation:return this.subscriptions.confirmSubscription(t),this.subscriptions.notify(t,"connected");case Co.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",n)}},open(){if(bo.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return bo.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(e){if(bo.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){bo.log("WebSocket onerror event")}};class Eo{constructor(e,t={},n){this.consumer=e,this.identifier=JSON.stringify(t),function(e,t){if(null!=t)for(let n in t){const r=t[n];e[n]=r}}(this,n)}perform(e,t={}){return t.action=e,this.send(t)}send(e){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(e)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class Mo{constructor(e){this.subscriptions=e,this.pendingSubscriptions=[]}guarantee(e){-1==this.pendingSubscriptions.indexOf(e)?(bo.log(`SubscriptionGuarantor guaranteeing ${e.identifier}`),this.pendingSubscriptions.push(e)):bo.log(`SubscriptionGuarantor already guaranteeing ${e.identifier}`),this.startGuaranteeing()}forget(e){bo.log(`SubscriptionGuarantor forgetting ${e.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter((t=>t!==e))}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout((()=>{this.subscriptions&&"function"==typeof this.subscriptions.subscribe&&this.pendingSubscriptions.map((e=>{bo.log(`SubscriptionGuarantor resubscribing ${e.identifier}`),this.subscriptions.subscribe(e)}))}),500)}}class Oo{constructor(e){this.consumer=e,this.guarantor=new Mo(this),this.subscriptions=[]}create(e,t){const n="object"==typeof e?e:{channel:e},r=new Eo(this.consumer,n,t);return this.add(r)}add(e){return this.subscriptions.push(e),this.consumer.ensureActiveConnection(),this.notify(e,"initialized"),this.subscribe(e),e}remove(e){return this.forget(e),this.findAll(e.identifier).length||this.sendCommand(e,"unsubscribe"),e}reject(e){return this.findAll(e).map((e=>(this.forget(e),this.notify(e,"rejected"),e)))}forget(e){return this.guarantor.forget(e),this.subscriptions=this.subscriptions.filter((t=>t!==e)),e}findAll(e){return this.subscriptions.filter((t=>t.identifier===e))}reload(){return this.subscriptions.map((e=>this.subscribe(e)))}notifyAll(e,...t){return this.subscriptions.map((n=>this.notify(n,e,...t)))}notify(e,t,...n){let r;return r="string"==typeof e?this.findAll(e):[e],r.map((e=>"function"==typeof e[t]?e[t](...n):void 0))}subscribe(e){this.sendCommand(e,"subscribe")&&this.guarantor.guarantee(e)}confirmSubscription(e){bo.log(`Subscription confirmed ${e}`),this.findAll(e).map((e=>this.guarantor.forget(e)))}sendCommand(e,t){const{identifier:n}=e;return this.consumer.send({command:t,identifier:n})}}class Ao{constructor(e){this._url=e,this.subscriptions=new Oo(this),this.connection=new Po(this)}get url(){return function(e){"function"==typeof e&&(e=e());if(e&&!/^wss?:/i.test(e)){const t=document.createElement("a");return t.href=e,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}return e}(this._url)}send(e){return this.connection.send(e)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}}function Do(e=function(e){const t=document.head.querySelector(`meta[name='action-cable-${e}']`);if(t)return t.getAttribute("content")}("url")||xo.default_mount_path){return new Ao(e)}const Io=function(){function e(t){c(this,e),this.channels={},this.onMessageHandler=this.defaultMessageHandler,this.onReceived=this.onReceived.bind(this),this.offMessage=this.offMessage.bind(this),this.onConnected=this.onConnected.bind(this),this.startSession=this.startSession.bind(this),this.onDisconnected=this.onDisconnected.bind(this),this.cable=Do(t)}return d(e,[{key:"startSession",value:function(){this.channels.RoomChannel=this.cable.subscriptions.create({channel:"RoomChannel"},{connected:this.onConnected,received:this.onReceived,disconnected:this.onDisconnected}),this.channels.UserChannel=this.cable.subscriptions.create({channel:"UserChannel"},{received:this.onReceived})}},{key:"onConnected",value:function(){this.disconnectTimestamp&&this.handleReconnect(),p.debug("ActionCableConnection::onConnected")}},{key:"handleReconnect",value:function(){this.onMessageHandler({type:"reconnect"})}},{key:"onReceived",value:function(e){p.debug("ActionCableConnection::onReceived",e),e._src="actioncable",this.onMessageHandler(e)}},{key:"onDisconnected",value:function(){p.debug("ActionCableConnection::onDisconnected"),this.disconnectTimestamp=Date.now(),this.onMessageHandler({type:"disconnect"})}},{key:"onMessage",value:function(e){"function"==typeof e&&(this.onMessageHandler=e)}},{key:"offMessage",value:function(){this.onMessageHandler=this.defaultMessageHandler}},{key:"defaultMessageHandler",value:function(e){p.debug("ActionCableConnection::defaultMessageHandler: ",e)}},{key:"send",value:function(e){var t=e.channel,n=void 0===t?"RoomChannel":t,r=e.type,i=void 0===r?"ping":r,o=this.channels[n];o?o.perform(i):p.warn("ActionCableConnection::send no subscription found! ",n)}},{key:"close",value:function(){this.cable.disconnect(),this.offMessage(),this.channels={},this.cable=null}}]),e}();var Bo=function(e,t){return e.core.eventHandler.send({type:"connection",connectionStatus:t})},Lo=function(e){var t=e.core;Bo(e,"fetch_room"),t.eventHandler.eyeson=e,t.comApi.onError((function(){return t.eventHandler.send({type:"warning",name:"error:comapi"})})),t.comApi.getRoom((function(n){if(n.error)return p.warn("eyeson::prepareConnection",n.error),void Bo(e,"access_denied");Bo(e,"received_room"),t.rtConnection=new Io(n.links.websocket),t.eventHandler.rtConnection=t.rtConnection,t.rtConnection.startSession(),t.eventHandler.monitor=new yo,t.eventHandler.api=t.comApi,function(e){e.core.keepRoomAlive=setInterval((function(){e.core.rtConnection.send({type:"user_joins"})}),3e4)}(e),function(e){var t=1;e.core.pollingFallbackInterval=setInterval((function(){var n=e.core;return 200===t?(p.debug("eyeson::pollingFallback: max count exceeded, clearing interval."),void clearInterval(n.pollingFallbackInterval)):n.eventHandler._connection?(p.debug("eyeson::pollingFallback: connection set, clearing interval."),void clearInterval(n.pollingFallbackInterval)):void n.comApi.getRoom((function(e){if(!0===e.ready)return p.debug("eyeson::pollingFallback: room ready"),void n.eventHandler.send({type:"room_ready",content:e});p.debug("eyeson::pollingFallback: room not ready",t),t+=1}))}),5e3)}(e)}))},Fo=function(){function e(){c(this,e),this.config=h,this.core={eventHandler:new no},this.room={},this.user={},this.links={},this.options=f}return d(e,[{key:"onEvent",value:function(e){"function"==typeof e?this.core.eventHandler.onReceive(e):p.error("A listener to eyeson events has to be of type function. The argument passed to onEvent is of type "+a(e)+".")}},{key:"offEvent",value:function(e){this.core.eventHandler.removeListener(e)}},{key:"connect",value:function(e){p.debug("eyeson::connect",e),this.core.comApi=new m(this.config.api,e),Lo(this)}},{key:"join",value:function(e){p.debug("eyeson::join",e),function(e,t){var n=e.core;if(n.eventHandler._connection){var r=new co(n.eventHandler._connection,n.comApi,t);r.setMonitor(n.eventHandler.monitor),n.eventHandler.session=r,r.start(),function(e){var t=e.core,n=t.eventHandler._rtData.broadcasts;n&&t.eventHandler.send({type:"broadcasts_update",broadcasts:n})}(e),clearInterval(n.keepRoomAlive),e.session=r}else p.error("You tried to join a session that is not yet available. Before calling join, a connection status of connected has to be received.")}(this,e)}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{audio:!0,video:!0};p.debug("eyeson::start");this.onEvent((function e(r){"ready"===r.connectionStatus&&(t.offEvent(e),t.join(n))})),this.connect(e)}},{key:"destroy",value:function(){var e=this.core;p.debug("eyeson::destroy"),clearInterval(e.keepRoomAlive),clearInterval(e.pollingFallbackInterval),e.eventHandler.destroy(),e.eventHandler=new no}},{key:"send",value:function(e){return e._src="client",this.core.eventHandler.send(e)}},{key:"throttledSend",value:function(e){var t=this;return this._throttledSend||(this._throttledSend=v((function(e){return t.send(e)}),500)),this._throttledSend(e)}},{key:"createInstance",value:function(){return new e}}]),e}();const jo=new Fo;function Vo(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||V(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const Uo=function(){function e(t){c(this,e),this.roomUrl=t}return d(e,[{key:"search",value:function(e){return this.request("".concat(this.roomUrl,"/search?q=").concat(e)).then((function(e){return e.data}))}},{key:"random",value:function(){return this.request("".concat(this.roomUrl,"/random")).then((function(e){return e.data}))}},{key:"trending",value:function(){var e=this;return this.request("".concat(this.roomUrl,"/trending?limit=9")).then((function(t){var n=t.data;return e.staff().then((function(e){return[].concat(Vo(n),Vo(e))}))}))}},{key:"staff",value:function(){return this.request("".concat(this.roomUrl,"/staff")).then((function(e){return e.data}))}},{key:"randomForQuery",value:function(e){var t=this;return new Promise((function(n,r){t.search(e).then((function(e){return Array.isArray(e)?e.filter((function(e){return e.images.original_mp4.mp4_size>=4e4})):[]})).then((function(e){if(0===e.length)throw new TypeError("No data found");n(e[Math.floor(Math.random()*e.length)])})).catch(r)}))}},{key:"request",value:function(e){return fetch(new Request(e)).then((function(e){return e.json()})).catch((function(t){return p.warn("GiphyApi",e,t),{data:[]}}))}}]),e}();function No(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return Wo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Wo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Wo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const Ho=function(){function e(){c(this,e),this.level=0,this.instant=0,this.silenceDuration=0,this.intervalCounter=0,this.track=null,this.context=null,this.source=null,this.analyser=null,this.volumes=null,this.listener=[],this.timer=null,this.errorTimer=null,this.boundOnTrackEnded=this.onTrackEnded.bind(this),this.initError=!1,this.init()}return d(e,[{key:"init",value:function(){var e=window.AudioContext||window.webkitAudioContext;void 0!==e?(this.context=new e,this.context.onstatechange=function(e){var t=e.target;"suspended"===t.state&&p.error("SoundMeter::init AudioContext: ",t.state)}):p.error("AudioContext is not available. Probably the current user agent does not support this feature. Use the feature detector to hide not supported elements. Any call on onUpdate will not send values.")}},{key:"connectToSource",value:function(e){var t=this;if(!this.context)return this;if(!e||e.getAudioTracks().length<1)return this.initError=!0,this.onTrackEnded(),this;p.debug("SoundMeter::connectToSource",e);var n=U(e.getAudioTracks(),1);if(this.track=n[0],"live"!==this.track.readyState)return this.initError=!0,this.onTrackEnded(),this;this.track.addEventListener("ended",this.boundOnTrackEnded),this.source=this.context.createMediaStreamSource(e);var r=this.context.createAnalyser();return r.fftSize=512,r.minDecibels=-127,r.maxDecibels=0,r.smoothingTimeConstant=.5,this.source.connect(r),this.analyser=r,this.volumes=new Uint8Array(r.frequencyBinCount),!this.running&&this.listener.length>0&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100)),this}},{key:"analyse",value:function(){var e=this,t=this.analyser,n=this.volumes,r=this.level;if(t){t.getByteFrequencyData(n);var i,o=0,s=No(n);try{for(s.s();!(i=s.n()).done;){o+=i.value}}catch(e){s.e(e)}finally{s.f()}var a=o/n.length,c=Math.min(Math.round(100*a/127),100);if(0===r&&0===c&&10===this.intervalCounter&&(this.silenceDuration++,this.silenceDuration>30&&!this.errorTimer&&(this.errorTimer=setTimeout((function(){e.emit({warning:"MicrophoneSilenceWarning"}),e.resetSilenceCounter()}),1e3))),r!==c)this.silenceDuration>0&&this.resetSilenceCounter(),Math.abs(r-c)>=1&&(this.level=c,this.emit({value:c}));this.intervalCounter<10&&this.intervalCounter++}}},{key:"resetSilenceCounter",value:function(){clearTimeout(this.errorTimer),this.errorTimer=null,this.silenceDuration=0}},{key:"stop",value:function(){this.offUpdate(),this.track&&(this.track.removeEventListener("ended",this.boundOnTrackEnded),this.track=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.source&&(this.source.disconnect(),this.source=null),this.volumes=null,this.context&&this.context.stop&&"closed"!==this.context.state&&(this.context.onstatechange=null,this.context.close(),this.context=null)}},{key:"onUpdate",value:function(e){var t=this;this.listener.push(e),this.initError?this.onTrackEnded():!this.running&&this.context&&this.track&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100))}},{key:"offUpdate",value:function(){clearTimeout(this.errorTimer),this.listener.length=0,this.running&&(clearInterval(this.timer),this.running=!1)}},{key:"onTrackEnded",value:function(){this.emit({error:"EyesonMicrophoneError"}),this.stop()}},{key:"emit",value:function(e){this.listener.forEach((function(t){return t(e)}))}}]),e}();const zo=function(){function e(){c(this,e),this._listener=[],this._monitor=null,this._running=!1,this.state=null}var t;return d(e,[{key:"onUpdate",value:function(e){"function"==typeof e&&this._listener.push(e)}},{key:"offUpdate",value:function(e){"function"==typeof e?this._listener=this._listener.filter((function(t){return t!==e})):this._listener.length=0}},{key:"_emit",value:function(e){var t=e[e.length-1].state;t!==this.state&&(this.state=t,p.debug("SystemPressureMonitor::emit",t),this._listener.forEach((function(e){try{e(t)}catch(e){p.error("SystemPressureMonitor::emit",e)}})))}},{key:"start",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==Xe.canMonitorSystemPressure()){e.next=3;break}return p.error("SystemPressureMonitor is not supported"),e.abrupt("return");case 3:if(e.prev=3,this._monitor||(this._monitor=new PressureObserver(this._emit.bind(this),{sampleRate:1})),this._running){e.next=9;break}return e.next=8,this._monitor.observe("cpu");case 8:this._running=!0;case 9:null===this.state&&this._emit([{state:"nominal"}]),p.debug("SystemPressureMonitor::start"),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(3),p.error("SystemPressureMonitor::start",e.t0);case 16:case"end":return e.stop()}}),e,this,[[3,13]])}))),function(){return t.apply(this,arguments)})},{key:"stop",value:function(){this._monitor&&this._running&&(this._monitor.disconnect(),this._running=!1)}},{key:"destroy",value:function(){this.stop(),this.offUpdate(),this.state=null,this._monitor=null}}]),e}(),Go=jo})(),r})())); +!function(){"use strict";var t="undefined"!=typeof window&&void 0!==window.document?window.document:{},n=e.exports,r=function(){for(var e,n=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],r=0,i=n.length,o={};r<i;r++)if((e=n[r])&&e[1]in t){for(r=0;r<e.length;r++)o[n[0][r]]=e[r];return o}return!1}(),i={change:r.fullscreenchange,error:r.fullscreenerror},o={request:function(e,n){return new Promise(function(i,o){var s=function(){this.off("change",s),i()}.bind(this);this.on("change",s);var a=(e=e||t.documentElement)[r.requestFullscreen](n);a instanceof Promise&&a.then(s).catch(o)}.bind(this))},exit:function(){return new Promise(function(e,n){if(this.isFullscreen){var i=function(){this.off("change",i),e()}.bind(this);this.on("change",i);var o=t[r.exitFullscreen]();o instanceof Promise&&o.then(i).catch(n)}else e()}.bind(this))},toggle:function(e,t){return this.isFullscreen?this.exit():this.request(e,t)},onchange:function(e){this.on("change",e)},onerror:function(e){this.on("error",e)},on:function(e,n){var r=i[e];r&&t.addEventListener(r,n,!1)},off:function(e,n){var r=i[e];r&&t.removeEventListener(r,n,!1)},raw:r};r?(Object.defineProperties(o,{isFullscreen:{get:function(){return Boolean(t[r.fullscreenElement])}},element:{enumerable:!0,get:function(){return t[r.fullscreenElement]}},isEnabled:{enumerable:!0,get:function(){return Boolean(t[r.fullscreenEnabled])}}}),n?e.exports=o:window.screenfull=o):n?e.exports={isEnabled:!1}:window.screenfull={isEnabled:!1}}()},539:e=>{"use strict";const t={generateIdentifier:function(){return Math.random().toString(36).substring(2,12)}};t.localCName=t.generateIdentifier(),t.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},t.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},t.getDescription=function(e){const n=t.splitSections(e);return n&&n[0]},t.getMediaSections=function(e){const n=t.splitSections(e);return n.shift(),n},t.matchPrefix=function(e,n){return t.splitLines(e).filter((e=>0===e.indexOf(n)))},t.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let e=8;e<t.length;e+=2)switch(t[e]){case"raddr":n.relatedAddress=t[e+1];break;case"rport":n.relatedPort=parseInt(t[e+1],10);break;case"tcptype":n.tcpType=t[e+1];break;case"ufrag":n.ufrag=t[e+1],n.usernameFragment=t[e+1];break;default:void 0===n[t[e]]&&(n[t[e]]=t[e+1])}return n},t.writeCandidate=function(e){const t=[];t.push(e.foundation);const n=e.component;"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port);const r=e.type;return t.push("typ"),t.push(r),"host"!==r&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},t.parseIceOptions=function(e){return e.substring(14).split(" ")},t.parseRtpMap=function(e){let t=e.substring(9).split(" ");const n={payloadType:parseInt(t.shift(),10)};return t=t[0].split("/"),n.name=t[0],n.clockRate=parseInt(t[1],10),n.channels=3===t.length?parseInt(t[2],10):1,n.numChannels=n.channels,n},t.writeRtpMap=function(e){let t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);const n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},t.parseExtmap=function(e){const t=e.substring(9).split(" ");return{id:parseInt(t[0],10),direction:t[0].indexOf("/")>0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},t.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},t.parseFmtp=function(e){const t={};let n;const r=e.substring(e.indexOf(" ")+1).split(";");for(let e=0;e<r.length;e++)n=r[e].trim().split("="),t[n[0].trim()]=n[1];return t},t.writeFmtp=function(e){let t="",n=e.payloadType;if(void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length){const r=[];Object.keys(e.parameters).forEach((t=>{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)})),t+="a=fmtp:"+n+" "+r.join(";")+"\r\n"}return t},t.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},t.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},t.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},t.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},t.getMid=function(e){const n=t.matchPrefix(e,"a=mid:")[0];if(n)return n.substring(6)},t.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},t.getDtlsParameters=function(e,n){return{role:"auto",fingerprints:t.matchPrefix(e+n,"a=fingerprint:").map(t.parseFingerprint)}},t.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},t.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},t.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?t.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},t.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},t.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},t.getCryptoParameters=function(e,n){return t.matchPrefix(e+n,"a=crypto:").map(t.parseCryptoLine)},t.getIceParameters=function(e,n){const r=t.matchPrefix(e+n,"a=ice-ufrag:")[0],i=t.matchPrefix(e+n,"a=ice-pwd:")[0];return r&&i?{usernameFragment:r.substring(12),password:i.substring(10)}:null},t.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},t.parseRtpParameters=function(e){const n={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=t.splitLines(e)[0].split(" ");n.profile=r[2];for(let i=3;i<r.length;i++){const o=r[i],s=t.matchPrefix(e,"a=rtpmap:"+o+" ")[0];if(s){const r=t.parseRtpMap(s),i=t.matchPrefix(e,"a=fmtp:"+o+" ");switch(r.parameters=i.length?t.parseFmtp(i[0]):{},r.rtcpFeedback=t.matchPrefix(e,"a=rtcp-fb:"+o+" ").map(t.parseRtcpFb),n.codecs.push(r),r.name.toUpperCase()){case"RED":case"ULPFEC":n.fecMechanisms.push(r.name.toUpperCase())}}}t.matchPrefix(e,"a=extmap:").forEach((e=>{n.headerExtensions.push(t.parseExtmap(e))}));const i=t.matchPrefix(e,"a=rtcp-fb:* ").map(t.parseRtcpFb);return n.codecs.forEach((e=>{i.forEach((t=>{e.rtcpFeedback.find((e=>e.type===t.type&&e.parameter===t.parameter))||e.rtcpFeedback.push(t)}))})),n},t.writeRtpDescription=function(e,n){let r="";r+="m="+e+" ",r+=n.codecs.length>0?"9":"0",r+=" "+(n.profile||"UDP/TLS/RTP/SAVPF")+" ",r+=n.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",r+="c=IN IP4 0.0.0.0\r\n",r+="a=rtcp:9 IN IP4 0.0.0.0\r\n",n.codecs.forEach((e=>{r+=t.writeRtpMap(e),r+=t.writeFmtp(e),r+=t.writeRtcpFb(e)}));let i=0;return n.codecs.forEach((e=>{e.maxptime>i&&(i=e.maxptime)})),i>0&&(r+="a=maxptime:"+i+"\r\n"),n.headerExtensions&&n.headerExtensions.forEach((e=>{r+=t.writeExtmap(e)})),r},t.parseRtpEncodingParameters=function(e){const n=[],r=t.parseRtpParameters(e),i=-1!==r.fecMechanisms.indexOf("RED"),o=-1!==r.fecMechanisms.indexOf("ULPFEC"),s=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),a=s.length>0&&s[0].ssrc;let c;const u=t.matchPrefix(e,"a=ssrc-group:FID").map((e=>e.substring(17).split(" ").map((e=>parseInt(e,10)))));u.length>0&&u[0].length>1&&u[0][0]===a&&(c=u[0][1]),r.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let t={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&c&&(t.rtx={ssrc:c}),n.push(t),i&&(t=JSON.parse(JSON.stringify(t)),t.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},n.push(t))}})),0===n.length&&a&&n.push({ssrc:a});let l=t.matchPrefix(e,"b=");return l.length&&(l=0===l[0].indexOf("b=TIAS:")?parseInt(l[0].substring(7),10):0===l[0].indexOf("b=AS:")?1e3*parseInt(l[0].substring(5),10)*.95-16e3:void 0,n.forEach((e=>{e.maxBitrate=l}))),n},t.parseRtcpParameters=function(e){const n={},r=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];r&&(n.cname=r.value,n.ssrc=r.ssrc);const i=t.matchPrefix(e,"a=rtcp-rsize");n.reducedSize=i.length>0,n.compound=0===i.length;const o=t.matchPrefix(e,"a=rtcp-mux");return n.mux=o.length>0,n},t.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},t.parseMsid=function(e){let n;const r=t.matchPrefix(e,"a=msid:");if(1===r.length)return n=r[0].substring(7).split(" "),{stream:n[0],track:n[1]};const i=t.matchPrefix(e,"a=ssrc:").map((e=>t.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return i.length>0?(n=i[0].value.split(" "),{stream:n[0],track:n[1]}):void 0},t.parseSctpDescription=function(e){const n=t.parseMLine(e),r=t.matchPrefix(e,"a=max-message-size:");let i;r.length>0&&(i=parseInt(r[0].substring(19),10)),isNaN(i)&&(i=65536);const o=t.matchPrefix(e,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substring(12),10),protocol:n.fmt,maxMessageSize:i};const s=t.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:i}}},t.writeSctpDescription=function(e,t){let n=[];return n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},t.generateSessionId=function(){return Math.random().toString().substr(2,22)},t.writeSessionBoilerplate=function(e,n,r){let i;const o=void 0!==n?n:2;i=e||t.generateSessionId();return"v=0\r\no="+(r||"thisisadapterortc")+" "+i+" "+o+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},t.getDirection=function(e,n){const r=t.splitLines(e);for(let e=0;e<r.length;e++)switch(r[e]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[e].substring(2)}return n?t.getDirection(n):"sendrecv"},t.getKind=function(e){return t.splitLines(e)[0].split(" ")[0].substring(2)},t.isRejected=function(e){return"0"===e.split(" ",2)[1]},t.parseMLine=function(e){const n=t.splitLines(e)[0].substring(2).split(" ");return{kind:n[0],port:parseInt(n[1],10),protocol:n[2],fmt:n.slice(3).join(" ")}},t.parseOLine=function(e){const n=t.matchPrefix(e,"o=")[0].substring(2).split(" ");return{username:n[0],sessionId:n[1],sessionVersion:parseInt(n[2],10),netType:n[3],addressType:n[4],address:n[5]}},t.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;const n=t.splitLines(e);for(let e=0;e<n.length;e++)if(n[e].length<2||"="!==n[e].charAt(1))return!1;return!0},e.exports=t},61:(e,t,n)=>{var r=n(698).default;function i(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */e.exports=i=function(){return n},e.exports.__esModule=!0,e.exports.default=e.exports;var t,n={},o=Object.prototype,s=o.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},c="function"==typeof Symbol?Symbol:{},u=c.iterator||"@@iterator",l=c.asyncIterator||"@@asyncIterator",d=c.toStringTag||"@@toStringTag";function h(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{h({},"")}catch(t){h=function(e,t,n){return e[t]=n}}function f(e,t,n,r){var i=t&&t.prototype instanceof S?t:S,o=Object.create(i.prototype),s=new D(r||[]);return a(o,"_invoke",{value:E(e,n,s)}),o}function p(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}n.wrap=f;var m="suspendedStart",v="suspendedYield",y="executing",g="completed",b={};function S(){}function k(){}function w(){}var x={};h(x,u,(function(){return this}));var C=Object.getPrototypeOf,T=C&&C(C(I([])));T&&T!==o&&s.call(T,u)&&(x=T);var R=w.prototype=S.prototype=Object.create(x);function _(e){["next","throw","return"].forEach((function(t){h(e,t,(function(e){return this._invoke(t,e)}))}))}function P(e,t){function n(i,o,a,c){var u=p(e[i],e,o);if("throw"!==u.type){var l=u.arg,d=l.value;return d&&"object"==r(d)&&s.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,a,c)}),(function(e){n("throw",e,a,c)})):t.resolve(d).then((function(e){l.value=e,a(l)}),(function(e){return n("throw",e,a,c)}))}c(u.arg)}var i;a(this,"_invoke",{value:function(e,r){function o(){return new t((function(t,i){n(e,r,t,i)}))}return i=i?i.then(o,o):o()}})}function E(e,n,r){var i=m;return function(o,s){if(i===y)throw new Error("Generator is already running");if(i===g){if("throw"===o)throw s;return{value:t,done:!0}}for(r.method=o,r.arg=s;;){var a=r.delegate;if(a){var c=M(a,r);if(c){if(c===b)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(i===m)throw i=g,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);i=y;var u=p(e,n,r);if("normal"===u.type){if(i=r.done?g:v,u.arg===b)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(i=g,r.method="throw",r.arg=u.arg)}}}function M(e,n){var r=n.method,i=e.iterator[r];if(i===t)return n.delegate=null,"throw"===r&&e.iterator.return&&(n.method="return",n.arg=t,M(e,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),b;var o=p(i,e.iterator,n.arg);if("throw"===o.type)return n.method="throw",n.arg=o.arg,n.delegate=null,b;var s=o.arg;return s?s.done?(n[e.resultName]=s.value,n.next=e.nextLoc,"return"!==n.method&&(n.method="next",n.arg=t),n.delegate=null,b):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,b)}function O(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function A(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function D(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(O,this),this.reset(!0)}function I(e){if(e||""===e){var n=e[u];if(n)return n.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function n(){for(;++i<e.length;)if(s.call(e,i))return n.value=e[i],n.done=!1,n;return n.value=t,n.done=!0,n};return o.next=o}}throw new TypeError(r(e)+" is not iterable")}return k.prototype=w,a(R,"constructor",{value:w,configurable:!0}),a(w,"constructor",{value:k,configurable:!0}),k.displayName=h(w,d,"GeneratorFunction"),n.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===k||"GeneratorFunction"===(t.displayName||t.name))},n.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,w):(e.__proto__=w,h(e,d,"GeneratorFunction")),e.prototype=Object.create(R),e},n.awrap=function(e){return{__await:e}},_(P.prototype),h(P.prototype,l,(function(){return this})),n.AsyncIterator=P,n.async=function(e,t,r,i,o){void 0===o&&(o=Promise);var s=new P(f(e,t,r,i),o);return n.isGeneratorFunction(t)?s:s.next().then((function(e){return e.done?e.value:s.next()}))},_(R),h(R,d,"Generator"),h(R,u,(function(){return this})),h(R,"toString",(function(){return"[object Generator]"})),n.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},n.values=I,D.prototype={constructor:D,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(A),!e)for(var n in this)"t"===n.charAt(0)&&s.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var n=this;function r(r,i){return a.type="throw",a.arg=e,n.next=r,i&&(n.method="next",n.arg=t),!!i}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var c=s.call(o,"catchLoc"),u=s.call(o,"finallyLoc");if(c&&u){if(this.prev<o.catchLoc)return r(o.catchLoc,!0);if(this.prev<o.finallyLoc)return r(o.finallyLoc)}else if(c){if(this.prev<o.catchLoc)return r(o.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return r(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&s.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var i=r;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,b):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),b},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),A(n),b}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;A(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,n,r){return this.delegate={iterator:I(e),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=t),b}},n}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},698:e=>{function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},687:(e,t,n)=>{var r=n(61)();e.exports=r;try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={id:r,loaded:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e);var r={};return(()=>{"use strict";n.r(r),n.d(r,{ConnectionStatistics:()=>vo,DeviceManager:()=>Bn,FeatureDetector:()=>Xe,FullscreenHelper:()=>Je,GiphyApi:()=>Uo,LocalStorage:()=>nt,Logger:()=>p,MediaStreamBuilder:()=>Ln,MicMixer:()=>Fn,SoundMeter:()=>Ho,StreamHelpers:()=>s,SystemPressureMonitor:()=>zo,debounce:()=>li,default:()=>Go,immediate:()=>qt,throttle:()=>v});var e={};n.r(e),n.d(e,{fixNegotiationNeeded:()=>le,shimAddTrackRemoveTrack:()=>ce,shimAddTrackRemoveTrackWithNative:()=>ae,shimGetDisplayMedia:()=>te,shimGetSendersWithDtmf:()=>ie,shimGetStats:()=>oe,shimGetUserMedia:()=>ee,shimMediaStream:()=>ne,shimOnTrack:()=>re,shimPeerConnection:()=>ue,shimSenderReceiverGetStats:()=>se});var t={};n.r(t),n.d(t,{shimAddTransceiver:()=>be,shimCreateAnswer:()=>we,shimCreateOffer:()=>ke,shimGetDisplayMedia:()=>he,shimGetParameters:()=>Se,shimGetUserMedia:()=>de,shimOnTrack:()=>fe,shimPeerConnection:()=>pe,shimRTCDataChannel:()=>ge,shimReceiverGetStats:()=>ve,shimRemoveStream:()=>ye,shimSenderGetStats:()=>me});var i={};n.r(i),n.d(i,{shimAudioContext:()=>Oe,shimCallbacksAPI:()=>Te,shimConstraints:()=>_e,shimCreateOfferLegacy:()=>Me,shimGetUserMedia:()=>Re,shimLocalStreamsAPI:()=>xe,shimRTCIceServerUrls:()=>Pe,shimRemoteStreamsAPI:()=>Ce,shimTrackEventTransceiver:()=>Ee});var o={};n.r(o),n.d(o,{removeExtmapAllowMixed:()=>Ve,shimAddIceCandidateNullOrEmpty:()=>Ue,shimConnectionState:()=>je,shimMaxMessageSize:()=>Le,shimParameterlessSetLocalDescription:()=>Ne,shimRTCIceCandidate:()=>Ie,shimRTCIceCandidateRelayProtocol:()=>Be,shimSendThrowTypeError:()=>Fe});var s={};function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e){var t=function(e,t){if("object"!==a(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==a(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===a(t)?t:String(t)}function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function d(e,t,n){return t&&l(e.prototype,t),n&&l(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}n.r(s),n.d(s,{captureStream:()=>zt,createExternalStream:()=>Gt,disableAudio:()=>dt,disableCamera:()=>Mt,enableAudio:()=>ht,enableCamera:()=>Ot,getCameraTracks:()=>_t,getCanvasTracks:()=>It,getFacingMode:()=>Ht,getScreenAsVideoTracks:()=>Rt,getScreenPresentationTracks:()=>Tt,getScreenTracks:()=>Ct,getVbgTracks:()=>Pt,hasAudio:()=>ut,hasCameraVideo:()=>Wt,hasVideo:()=>lt,isCameraStream:()=>Vt,isCanvasPresentationStream:()=>Ut,isCanvasStream:()=>Ft,isNinjaStreamTrack:()=>kt,isPresentationStream:()=>Nt,isScreenAsVideoTrack:()=>bt,isScreenPresentationStream:()=>Lt,isScreenStream:()=>Bt,isVBGStream:()=>jt,isVbgStreamTrack:()=>wt,stopCamera:()=>Et,stopStream:()=>vt,stopTrack:()=>mt,toggleAudio:()=>ft,toggleCamera:()=>At,toggleVbgTrack:()=>Dt,toggleVideo:()=>pt});const h={api:"https://api.eyeson.team",allowSafariSFU:!0,screencapture:!0},f={widescreen:!1},p={error:function(){var e;return(e=console).error.apply(e,arguments)},warn:function(){var e;return(e=console).warn.apply(e,arguments)},info:function(){var e;return(e=console).log.apply(e,arguments)},debug:function(){var e;return console.debug?(e=console).debug.apply(e,arguments):null}};const m=function(){function e(t,n){c(this,e),this.uri=t,this.token=n.replace(/\W+/g,""),this.cache={users:[]},this.errorCallback=null,this._handleError=this._handleError.bind(this)}return d(e,[{key:"_request",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return fetch(new Request(this.uri+e),t).then((function(e){var t=e.headers.get("content-type");if(t&&-1!==t.indexOf("application/json")&&e.ok)return e.json();if(e.ok)return e.text();throw new Error("ComApiError: ".concat(e.status))}))}},{key:"_objectToFormData",value:function(e,t,n){var r=t||new FormData,i=null;for(var o in e){if(!e.hasOwnProperty(o))return;if(n)i=n+"["+(isNaN(parseInt(o))?o:"")+"]";else i=o;"object"!==a(e[o])||e[o]instanceof File?r.append(i,e[o]):this._objectToFormData(e[o],r,o)}return r}},{key:"_post",value:function(e,t){return this._request(e,{method:"POST",body:this._objectToFormData(t)})}},{key:"_put",value:function(e,t){var n=new FormData;for(var r in t)n.append(r,t[r]);return this._request(e,{method:"PUT",body:n})}},{key:"_handleError",value:function(e){return p.error("ComApi::handleError",e),this.errorCallback&&this.errorCallback(e),!1}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"getRoom",value:function(e){return this._request("/rooms/".concat(this.token)).then(e).catch((function(t){return e?e({error:t}):{error:t}}))}},{key:"terminateMeeting",value:function(){return this._request("/rooms/".concat(this.token),{method:"DELETE"}).catch(this._handleError)}},{key:"getUser",value:function(e,t){var n=this,r=this.cache.users.find((function(t){return t.id===e}));return r?(t(r),null):this._request("/rooms/".concat(this.token,"/users/").concat(e)).then((function(r){var i=n.cache.users.filter((function(t){return t.id!==e})),o=n.addUserAttributes(r,e,e);i.push(o),n.cache.users=i,t(o)})).catch(this._handleError)}},{key:"addUserAttributes",value:function(e,t,n){var r=e.avatar;try{r="".concat(e.avatar,"?size=large")}catch(t){p.warn("ComApi::addUserAttributes missing",e)}return Object.assign(e,{id:t,apiId:e.id,clientId:n,sipId:n,largeAvatar:r})}},{key:"kickUser",value:function(e){var t=this;return this._request("/rooms/".concat(this.token,"/users/").concat(e),{method:"DELETE"}).then((function(){if(t.cache.users.find((function(t){return t.id===e}))){var n=t.cache.users.filter((function(t){return t.id!==e}));t.cache.users=n}})).catch(this._handleError)}},{key:"requestUser",value:function(e,t){return this._post("/guests/".concat(this.token),{name:e.name,email:e.email,custom_fields:{locale:e.locale||"en"}}).then(t).catch((function(e){return t({error:e})}))}},{key:"startBroadcast",value:function(e,t){return this._post("/rooms/".concat(this.token,"/broadcasts"),{platform:t,player_url:e.playerUrl||"",stream_url:e.streamUrl})}},{key:"publishBroadcast",value:function(e,t){return this._put("/rooms/".concat(this.token,"/broadcasts/").concat(t),{player_url:e.playerUrl})}},{key:"stopBroadcast",value:function(e){return this._request("/rooms/".concat(this.token,"/broadcasts/").concat(e),{method:"DELETE"})}},{key:"stopAllBroadcasts",value:function(){return this._request("/rooms/".concat(this.token,"/broadcasts"),{method:"DELETE"})}},{key:"startRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"POST"})}},{key:"stopRecording",value:function(){return this._request("/rooms/".concat(this.token,"/recording"),{method:"DELETE"}).catch(this._handleError)}},{key:"setLayout",value:function(e){return this._post("/rooms/".concat(this.token,"/layout"),e).catch(this._handleError)}},{key:"setLayer",value:function(e){return this._post("/rooms/".concat(this.token,"/layers"),e).catch(this._handleError)}},{key:"clearFrontLayer",value:function(){return this._request("/rooms/".concat(this.token,"/layers/1"),{method:"DELETE"}).catch(this._handleError)}},{key:"takeSnapshot",value:function(){return this._request("/rooms/".concat(this.token,"/snapshot"),{method:"POST"}).catch(this._handleError)}},{key:"getSnapshot",value:function(e,t){var n=this;return this._request("/rooms/".concat(this.token,"/snapshots/").concat(e)).then(t).catch((function(e){t?t({error:e}):n._handleError(e)}))}},{key:"startPlayback",value:function(e){return this._post("/rooms/".concat(this.token,"/playbacks"),{playback:e}).catch(this._handleError)}},{key:"stopPlayback",value:function(e){return this._request("/rooms/".concat(this.token,"/playbacks/").concat(e.play_id),{method:"DELETE"}).catch(this._handleError)}},{key:"lockMeeting",value:function(){return this._request("/rooms/".concat(this.token,"/lock"),{method:"POST"}).catch(this._handleError)}}]),e}(),v=function(e,t,n){var r,i,o,s=null,a=0;n||(n={});var c=function(){a=!1===n.leading?0:Date.now(),s=null,o=e.apply(r,i),s||(r=i=null)};return function(){var u=Date.now();a||!1!==n.leading||(a=u);var l=t-(u-a);return r=this,i=arguments,l<=0||l>t?(s&&(clearTimeout(s),s=null),a=u,o=e.apply(r,i),s||(r=i=null)):s||!1===n.trailing||(s=setTimeout(c,l)),o}};function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function S(e,t){if(t&&("object"===a(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return b(e)}function k(e){return k=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},k(e)}const w=function(){function e(t){c(this,e),this.context=t}return d(e,[{key:"handle",value:function(e){p.error("BaseEvent::handle is not implemented",e)}}]),e}();function x(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var C=function(e){g(n,e);var t=x(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.startPlayback(e.playback)}}]),n}(w),T=function(e){g(n,e);var t=x(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopPlayback(e.playback)}}]),n}(w);function R(){return R="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=k(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},R.apply(this,arguments)}function _(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const P=function(e){g(n,e);var t=_(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){"client"!==e._src&&(Reflect.deleteProperty(e,"_src"),this.context.listeners.forEach((function(t){return t(e)})))}}]),n}(w);function E(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var M=function(e){g(n,e);var t=E(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context.annotationLoop=window.setInterval((function(){e.context._api.createAnnotation((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"annotation",annotation:t})}),(function(){window.clearInterval(e.context.annotationLoop)}))}),1e3)}}]),n}(P),O=function(e){g(n,e);var t=E(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){window.clearInterval(this.context.annotationLoop),this.context._api.stopAnnotation()}}]),n}(P);function A(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const D=function(e){g(n,e);var t=A(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._rtConnection.send({type:"stfu"})}}]),n}(P);function I(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const B=function(e){g(n,e);var t=I(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){}}]),n}(w);function L(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const F=function(e){g(n,e);var t=L(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context.listeners.forEach((function(t){return t(e)}))}}]),n}(w);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(e){if("string"==typeof e)return j(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}function U(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,s,a=[],c=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(a.push(r.value),a.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return a}}(e,t)||V(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}let N=!0,W=!0;function H(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function z(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const o=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,o),i.apply(this,[e,o])};const o=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function G(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(N=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function q(e){return"boolean"!=typeof e?new Error("Argument type: "+typeof e+". Please use a boolean."):(W=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function $(){if("object"==typeof window){if(N)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function J(e,t){W&&console.warn(e+" is deprecated, please use "+t+" instead.")}function K(e){return"[object Object]"===Object.prototype.toString.call(e)}function X(e){return K(e)?Object.keys(e).reduce((function(t,n){const r=K(e[n]),i=r?X(e[n]):e[n],o=r&&!Object.keys(i).length;return void 0===i||o?t:Object.assign(t,{[n]:i})}),{}):e}function Y(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?Y(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{Y(e,e.get(t),n)}))})))}function Q(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const o=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&o.push(e)})),o.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&Y(e,n,i)}))})),i}const Z=$;function ee(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let o=e.video.facingMode;o=o&&("object"==typeof o?o:{ideal:o});const s=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||s)){let t;if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?t=["back","rear"]:"user"!==o.exact&&"user"!==o.ideal||(t=["front"]),t)return n.mediaDevices.enumerateDevices().then((n=>{let s=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!s&&n.length&&t.includes("back")&&(s=n[n.length-1]),s&&(e.video.deviceId=o.exact?{exact:s.deviceId}:{ideal:s.deviceId}),e.video=r(e.video),Z("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return Z("chrome: "+JSON.stringify(e)),i(e)},o=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(o(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(t,(t=>e(t).then((e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach((e=>{e.stop()})),new DOMException("","NotFoundError");return e}),(e=>Promise.reject(o(e))))))}}}function te(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,o=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:o||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function ne(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function re(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else z(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function ie(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const t=this._senders.find((t=>t.track===e));t&&this._senders.splice(this._senders.indexOf(t),1)}))}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function oe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof e))return t.apply(this,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},o=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(o(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(o(i(t)))},n])})).then(n,r)}}function se(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>Q(t,e.track,!1)))}}if(!("getStats"in e.RTCRtpSender.prototype)||!("getStats"in e.RTCRtpReceiver.prototype))return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function ae(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function ce(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return ae(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((e=>{if(this.getSenders().find((t=>t.track===e)))throw new DOMException("Track already exists.","InvalidAccessError")})),!this._reverseStreams[t.id]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function o(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find((e=>e===t)))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((e=>e.track===t)))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=o(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>o(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),s.apply(this,arguments)):s.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:o(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function ue(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function le(e,t){z(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}function de(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){J("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function he(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function fe(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function pe(e,t){if("object"!=typeof e||!e.RTCPeerConnection&&!e.mozRTCPeerConnection)return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,o]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,o)}}function me(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function ve(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),z(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function ye(e){e.RTCPeerConnection&&!("removeStream"in e.RTCPeerConnection.prototype)&&(e.RTCPeerConnection.prototype.removeStream=function(e){J("removeStream","removeTrack"),this.getSenders().forEach((t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)}))})}function ge(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function be(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function Se(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function ke(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function we(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((()=>t.apply(this,arguments))).finally((()=>{this.setParametersPromises=[]})):t.apply(this,arguments)}}function xe(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.forEach((e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]})),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function Ce(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach((e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function Te(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,o=t.setRemoteDescription,s=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function Re(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(_e(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function _e(e){return e&&void 0!==e.video?Object.assign({},e,{video:X(e.video)}):e}function Pe(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;n<e.iceServers.length;n++){let r=e.iceServers[n];void 0===r.urls&&r.url?(J("RTCIceServer.url","RTCIceServer.urls"),r=JSON.parse(JSON.stringify(r)),r.urls=r.url,delete r.url,t.push(r)):t.push(e.iceServers[n])}e.iceServers=t}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:()=>t.generateCertificate})}function Ee(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Me(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const t=this.getTransceivers().find((e=>"audio"===e.receiver.track.kind));!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Oe(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}var Ae=n(539),De=n.n(Ae);function Ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const t=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){const n=new t(e),r=De().parseCandidate(e.candidate);for(const e in r)e in n||Object.defineProperty(n,e,{value:r[e]});return n.toJSON=function(){return{candidate:n.candidate,sdpMid:n.sdpMid,sdpMLineIndex:n.sdpMLineIndex,usernameFragment:n.usernameFragment}},n}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,z(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function Be(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||z(e,"icecandidate",(e=>{if(e.candidate){const t=De().parseCandidate(e.candidate.candidate);"relay"===t.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[t.priority>>24])}return e}))}function Le(e,t){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===t.browser&&t.version>=76){const{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(e){if(!e||!e.sdp)return!1;const t=De().splitSections(e.sdp);return t.shift(),t.some((e=>{const t=De().parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),n=function(e){let n=65536;return"firefox"===t.browser&&(n=t.version<57?-1===e?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637),n}(e),r=function(e,n){let r=65536;"firefox"===t.browser&&57===t.version&&(r=65535);const i=De().matchPrefix(e.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substring(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],e);let i;i=0===n&&0===r?Number.POSITIVE_INFINITY:0===n||0===r?Math.max(n,r):Math.min(n,r);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>i}),this._sctp=o}return n.apply(this,arguments)}}function Fe(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},z(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function je(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((e=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function Ve(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=t.sdp.split("\n").filter((e=>"a=extmap-allow-mixed"!==e.trim())).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:n}):t.sdp=n}return n.apply(this,arguments)}}function Ue(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function Ne(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}const We=function({window:n}={},r={shimChrome:!0,shimFirefox:!0,shimSafari:!0}){const s=$,a=function(e){const t={browser:null,version:null};if(void 0===e||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;const{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=H(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=H(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=H(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}(n),c={browserDetails:a,commonShim:o,extractVersion:H,disableLog:G,disableWarnings:q,sdp:Ae};switch(a.browser){case"chrome":if(!e||!ue||!r.shimChrome)return s("Chrome shim is not included in this adapter release."),c;if(null===a.version)return s("Chrome shim can not determine version, not shimming."),c;s("adapter.js shimming chrome."),c.browserShim=e,Ue(n,a),Ne(n),ee(n,a),ne(n),ue(n,a),re(n),ce(n,a),ie(n),oe(n),se(n),le(n,a),Ie(n),Be(n),je(n),Le(n,a),Fe(n),Ve(n,a);break;case"firefox":if(!t||!pe||!r.shimFirefox)return s("Firefox shim is not included in this adapter release."),c;s("adapter.js shimming firefox."),c.browserShim=t,Ue(n,a),Ne(n),de(n,a),pe(n,a),fe(n),ye(n),me(n),ve(n),ge(n),be(n),Se(n),ke(n),we(n),Ie(n),je(n),Le(n,a),Fe(n);break;case"safari":if(!i||!r.shimSafari)return s("Safari shim is not included in this adapter release."),c;s("adapter.js shimming safari."),c.browserShim=i,Ue(n,a),Ne(n),Pe(n),Me(n),Te(n),xe(n),Ce(n),Ee(n),Re(n),Oe(n),Ie(n),Be(n),Le(n,a),Fe(n),Ve(n,a);break;default:s("Unsupported browser!")}return c}({window:"undefined"==typeof window?void 0:window}),He=We;var ze=n(795),Ge=n.n(ze),qe=n(577),$e=n.n(qe);const Je=function(){function e(){c(this,e),this.onChange=this.onChange.bind(this),this.hasSupport=Boolean($e().isEnabled)}return d(e,[{key:"toggle",value:function(){return this.isFullscreen()?$e().exit():$e().request()}},{key:"canFullscreen",value:function(){return this.hasSupport}},{key:"isFullscreen",value:function(){return this.hasSupport&&$e().isFullscreen}},{key:"onChange",value:function(e){var t=this;this.hasSupport&&$e().on("change",(function(){return e(t.isFullscreen())}))}},{key:"off",value:function(){this.hasSupport&&$e().off("change")}}]),e}();var Ke=null;const Xe={environment:function(){return{canMix:this.canMix(),canPip:this.hasPipSupport(),canSFU:this.canSFU(),isPhone:this.isPhone(),inIframe:this.inIframe(),isIOSDevice:this.isIOSDevice(),canUseEyeson:this.canUseEyeson(),canFullscreen:this.canFullscreen(),hasMobileDevice:this.hasMobileDevice(),canToggleCamera:this.canToggleCamera(),canPresentFiles:this.canPresentFiles(),canScreenCapture:this.canScreenCapture(),canAdjustSettings:this.canAdjustDeviceSettings(),canStreamLocalMedia:this.canStreamLocalMedia(),isExperimentalBrowser:this.isExperimentalBrowser()}},platform:function(){return Ge()},canUseEyeson:function(){return!this.isWebView()&&this.hasGetUserMedia()&&this.canDataChannel()&&this.isMinimumRequiredBrowser()},hasGetUserMedia:function(){return"mediaDevices"in navigator&&"getUserMedia"in navigator.mediaDevices},hasGetDisplayMedia:function(){return"mediaDevices"in navigator&&"getDisplayMedia"in navigator.mediaDevices},hasPeerConnection:function(){return"RTCPeerConnection"in window},hasCaptureStream:function(){return"captureStream"in HTMLMediaElement.prototype||"mozCaptureStream"in HTMLMediaElement.prototype},hasCanvasCaptureSupport:function(){return"CanvasCaptureMediaStream"in window||"CanvasCaptureMediaStreamTrack"in window},hasSenders:function(){return"RTCRtpSender"in window},hasTrackOnUnmute:function(){return!(this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())&&"onunmute"in MediaStreamTrack.prototype},hasWebpSupport:function(){return this.isChrome()?He.browserDetails.version>=70:!!this.isFF()&&He.browserDetails.version>=65},canChangeAudioOutput:function(){return!document||"setSinkId"in HTMLMediaElement.prototype},canChangeMicrophone:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canMultipleDifferentMicrophones:function(){return!(this.isFF()&&this.browserVersion()<101)},canChangeCamera:function(){var e=!1;return"safari"===He.browserDetails.browser&&(e=this.browserVersion()<12&&!this.isWorkingIOSBrowser()),!this.isTestSuite()&&!e},canScreenCapture:function(){return!(!h.screencapture||this.isTestSuite()||!this.canUseEyeson()||this.hasMobileDevice())&&(this.hasGetDisplayMedia()||this.isFF()&&this.hasGetUserMedia())},canPresentFiles:function(){return!(this.isTestSuite()||!this.canUseEyeson()||this.isFF()&&He.browserDetails.version<=60||this.isIPhone()||this.isIOSDevice()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser())},canStreamLocalMedia:function(){var e=window.AudioContext||window.webkitAudioContext;if("function"!=typeof e)return!1;var t=e.prototype;return["createGain","createMediaStreamSource","createMediaElementSource","createMediaStreamDestination"].every((function(e){return"function"==typeof t[e]}))&&this.hasCanvasCaptureSupport()},requiresLowerConstraints:function(){return this.isSafari()&&this.browserVersion()<13&&!this.isWorkingIOSBrowser()},browserName:function(){return He.browserDetails.browser.replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))},browserVersion:function(){return"safari"===He.browserDetails.browser?He.extractVersion(navigator.userAgent,/Version\/(\d+)\./,1):He.browserDetails.version},isEdge:function(){return"edge"===He.browserDetails.browser},isFF:function(){return"firefox"===He.browserDetails.browser},isChrome:function(){return"chrome"===He.browserDetails.browser},isSafari:function(){return"safari"===He.browserDetails.browser},isMinimumRequiredBrowser:function(){return this.isChrome()?this.isMinimumRequiredChrome():this.isFF()?this.isMinimumRequiredFF():!!this.isSafari()&&this.isMinimumRequiredSafari()},isMinimumRequiredEdge:function(){return!1},isMinimumRequiredFF:function(){return!!this.isFF()&&He.browserDetails.version>=52},isMinimumRequiredChrome:function(){return!!this.isChrome()&&He.browserDetails.version>=70},isMinimumRequiredSafari:function(){return!!this.isSafari()&&(this.browserVersion()>=10||this.isWorkingIOSBrowser())},isWorkingIOSBrowser:function(){var e=/ [a-zA-Z]+iOS\//.test(navigator.userAgent),t=navigator.userAgent.indexOf(" OPT/")>-1;return(e||t)&&this.hasGetUserMedia()},isExperimentalBrowser:function(){return["safari","edge"].includes(He.browserDetails.browser)},hasPipSupport:function(){return!document||Boolean("webkitSupportsPresentationMode"in HTMLVideoElement.prototype||"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled)},iOSPipCheck:function(){var e=this;return new Promise((function(t){var n=e.hasPipSupport();if(n&&e.isIOSDevice()){var r=document.createElement("video");r.preload="none",r.src="about:blank",r.onsuspend=function(){var e=r.webkitSupportsPresentationMode("picture-in-picture");t(e)}}else t(n)}))},isAndroidDevice:function(){return Boolean(navigator.userAgent.match(/Android/i))},isIOSDevice:function(){return(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!window.MSStream},isIPhone:function(){return(/iPhone/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1&&window.screen.height/window.screen.width>=1.5)&&!window.MSStream},isAndroidPhone:function(){var e=/(android)/i.test(navigator.userAgent),t=/(mobile)/i.test(navigator.userAgent);return e&&t},isMacOS:function(){return void 0!==navigator.userAgentData?"macOS"===navigator.userAgentData.platform:0===navigator.platform.indexOf("Mac")},inIframe:function(){try{return window.self!==window.top}catch(e){return!0}},isPhone:function(){return this.isIPhone()||this.isAndroidPhone()},hasMobileDevice:function(){return this.isIOSDevice()||this.isAndroidDevice()},isTouchDevice:function(){return Boolean("ontouchstart"in window||navigator.maxTouchPoints)},canDisplayTooltips:function(){return!this.isIOSDevice()&&!this.isTestSuite()},canAdjustDeviceSettings:function(){return!this.isIOSDevice()},canToggleCamera:function(){return!0},canDrawCamera:function(){return!this.isIOSDevice()},canMix:function(){return this.isChrome()&&this.canScreenCapture()&&this.hasCanvasCaptureSupport()},stopsDeviceActivityIndicatorOnDisable:function(){return!!this.isFF()},supportsBlurOnSVG:function(){return"undefined"!=typeof SVGElement&&void 0!==SVGElement.prototype.blur},hasLocalStorage:function(){try{var e="object"===a(window.localStorage)&&null!==window.localStorage;window.localStorage.setItem("eyeson.test","test");var t="test"===window.localStorage.getItem("eyeson.test");return e&&t}catch(e){return p.debug("FeatureDetector::hasLocalStorage:",e.message),!1}},canFullscreen:function(){return(new Je).canFullscreen()},isFullscreen:function(){return(new Je).isFullscreen()},canSFU:function(){var e=!1;if(this.isSafari()){if(!h.allowSafariSFU)return!1;if(this.isWorkingIOSBrowser())return!0;var t=navigator.userAgent.match(/Version\/(\d+).(\d+)/);t&&t.length>1&&(e=Number(t[1])<12||12===Number(t[1])&&Number(t[2])<1)}return!e&&!this.isTestSuite()},canDataChannel:function(){return this.hasPeerConnection()&&"function"==typeof RTCPeerConnection.prototype.createDataChannel&&"RTCDataChannel"in window},disallowAudioSyncSrcChange:function(){return this.isSafari()&&this.canSFU()},canShare:function(){return Boolean(navigator.share)},isWebView:function(){return/Version\/|wv/i.test(navigator.userAgent)&&this.isAndroidDevice()},isTestSuite:function(){return"test-suite"===He.browserDetails.browser},canVirtualBackground:function(){return!this.isIOSDevice()&&Boolean(window.WebAssembly)&&"function"==typeof WebAssembly.validate&&("function"==typeof WebAssembly.instantiateStreaming||"function"==typeof WebAssembly.instantiate)&&Boolean(window.CanvasRenderingContext2D)&&"function"==typeof window.ImageData&&"function"==typeof window.requestAnimationFrame},canvasBlurSupport:function(){if(null!==Ke)return Ke;if(!(window.CanvasRenderingContext2D&&"filter"in CanvasRenderingContext2D.prototype))return Ke=!1;var e=document.createElement("canvas"),t=document.createElement("canvas");e.width=10,e.height=10,t.width=10,t.height=10;var n=e.getContext("2d"),r=t.getContext("2d");n.filter="blur(5px)",n.fillStyle="#000000",n.fillRect(3,3,4,4),r.fillStyle="#000000",r.fillRect(3,3,4,4);var i=n.getImageData(5,5,1,1),o=r.getImageData(5,5,1,1);return Ke=i.data[3]!==o.data[3]},canStereo:function(){return!(this.isSafari()||this.isAndroidDevice())},canChooseDisplaySurface:function(){return this.hasGetDisplayMedia()&&navigator.mediaDevices.getSupportedConstraints().displaySurface},hasPipCamSupport:function(){return this.isChrome()&&this.hasPipSupport()},canMonitorSystemPressure:function(){return"function"==typeof window.PressureObserver&&Array.isArray(PressureObserver.supportedSources)&&PressureObserver.supportedSources.includes("cpu")}};function Ye(e,t,n,r,i,o,s){try{var a=e[o](s),c=a.value}catch(e){return void n(e)}a.done?t(c):Promise.resolve(c).then(r,i)}function Qe(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function s(e){Ye(o,r,i,s,a,"next",e)}function a(e){Ye(o,r,i,s,a,"throw",e)}s(void 0)}))}}var Ze=n(687),et=n.n(Ze);const tt=function(){function e(){c(this,e),this._stream=this.createStream()}return d(e,[{key:"stream",get:function(){return this._stream}},{key:"createStream",value:function(){var e=Object.assign(document.createElement("canvas"),{width:0,height:0});e.id="eyeson-ninja-stream",e.getContext("2d").fillRect(0,0,0,0);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return window.CanvasCaptureMediaStream&&t instanceof window.CanvasCaptureMediaStream&&(n.type="canvas-track",n.canvas=e),t}}]),e}(),nt=(rt="eyeson.",it={},ot=Xe.hasLocalStorage(),{store:function(e,t){if(!ot)return it[e]=t,!0;try{window.localStorage.setItem(rt+e,JSON.stringify(t))}catch(e){return p.error("LocalStorage::store",e),!1}return!0},load:function(e,t){var n=t;if("object"!==a(n)||Array.isArray(n)||(n=Object.assign({},n)),!ot)return it[e]||n;var r=window.localStorage.getItem(rt+e);if(!r)return n;try{return JSON.parse(r)}catch(t){return p.error("LocalStorage::load",e,t),n}}});var rt,it,ot,st,at,ct=window.CanvasCaptureMediaStream||window.CanvasCaptureMediaStreamTrack,ut=function(e){return Boolean(e&&e.getAudioTracks().length>0&&e.getAudioTracks()[0].enabled)},lt=function(e){return Boolean(e&&e.getVideoTracks().length>0&&e.getVideoTracks()[0].enabled)},dt=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!1})),e},ht=function(e){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=!0})),e},ft=function(e,t){return e&&e.getAudioTracks().forEach((function(e){return e.enabled=t})),e},pt=function(e,t){return e&&e.getVideoTracks().forEach((function(e){return e.enabled=t})),e},mt=function(e){return e.stop(),e.dispatchEvent(new Event("stopped"))},vt=function(e){e&&e.getTracks().forEach(mt)},yt=function(e){return/screen|monitor|window|web-contents-media-stream/i.test(e.label)||"screen-track"===e.type||"screen-video-track"===e.type},gt=function(e){return yt(e)&&"screen-video-track"!==e.type},bt=function(e){return yt(e)&&"screen-video-track"===e.type},St=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"!==e.canvas.id&&"eyeson-vbg-stream"!==e.canvas.id)},kt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-ninja-stream"===e.canvas.id)},wt=function(e){return Boolean(("canvas-track"===e.type||e instanceof ct)&&e.canvas&&"eyeson-vbg-stream"===e.canvas.id)},xt=function(e){return!St(e)&&!yt(e)&&!wt(e)},Ct=function(e){return e?e.getVideoTracks().filter(yt):[]},Tt=function(e){return e?e.getVideoTracks().filter(gt):[]},Rt=function(e){return e?e.getVideoTracks().filter(bt):[]},_t=function(e){return e?e.getVideoTracks().filter(xt):[]},Pt=function(e){return e?e.getVideoTracks().filter(wt):[]},Et=function(e){_t(e).forEach(mt)},Mt=function(e){return _t(e).forEach((function(e){return e.enabled=!1})),e},Ot=function(e){return _t(e).forEach((function(e){return e.enabled=!0})),e},At=function(e,t){return _t(e).forEach((function(e){return e.enabled=t})),e},Dt=function(e,t){return Pt(e).forEach((function(e){return e.enabled=t})),e},It=function(e){return e instanceof ct?e.getVideoTracks():e?e.getVideoTracks().filter(St):[]},Bt=function(e){return lt(e)&&e.getVideoTracks().some(yt)},Lt=function(e){return lt(e)&&e.getVideoTracks().some(gt)},Ft=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&e.getVideoTracks().some(St)},jt=function(e){return!(!Xe.hasCanvasCaptureSupport()||!e)&&(lt(e)&&e.getVideoTracks().some(wt))},Vt=function(e){return lt(e)&&!Bt(e)&&!Ft(e)&&!jt(e)},Ut=function(e){return!!e&&(Ft(e)&&e.getVideoTracks().some(St))},Nt=function(e){return Lt(e)||Ft(e)},Wt=function(e){return _t(e).some((function(e){return e.enabled}))},Ht=function(e){var t=_t(e);if(t.length>0){var n=U(t,1)[0];if("function"==typeof n.getSettings){var r=n.getSettings();if(r&&"facingMode"in r)return r.facingMode}}return null},zt=function(e){e.getContext("2d");var t=e.captureStream(20),n=U(t.getVideoTracks(),1)[0];return"requestFrame"in n||(n.type="canvas-track",n.canvas=e,n.requestFrame=function(){return t.requestFrame()}),t},Gt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&e instanceof MediaStream&&e.getTracks().length>0){var n=e.getAudioTracks().find((function(e){return"live"===e.readyState})),r=e.getVideoTracks().find((function(e){return"live"===e.readyState})),i=n||function(){try{var e=new(window.AudioContext||window.webkitAudioContext),t=e.createMediaStreamDestination().stream,n=U(t.getAudioTracks(),1)[0];return n.type="fake-audio",n.enabled=!1,vt(t),e.close(),n}catch(e){p.warn("StreamHelpers::createFakeAudioTrack Unable to create audio track",e)}return null}(),o=r||function(){try{var e=document.createElement("canvas");e.getContext("2d").fillRect(0,0,e.width,e.height);var t=e.captureStream(),n=U(t.getVideoTracks(),1)[0];return n.type="fake-video",n.enabled=!1,vt(t),n}catch(e){p.warn("StreamHelpers::createFakeVideoTrack Unable to create video track",e)}return null}(),s=[];return i&&s.push(i),o&&!t&&s.push(o),new MediaStream(s)}return!1};const qt=(st=[],at="com.eyeson.immediate",window.addEventListener("message",(function(e){if(e.source===window&&e.data===at){e.stopPropagation();var t=st.shift();t&&t()}})),function(e){st.push(e),window.postMessage(at,"*")});const $t=function(e,t){var n=null,r=!0,i=!1,o=0,s=1e3/t,a=function t(){var r=Date.now(),i=r-o;i<=s?n=requestAnimationFrame(t):(o=r-i%s,e())},c=function t(){var n=Date.now(),r=n-o;r<=s?qt(t):(o=n-r%s,i||e())},u={requestAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){r?n=requestAnimationFrame(a):(i&&(i=!1),qt(c))})),cancelAnimationFrame:function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(){i=!0,n&&(cancelAnimationFrame(n),n=null)}))};return document.addEventListener("visibilitychange",(function(){!(r="visible"===document.visibilityState)&&n&&(u.cancelAnimationFrame(),u.requestAnimationFrame())})),u};const Jt=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return new Promise((function(n,r){var i=new URL(e,location.href),o=document.createElement("script");o.async=!0,o.onload=function(){o.parentNode&&o.remove(),n(o)},o.onerror=function(){o.parentNode&&o.remove(),r(new Error("Unable to initiate script "+e))},t&&(o.integrity=t.algo+"-"+t.hash),o.src=i,document.head.append(o)}))};var Kt="function"==typeof window.CacheStorage;const Xt={storeBlobURL:function(){var e=Qe(et().mark((function e(t,n){var r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,fetch(t);case 5:return r=e.sent,e.next=8,r.blob();case 8:return i=e.sent,e.next=11,caches.open("store");case 11:return o=e.sent,e.next=14,o.put(n,new Response(i));case 14:e.next=18;break;case 16:e.prev=16,e.t0=e.catch(2);case 18:case"end":return e.stop()}}),e,null,[[2,16]])})));return function(t,n){return e.apply(this,arguments)}}(),loadBlobURL:function(){var e=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Kt){e.next=16;break}return e.prev=1,e.next=4,caches.open("store");case 4:return n=e.sent,e.next=7,n.match(t);case 7:return r=e.sent,e.next=10,r.blob();case 10:return i=e.sent,e.abrupt("return",URL.createObjectURL(i));case 14:e.prev=14,e.t0=e.catch(1);case 16:return e.abrupt("return",!1);case 17:case"end":return e.stop()}}),e,null,[[1,14]])})));return function(t){return e.apply(this,arguments)}}(),deleteBlob:function(){var e=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Kt){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,caches.open("store");case 5:return n=e.sent,e.next=8,n.delete(t);case 8:e.next=12;break;case 10:e.prev=10,e.t0=e.catch(2);case 12:case"end":return e.stop()}}),e,null,[[2,10]])})));return function(t){return e.apply(this,arguments)}}()};var Yt=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],Qt=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];const Zt=function(){var e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null;return{run:function(c){if(n&&e)return n=!1,e;n=!0;var u=parseFloat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:0),l=c.width,d=c.height;e||(e=document.createElement("canvas"),t=e.getContext("2d",{alpha:!1,desynchronized:!0}),e.width=l,e.height=d),t.drawImage(c,0,0);var h=t.getImageData(0,0,l,d),f=h.data,p=l-1,m=d-1,v=u+1,y=Yt[u],g=Qt[u];r||(r=new Uint32Array(f.length/4),i=new Uint32Array(f.length/4),o=new Uint32Array(f.length/4),s=new Uint32Array(l),a=new Uint32Array(l));for(var b=2,S=0,k=0,w=0;b-- >0;){for(var x=0,C=0,T=0;T<d;T++){for(var R=f[x]*v,_=f[x+1]*v,P=f[x+2]*v,E=1;E<=u;E++)S=x+((E>p?p:E)<<2),R+=f[S++],_+=f[S++],P+=f[S++];for(var M=0;M<l;M++)r[C]=R,i[C]=_,o[C]=P,0===T&&(s[M]=((S=M+v)<p?S:p)<<2,a[M]=(S=M-u)>0?S<<2:0),k=x+s[M],w=x+a[M],R+=f[k++]-f[w++],_+=f[k++]-f[w++],P+=f[k++]-f[w++],C++;x+=l<<2}for(var O=0;O<l;O++){for(var A=O,D=r[A]*v,I=i[A]*v,B=o[A]*v,L=1;L<=u;L++)D+=r[A+=L>m?0:l],I+=i[A],B+=o[A];C=O<<2;for(var F=0;F<d;F++)f[C]=D*y>>>g,f[C+1]=I*y>>>g,f[C+2]=B*y>>>g,0===O&&(s[F]=((S=F+v)<m?S:m)*l,a[F]=(S=F-u)>0?S*l:0),k=O+s[F],w=O+a[F],D+=r[k]-r[w],I+=i[k]-i[w],B+=o[k]-o[w],C+=l<<2}}return t.putImageData(h,0,0),e},reset:function(){e=null,t=null,n=!1,r=null,i=null,o=null,s=null,a=null}}};window.exports=window.exports||{};var en="function"==typeof window.OffscreenCanvas&&function(){try{return new OffscreenCanvas(1,1).getContext("2d"),!0}catch(e){}return!1}(),tn=en&&Boolean(window.OffscreenCanvasRenderingContext2D)&&"filter"in OffscreenCanvasRenderingContext2D.prototype,nn="function"==typeof window.createImageBitmap,rn="function"==typeof window.MediaStreamTrackProcessor,on=window.WebAssembly&&WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11])),sn=function(){try{return new EventTarget,!0}catch(e){}return!1}(),an=Math.max,cn=sn?new EventTarget:document.createElement("i"),un="selfie_segmentation_landscape",ln=256,dn=144,hn=36864,fn=null,pn=!1,mn=!1,vn=null,yn=null,gn=null,bn=null,Sn=function(){var e=Qe(et().mark((function e(){var t,n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!fn){e.next=2;break}return e.abrupt("return");case 2:return mn=!0,cn.dispatchEvent(new Event("change")),e.next=6,Promise.all([Jt(on?"vendor/tflite/tflite-simd.js":"vendor/tflite/tflite.js"),fetch("vendor/tflite/models/".concat(un,".tflite"))]);case 6:return t=e.sent,e.next=9,window.exports[on?"createTFLiteSIMDModule":"createTFLiteModule"]();case 9:return fn=e.sent,e.next=12,t[1].arrayBuffer();case 12:n=e.sent,r=fn._getModelBufferMemoryOffset(),fn.HEAPU8.set(new Uint8Array(n),r),fn._loadModel(n.byteLength),vn=fn._getInputMemoryOffset()/4,yn=fn._getOutputMemoryOffset()/4,mn=!1,pn=!0,cn.dispatchEvent(new Event("change"));case 21:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),kn=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={canvas:null,ctx:null};return en&&("blur"===(arguments.length>3?arguments[3]:void 0)&&tn)?(r.canvas=new OffscreenCanvas(e,t),r.ctx=r.canvas.getContext("2d",n),r):(r.canvas=document.createElement("canvas"),r.canvas.width=e,r.canvas.height=t,r.ctx=r.canvas.getContext("2d",Object.assign({desynchronized:!0},n)),r)};Qe(et().mark((function e(){var t;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("image:blob"!==nt.load("virtualBackgroundType")){e.next=6;break}return e.next=4,Xt.loadBlobURL("/virtualBackgroundLocalImage");case 4:(t=e.sent)&&(gn=t);case 6:case"end":return e.stop()}}),e)})))();var wn,xn=function(e,t){return new Promise((function(n){if(t&&"ready"===t.state&&t.emitLoading(!0),"blob"!==e||gn){var r=new Image;r.onerror=function(){return n(null)},r.onload=function(){return n(r)},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src="blob"===e&&gn?gn:e}else n(null)})).then((function(e){return t&&"ready"===t.state&&t.emitLoading(!1),e}))},Cn=function(e){return new Promise((function(t,n){var r=new Image;r.onerror=function(){return n(new TypeError("Invalid image file"))},r.onload=function(){return t()},/^([\w]+:)?\/\//.test(e)&&-1===e.indexOf(location.host)&&(r.crossOrigin="anonymous"),r.src=e}))},Tn=(wn=null,function(e){wn||(wn=Object.assign(document.createElement("input"),{type:"file",accept:"image/*"})),wn.onchange=function(t){var n=t.target.files;if(n.length>0){var r=URL.createObjectURL(n[0]);Cn(r).then((function(){gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=r,e()}),e)}wn.onchange=null,wn.value=""},wn.click()}),Rn=function(e,t,n){var r=t/e.width,i=n/e.height,o=an(r,i),s=e.width*o,a=e.height*o,c=(t-s)/2,u=(n-a)/2,l=kn(t,n,{alpha:!1});return l.ctx.drawImage(e,0,0,e.width,e.height,c,u,s,a),l.canvas},_n=function(e,t,n){var r=kn(t,n,{alpha:!1}),i=r.ctx;return i.fillStyle="#ffffff",i.fillRect(0,0,t,n),i.drawImage(e,15,15),r.canvas},Pn=function(e,t,n){var r=kn(e,t,{alpha:!1}),i=r.ctx,o=i.createLinearGradient(n.startX,n.startY,n.endX,n.endY);return o.addColorStop(0,n.color1),o.addColorStop(1,n.color2),i.fillStyle=o,i.fillRect(0,0,e,t),r.canvas},En=function(e,t,n,r){var i=2*(2*r),o=t+i,s=n+i;e.blurCanvas=kn(o,s,{alpha:!1},"blur"),e.imageCanvas=kn(o,s,{alpha:!1}),e.blurCanvas.ctx.filter="blur(".concat(r,"px)")},Mn=/^(off|eyeson|generali:.*|color:.+|image:.+|blur:\d+)/,On=function(){return pn?"ready":mn?"initialize":""},An=function(){function e(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";c(this,e),p.info("VirtualBackgroundMixer::constructor",n),this.name=n,this.canvas=null,this.ctx=null,this.originalStream=null,this.outStream=null,this.video=null,this.reader=null,this.size={width:0,height:0},this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.playPromise=null,this.abort=!1,this.paused=!1,this.raf=$t(this.drawVideo.bind(this),20),this.backgroundOld=null,this.backgroundType=null,this.backgroundValue=null,this.blurInit=!1,this.blurCanvas=null,this.canvasBlur=Zt(),this.imageCanvas=null,this.state=On(),this.loadingListener=[],this.handleStateChange=function(){var e=On();t.state=e,t.emitLoading("initialize"===e)},cn.addEventListener("change",this.handleStateChange)}var t,n,r;return d(e,[{key:"storeLocalImageFile",value:function(){gn&&(bn=gn)}},{key:"resetLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(gn),gn=bn,bn=null)}},{key:"saveLocalImageFile",value:function(){bn&&(gn&&gn!==bn&&URL.revokeObjectURL(bn),bn=null)}},{key:"updateCache",value:function(e){"image:blob"===e?gn&&Xt.storeBlobURL(gn,"/virtualBackgroundLocalImage"):Xt.deleteBlob("/virtualBackgroundLocalImage")}},{key:"onLoading",value:function(e){this.loadingListener.push(e)}},{key:"offLoading",value:function(e){this.loadingListener=this.loadingListener.filter((function(t){return t!==e}))}},{key:"emitLoading",value:function(e){this.loadingListener.forEach((function(t){return t(e)}))}},{key:"initiateStream",value:function(e){var t=this;p.info("VirtualBackgroundMixer::initiate",this.name),Sn();var n=e.getVideoTracks();if(0===n.length)return p.warn("VirtualBackgroundMixer::initiate",this.name,"missing track"),e;var r=U(n,1)[0],i=r.getSettings();if("live"!==r.readyState||!i.width||!i.height)return p.warn("VirtualBackgroundMixer::initiate",this.name,"0 width or height, or not ready",r.readyState,i.width,i.height),e;this.originalStream&&(p.warn("VirtualBackgroundMixer::initiate",this.name,"existing originalStream!",this.originalStream.id,e.id),this.originalStream.id!==e.id&&this.stopOriginalStream(),this.terminate()),this.originalStream=e,this.canvas=document.createElement("canvas"),this.canvas.id="eyeson-vbg-stream",this.ctx=this.canvas.getContext("2d",{desynchronized:!0}),this.ctx.imageSmoothingEnabled=!1,this.size.width=i.width,this.size.height=i.height,this.canvas.width=i.width,this.canvas.height=i.height;var o=U(this.canvas.captureStream(20).getVideoTracks(),1)[0];o.canvas||(o.type="canvas-track",o.canvas=this.canvas);var s={};return"function"==typeof o.getSettings&&Object.assign(s,o.getSettings()),Object.assign(s,i),o.getSettings=function(){return s},o.srcLabel=r.label,o.srcDeviceId=i.deviceId,this.outStream=new MediaStream([o]),e.getAudioTracks().forEach((function(e){return t.outStream.addTrack(e)})),this.start(),this.outStream}},{key:"start",value:function(){var e=this;p.info("VirtualBackgroundMixer::start",this.name);var t=null,n=null,r=this.size,i=r.width,o=r.height;if(i&&o){if(rn)try{var s=U(this.originalStream.getVideoTracks(),1)[0],a=new MediaStreamTrackProcessor(s);this.reader=a.readable.getReader()}catch(e){}this.reader||((n=document.createElement("video")).playsInline=!0,n.muted=!0,n.width=i,n.height=o,n.srcObject=this.originalStream,this.video=n),this.segmentationMask=new ImageData(ln,dn),t=kn(ln,dn,{willReadFrequently:!0}),this.segmentationMaskCanvas=t.canvas,this.segmentationMaskCtx=t.ctx,this.segmentationMaskCtx.imageSmoothingEnabled=!1,n&&!nn&&(t=kn(i,o),this.videoCanvas=t.canvas,this.videoCtx=t.ctx),this.abort=!1,this.paused=!1,this.blurInit=!1,this.canvasBlur.reset(),this.initBackground(),this.reader?(p.info("VirtualBackgroundMixer::start::videoTrackProcessor",this.name),this.raf.requestAnimationFrame()):(n.onloadeddata=function(){p.info("VirtualBackgroundMixer::start::video.loadeddata",e.name),e.raf.requestAnimationFrame()},this.playPromise=n.play(),this.playPromise.catch((function(t){p.error("VirtualBackgroundMixer::start::video.play",e.name,t)})))}else p.warn("VirtualBackgroundMixer::start 0 width or height",this.name,i,o)}},{key:"drawVideo",value:(r=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c,u,l,d,h,f,p,m,v,y,g,b;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=null,!this.abort){e.next=3;break}return e.abrupt("return");case 3:if(n=this.ctx,r=this.size,i=this.paused,o=this.segmentationMask,s=this.segmentationMaskCtx,a=this.segmentationMaskCanvas,!this.reader){e.next=15;break}return e.prev=5,e.next=8,this.reader.read();case 8:c=e.sent,(u=c.value)&&(u.width=u.displayWidth,u.height=u.displayHeight,t=u),e.next=15;break;case 13:e.prev=13,e.t0=e.catch(5);case 15:if(pn&&!i){e.next=19;break}n.drawImage(t||this.video,0,0),e.next=36;break;case 19:if(t){e.next=33;break}if(!nn){e.next=31;break}return e.prev=21,e.next=24,createImageBitmap(this.video);case 24:t=e.sent,e.next=29;break;case 27:e.prev=27,e.t1=e.catch(21);case 29:e.next=33;break;case 31:this.videoCtx.drawImage(this.video,0,0),t=this.videoCanvas;case 33:if(!this.abort){e.next=35;break}return e.abrupt("return");case 35:if(t&&t.width>0&&t.height>0){for(s.drawImage(t,0,0,t.width,t.height,0,0,ln,dn),l=s.getImageData(0,0,ln,dn),d=l.data,h=fn.HEAPF32,f=o.data,p=hn,m=0,v=0,y=0;y<p;y++)v=4*y,h[m=vn+3*y]=d[v]/255,h[m+1]=d[v+1]/255,h[m+2]=d[v+2]/255;for(fn._runInference(),g=0,b=0;g<p;g++)b=h[yn+g],f[4*g+3]=255*b;s.putImageData(o,0,0),n.globalCompositeOperation="copy",n.filter="blur(2px)",n.drawImage(a,0,0,ln,dn,0,0,r.width,r.height),n.globalCompositeOperation="source-in",n.filter="none",n.drawImage(t,0,0),this.backgroundType&&this.drawBackground(t)}case 36:!i&&this.paused&&(n.filter="none",n.globalCompositeOperation="source-over"),t&&"function"==typeof t.close&&t.close(),this.abort||this.raf.requestAnimationFrame();case 39:case"end":return e.stop()}}),e,this,[[5,13],[21,27]])}))),function(){return r.apply(this,arguments)})},{key:"suspend",value:function(){var e=this.ctx;this.paused=!0,e&&(e.filter="none",e.globalCompositeOperation="source-over")}},{key:"resume",value:function(){this.paused=!1}},{key:"drawBackground",value:function(e){var t=this.backgroundType,n=this.ctx,r=this.blurCanvas,i=this.imageCanvas,o=this.backgroundValue,s=this.size;if(t&&n)if(n.globalCompositeOperation="destination-over","blur"===t)if(Xe.canvasBlurSupport()){var a=2*Number(o),c=2*a;this.blurInit||(i.ctx.drawImage(e,0,0,s.width,s.height,0,0,s.width+c,s.height+c),this.blurInit=!0),i.ctx.drawImage(e,0,0,s.width,s.height,a,a,s.width,s.height),r.ctx.drawImage(i.canvas,0,0),n.drawImage(r.canvas,a,a,s.width,s.height,0,0,s.width,s.height)}else{var u=this.canvasBlur.run(e,o);n.drawImage(u,0,0)}else"color"===t?(n.fillStyle=o,n.fillRect(0,0,s.width,s.height)):i?n.drawImage(i,0,0):n.drawImage(e,0,0)}},{key:"initBackground",value:(n=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.backgroundType,n=this.backgroundValue,r=this.size,i=r.width,o=r.height,s=!1,i&&o){e.next=5;break}return e.abrupt("return");case 5:if("eyeson"!==t){e.next=10;break}this.imageCanvas=Pn(i,o,{startX:0,startY:0,endX:i,endY:50,color1:"#ff7676",color2:"#9e206c"}),s=!0,e.next=27;break;case 10:if("generali"!==t){e.next=18;break}return this.setBackgroundFallback(),e.next=14,xn(n,this);case 14:(a=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=_n(a,i,o),s=!0),e.next=27;break;case 18:if("image"!==t){e.next=26;break}return this.setBackgroundFallback(),e.next=22,xn(n,this);case 22:(c=e.sent)&&(this.backgroundType="image",this.backgroundValue=n,this.imageCanvas=Rn(c,i,o),s=!0),e.next=27;break;case 26:"blur"===t?(this.blurInit=!1,En(this,i,o,Number(n)),this.canvasBlur.reset(),s=!0):(this.imageCanvas=null,s=!0);case 27:s&&(this.backgroundOld={type:t,value:n});case 28:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"setBackgroundFallback",value:function(){var e=this.backgroundOld;if(e)this.backgroundType=e.type,this.backgroundValue=e.value;else{if(!this.imageCanvas){var t=this.size,n=t.width,r=t.height;this.blurInit=!1,En(this,n,r,8)}this.backgroundType="blur",this.backgroundValue="8"}}},{key:"changeBackground",value:function(e){if(p.info("VirtualBackgroundMixer::changeBackground",this.name,e),"string"==typeof e){var t=e.indexOf(":");-1===t?(this.backgroundType="off"===e?null:e,this.backgroundValue=null):(this.backgroundType=e.substring(0,t),this.backgroundValue=e.substring(t+1)),this.abort||this.initBackground()}}},{key:"stop",value:function(){if(p.info("VirtualBackgroundMixer::stop",this.name),this.abort=!0,this.raf&&this.raf.cancelAnimationFrame(),this.video){var e=this.video,t=this.playPromise;t&&e&&t.then((function(){return e.pause()})),this.video.onloadeddata=null,this.video=null,this.playPromise=null}this.reader&&(this.reader=null),this.segmentationMaskCanvas=null,this.segmentationMaskCtx=null,this.segmentationMask=null,this.videoCanvas=null,this.videoCtx=null,this.backgroundOld=null,this.imageCanvas=null,this.blurCanvas=null,this.canvasBlur.reset()}},{key:"stopOriginalStream",value:function(){p.info("VirtualBackgroundMixer::stopOriginalStream",this.name,this.originalStream),this.stop(),vt(this.originalStream)}},{key:"terminate",value:function(){var e=this;p.info("VirtualBackgroundMixer::terminate",this.name),this.stop(),this.outStream&&Pt(this.outStream).forEach((function(t){mt(t),p.info("VirtualBackgroundMixer::terminate stop track",e.name,t)})),this.originalStream=null,this.outStream=null,this.canvas=null,this.ctx=null,this.video=null}},{key:"destroy",value:function(){p.info("VirtualBackgroundMixer::destroy",this.name),cn.removeEventListener("change",this.handleStateChange),this.loadingListener.length=0,this.canvasBlur=null}}],[{key:"isTypeAllowed",value:function(e){return Mn.test(e)}},{key:"checkExternalImage",value:(t=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!/^image:([\w]+:)?\/\//i.test(t)){e.next=4;break}return n=t.substring(6),e.next=4,Cn(n);case 4:case"end":return e.stop()}}),e)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImage",value:function(e){Tn(e)}},{key:"getImageBlobOrFallback",value:function(){return gn&&(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])?"image:blob":"blur:8"}}]),e}();const Dn=An;var In=function(e,t){if(e.length!==t.length)return!0;for(var n,r=function(n,r){if(n=e[a],!(r=t.find((function(e){return n.deviceId===e.deviceId&&n.groupId===e.groupId&&n.label===e.label&&n.kind===e.kind}))))return{v:!0};i=n,o=r},i=null,o=!1,s=e.length,a=0;a<s;a++)if(n=r(i,o))return n.v;return!1};const Bn=function(){function e(t){var n=this;c(this,e),this.sinkId="default",this.options=t||{audio:!0,video:!0,eco:!1},this.stream=null,this.cameras=[],this.listeners=[],this.speakers=[],this.microphones=[],this.constraints={},this.terminationInProgress=!1,this.virtualBackground=new Dn("DeviceManager"),this.virtualBackgroundType="off",e.getSinkId().then((function(e){return n.sinkId=e})),this.setStream=this.setStream.bind(this),this.handleError=this.handleError.bind(this),this.verifyStream=this.verifyStream.bind(this),this.storeConstraints=this.storeConstraints.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.initiateVirtualBackground=this.initiateVirtualBackground.bind(this)}var t;return d(e,[{key:"setVirtualBackgroundType",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Dn.isTypeAllowed(t)){e.next=3;break}return p.warn("DeviceManage::setVirtualBackgroundType type not allowed",t),e.abrupt("return");case 3:return e.next=5,Dn.checkExternalImage(t);case 5:n="off"===this.virtualBackgroundType,r="off"===t,this.virtualBackgroundType=t,this.virtualBackground.changeBackground(t),this.stream&&(n&&!r||!n&&r)&&this.update();case 10:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"loadLocalImageForVirtualBackground",value:function(e){var t=this;Dn.loadLocalImage((function(n){n||t.setVirtualBackgroundType("image:blob"),e(n)}))}},{key:"start",value:function(){var t=this;return this.watchForNewDevices(),e.fetchDevices().then((function(e){return t.setDevices(e)})).then((function(){return e.getConstraints(t.options)})).then((function(e){return t.constraints=e,navigator.mediaDevices.getUserMedia({video:!t.options.eco&&t.constraints.video,audio:t.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"stopStream",value:function(){this.stream&&(this.virtualBackground.originalStream?(this.virtualBackground.stopOriginalStream(),this.virtualBackground.terminate()):vt(this.stream),this.stream=null)}},{key:"stop",value:function(){this.stopStream()}},{key:"terminate",value:function(){var e=this;navigator.mediaDevices.ondevicechange=null,this.terminationInProgress=!0,window.setTimeout((function(){e.stop(),e.virtualBackground.destroy()}),10)}},{key:"setDevices",value:function(e){var t=In(this.cameras,e.cameras),n=In(this.microphones,e.microphones),r=In(this.speakers,e.speakers);this.cameras=e.cameras,this.microphones=e.microphones,this.speakers=e.speakers,this.options.audio=this.microphones.length>0&&this.options.audio,this.options.video=this.cameras.length>0&&this.options.video,(t||n||r)&&this.emit(e)}},{key:"watchForNewDevices",value:function(){var t=this;navigator.mediaDevices.ondevicechange=function(){e.fetchDevices().then((function(e){return t.setDevices(e)})).catch(t.handleError)}}},{key:"onChange",value:function(e){this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"update",value:function(e){return this.constraints=e||this.constraints,this.stop(),this.watchForNewDevices(),navigator.mediaDevices.getUserMedia(this.constraints).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"updateWithOptions",value:function(t){var n=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.options=t||this.options,this.stop(),this.watchForNewDevices(),e[r?"getMobileConstraints":"getConstraints"](this.options).then((function(e){return n.constraints=e,navigator.mediaDevices.getUserMedia({video:!n.options.eco&&n.constraints.video,audio:n.constraints.audio||!0})})).then(this.adjustAudioTrack).then(this.initiateVirtualBackground).then(this.setStream).catch(this.handleError)}},{key:"adjustAudioTrack",value:function(e){return 1===e.getAudioTracks().length&&(e.getAudioTracks()[0].enabled=this.options.audio),e}},{key:"initiateVirtualBackground",value:function(e){return"off"!==this.virtualBackgroundType&&e&&1===e.getVideoTracks().length?this.virtualBackground.initiateStream(e):e}},{key:"storeConstraints",value:function(){var e=this.constraints,t=e.video,n=e.audio;p.debug("DeviceManager::storeConstraints",e),nt.store("mediaConstraints",e),nt.store("sinkId",this.sinkId),nt.store("virtualBackgroundType",this.virtualBackgroundType),t&&t.deviceId&&t.deviceId.exact&&nt.store("videoId",t.deviceId.exact),n&&n.deviceId&&n.deviceId.exact&&nt.store("audioId",n.deviceId.exact),this.virtualBackground.updateCache(this.virtualBackgroundType)}},{key:"setStream",value:function(t){var n=this,r=null===this.stream;if(this.stream=t,this.terminationInProgress)return this.stop(),Promise.resolve();var i=function(){n.emit({stream:n.stream,constraints:n.constraints,options:n.options}),n.verifyStream()};return r?e.fetchDevices().then((function(e){n.setDevices(e),i()})):(i(),Promise.resolve())}},{key:"verifyStream",value:function(){this.constraints.video&&this.stream&&0===this.stream.getVideoTracks().length&&!this.options.eco&&this.handleError({name:"EyesonCameraError"}),this.constraints.audio&&this.stream&&0===this.stream.getAudioTracks().length&&this.handleError({name:"EyesonMicrophoneError"})}},{key:"setVideoInput",value:function(e){var t={};return Object.assign(t,this.constraints.video,{deviceId:{exact:e}}),this.constraints.video=t,this.update()}},{key:"setAudioInput",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={};return Object.assign(n,this.constraints.audio,{deviceId:{exact:e}}),this.constraints.audio=n,!0===t.preventUpdate?Promise.resolve():this.update()}},{key:"setAudioOutput",value:function(e){this.sinkId=e||"default",nt.store("sinkId",this.sinkId),this.emit({sinkId:this.sinkId})}},{key:"handleError",value:function(e){p.error("DeviceManager::",e),this.emit({error:e,constraints:this.constraints})}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}],[{key:"getDevices",value:function(){return"mediaDevices"in navigator?navigator.mediaDevices.enumerateDevices().then((function(e){return 2===e.length&&e.every((function(e){return"audioinput"===e.kind&&""===e.deviceId}))?[{deviceId:"",groupId:"",kind:"audioinput",label:""},{deviceId:"",groupId:"",kind:"videoinput",label:""}]:e})):Promise.resolve([])}},{key:"getConstraints",value:function(t){var n=t||{audio:!0,video:!0};return e.getDevices().then((function(t){return e.determineConstraintsForDevices(t,n)})).catch((function(e){p.error("DeviceManager::getConstraints ",e)}))}},{key:"determineConstraintsForDevices",value:function(t,n){var r=nt.load("mediaConstraints",n),i={channelCount:Xe.canStereo()&&!n.eco?2:1};if("video"in r||(r.video=!0),"audio"in r||(r.audio=i),r.video.deviceId){var o=r.video.deviceId.exact;t.find((function(e){return e.deviceId===o}))||(r.video=n.video)}if(r.audio.deviceId){var s=r.audio.deviceId.exact;t.find((function(e){return e.deviceId===s}))||(r.audio=!!n.audio&&i)}return!1!==n.video||n.eco||(r.video=!1),!0===n.video&&!1===r.video&&(r.video=!0),(!0===n.audio&&!1===r.audio||!0===r.audio)&&(r.audio=i),r.audio&&r.audio.channelCount!==i.channelCount&&(r.audio.channelCount=i.channelCount),0===t.filter((function(e){return"videoinput"===e.kind})).length&&(r.video=!1),e.applyLastUsedDevices(r,t),e.applyWidescreen(r),r}},{key:"applyLastUsedDevices",value:function(e,t){var n=nt.load("videoId"),r=nt.load("audioId");!0===e.video&&n&&t.find((function(e){return e.deviceId===n}))&&(e.video={deviceId:{exact:n}}),e.audio&&r&&t.find((function(e){return e.deviceId===r}))&&(e.audio.deviceId={exact:r})}},{key:"applyWidescreen",value:function(e){f.widescreen?(!0===e.video&&(e.video={}),e.video&&Object.assign(e.video,{width:640,height:360})):"object"===a(e.video)&&("width"in e.video||"height"in e.video)&&(Reflect.deleteProperty(e.video,"width"),Reflect.deleteProperty(e.video,"height"))}},{key:"getMobileConstraints",value:function(t){var n=Object.assign({audio:!0,video:!0},t);return e.applyWidescreen(n),Promise.resolve(n)}},{key:"getSinkId",value:function(){var t=nt.load("sinkId","");return e.getDevices().then((function(e){return e.find((function(e){return e.deviceId===t}))||(t="default"),t}))}},{key:"fetchDevices",value:function(){return e.getDevices().then((function(e){var t=e.filter((function(e){return"audiooutput"===e.kind}));return t.length>0&&-1===t.findIndex((function(e){return"default"===e.deviceId}))&&t.unshift({deviceId:"default",kind:"audiooutput",groupId:"default",label:"System default"}),{cameras:e.filter((function(e){return"videoinput"===e.kind})),microphones:e.filter((function(e){return"audioinput"===e.kind})),speakers:t}}))}},{key:"fetchInputDevices",value:function(){return e.getDevices().then((function(e){return e.filter((function(e){return e.kind.includes("input")}))}))}},{key:"getStoredVirtualBackgroundType",value:function(e){var t=nt.load("virtualBackgroundType","off");return"image:blob"===t?Dn.getImageBlobOrFallback(e):t}}]),e}();const Ln=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{eco:!1,audio:!0,video:!0,screen:!1,surface:null,screenStream:null,canvas:null,existingStream:null,micMixer:null,vbgMixer:null,isPresentation:!1,virtualBackground:!1,deviceMonitor:null};c(this,e),this.options=t,this.tempStream=null,this.brokenTrackCallback=null,this.bindMethods()}var t;return d(e,[{key:"bindMethods",value:function(){this.getMediaStream=this.getMediaStream.bind(this),this.addNinjaTrack=this.addNinjaTrack.bind(this),this.addCanvasTrack=this.addCanvasTrack.bind(this),this.addScreenTrack=this.addScreenTrack.bind(this),this.adjustAudioTrack=this.adjustAudioTrack.bind(this),this.adjustVideoTrack=this.adjustVideoTrack.bind(this),this.addScreenStreamTrack=this.addScreenStreamTrack.bind(this),this.initializeVirtualBackground=this.initializeVirtualBackground.bind(this)}},{key:"start",value:function(){var e=this;p.debug("MediaStreamBuilder::start",this.options);var t=this.options,n=t.existingStream,r=t.video,i=t.audio,o=t.screen,s=t.canvas,a=t.micMixer,c=t.screenStream;return Xe.isIOSDevice()&&n&&"boolean"==typeof r&&n.active&&_t(n).length>0&&"ended"!==_t(n)[0].readyState?new Promise((function(t){var o=U(_t(n),1)[0];if(o.enabled=r,o.onended=r&&e.brokenTrackCallback?function(){p.error("iOS video track broken"),n.getTracks().forEach((function(e){return e.stop()})),e.brokenTrackCallback()}:null,"boolean"==typeof i&&ft(n,i),s){var a=new MediaStream(n.getTracks()),c=zt(s),u=U(It(c),1)[0];return a.addTrack(u),void t(a)}t(n)})):Xe.isSafari()&&o&&a&&!s?(c?Promise.resolve(c):this.getDisplayMedia()).then((function(t){return Bn.getConstraints().then((function(n){var r=new MediaStream;return e.addScreenStreamTrack(r,t),e.tempStream=new MediaStream(t.getTracks()),navigator.mediaDevices.getUserMedia({audio:n.audio}).then((function(n){return e.adjustAudioTrack(n),n.getTracks().forEach((function(t){return e.tempStream.addTrack(t)})),a.mixScreenshareAudio(n,t,r),a.active&&a.setMicOnlyStream(n,t),r}))}))})).then((function(t){return e.tempStream=null,t})).catch((function(t){return e.tempStream&&(vt(e.tempStream),e.tempStream=null),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)})):Bn.fetchInputDevices().then(this.getMediaStream).then(this.adjustVideoTrack).then(this.adjustAudioTrack).then(this.initializeVirtualBackground).then(this.addCanvasTrack).then(this.addScreenTrack).then(this.addNinjaTrack).then((function(t){return e.tempStream=null,e.options.deviceMonitor&&e.options.deviceMonitor.applyTempTracks(),t})).catch((function(t){return e.cleanupTempStream(),e.options.deviceMonitor&&e.options.deviceMonitor.discardTempTracks(),p.error("MediaStreamBuilder::start ",t,t.message),Promise.reject(t)}))}},{key:"getMediaStream",value:function(e){var t=this;if(0===e.length)return this.options={audio:!1,video:!1},this.tempStream=(new tt).stream,this.tempStream;var n=this.options,r=n.eco,i=n.video,o=n.existingStream,s={video:!Xe.hasCanvasCaptureSupport()&&!r||i,audio:!0};!1===i&&!r&&Xe.isIOSDevice()&&(s.video=!0);var a=Bn.getConstraints;return Xe.canMultipleDifferentMicrophones()||vt(o),(Xe.isPhone()||Xe.isIOSDevice())&&(vt(o),a=Bn.getMobileConstraints),a(s).then((function(e){return navigator.mediaDevices.getUserMedia(e).then((function(e){return t.tempStream=e,e}))}))}},{key:"adjustVideoTrack",value:function(e){if(1===e.getVideoTracks().length){var t=U(e.getVideoTracks(),1)[0];t.enabled=this.options.video,!1!==this.options.video||Xe.isIOSDevice()||mt(t),this.options.deviceMonitor&&this.options.deviceMonitor.addVideoTrack(t)}return e}},{key:"initializeVirtualBackground",value:function(e){var t=this.options,n=t.screen,r=t.virtualBackground,i=t.vbgMixer;return!n&&r&&e&&1===e.getVideoTracks().length?i.initiateStream(e):e}},{key:"adjustAudioTrack",value:function(e){if(1===e.getAudioTracks().length){var t=U(e.getAudioTracks(),1)[0];t.enabled=this.options.audio,this.options.deviceMonitor&&this.options.deviceMonitor.addAudioTrack(t)}return e}},{key:"addCanvasTrack",value:function(e){var t=this.options,n=t.canvas,r=t.existingStream;if(n){var i=zt(n),o=U(It(i),1)[0];e.addTrack(o)}if(Ut(r)){var s=U(It(r),1)[0];e.addTrack(s)}return e}},{key:"addScreenTrack",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options.screenStream,r=this.options,i=r.screen,o=r.existingStream,s=r.micMixer,!i||!s){e.next=13;break}if(null!=n){e.next=7;break}return e.next=6,this.getDisplayMedia();case 6:n=e.sent;case 7:return a=new MediaStream,this.addScreenStreamTrack(a,n),s.mixScreenshareAudio(t,n,a),s.active&&s.setMicOnlyStream(t,n),this.tempStream=new MediaStream(t.getTracks().concat(n.getTracks())),e.abrupt("return",a);case 13:return Lt(o)&&(c=Tt(o),u=U(c,1),l=u[0],t.addTrack(l)),e.abrupt("return",t);case 15:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})},{key:"addScreenStreamTrack",value:function(e,t){var n=U(t.getVideoTracks(),1)[0];n.type=this.options.isPresentation?"screen-track":"screen-video-track",e&&e.addTrack(n)}},{key:"getDisplayMedia",value:function(){if(Xe.hasGetDisplayMedia()){var e={channelCount:Xe.canStereo()&&!this.options.eco?2:1},t={height:{max:1080},frameRate:{max:15}};return Xe.isChrome()&&Xe.isMacOS()&&(e.echoCancellation=!1),this.options.surface&&Xe.canChooseDisplaySurface()&&(t.displaySurface=this.options.surface),navigator.mediaDevices.getDisplayMedia({audio:e,video:t,surfaceSwitching:"include",selfBrowserSurface:"include",systemAudio:"include"})}return navigator.mediaDevices.getUserMedia({video:{mediaSource:"screen",width:{max:1920},height:{max:1040},frameRate:{max:15}}})}},{key:"addNinjaTrack",value:function(e){var t=this.options,n=t.eco,r=t.video;if(n||!Xe.hasCanvasCaptureSupport())return e;if(0===e.getVideoTracks().length){var i=U((new tt).stream.getVideoTracks(),1)[0];i.enabled=r,e.addTrack(i)}return e}},{key:"cleanupTempStream",value:function(){var e=this.tempStream;if(e){var t=this.options,n=t.existingStream,r=t.screenStream;if(Ut(n)){var i=U(It(n),1)[0];e.removeTrack(i)}if(Bt(n)){var o=U(Ct(n),1)[0];e.removeTrack(o)}if(Lt(r)){var s=U(Tt(r),1)[0];e.removeTrack(s)}vt(e),this.tempStream=null}}},{key:"onBrokenTrackError",value:function(e){return this.brokenTrackCallback=e,this}}]),e}();const Fn=function(){function e(){c(this,e),this.active=!1,this.audioContext=null,this.acOut=null,this.micOnlyStream=null,this.originalStream=null}return d(e,[{key:"setMicOnlyStream",value:function(e,t){this.micOnlyStream=new MediaStream;var n=e.getAudioTracks(),r=t.getVideoTracks();return n.length>0&&this.micOnlyStream.addTrack(n[0]),r.length>0&&this.micOnlyStream.addTrack(r[0]),this.micOnlyStream}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"getOriginalStream",value:function(){return this.originalStream}},{key:"stopOriginalStream",value:function(){vt(this.originalStream)}},{key:"noMix",value:function(e,t){var n=e.getAudioTracks();n.length>0&&t.addTrack(n[0])}},{key:"initMixScreenshareMix",value:function(e,t,n){this.audioContext=new(window.AudioContext||window.webkitAudioContext),this.acOut=this.audioContext.createMediaStreamDestination(),this.audioContext.createMediaStreamSource(t).connect(this.acOut),this.audioContext.createMediaStreamSource(e).connect(this.acOut),n.addTrack(this.acOut.stream.getAudioTracks()[0])}},{key:"mixScreenshareAudio",value:function(e,t,n){this.originalStream=t;var r=t.getAudioTracks();if(0===r.length)this.noMix(e,n);else try{this.initMixScreenshareMix(e,t,n),this.active=!0}catch(t){p.error("MicMixer::mixScreenshareAudio",t),mt(r[0]),this.noMix(e,n)}}},{key:"destroy",value:function(){var e=this;if(this.stopOriginalStream(),this.micOnlyStream=null,this.originalStream=null,this.audioContext)return vt(this.acOut.stream),void this.audioContext.close().then((function(){e.audioContext=null,e.acOut=null,e.active=!1}));this.active=!1}}]),e}();function jn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vn=function(e,t,n){e.getAudioTracks().forEach((function(e){return e.enabled=t})),e.getVideoTracks().forEach((function(e){return e.enabled=n}))};const Un=function(e){g(n,e);var t=jn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.screen,i=void 0!==r&&r,o=e.surface;p.debug("ChangeLocalStreamEvent::handle");var s=this.context._session;if(!s)throw new Error("Session does not exist");var a=s.localStream,c=s.vbgMixer,u=Boolean(s.micMixer);if(Xe.isIOSDevice()||Xe.stopsDeviceActivityIndicatorOnDisable()&&!u&&!a.wasScreenAsVideo)return c&&(n?c.resume():c.suspend(),c.originalStream&&c.originalStream!==a&&Vn(c.originalStream,t,n)),Vn(a,t,n),a.locallyChanged=!0,void s.emit({type:"stream_update",localStream:a});s.micMixer&&(s.micMixer.destroy(),s.micMixer=null),c&&(c.stopOriginalStream(),c.terminate());var l={audio:t,video:n,virtualBackground:s.options.virtualBackground,existingStream:a,vbgMixer:c,deviceMonitor:s.deviceMonitor};i&&(s.micMixer=new Fn,l.video=!1,l.screen=!0,l.surface=o,l.virtualBackground=!1,l.micMixer=s.micMixer),new Ln(l).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){s.emit({type:"stop_screen_video"})})),e})).then((function(e){e.locallyChanged=!0,e.wasScreenAsVideo=u,s.setStream(e)})).catch((function(e){if(p.error("ChangeLocalStreamEvent",e),i){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"screen_capture_error",name:t}),s.emit({type:"stop_screen_video"})}}))}}]),n}(w);function Nn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Wn=function(e){g(n,e);var t=Nn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){p.debug("PodiumEvent::handle",e);var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=t.localStream;e.hasPresenter||!Nt(n)||t.stopPresentingSet||t.emit({type:"stop_presenting"}),t&&!t.externalStream&&this.scanMessageForLocalStreamOptimization(n,e),new F(this.context).handle(e)}},{key:"scanMessageForLocalStreamOptimization",value:function(e,t){var n=t.video,r=t.isSource,i=t.isPresenter,o=t.hasPresenter,s=t.hasDesktopSources;if(e){if(r&&(!n&&(Vt(e)||jt(e))||n&&!lt(e)&&e.locallyChanged&&!o)){var a={audio:ut(e),video:n};e.wasScreenAsVideo&&(a.video=!1,a.screen=!0),new Un(this.context).handle(a)}n&&!i&&s&&new Un(this.context).handle({audio:ut(e),video:!1})}}}]),n}(w);function Hn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const zn=function(e){g(n,e);var t=Hn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.takeSnapshot()}}]),n}(w);function Gn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const qn=function(e){g(n,e);var t=Gn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayer(e.params)}}]),n}(w);function $n(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Jn=function(e){g(n,e);var t=$n(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(!this.context._session)throw new Error("Session does not exist");this.context._session.send({type:"chat",content:e.content})}}]),n}(w);function Kn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Xn=function(e){g(n,e);var t=Kn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopBroadcast("generic").then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})})).catch((function(e){return p.warn(e)}))}}]),n}(P);function Yn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Qn=function(e){g(n,e);var t=Yn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.setLayout(e.params)}}]),n}(w);function Zn(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const er=function(e){g(n,e);var t=Zn(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t,n=this.context,r=n._api,i=n._session,o=((t=e.url).endsWith("/")?t:t+"/")+e.key;r.startBroadcast({streamUrl:o},"generic").catch((function(e){i.emit({type:"start_broadcast_error",platform:"generic",error:e})}))}}]),n}(w);var tr=function(){try{return new EventTarget,!0}catch(e){}return!1}();const nr=function(){function e(){c(this,e),this.listeners=new Map,this.target=tr?new EventTarget:document.createElement("i")}return d(e,[{key:"onEvent",value:function(e){var t=function(t){var n=t.detail;return e(n)};this.target.addEventListener("event",t),this.listeners.set(e,t)}},{key:"offEvent",value:function(e){var t=this.listeners.get(e);t&&(this.target.removeEventListener("event",t),this.listeners.delete(e))}},{key:"removeAllListeners",value:function(){var e=this.listeners,t=this.target;e.forEach((function(e){return t.removeEventListener("event",e)})),e.clear()}},{key:"emit",value:function(e){var t=new CustomEvent("event",{detail:e});this.target.dispatchEvent(t)}}]),e}();function rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ir=function(e){g(n,e);var t=rr(n);function n(e){var r;return c(this,n),(r=t.call(this)).connection=null,r.options=e,r.wasOpen=!1,r}return d(n,[{key:"connect",value:function(){var e=this,t=this.options;this.wasOpen=!1;var n=new WebSocket("".concat(t.endpoint,"?auth_token=").concat(t.auth_token));n.onopen=function(){e.wasOpen=!0,e.emit({type:"connected"})},n.onmessage=function(t){var n=t.data;e.emit({type:"message",message:n})},n.onerror=function(){e.emit({type:"transportError"})},n.onclose=function(){e.destroy()},this.connection=n}},{key:"isConnected",value:function(){var e=this.connection;return!!e&&e.readyState===WebSocket.OPEN}},{key:"send",value:function(e){var t=this.connection;return!!t&&(t.send(e),!0)}},{key:"destroy",value:function(){var e=this.connection,t=this.wasOpen;e&&(this.connection=null,e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null,e.readyState<=WebSocket.OPEN&&e.close(),this.emit({type:"disconnected",was_open:t})),this.removeAllListeners()}}]),n}(nr);var or=/\r\n|\r(?!\n)|\n/g;const sr=function(e){return e.replace(or,"\r\n")};const ar=function(e){try{return JSON.parse(atob(e.split(".")[1]))}catch(e){return!1}};var cr="undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID;const ur=function(){if(cr)return crypto.randomUUID();var e=0,t=crypto.getRandomValues(new Uint8Array(31));return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(function(n){var r=t[e];return e+=1,(n^r&15>>n/4).toString(16)}))};function lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var dr=function(e){g(o,e);var t,n,r,i=lr(o);function o(e){var t;return c(this,o),t=i.call(this),function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="";if(["client_id","conf_id","client_name","sessionDescriptionHandlerFactory","transportOptions"].some((function(n){return!!e[n]||(t=n,!1)})),t||["auth_token","endpoint"].some((function(n){return!!e.transportOptions[n]||(t="transportOptions.".concat(n),!1)})),t)throw new Error("Invalid options - ".concat(t))}(e),t.callId=null,t.sessionDescriptionHandler=null,t.options=e,t.initAuthToken(),t.debouncedHandleSDPUpdate=function(e,t,n){var r=[],i=!1;return function o(){for(var s=arguments.length,a=new Array(s),c=0;c<s;c++)a[c]=arguments[c];i?r.push(a):(i=!0,setTimeout((function(){if(i=!1,r.length>0){var e=r.shift();Reflect.apply(o,null,e)}}),t),Reflect.apply(e,n,a))}}(t.handleSdpUpdate,250,b(t)),t}return d(o,[{key:"onMessage",value:(r=Qe(et().mark((function e(t){var n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=JSON.parse(t),r=n.type,i=n.data,this.verifySender(n),"call_accepted"!==r){e.next=10;break}return this.setCallId(i.call_id),e.next=7,this.sessionDescriptionHandler.setDescription(i.sdp);case 7:this.emit({type:"accepted"}),e.next=11;break;case 10:"call_resumed"===r?(this.sessionDescriptionHandler.setDescription(i.sdp),this.emit({type:"resumed"})):"call_rejected"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"reject",code:i.reject_code}),this.terminate()):"call_terminated"===r?(this.termination=!0,this.setCallId(null),this.emit({type:"terminated",reason:"bye",code:i.term_code}),this.terminate()):"sdp_update"===r?this.debouncedHandleSDPUpdate(i):(i.type=r,this.emit({type:"message",data:i}));case 11:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"initAuthToken",value:function(){var e=this.options,t=ar(e.transportOptions.auth_token);if(!1===t||t.client_id!==e.client_id||t.conf_id!==e.conf_id||!t.exp)throw new Error("Invalid auth token")}},{key:"setCallId",value:function(e){this.callId=e}},{key:"verifySender",value:function(e){var t=this.options;e.from===t.conf_id&&e.to===t.client_id||console.error(new Error("Invalid message sender",e))}},{key:"handleSdpUpdate",value:(n=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.callId,r=t.sdp,n&&n===t.call_id){e.next=4;break}throw new Error("Invalid call id");case 4:return this.emit({type:"sdp_update",sdp:r}),e.next=7,this.sessionDescriptionHandler.updateDescription(r);case 7:i=e.sent,"offer"===r.type&&i&&(o={type:i.type,sdp:sr(i.sdp)},this.message("sdp_update",{call_id:n,sdp:o}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"message",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"message",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.options,r=JSON.stringify({type:e,msg_id:ur(),from:n.client_id,to:n.conf_id,data:t});this.transport.send(r)}},{key:"connect",value:function(){var e=this,t=this.options,n=new ir(t.transportOptions);this.transport=n,this.termination=!1,this.emit({type:"transportCreated",transport:n}),n.onEvent((function(n){var r=n.type;"connected"===r?e.sessionDescriptionHandler||(e.sessionDescriptionHandler=t.sessionDescriptionHandlerFactory(t.sessionDescriptionHandlerFactoryOptions),e.emit({type:"registered"})):"message"===r?e.onMessage(n.message):"disconnected"===r&&(e.termination||e.emit({type:"terminated",reason:"disconnect",code:n.was_open?0:-1}))})),n.connect()}},{key:"call",value:(t=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.sessionDescriptionHandler,n=this.options,t){e.next=3;break}throw new Error("Invalid sessionDescriptionHandler");case 3:return e.next=5,t.getDescription();case 5:r=e.sent,i={type:r.type,sdp:sr(r.sdp)},this.message("call_start",{sdp:i,display_name:n.client_name,mute_video:n.mute_video});case 8:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"resume",value:function(e){var t=this;if(!this.callId)throw new Error("Session was already closed");this.options.transportOptions.auth_token=e;try{this.initAuthToken()}catch(e){return void this.emit({type:"terminated",reason:"disconnect",code:-1})}this.onEvent((function e(n){"transportCreated"===n.type&&(t.offEvent(e),t.transport.onEvent(function(){var e=Qe(et().mark((function e(n){var r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("connected"!==n.type){e.next=17;break}if(r=t.transport,i=t.sessionDescriptionHandler,t.callId){e.next=5;break}throw r.destroy(),new Error("Session was already closed");case 5:return e.prev=5,e.next=8,i.getDescription();case 8:o=e.sent,s={type:o.type,sdp:sr(o.sdp)},t.message("call_resume",{call_id:t.callId,sdp:s}),e.next=17;break;case 13:throw e.prev=13,e.t0=e.catch(5),r.destroy(),new Error("Unable to reconnect");case 17:case"end":return e.stop()}}),e,null,[[5,13]])})));return function(t){return e.apply(this,arguments)}}()))})),this.connect()}},{key:"terminate",value:function(){var e=this.sessionDescriptionHandler,t=this.transport,n=this.callId;this.callId=null,e&&e.close(),t&&(t.isConnected()&&n&&(this.termination=!0,this.message("call_terminate",{call_id:n,term_code:0}),this.emit({type:"terminated",reason:"terminate",code:0})),this.transport=null,t.destroy())}}]),o}(nr);const hr={UserAgent:dr},fr=["chat","recording","memberlist","source_update","voice_activity"];const pr=function(){function e(t,n){c(this,e);var r=t.src,i=void 0===r?[]:r,o=t.psrc,s=t.asrc,a=t.vsrc,u=t.dsrc,l=t.dims;this.clientId=n,this.sources=i,this.presenterIdx=o,this.audioSources=s,this.videoSources=a,this.desktopSources=u,this.dimensions=l,this.userSourceIndex=i.indexOf(n)}return d(e,[{key:"isSolo",get:function(){return 1===Array.from(new Set(this.sources)).length&&this.sources[0]===this.clientId}},{key:"isSource",get:function(){return this.sources.includes(this.clientId)}},{key:"isPresenter",get:function(){return this.hasPresenter&&this.presenter===this.clientId}},{key:"presenter",get:function(){return this.hasPresenter&&this.sources[this.presenterIdx]}},{key:"hasMedia",get:function(){return this.sources.some((function(e){return/media/.test(e)}))}},{key:"hasPresenter",get:function(){return Number.isInteger(this.presenterIdx)&&this.presenterIdx>-1}},{key:"hasVideoSources",get:function(){return Boolean(this.videoSources)}},{key:"hasDesktopSources",get:function(){return Number.isInteger(this.desktopSources)&&this.desktopSources>-1}},{key:"hasAudioPosition",get:function(){return this.audioSources.includes(this.userSourceIndex)}},{key:"hasVideoPosition",get:function(){return this.videoSources.includes(this.userSourceIndex)}},{key:"hasMutedVideoPeers",get:function(){var e=this;return!this.hasDesktopSources&&0===this.videoSources.filter((function(t){return t!==e.userSourceIndex})).length}},{key:"userDimensions",get:function(){var e=this.videoSources.indexOf(this.userSourceIndex);return e>-1?this.dimensions[e]:null}}]),e}();const mr=function(){function e(t){c(this,e),this.clientId=t,this.stamp=this.stamp.bind(this),this.default=this.default.bind(this),this.process=this.process.bind(this),this.sourceUpdate=this.sourceUpdate.bind(this),this.voiceActivity=this.voiceActivity.bind(this)}return d(e,[{key:"stamp",value:function(e){return Object.assign({_src:"sig"},e)}},{key:"process",value:function(e){return({source_update:this.sourceUpdate,voice_activity:this.voiceActivity}[e.type]||this.default)(this.stamp(e))}},{key:"default",value:function(e){return p.debug("SipMessageTransformer::default",e),e}},{key:"sourceUpdate",value:function(e){p.debug("SipMessageTransformer::sourceUpdate",e);var t=new pr(e,this.clientId);return{type:"podium",solo:t.isSolo,audio:t.hasAudioPosition,video:t.hasVideoPosition,media:t.hasMedia,sources:t.sources,isSource:t.isSource,presenter:t.presenter,isPresenter:t.isPresenter,hasPresenter:t.hasPresenter,videoSources:t.videoSources,userDimensions:t.userDimensions,hasVideoSources:t.hasVideoSources,hasDesktopSources:t.hasDesktopSources,hasMutedVideoPeers:t.hasMutedVideoPeers}}},{key:"voiceActivity",value:function(e){return p.debug("SipMessageTransformer::voiceActivity",e),Object.assign({type:"voice_activity_raw",on:e.on,userId:e.cid})}}]),e}();var vr=function(){function e(t){c(this,e),this.datachannel=null,this.peerConnection=null,this.localStream=null,this.remoteStream=null,this.connected=!1,this.iceCheckingTimer=null,this.peerConnectionReady=null,this.options=t||{},this.connection=t.connection,this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.initPeerConnection()}var t,n,r;return d(e,[{key:"getDescription",value:(r=Qe(et().mark((function e(){var t,n,r,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.options,n=this.peerConnection,p.debug("SessionDescriptionHandler::getDescription:",t),this.localStream=t.stream,e.next=5,n.createOffer(t.RTCOfferOptions);case 5:return r=e.sent,t.SDPModifiers.active.forEach((function(e){r.sdp=e(r.sdp)})),e.next=9,n.setLocalDescription(r);case 9:return e.next=11,this.peerConnectionReady;case 11:return i=n.localDescription.sdp,t.SDPModifiers.passive.forEach((function(e){i=e(i)})),p.debug("SessionDescriptionHandler::getDescription offer",i),e.abrupt("return",{type:"offer",sdp:i});case 15:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"setDescription",value:(n=Qe(et().mark((function e(t){var n;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.datachannel,p.debug("SessionDescriptionHandler::setDescription:",t),t&&t.sdp&&(this.connection.seppMessaging=t.sdp.includes("a=eyeson-sepp-messaging")),e.next=5,this.peerConnection.setRemoteDescription(new RTCSessionDescription(t));case 5:if(this.options.remoteDescriptionUpdate(t),"connecting"!==n.readyState){e.next=9;break}return e.next=9,new Promise((function(e){n.onopen=function(){n.onopen=null,e()}}));case 9:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"updateDescription",value:(t=Qe(et().mark((function e(t){var n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=this.options,r=this.peerConnection,p.debug("SessionDescriptionHandler::updateDescription:",t),"offer"!==t.type){e.next=24;break}return e.prev=3,e.next=6,r.setRemoteDescription(new RTCSessionDescription(t));case 6:return e.next=8,r.createAnswer();case 8:return i=e.sent,n.SDPModifiers.active.forEach((function(e){i.sdp=e(i.sdp)})),e.next=12,r.setLocalDescription(i);case 12:return this.options.remoteDescriptionUpdate(t),o=r.localDescription.sdp,n.SDPModifiers.passive.forEach((function(e){o=e(o)})),p.debug("SessionDescriptionHandler::updateDescription answer",o),e.abrupt("return",{type:"answer",sdp:o});case 19:e.prev=19,e.t0=e.catch(3),p.error("SessionDescriptionHandler::updateDescription",e.t0);case 22:e.next=28;break;case 24:if("answer"!==t.type){e.next=28;break}return e.next=27,r.setRemoteDescription(new RTCSessionDescription(t));case 27:this.options.remoteDescriptionUpdate(t);case 28:return e.abrupt("return",null);case 29:case"end":return e.stop()}}),e,this,[[3,19]])}))),function(e){return t.apply(this,arguments)})},{key:"close",value:function(){p.debug("SessionDescriptionHandler::close"),clearTimeout(this.iceCheckingTimer),this.peerConnection&&(this.stopAllTracks(),this.peerConnection.close(),this.peerConnection=null,this.datachannel&&["connecting","open"].includes(this.datachannel.readyState)&&(this.datachannel.close(),this.datachannel=null),p.debug("SessionDescriptionHandler::close Stopped streams and closed peerConnection."))}},{key:"initPeerConnection",value:function(){var e=this.options,t=this.buildPeerConnectionOptions();p.debug("SessionDescriptionHandler::initPeerConnection with",t);var n=null;this.peerConnectionReady=new Promise((function(e){return n=e}));try{var r=new RTCPeerConnection(t);this.peerConnection=r,e.stream.getTracks().forEach((function(t){r.addTrack(t,e.stream)}));var i=r.createDataChannel("data",{negotiated:!0,id:0});this.handleDatachannel(i),r.onicecandidate=function(e){var t=e.candidate;t?p.debug("SessionDescriptionHandler::gotIceCandidate",t.candidate):n()},r.onicegatheringstatechange=function(){"complete"===r.iceGatheringState&&n()},!0===e.sendOnly?r.addEventListener("connectionstatechange",this.handleConnectionStateChange):r.ontrack=this.handleOntrack.bind(this),this.iceCheckingTimer=setTimeout((function(){return n()}),3e3)}catch(e){p.error("SessionDescriptionHandler::initPeerConnection failed:",e,this.connection.uaOptions)}}},{key:"handleOntrack",value:function(e){var t=e.track,n=e.streams,r=this.options,i=U(n,1);this.remoteStream=i[0],p.debug("SessionDescriptionHandler::handleOntrack:",t.kind),t.onunmute=function(){return r.handleUnmute(t)},r.handleAccept(this.remoteStream)}},{key:"handleConnectionStateChange",value:function(){"connected"!==this.peerConnection.connectionState||this.connected||(this.connected=!0,this.options.handleAccept())}},{key:"handleDatachannel",value:function(e){this.datachannel=e,this.connection.initDatachannel(e)}},{key:"buildPeerConnectionOptions",value:function(){var e=this.options,t=[{urls:e.stun_servers}];return e.turn_servers.forEach((function(e){e.credential=e.password,t.push(e)})),{sdpSemantics:"unified-plan",iceServers:t}}},{key:"getLocalStream",value:function(){return this.localStream}},{key:"getRemoteStream",value:function(){return this.remoteStream}},{key:"setStream",value:function(e){var t=this;return new Promise((function(n,r){var i=t.getLocalStream();t.localStream=e,t.stopUnusedTracks(i,e);var o=U(e.getAudioTracks(),1)[0],s=U(Ut(e)?It(e):e.getVideoTracks(),1)[0];if(t.tracksExist()){var a=t.peerConnection.getSenders(),c=a.find((function(e){return e.track&&"audio"===e.track.kind})),u=a.find((function(e){return e.track&&"video"===e.track.kind}));Promise.all([c?c.replaceTrack(o):null,u?u.replaceTrack(s):null]).then((function(){n({newStream:e,remoteStream:t.remoteStream})})).catch(r)}else n({newStream:e,remoteStream:t.remoteStream})}))}},{key:"stopUnusedTracks",value:function(e,t){this.connection.hasExternalStream||e.getTracks().filter((function(e){return!t.getTracks().includes(e)})).forEach(mt)}},{key:"tracksExist",value:function(){return Boolean(this.peerConnection.getSenders().find((function(e){return null!==e.track})))}},{key:"scaleResolution",value:function(e){try{var t=Math.max(1/Math.max(e,.1),1),n=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),r=n.getParameters();r.encodings||(r.encodings=[{}]),r.encodings[0].scaleResolutionDownBy!==t&&(r.encodings[0].scaleResolutionDownBy=t,n.setParameters(r))}catch(e){p.error("SessionDescriptionHandler::scaleResolution failed:",e)}}},{key:"limitFramerate",value:function(e){try{var t=this.peerConnection.getSenders().find((function(e){return"video"===e.track.kind})),n=t.getParameters();n.encodings||(n.encodings=[{}]),n.encodings[0].maxFramerate!==e&&(e?n.encodings[0].maxFramerate=e:Reflect.deleteProperty(n.encodings[0],"maxFramerate"),t.setParameters(n))}catch(e){p.error("SessionDescriptionHandler::limitFramerate failed:",e)}}},{key:"stopAllTracks",value:function(){p.debug("SessionDescriptionHandler::stopAllTracks");var e=this.peerConnection.getReceivers?this.peerConnection.getReceivers():[];this.peerConnection.getSenders().concat(e).forEach((function(e){e.track&&mt(e.track)}))}}]),e}();const yr=vr;var gr=32768;const br=function(){function e(t,n){c(this,e),this.listeners=[],this.messageListener=[],this.datachannel=null,this.uaOptions=this.initUserAgentOptions(t,n),this.clientId=this.uaOptions.client_id,this.userAgent=null,this.transformer=new mr(this.clientId),this.seppMessaging=!1}return d(e,[{key:"initUserAgentOptions",value:function(e,t){if("sepp"!==e.type)return{client_id:null};var n=e.options;return{client_id:n.client_id,conf_id:n.conf_id,client_name:t.name,mute_video:!1,sessionDescriptionHandlerFactory:function(e){return new yr(e)},sessionDescriptionHandlerFactoryOptions:{stun_servers:n.stun_servers,turn_servers:n.turn_servers},transportOptions:{auth_token:n.auth_token,endpoint:n.endpoint}}}},{key:"start",value:function(){var e=this;return new Promise((function(t){if(!e.uaOptions.client_id)throw new TypeError("Invalid signaling data");e.userAgent=new hr.UserAgent(e.uaOptions),t()}))}},{key:"startSession",value:function(e){var t=this;return Object.assign(this.uaOptions.sessionDescriptionHandlerFactoryOptions,e),e.mediaOptions&&(this.uaOptions.mute_video=!e.mediaOptions.video),this.userAgent.onEvent((function(e){var n=e.type,r=e.data;"registered"===n?t.userAgent.call():"message"===n&&t.handleMessage(r)})),this.userAgent.connect(),this.userAgent}},{key:"updateAuthAndRestartSession",value:function(e){p.debug("updateAuthAndRestartSession",e),e.error||(this.uaOptions.transportOptions.auth_token=e.signaling.options.auth_token),this.userAgent.connect()}},{key:"updateAuthAndResume",value:function(e){p.debug("updateAuthAndResume",e),this.userAgent?e.error?this.userAgent.resume(null):this.userAgent.resume(e.signaling.options.auth_token):p.warn("updateAuthAndResume","userAgent already gone")}},{key:"initDatachannel",value:function(e){var t=this;this.datachannel=e,p.debug("SigConnection::initDatachannel",e),e.onmessage=function(n){if('{"type":"ping"}'!==n.data||"open"!==e.readyState){p.debug("SigConnection::dataChannelMessage",n.data);var r=JSON.parse(n.data);"ack"!==r.type&&t.handleMessage(r)}else e.send('{"type":"pong"}')}}},{key:"close",value:function(){var e=this.datachannel,t=this.userAgent;this.datachannel=null,this.userAgent=null,e&&"open"===e.readyState&&e.close(),t&&(t.removeAllListeners(),t.terminate())}},{key:"onMessage",value:function(e){this.messageListener.push(e)}},{key:"handleMessage",value:function(e){if(fr.includes(e.type)){var t=this.transformer.process(e);this.messageListener.forEach((function(e){return e(t)}))}else p.debug('SigConnection::handleMessage ignoring "'.concat(e.type,'" message.'))}},{key:"send",value:function(e){if(!this.seppMessaging){var t=this.datachannel;e.cid=this.uaOptions.client_id;var n=JSON.stringify(e);return"chat"===e.type&&n.length>=gr?(p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"})):t&&"open"===t.readyState&&n.length<gr?(p.debug("SigConnection::send datachannel",n),void t.send(n)):void p.error("SigConnection::send failed",e)}this.sendSeppMessage(e)}},{key:"sendSeppMessage",value:function(e){var t=this.userAgent;if(t&&t.callId){e.cid=this.uaOptions.client_id,e.call_id=t.callId;var n=JSON.stringify(e);if("chat"===e.type&&n.length>=gr)return p.error("SigConnection::send failed: chat message too long",e),void this.emit({type:"warning",name:"chat_message_too_long"});if(n.length<gr)return p.debug("SigConnection::send sepp",e),void t.message(e.type,e);p.error("SigConnection::send failed",e)}}},{key:"onError",value:function(e){return this.listeners.push(e),this}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}}]),e}();function Sr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const kr=function(e){g(n,e);var t=Sr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){if(R(k(n.prototype),"handle",this).call(this,e),this.context.rtData=e.content,!0===e.content.ready){var t=e.content,r=t.user,i=t.room,o=t.signaling,s=t.links,a=t.options;this.context._eyeson.room=i,this.context._eyeson.user=this.context._api.addUserAttributes(r,r.id,o.options.client_id),this.context._eyeson.links=s,f.widescreen=Boolean(a.widescreen),this.context._connection?p.debug("RoomReceived double room_ready"):function(e,t,n){e.connection=new br(t,n),e._connection.onError((function(t){return e.send(t)})).start().then((function(){return e.send({type:"connection",connectionStatus:"ready"})})).catch((function(){return e.send({type:"connection",connectionStatus:"transport_error"})}))}(this.context,o,r)}else p.debug("RoomReceived not ready:",e.content)}}]),n}(P);function wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const xr=function(e){g(n,e);var t=wr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this;this.context._api.getRoom((function(t){return R(k(n.prototype),"handle",e).call(e,{type:"fetch_room",room:t})}))}}]),n}(P);function Cr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Tr=function(e){g(n,e);var t=Cr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.deleteFile(e.file)}}]),n}(w);function Rr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const _r=function(e){g(n,e);var t=Rr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.uploadFile(e.file,this.addFile.bind(this))}},{key:"addFile",value:function(e){R(k(n.prototype),"handle",this).call(this,{type:"add_file",file:e})}}]),n}(P);function Pr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Er=function(e){g(n,e);var t=Pr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.cid.split("@").shift();this.msg=e,this.context._api.getUser(t,this.forwardMessage.bind(this))}},{key:"forwardMessage",value:function(e){var t=Date.parse(this.msg.ts||this.msg.created_at);R(k(n.prototype),"handle",this).call(this,{type:this.msg.type,user:e,timestamp:new Date(t),content:this.msg.content})}}]),n}(P);function Mr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Or=function(e){g(n,e);var t=Mr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.virtualBackground,s=void 0!==o&&o,a=e.screen,c=void 0!==a&&a,u=e.surface,l=void 0===u?null:u;p.debug("StartStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(c));var d=this.context,h=d._session,f=d._connection;if(!h)throw new Error("Session does not exist");if(h.micMixer&&(h.micMixer.destroy(),h.micMixer=null),h.options.virtualBackground=s,h.vbgMixer){var m=Bn.getStoredVirtualBackgroundType();h.vbgMixer.stopOriginalStream(),h.vbgMixer.terminate(),h.vbgMixer.changeBackground(m)}h.localStream&&!Xe.canMultipleDifferentMicrophones()&&vt(h.localStream);var v={audio:n,video:i,virtualBackground:h.options.virtualBackground,vbgMixer:h.vbgMixer,deviceMonitor:h.deviceMonitor};return c&&(h.micMixer=new Fn,v.video=!1,v.screen=!0,v.surface=l,v.virtualBackground=!1,v.micMixer=h.micMixer),new Ln(v).start().then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_screen_video"})})),e})).then(h.setStream).then((function(){return h.send({type:"mute_video",on:!(i||c)})})).then((function(){h.externalStream&&(h.externalStream=null,f.hasExternalStream=!1)})).catch((function(e){if(p.error("StartStreamEvent",e),c){h.micMixer&&(h.micMixer.destroy(),h.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),h.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ar(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Dr=function(e){g(n,e);var t=Ar(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=void 0===t||t,r=e.video,i=void 0===r||r,o=e.screen,s=void 0!==o&&o,a=e.surface;p.debug("ChangeStreamEvent::handle audio: ".concat(n," video: ").concat(i," screen: ").concat(s));var c=this.context._session;if(!c)throw new Error("Session does not exist");c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);return c.externalStream?(ft(c.externalStream,n),pt(c.externalStream,i),c.send({type:"mute_video",on:!i}),Promise.resolve()):new Promise((function(e,t){if(Xe.stopsDeviceActivityIndicatorOnDisable()&&!s){var r=U(c.localStream.getVideoTracks(),1)[0],o=U(c.localStream.getAudioTracks(),1)[0];if(!(i&&kt(r)||"ended"===r.readyState||"ended"===o.readyState||bt(r)))return c.vbgMixer&&c.vbgMixer.originalStream?(c.vbgMixer[i?"start":"stop"](),Dt(c.localStream,i),At(c.vbgMixer.originalStream,i)):At(c.localStream,i),ft(c.localStream,n),void e(c.localStream)}c.vbgMixer&&(c.vbgMixer.stopOriginalStream(),c.vbgMixer.terminate());var u={audio:n,video:i,virtualBackground:c.options.virtualBackground,existingStream:c.localStream,vbgMixer:c.vbgMixer,deviceMonitor:c.deviceMonitor};s&&(c.micMixer=new Fn,u.screen=!0,u.video=!1,u.surface=a,u.virtualBackground=!1,u.vbgMixer=null,u.micMixer=c.micMixer),new Ln(u).onBrokenTrackError((function(){c.emit({type:"broken_track_error"})})).start().then(e).catch(t)})).then((function(e){var t=U(Rt(e),1)[0];return t&&t.addEventListener("ended",(function(){c.emit({type:"stop_screen_video"})})),e})).then(c.setStream).then((function(e){Ut(e)?c.canvasMixer.setStream(e):c.send({type:"mute_video",on:!(i||s)})})).catch((function(e){if(p.error(e),e instanceof Error&&["NotReadableError","DevicesNotFoundError","NotFoundError"].includes(e.name)&&c.emit({type:"warning",name:"error_"+e.name}),s){c.micMixer&&(c.micMixer.destroy(),c.micMixer=null);var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),c.emit({type:"screen_capture_error",name:t})}}))}}]),n}(w);function Ir(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Br=function(e){g(n,e);var t=Ir(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=Gt(e.stream);if(!t)return p.error("ReplaceStreamEvent::handle invalid stream",e.stream),Promise.reject(new TypeError("Invalid stream"));var n=this.context,r=n._session,i=n._connection;if(!r)throw new Error("Session does not exist");return r.micMixer&&(r.micMixer.destroy(),r.micMixer=null),r.vbgMixer&&(r.vbgMixer.stopOriginalStream(),r.vbgMixer.terminate()),r.options.audio=ut(t),r.options.video=lt(t),r.setStream(t).then((function(){r.externalStream=t,i.hasExternalStream=!0,r.send({type:"mute_video",on:!lt(t)})})).catch((function(e){r.externalStream=null,i.hasExternalStream=!1,p.error(e)}))}}]),n}(w);function Lr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fr=function(e){g(n,e);var t=Lr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.facingMode;p.debug("ToggleCameraEvent::handle",t);var n=this.context._session;if(!n)throw new Error("Session does not exist");new Ln({audio:n.localStream.getAudioTracks()[0].enabled,video:{facingMode:t},existingStream:n.localStream,deviceMonitor:n.deviceMonitor}).start().then(n.setStream).catch(p.error)}}]),n}(w);function jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Vr=function(e){g(n,e);var t=jr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.type,r=e.session.sessionDescriptionHandler,i=r.getLocalStream(),o=r.getRemoteStream();R(k(n.prototype),"handle",this).call(this,{type:t,localStream:i,remoteStream:o})}}]),n}(P);function Ur(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Nr=function(e){g(n,e);var t=Ur(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.stopRecording(e)}}]),n}(P);function Wr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hr=function(e){g(n,e);var t=Wr(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n){t.context._api.getUser(e,n)}))}},{key:"handle",value:function(e){var t=this;this.getUser(e.userId).then((function(n){t.context.send({type:"voice_activity",user:n,on:e.on})}),(function(e){p.error("VoiceActivityEvent::handle",e)}))}}]),n}(w);function zr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Gr=function(e){g(n,e);var t=zr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context,n=t._api,r=t._session;n.startRecording(e).catch((function(e){return r.emit({type:"recording_error",error:e})}))}}]),n}(P);function qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const $r=function(e){g(n,e);var t=qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.screen,r=void 0!==n&&n,i=e.screenStream,o=e.surface,s=this.context._session;if(!s)throw new Error("Session does not exist");s.micMixer&&s.micMixer.destroy(),s.micMixer=new Fn;new Ln({audio:t,video:!1,screen:r,surface:o,screenStream:i,existingStream:s.localStream,micMixer:s.micMixer,isPresentation:!0,deviceMonitor:s.deviceMonitor}).start().then((function(e){var t="screen",n=U(Tt(e),1)[0];if(n){n.addEventListener("ended",(function(){s.emit({type:"stop_presenting"})}));var r=function(e){if(e&&"function"==typeof e.getSettings){var t=e.getSettings();if(Reflect.apply(Object.prototype.hasOwnProperty,t,["displaySurface"]))return t.displaySurface}return""}(n);r&&(t="screen-".concat(r))}s.emit({type:"start_presenting",stream:e,present:t})})).catch((function(e){if(p.error("ScreenCaptureEvent",e),r){var t="error_Screen_".concat(e.name);e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),s.emit({type:"capture_error",name:t})}s.emit({type:"stop_presenting"})}))}}]),n}(w);function Jr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Kr=function(e){g(r,e);var t,n=Jr(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"streamVideo",value:function(){var e=this,t=this.context._session;new Ln({audio:t.localStream.getAudioTracks()[0].enabled,video:!1,deviceMonitor:t.deviceMonitor}).start().then((function(n){var r=t.videoPlayer.invokeStream(n);return e.handle({stream:r})})).catch((function(e){p.error("StartPresentingEvent",e),e.name.match(/notallowed|permission/i)||t.emit({type:"capture_error",name:"error_".concat(e.name)}),t.emit({type:"stop_presenting"})}))}},{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.stream,r=void 0===n?null:n,i=t.present,o=void 0===i?"":i,s=this.context._session){e.next=4;break}throw new Error("Session does not exist");case 4:if(s.vbgMixer&&(s.vbgMixer.stopOriginalStream(),s.vbgMixer.terminate()),!s.videoPlayer||s.videoPlayer.isStreaming()){e.next=9;break}this.streamVideo(),e.next=16;break;case 9:return a=r||s.localStream,s.canvasMixer&&s.canvasMixer.stream&&(a=s.canvasMixer.stream),e.next=13,s.setStream(a);case 13:s.send({type:"set_presenter",on:!0}),s.send({type:"desktopstreaming",on:!0}),s.emit({type:"presentation_started",present:o});case 16:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Xr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Yr=function(e){g(n,e);var t=Xr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.canvasMixer&&(e.canvasMixer.vbgMixer&&(e.canvasMixer.vbgMixer.stopOriginalStream(),e.canvasMixer.vbgMixer.terminate(),e.canvasMixer.vbgMixer=null),e.canvasMixer.stop(),e.canvasMixer=null),e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.videoPlayer&&(e.videoPlayer.destroy(),e.videoPlayer=null),e.send({type:"desktopstreaming",on:!1}),e.send({type:"set_presenter",on:!1}),e.emit({type:"presentation_ended"}),e.stopPresentingSet=!0}}]),n}(w);function Qr(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Zr=function(e){g(n,e);var t=Qr(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;this.context._api.stopAllBroadcasts().then((function(){return R(k(n.prototype),"handle",t).call(t,{type:e.type})}))}}]),n}(P);function ei(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ti=function(e){g(n,e);var t=ei(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.clearFrontLayer()}}]),n}(w);function ni(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ri=function(e){g(n,e);var t=ni(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this;return new m(e.api,e.token).requestUser({name:e.name,email:e.email,locale:e.locale},(function(e){if(!e.access_key){var r=e.locked;return e.error&&"ComApiError: 423"===e.error.message&&(r=!0),void R(k(n.prototype),"handle",t).call(t,{type:"error",content:"Request guest user failed",locked:r})}R(k(n.prototype),"handle",t).call(t,{type:"guest_user",token:e.access_key})}))}}]),n}(P);function ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const oi=function(e){g(n,e);var t=ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._eyeson.destroy()}}]),n}(w);function si(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const ai=function(e){g(n,e);var t=si(n);function n(e){var r;return c(this,n),(r=t.call(this,e)).getUser=r.getUser.bind(b(r)),r}return d(n,[{key:"getUser",value:function(e){var t=this;return new Promise((function(n,r){if(t.context._api)try{t.context._api.getUser(e,n)}catch(e){r(e)}else r(new Error("missing ComAPI"))}))}},{key:"handle",value:function(e){var t=this;(e.add||[]).forEach((function(e,n,r){var i=e.cid,o=t.context._connection.clientId,s=Boolean(r.find((function(e){return e.cid===o})));t.getUser(i).then((function(e){t.context.send({type:"add_user",user:e,initial:s})})).catch((function(e){return p.error(e)}))})),(e.del||[]).forEach((function(e){var n=e;t.getUser(n).then((function(e){t.context.send({type:"remove_user",userId:n,user:e})})).catch((function(e){return p.error(e)}))})),this.context.send({type:"playback_update",playing:e.media||[]})}}]),n}(w);var ci=function(e){return Number(parseFloat(e).toFixed(2))};const ui=function(e,t,n){var r=Math.min(n.width/e,n.height/t);return{width:ci(e*r),height:ci(t*r)}},li=function(e,t,n){var r;return function(){var i=this,o=arguments,s=n&&!r;clearTimeout(r),r=setTimeout((function(){r=null,n||e.apply(i,o)}),t),s&&e.apply(i,o)}};var di=1e3/15,hi={width:220,height:140},fi={width:320,height:240},pi={width:420,height:340},mi={width:0,height:0},vi="function"==typeof window.MediaStreamTrackProcessor,yi={getSettings:function(){return{width:0,height:0}},addEventListener:function(){return null}},gi=Xe.isIOSDevice(),bi=function(e){var t=U(e.getVideoTracks(),1)[0];if(!t)return null;if(vi)return new MediaStreamTrackProcessor(t).readable.getReader();var n=t.getSettings(),r=n.width,i=n.height,o=document.createElement("video");return o.playsInline=!0,o.muted=!0,o.width=r,o.height=i,o.srcObject=e,t.addEventListener("stopped",(function(){o.srcObject=null})),o.play().catch((function(e){return p.warn("bindVideoToStream: play",e,e.message)})),o},Si=function(){function e(t,n){c(this,e),this.canvas=t,this.stream=n,this.camera=null,this.screen=null,this.canvasTrack=null,this.context=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),this.xPos=0,this.camSize=fi,this.isCanvasCapture=!1,this.draw=this.draw.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.onError=this.onError.bind(this),this.onRedraw=this.onRedraw.bind(this),this.setStream=this.setStream.bind(this),this.setCamera=this.setCamera.bind(this),this.drawFrame=this.drawFrame.bind(this),this.calcSizesAndPositions=this.calcSizesAndPositions.bind(this),this.bouncedDraw=li(this.draw,di)}var t;return d(e,[{key:"onError",value:function(e){this.errorCallback=e}},{key:"onRedraw",value:function(e){this.redrawCallback=e}},{key:"start",value:function(){var e,t=U(It(this.stream),1)[0];this.canvasTrack=t,gi?((e=this).cameraStream={getVideoTracks:function(){return[]}},e.screenStream={getVideoTracks:function(){return[]}},this.setCamera({horizontal:"right",vertical:"bottom"},"none")):(this.setCamera({horizontal:"right",vertical:"bottom"},"medium"),this.setStream(this.stream)),this.draw()}},{key:"stop",value:function(){this.stream&&(vt(this.stream),this.stream=null,this.camera=null,this.screen=null,this.screenStream=null,this.cameraStream=null,this.canvasTrack=null)}},{key:"setStream",value:function(e){this.stream=e,this.cameraStream=new MediaStream(jt(e)?Pt(e):_t(e)),this.screenStream=new MediaStream(Tt(this.stream));var t=function(e){if(e&&e.getVideoTracks().length>0){var t=U(e.getVideoTracks(),1)[0];if("canvas"in t)return t.canvas}return null}(this.cameraStream);t?(this.isCanvasCapture=!0,this.camera=t):(this.isCanvasCapture=!1,this.camera=bi(this.cameraStream)),this.screen=bi(this.screenStream),this.calcSizesAndPositions(),this.redrawQueued=!0}},{key:"setCamera",value:function(e,t){this.cameraPosition=e||this.cameraPosition,this.cameraSizeInWords=t||this.cameraSizeInWords,this.redrawQueued=!0}},{key:"calcSizesAndPositions",value:function(){var e,t,n,r,i,o,s,a,c=U(this.screenStream.getVideoTracks(),1)[0],u=(void 0===c?yi:c).getSettings(),l=(e=this.canvas,n=(t=u).width/t.height,r=e.width/e.height,i=e.width,o=e.height,s=0,a=0,n<r&&(i=t.width*(o/t.height),s=(e.width-i)/2),n>r&&(o=t.height*(i/t.width),a=(e.height-o)/2),{x:s,y:a,width:i,height:o}),d=U(this.cameraStream.getVideoTracks(),1)[0],h=(void 0===d?yi:d).getSettings();this.camSize={small:hi,medium:fi,large:pi,none:mi}[this.cameraSizeInWords];var f=ui(h.width,h.height,this.camSize);this.sizes={screen:{width:l.width,height:l.height},camera:{width:f.width,height:f.height}};var p={x:"right"===this.cameraPosition.horizontal?this.canvas.width-this.sizes.camera.width:0,y:"bottom"===this.cameraPosition.vertical?this.canvas.height-this.sizes.camera.height:0};this.positions={screen:{x:l.x,y:l.y},camera:{x:p.x,y:p.y}}}},{key:"draw",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,this.stream&&this.stream.active){e.next=3;break}return e.abrupt("return");case 3:if(this.calcSizesAndPositions(),this.redrawCallback&&this.redrawQueued&&(this.redrawCallback(),this.redrawQueued=!1),t=performance.now(),!this.screen){e.next=14;break}if(n=this.screen,!(vi&&this.screen instanceof ReadableStreamDefaultReader)){e.next=13;break}return e.next=11,this.screen.read();case 11:r=e.sent,n=r.value;case 13:this.drawFrame(n,this.positions.screen,this.sizes.screen,!1,!0);case 14:if(i=this.camera,!(vi&&this.camera instanceof ReadableStreamDefaultReader)){e.next=20;break}return e.next=18,this.camera.read();case 18:o=e.sent,i=o.value;case 20:this.drawFrame(i,this.positions.camera,this.sizes.camera,this.isCanvasCapture,!1),(s=performance.now())-t>=di&&p.warn("Mixer::drawFrame took ".concat(s-t,"ms."));try{this.canvasTrack&&this.canvasTrack.requestFrame()}catch(e){p.warn("CanvasMixer draw requestFrame error - ".concat(e.message))}this.bouncedDraw(),e.next=31;break;case 27:e.prev=27,e.t0=e.catch(0),p.error(e.t0),this.errorCallback(e.t0);case 31:case"end":return e.stop()}}),e,this,[[0,27]])}))),function(){return t.apply(this,arguments)})},{key:"drawFrame",value:function(e,t,n,r,i){var o=this.context,s=this.canvas;if(e&&(r||!(e instanceof HTMLVideoElement)||e.srcObject&&e.srcObject.active))i&&!r&&o.clearRect(0,0,s.width,s.height),o.drawImage(e,t.x,t.y,n.width,n.height),vi&&"function"==typeof e.close&&e.close();else{var a=o.createImageData(1,1);o.putImageData(a,0,0)}}}]),e}();const ki=Si;function wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var xi=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.audio,n=e.video,r=e.canvas,i=e.screen,o=void 0!==i&&i,s=e.surface,a=e.onRedraw,c=e.changeStream,u=void 0!==c&&c,l=e.present,d=void 0===l?"mixer":l,h=this.context._session;if(!h)throw new Error("Session does not exist");var f=Bn.getStoredVirtualBackgroundType(),m=new Dn("canvasmixer");m.changeBackground(f);var v=function(e){p.error("StartMixerEvent",e),!h.canvasMixer&&m&&m.terminate(),!e.name.match(/notallowed|permission/i)&&o&&h.emit({type:"capture_error",name:"error_".concat(e.name)}),h.emit({type:"stop_presenting"})};new Ln({audio:t,video:n,virtualBackground:h.options.virtualBackground,screen:o,surface:s,canvas:r,existingStream:h.localStream,vbgMixer:m,deviceMonitor:h.deviceMonitor}).start().then((function(e){var t=U(Tt(e),1)[0];return t&&t.addEventListener("ended",(function(){h.emit({type:"stop_presenting"}),mt(t)})),h.canvasMixer=new ki(r,e),h.canvasMixer.vbgMixer=m,h.canvasMixer.onError(v),h.canvasMixer.onRedraw(a),h.canvasMixer.start(),e})).then((function(e){u?h.emit({type:"start_presenting",stream:e,present:d}):h.emit({type:"stream_update",presentationStream:e})})).catch(v)}}]),n}(w),Ci=function(e){g(n,e);var t=wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=e.position,n=e.size,r=this.context._session;if(!r)throw new Error("Session does not exist");try{r.canvasMixer.setCamera(t,n)}catch(e){p.error(e)}}}]),n}(w),Ti="function"==typeof HTMLVideoElement.prototype.requestVideoFrameCallback,Ri=Xe.isIOSDevice();const _i=function(){function e(t){var n=t.canvas,r=t.file,i=t.onReady,o=t.onDuration,s=t.onTimeUpdate,a=t.onEnd,u=t.performAction;c(this,e),this.ac=null,this.acOut=null,this.gainNode=null,this.timer=null,this.canvas=n,this.url=URL.createObjectURL(r),this.ctx=n.getContext("2d"),this.video=document.createElement("video"),this.callback={onReady:i,onDuration:o,onTimeUpdate:s,onEnd:a,performAction:u},this.errorCallback=null,this.boundDrawVideoFrame=this.drawVideoFrame.bind(this),this.boundInitCanvasStream=this.initCanvasStream.bind(this),this.isPlaying=!1,this.blockTimeUpdate=!1,this.micOnlyStream=null,this.userMediaStream=null,this.initTimeout=null,this.invokationTimer=null,this.initVideo()}return d(e,[{key:"drawVideoFrame",value:function(){this.ctx.drawImage(this.video,0,0),this.timer=Ti?this.video.requestVideoFrameCallback(this.boundDrawVideoFrame):requestAnimationFrame(this.boundDrawVideoFrame)}},{key:"initVideo",value:function(){var e=this,t=this.video;t.playsInline=!0,t.autoplay=Boolean(Ri),t.preload="",t.onplaying=this.onVideoPlay.bind(this),t.onpause=this.onVideoPause.bind(this),t.onseeked=this.onVideoSeeked.bind(this),t.ontimeupdate=this.onVideoTimeUpdate.bind(this),t.onloadeddata=this.onVideoReady.bind(this),t.onerror=this.onVideoError.bind(this),t.onended=this.onVideoEnd.bind(this),this.initTimeout=setTimeout((function(){return e.onVideoError()}),6e3),t.src=this.url}},{key:"onVideoReady",value:function(){var e=this.video,t=this.canvas;clearTimeout(this.initTimeout),this.callback.onDuration(e.duration),t.width=e.videoWidth,t.height=e.videoHeight,this.ac=new(window.AudioContext||window.webkitAudioContext),this.gainNode=this.ac.createGain(),this.ac.createMediaElementSource(e).connect(this.gainNode),this.gainNode.connect(this.ac.destination),Ti&&(this.timer=e.requestVideoFrameCallback(this.boundDrawVideoFrame)),this.callback.performAction(this.onVideoAction.bind(this));try{this.ctx.drawImage(e,0,0)}catch(e){return void(this.errorCallback&&this.errorCallback(e))}this.callback.onReady(),e.autoplay&&setTimeout((function(){e.pause(),e.currentTime=0}))}},{key:"onVideoAction",value:function(e,t){return"play"===e?this.onPlayAction():"pause"===e?this.onPauseAction():("time"===e?this.onTimeAction(t):"volume"===e&&this.onVolumeAction(t),Promise.resolve())}},{key:"onPlayAction",value:function(){var e=this.video;return e.paused&&!this.isPlaying?e.play().then((function(){return e.paused}),(function(){return e.paused})):Promise.resolve(e.paused)}},{key:"onPauseAction",value:function(){var e=this.video;return!e.paused&&this.isPlaying&&e.pause(),Promise.resolve(e.paused)}},{key:"onTimeAction",value:function(e){var t=this.video;this.blockTimeUpdate=!0,e>=t.duration?t.currentTime=t.duration-.1:t.currentTime=e,this.blockTimeUpdate=!1}},{key:"onVolumeAction",value:function(e){this.gainNode&&(this.gainNode.gain.value=e)}},{key:"onVideoPlay",value:function(){this.isPlaying=!0,Ti||(this.timer=requestAnimationFrame(this.boundDrawVideoFrame)),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null)}},{key:"onVideoPause",value:function(){this.isPlaying=!1,!Ti&&this.timer&&cancelAnimationFrame(this.timer)}},{key:"onVideoSeeked",value:function(){Ti||this.isPlaying||this.ctx.drawImage(this.video,0,0)}},{key:"onVideoTimeUpdate",value:function(){this.blockTimeUpdate||this.callback.onTimeUpdate(this.video.currentTime)}},{key:"onVideoError",value:function(){var e=this.video,t=e&&e.error?e.error:new TypeError("VideoPlayer failed");p.error("VideoPlayer failed",t),this.errorCallback&&this.errorCallback(t)}},{key:"onVideoEnd",value:function(){this.callback.onEnd()}},{key:"initCanvasStream",value:function(){this.ctx.drawImage(this.video,0,0),this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)}},{key:"invokeStream",value:function(e){var t=U(this.canvas.captureStream(25).getVideoTracks(),1)[0];t.canvas||(t.type="canvas-track",t.canvas=this.canvas);var n=new MediaStream([t]);return this.acOut=this.ac.createMediaStreamDestination(),this.gainNode.connect(this.acOut),this.ac.createMediaStreamSource(e).connect(this.acOut),this.acOut.stream.getAudioTracks().forEach((function(e){return n.addTrack(e)})),this.userMediaStream=e,this.micOnlyStream=new MediaStream(e.getAudioTracks().concat(t)),this.isPlaying||(this.invokationTimer=requestAnimationFrame(this.boundInitCanvasStream)),n}},{key:"isStreaming",value:function(){return Boolean(this.micOnlyStream)}},{key:"getMicOnlyStream",value:function(){return this.micOnlyStream}},{key:"onError",value:function(e){this.errorCallback=e}},{key:"destroy",value:function(){var e=this,t=this.video;clearTimeout(this.initTimeout),this.url&&(URL.revokeObjectURL(this.url),this.url=null),this.timer&&(Ti?t.cancelVideoFrameCallback(this.timer):cancelAnimationFrame(this.timer),this.timer=null),this.invokationTimer&&(cancelAnimationFrame(this.invokationTimer),this.invokationTimer=null),this.userMediaStream&&(vt(this.userMediaStream),this.userMediaStream=null),this.micOnlyStream&&(vt(this.micOnlyStream),this.micOnlyStream=null),this.acOut&&(vt(this.acOut.stream),this.acOut=null),this.ac&&(this.gainNode.disconnect(),this.ac.close().then((function(){e.ac=null,e.gainNode=null}))),t&&(t.pause(),t.onplaying=null,t.onpause=null,t.ontimeupdate=null,t.onloadeddata=null,t.onseeked=null,t.onerror=null,t.onended=null,this.video=null),this.callback=null,this.errorCallback=null,this.ctx=null,this.canvas=null,this.boundDrawVideoFrame=null}}]),e}();function Pi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ei=function(e){g(n,e);var t=Pi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");var n=function(e){p.error("StartMediaEvent",e);var n=e&&(e instanceof MediaError||e instanceof DOMException)?"error_VideoError":"error_TypeError";t.emit({type:"warning",name:n}),t.emit({type:"stop_presenting"})};try{t.videoPlayer=new _i(e),t.videoPlayer.onError(n)}catch(e){n(e)}}}]),n}(w);function Mi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Oi=function(e){g(n,e);var t=Mi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.lockMeeting()}}]),n}(w);function Ai(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Di=function(e){g(n,e);var t=Ai(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){this.context._api.terminateMeeting()}}]),n}(w);function Ii(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Bi=function(e){g(n,e);var t=Ii(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){this.context._api.kickUser(e.userId)}}]),n}(w);function Li(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Fi=function(e){g(n,e);var t=Li(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(e){var t=this.context._session;if(!t)throw new Error("Session does not exist");t.vbgMixer&&("suspend"===e.state?(t.vbgMixer.suspend(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.suspend()):"resume"===e.state&&(t.vbgMixer.resume(),t.canvasMixer&&t.canvasMixer.vbgMixer&&t.canvasMixer.vbgMixer.resume()))}}]),n}(w);function ji(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Vi=function(e){e.micMixer&&(e.micMixer.destroy(),e.micMixer=null)},Ui=function(e){var t="error_Screen_".concat(e.name);return e.message.indexOf("not start audio")>-1&&(t="error_Screen_".concat(e.name,"_Audio")),t};const Ni=function(e){g(r,e);var t,n=ji(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,r,i,o,s,a,c,u,l;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.surface,r=null,i=this.context._session){e.next=5;break}throw new Error("Session does not exist");case 5:return e.prev=5,o=new Ln({surface:n}),e.next=9,o.getDisplayMedia();case 9:r=e.sent,e.next=17;break;case 12:return e.prev=12,e.t0=e.catch(5),p.error("ScreenVideoChangeEvent",e.t0),i.emit({type:"warning",name:Ui(e.t0)}),e.abrupt("return");case 17:return Vi(i),i.micMixer=new Fn,s={audio:i.localStream.getAudioTracks()[0].enabled,video:!1,screen:!0,surface:n,micMixer:i.micMixer,screenStream:r},e.prev=20,e.next=23,new Ln(s).start();case 23:a=e.sent,c=Rt(a),u=U(c,1),(l=u[0])&&l.addEventListener("ended",(function(){i.emit({type:"stop_screen_video"})})),i.setStream(a),e.next=35;break;case 29:e.prev=29,e.t1=e.catch(20),p.error("ScreenVideoChangeEvent",e.t1),Vi(i),i.emit({type:"screen_capture_error",name:Ui(e.t1)}),i.emit({type:"screen_video_ended"});case 35:case"end":return e.stop()}}),e,this,[[5,12],[20,29]])}))),function(e){return t.apply(this,arguments)})}]),r}(w);function Wi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}const Hi=function(e){g(n,e);var t=Wi(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.micMixer&&(e.micMixer.destroy(),e.micMixer=null),e.emit({type:"screen_video_ended"})}}]),n}(w);var zi=Xe.isIOSDevice();const Gi=function(){function e(){c(this,e),this.tempAudioTrack=null,this.tempVideoTrack=null,this.audioTrack=null,this.videoTrack=null,this.audioEnded=null,this.videoEnded=null,this.boundOnAudioEnd=this.onAudioEnd.bind(this),this.boundOnVideoEnd=this.onVideoEnd.bind(this),this.listeners=[]}return d(e,[{key:"addAudioTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempAudioTrack=e)}},{key:"addVideoTrack",value:function(e){!zi&&e&&"ended"!==e.readyState&&(this.tempVideoTrack=e)}},{key:"applyTempTracks",value:function(){this.clearTracks(),this.tempAudioTrack&&(this.audioTrack=this.tempAudioTrack,this.tempAudioTrack=null,this.audioTrack.addEventListener("ended",this.boundOnAudioEnd)),this.tempVideoTrack&&(this.videoTrack=this.tempVideoTrack,this.tempVideoTrack=null,this.videoTrack.addEventListener("ended",this.boundOnVideoEnd))}},{key:"discardTempTracks",value:function(){this.tempAudioTrack=null,this.tempVideoTrack=null}},{key:"onAudioEnd",value:function(){var e=this;if(this.videoEnded)return clearTimeout(this.videoEnded),void this.emit({type:"all_devices_ended"});this.audioEnded=setTimeout((function(){e.videoEnded?(clearTimeout(e.videoEnded),e.emit({type:"all_devices_ended"})):e.emit({type:"audio_device_ended"})}),1e3)}},{key:"onVideoEnd",value:function(){var e=this;this.videoEnded=setTimeout((function(){e.audioEnded||e.emit({type:"video_device_ended"})}),1e3)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"clearTracks",value:function(){clearTimeout(this.audioEnded),clearTimeout(this.videoEnded),this.audioTrack&&(this.audioTrack.removeEventListener("ended",this.boundOnAudioEnd),this.audioTrack=null),this.videoTrack&&(this.videoTrack.removeEventListener("ended",this.boundOnVideoEnd),this.videoTrack=null),this.audioEnded=null,this.videoEnded=null}},{key:"destroy",value:function(){this.listeners.length=0,this.discardTempTracks(),this.clearTracks()}}]),e}();const qi=function(){function e(t){c(this,e),this.video=null,this.stream=null,this.canvasStream=null,this.vbgMixer=null,this.deviceMonitor=null,this.session=t,this.isActive=!1,this.startTimer=null}var t,n,r,i,o,s;return d(e,[{key:"start",value:(s=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.session,Xe.hasPipCamSupport()){e.next=4;break}return t.emit({type:"pip_cam_warning_unsupported"}),e.abrupt("return");case 4:return e.prev=4,this.startTimer=setTimeout((function(){return n.onError(new Error("Starting timeout 5s"))}),5e3),this.initFakeStream(),e.next=9,this.initVideoAndPip();case 9:return e.next=11,this.initCamera();case 11:clearTimeout(this.startTimer),this.isActive=!0,t.emit({type:"pip_cam",active:!0}),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return s.apply(this,arguments)})},{key:"onError",value:function(e){var t=this.session;clearTimeout(this.startTimer),p.error("PipCam error",e),t?(t.emit({type:"pip_cam_error"}),t.emit({type:"stop_pip_cam"})):this.stop()}},{key:"updateCamera",value:(o=Qe(et().mark((function e(){var t,n,r,i,o,s=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.isActive){e.next=2;break}return e.abrupt("return");case 2:return t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,this.startTimer=setTimeout((function(){return s.onError(new Error("Starting timeout 5s"))}),5e3),e.prev=4,t.srcObject=r,e.next=8,t.play();case 8:return o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),e.next=13,this.initCamera();case 13:clearTimeout(this.startTimer),e.next=19;break;case 16:e.prev=16,e.t0=e.catch(4),this.onError(e.t0);case 19:case"end":return e.stop()}}),e,this,[[4,16]])}))),function(){return o.apply(this,arguments)})},{key:"initFakeStream",value:function(){var e=f.widescreen,t=document.createElement("canvas"),n=t.getContext("2d",{alpha:!1});t.width=640,t.height=e?360:480,n.fillStyle="#404040",n.fillRect(0,0,t.width,t.height);var r=new Path2D(e?"M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z":"M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z");n.fillStyle="#212121",n.fill(r),this.canvasStream=t.captureStream()}},{key:"initVideoAndPip",value:(i=Qe(et().mark((function e(){var t,n=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=document.createElement("video"),this.video=t,t.muted=!0,t.playsInline=!0,t.onleavepictureinpicture=function(){return n.onExitPip()},t.onpause=function(e){var t=e.target;return n.onVideoPause(t)},t.srcObject=this.canvasStream,e.next=9,t.play();case 9:return e.next=11,t.requestPictureInPicture();case 11:case"end":return e.stop()}}),e,this)}))),function(){return i.apply(this,arguments)})},{key:"initCamera",value:(r=Qe(et().mark((function e(){var t,n,r,i=this;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return(t=this.session.options.virtualBackground)&&(n=Bn.getStoredVirtualBackgroundType(),this.vbgMixer=new Dn("PipCam"),this.vbgMixer.changeBackground(n)),this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(e){return i.onDeviceEvent(e)})),r={audio:!1,video:!0,virtualBackground:t,vbgMixer:this.vbgMixer,deviceMonitor:this.deviceMonitor},e.next=7,new Ln(r).start();case 7:return this.stream=e.sent,this.video.srcObject=this.stream,e.next=11,this.video.play();case 11:case"end":return e.stop()}}),e,this)}))),function(){return r.apply(this,arguments)})},{key:"onExitPip",value:function(){this.session?this.session.emit({type:"stop_pip_cam"}):this.stop()}},{key:"onVideoPause",value:function(e){setTimeout((function(){return e.play().catch((function(){}))}))}},{key:"onDeviceEvent",value:function(e){e.type.endsWith("_ended")&&(clearTimeout(this.startTimer),this.session?(this.session.emit({type:"pip_cam_warning_video_ended"}),this.session.emit({type:"stop_pip_cam"})):this.stop())}},{key:"stop",value:(n=Qe(et().mark((function e(){var t,n,r,i,o;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=this.video,n=this.stream,r=this.canvasStream,i=this.vbgMixer,o=this.deviceMonitor,clearTimeout(this.startTimer),!t){e.next=15;break}if(t.onpause=null,t.onleavepictureinpicture=null,document.pictureInPictureElement!==t){e.next=13;break}return e.prev=6,e.next=9,document.exitPictureInPicture();case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(6);case 13:t.srcObject=null,this.video=null;case 15:o&&(o.destroy(),this.deviceMonitor=null),i&&(i.stopOriginalStream(),i.terminate(),this.vbgMixer=null),n&&(vt(n),this.stream=null),r&&(vt(r),this.canvasStream=null),this.isActive&&(this.session&&this.session.emit({type:"pip_cam",active:!1}),this.isActive=!1);case 20:case"end":return e.stop()}}),e,this,[[6,11]])}))),function(){return n.apply(this,arguments)})},{key:"destroy",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.stop();case 2:this.session=null;case 3:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})}]),e}();function $i(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Ji=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?e.emit({type:"pip_cam",active:e.pipCam.isActive}):(e.pipCam=new qi(e),e.pipCam.start())}}]),n}(w),Ki=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam?(e.pipCam.destroy(),e.pipCam=null):e.emit({type:"pip_cam",active:!1})}}]),n}(w),Xi=function(e){g(n,e);var t=$i(n);function n(){return c(this,n),t.apply(this,arguments)}return d(n,[{key:"handle",value:function(){var e=this.context._session;if(!e)throw new Error("Session does not exist");e.pipCam&&e.pipCam.updateCamera()}}]),n}(w);function Yi(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=k(e);if(t){var i=k(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return S(this,n)}}var Qi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h,f;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),o=lt(n.localStream),e.next=6,new Dr(this.context).handle({audio:i,video:o});case 6:if(!((s=n.localStream.getAudioTracks())&&s.length>0)){e.next=16;break}return a=U(s,1),c=a[0],e.next=11,Bn.fetchInputDevices();case 11:u=e.sent,l=c.getSettings(),d=l.deviceId,h=u.find((function(e){return e.deviceId===d})),Xe.canMultipleDifferentMicrophones()||((f=nt.load("mediaConstraints")).audio={deviceId:{exact:d}},nt.store("mediaConstraints",f),nt.store("audioId",d)),h&&(t.newAudioDevice=h.label);case 16:e.next=21;break;case 18:e.prev=18,e.t0=e.catch(1),p.error("AudioDeviceEndEvent",e.t0);case 21:R(k(r.prototype),"handle",this).call(this,t);case 22:case"end":return e.stop()}}),e,this,[[1,18]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),Zi=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Dr(this.context).handle({audio:i,video:!1});case 5:e.next=10;break;case 7:e.prev=7,e.t0=e.catch(1),p.error("VideoDeviceEndEvent",e.t0);case 10:R(k(r.prototype),"handle",this).call(this,t);case 11:case"end":return e.stop()}}),e,this,[[1,7]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),eo=function(e){g(r,e);var t,n=Yi(r);function r(){return c(this,r),n.apply(this,arguments)}return d(r,[{key:"handle",value:(t=Qe(et().mark((function e(t){var n,i,o,s,a,c,u,l,d,h;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=this.context._session,e.prev=1,i=ut(n.localStream),e.next=5,new Dr(this.context).handle({audio:i,video:!1});case 5:if(!((o=n.localStream.getAudioTracks())&&o.length>0)){e.next=15;break}return s=U(o,1),a=s[0],e.next=10,Bn.fetchInputDevices();case 10:c=e.sent,u=a.getSettings(),l=u.deviceId,d=c.find((function(e){return e.deviceId===l})),Xe.canMultipleDifferentMicrophones()||((h=nt.load("mediaConstraints")).audio={deviceId:{exact:l}},nt.store("mediaConstraints",h),nt.store("audioId",l)),d&&(t.newAudioDevice=d.label);case 15:e.next=20;break;case 17:e.prev=17,e.t0=e.catch(1),p.error("AllDevicesEndEvent",e.t0);case 20:R(k(r.prototype),"handle",this).call(this,t);case 21:case"end":return e.stop()}}),e,this,[[1,17]])}))),function(e){return t.apply(this,arguments)})}]),r}(P),to=function(){function e(){c(this,e),this.listeners=[],this._eyeson=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null,this.send=this.send.bind(this)}return d(e,[{key:"destroy",value:function(){this._monitor&&this._monitor.destroy(),this._connection&&this._connection.close(),this._rtConnection&&this._rtConnection.close(),this._session&&(this._session.vbgMixer&&(this._session.vbgMixer.stopOriginalStream(),this._session.vbgMixer.terminate(),this._session.vbgMixer.destroy()),this._session.end()),this._api=null,this._session=null,this._monitor=null,this._connection=null,this._rtConnection=null}},{key:"connection",get:function(){return null},set:function(e){this._connection?p.error("A connection is already set. If you are trying to start a new session you have to end the current one first."):(this._connection=e,this._connection.onMessage(this.send))}},{key:"rtConnection",get:function(){return null},set:function(e){this._rtConnection?p.error("A real-time connection is already set. If you are trying to start a new session you have the close the current before."):(this._rtConnection=e,this._rtConnection.onMessage(this.send))}},{key:"monitor",get:function(){return this._monitor},set:function(e){this._monitor?p.error("A monitor is already set. If you are trying to start a new session you have to end the current one first."):(this._monitor=e,this._monitor.onEvent(this.send))}},{key:"session",get:function(){return null},set:function(e){this._session?p.error("A session is already set. If you are trying to start a new session you have to end the current one first."):(this._session=e,this._session.onEvent(this.send))}},{key:"api",get:function(){return null},set:function(e){this._api=e}},{key:"rtData",get:function(){return null},set:function(e){this._rtData=e}},{key:"eyeson",get:function(){return null},set:function(e){this._eyeson=e}},{key:"onReceive",value:function(e){p.debug("EventHandler::onReceive"),this.listeners.push(e)}},{key:"removeListener",value:function(e){this.listeners=this.listeners.filter((function(t){return t!==e}))}},{key:"send",value:function(e){e.silenced||p.debug("EventHandler::send",e),new({stfu:F,chat:Er,accept:Vr,podium:Wn,snapshot:zn,send_chat:Jn,set_layer:qn,set_layout:Qn,fetch_room:xr,room_ready:kr,room_setup:kr,memberlist:ai,upload_file:_r,delete_file:Tr,request_stfu:D,change_stream:Dr,replace_stream:Br,toggle_camera:Fr,stop_playback:T,playback_update:F,start_playback:C,start_stream:Or,stop_recording:Nr,start_screen_capture:$r,stop_broadcasts:Zr,start_recording:Gr,stop_presenting:Yr,start_presenting:Kr,stop_annotation:O,start_annotation:M,clear_front_layer:ti,request_guest_user:ri,voice_activity_raw:Hr,start_mixer:xi,update_mixer:Ci,lock_meeting:Oi,terminate_meeting:Di,kick_user:Bi,session_termination:oi,start_media:Ei,change_screen_video:Ni,stop_screen_video:Hi,stop_rtmp:Xn,start_rtmp:er,suspend_virtual_background:Fi,audio_device_ended:Qi,video_device_ended:Zi,all_devices_ended:eo,start_pip_cam:Ji,stop_pip_cam:Ki,update_pip_cam:Xi,capture_error:F,voice_activity:F,options_update:F,ext_not_installed:F,broadcasts_update:F,presentation_ended:F,recording:B,ext_cancel:B,ext_installed:B,message_status:B,moderator_info:B}[e.type]||P)(this).handle(e)}}]),e}();const no=to;var ro=function(e){return e.replace("o=-","o=Visoweb")},io=function(e){var t=e.split("\r\n"),n=t.findIndex((function(e){return e.startsWith("t=")})),r=1;return Xe.canSFU()&&(t.splice(n+r,0,"a=sfu-capable"),r++,Xe.disallowAudioSyncSrcChange()&&(t.splice(n+r,0,"a=disallow-audio-ssrc-change"),r++)),Xe.canDataChannel()&&t.splice(n+r,0,"a=eyeson-datachan-capable","a=eyeson-datachan-keepalive","a=eyeson-sepp-messaging"),t.join("\r\n")},oo=function(e){var t=Xe.canStereo(),n=e.match(/^a=rtpmap:(\d+) opus/m);if(n){var r=new RegExp("^a=fmtp:".concat(n[1]," (.+)$"),"m"),i=e.match(r);if(i){var o={};i[1].split(";").forEach((function(e){var t=U(e.split("="),2),n=t[0],r=t[1];o[n]=r})),o.stereo=t?"1":"0";var s=Object.entries(o).map((function(e){var t=U(e,2),n=t[0],r=t[1];return"".concat(n,"=").concat(r)})).join(";");return e.replace(r,"a=fmtp:".concat(n[1]," ").concat(s))}}return e},so=function(e){var t=e.split("\r\n"),n=!1;return t.forEach((function(e,r){e.startsWith("m=audio")||e.startsWith("m=video")?n=!0:e.startsWith("m=application")?n=!1:"a=sendrecv"===e&&n&&(t[r]="a=sendonly")})),t.join("\r\n")},ao=function(e){var t={active:[oo],passive:[ro,io]};return!0===e.sendOnly&&t.active.push(so),t};const co=function(){function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};c(this,e),this.options=r,this.options.RTCConstraints=Object.assign({},this.defaultRTCConstraints,{offerToReceiveVideo:!this.options.eco}),this.accepted=!1,this.listeners=[],this.restarting=!1,this.connection=t,this.comApi=n,this.sipSession=null,this.startAttempts=0,this.maxStartAttempts=3,this.tryAuthUpdate=!0,this.tryResume=!0,this.tryWaitResume=!0,this.resumeTimer=null,this.waitResumeTimer=null,this.end=this.end.bind(this),this.emit=this.emit.bind(this),this.setStream=this.setStream.bind(this),this.endSession=this.endSession.bind(this),this.initSession=this.initSession.bind(this),this.handleFailed=this.handleFailed.bind(this),this.handleAccept=this.handleAccept.bind(this),this.handleUnmute=this.handleUnmute.bind(this),this.restartSession=this.restartSession.bind(this),this.tryRecoveryFrom=this.tryRecoveryFrom.bind(this),this.terminateSession=this.terminateSession.bind(this),this.remoteDescriptionUpdate=this.remoteDescriptionUpdate.bind(this)}var t;return d(e,[{key:"peerConnection",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.peerConnection:null}},{key:"localStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.localStream:null}},{key:"remoteStream",get:function(){return this.sipSession&&this.sipSession.sessionDescriptionHandler?this.sipSession.sessionDescriptionHandler.remoteStream:null}},{key:"defaultRTCConstraints",get:function(){return{offerToReceiveAudio:!0,offerToReceiveVideo:!0}}},{key:"start",value:function(){this.options.stream?this.initExternalStream():(this.initDeviceMonitor(),this.initVirtualBackground(),new Ln(this.options).start().then(this.initSession).catch(this.handleFailed))}},{key:"initExternalStream",value:function(){var e=!lt(this.options.stream)&&this.options.eco,t=Gt(this.options.stream,e);t?(this.externalStream=t,this.options.audio=ut(t),this.options.video=lt(t),this.initSession(this.externalStream)):this.handleFailed({name:"invalid_stream"})}},{key:"initVirtualBackground",value:function(){var e=Bn.getStoredVirtualBackgroundType();this.vbgMixer=new Dn,this.vbgMixer.changeBackground(e),this.options.vbgMixer=this.vbgMixer}},{key:"initDeviceMonitor",value:function(){var e=this;this.deviceMonitor=new Gi,this.deviceMonitor.onEvent((function(t){return e.emit(t)})),this.options.deviceMonitor=this.deviceMonitor}},{key:"buildSessionOptions",value:function(e){var t=this.options;return!0===t.sendOnly&&(t.RTCConstraints={}),{stream:e,sendOnly:t.sendOnly,SDPModifiers:ao({sendOnly:t.sendOnly}),connection:this.connection,handleAccept:this.handleAccept,handleUnmute:this.handleUnmute,RTCConstraints:t.RTCConstraints,remoteDescriptionUpdate:this.remoteDescriptionUpdate,mediaOptions:{audio:t.audio,video:t.video}}}},{key:"initSession",value:function(e){var t=this;this.tryResume=!0,this.tryAuthUpdate=!0,this.tryWaitResume=!0;var n=this.buildSessionOptions(e);this.sipSession=this.connection.startSession(n),this.onUnmute(e),this.sipSession.onEvent((function(e){"accepted"===e.type?t.adjustVideoPodium():"resumed"===e.type?(clearTimeout(t.resumeTimer),clearTimeout(t.waitResumeTimer),t.tryResume=!0,t.tryAuthUpdate=!0,t.tryWaitResume=!0):"terminated"===e.type&&t.handleTermination(e.reason,e.code)})),this.externalStream&&(this.connection.hasExternalStream=!0),window&&window.addEventListener(Xe.isIOSDevice()?"pagehide":"beforeunload",this.endSession)}},{key:"end",value:function(){this.listeners=[],this.endSession(),this.accepted=!1,this.sipSession=null,this.connection=null}},{key:"endSession",value:function(){p.debug("ConferenceSession::endSession"),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),this.sipSession&&(this.sipSession.removeAllListeners(),this.terminateSession()),this.connection&&this.connection.close(),this.deviceMonitor&&this.deviceMonitor.destroy()}},{key:"terminateSession",value:function(){p.debug("ConferenceSession::terminateSession");try{this.sipSession.terminate()}catch(e){p.error(e)}}},{key:"setStream",value:(t=Qe(et().mark((function e(t){var n,r;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.sipSession){e.next=2;break}return e.abrupt("return",null);case 2:return e.prev=2,n=this.sipSession.sessionDescriptionHandler,e.next=6,n.setStream(t);case 6:return r=e.sent,this.stopPresentingSet=!1,this.micMixer&&this.micMixer.active&&(r.newStream=this.micMixer.getMicOnlyStream(),n.localStream=r.newStream),this.videoPlayer&&this.videoPlayer.isStreaming()&&(r.newStream=this.videoPlayer.getMicOnlyStream(),n.localStream=r.newStream),this.onUnmute(r.newStream),this.emit({type:"stream_update",localStream:r.newStream,stream:r.remoteStream}),e.abrupt("return",r.newStream);case 15:return e.prev=15,e.t0=e.catch(2),p.error("ConferenceSession::setStream",e.t0),this.emit({type:"stream_update",localStream:this.localStream,stream:this.remoteStream}),e.abrupt("return",this.localStream);case 20:case"end":return e.stop()}}),e,this,[[2,15]])}))),function(e){return t.apply(this,arguments)})},{key:"onUnmute",value:function(e){var t=this;e&&e.getTracks().forEach((function(e){e.onunmute=function(){return t.emit({type:"local_track_unmuted",track:e})}}))}},{key:"setMonitor",value:function(e){this.monitor=e}},{key:"handleAccept",value:function(e){this.monitor&&this.monitor.observe(this.peerConnection),this.accepted||(this.emit({type:"accept",session:this.sipSession}),this.accepted=!0),e&&this.emit({type:"stream_update",stream:e})}},{key:"handleUnmute",value:function(e){this.emit({type:"track_unmuted",track:e})}},{key:"remoteDescriptionUpdate",value:function(e){p.debug("ConferenceSession::remoteDescriptionUpdate",e.sdp);var t=!1,n=e.sdp.split("\r\n").find((function(e){return e.startsWith("a=sfu-mode")}));n&&(t=n.includes("on")),this.emit({type:"remote_description_update",update:{sfu:t}})}},{key:"adjustVideoPodium",value:function(){this.send({type:"mute_video",on:!this.options.video})}},{key:"handleTermination",value:function(e,t){var n=this;if(p.debug("ConfSession::handleTermination",e,t),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer),"bye"===e&&200===t||"terminate"===e)this.handleExit();else if("disconnect"===e)if(-1===t){if(this.tryAuthUpdate)return this.tryAuthUpdate=!1,void this.comApi.getRoom((function(e){return n.connection.updateAuthAndRestartSession(e)}));if(this.tryWaitResume&&this.connection)return this.tryWaitResume=!1,this.waitResumeTimer=setTimeout((function(){n.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)}))}),5e3),void(this.resumeTimer=setTimeout((function(){n.handleFailed({name:503})}),15e3));this.handleFailed({name:503})}else{if(this.tryResume&&this.connection)return this.tryResume=!1,this.tryAuthUpdate=!1,this.comApi.getRoom((function(e){n.connection&&n.connection.updateAuthAndResume(e)})),void(this.resumeTimer=setTimeout((function(){return n.handleFailed({name:410})}),1e4));this.handleFailed({name:410})}else this.handleFailed({name:t});this.restarting||this.emit({type:"session_termination"})}},{key:"handleExit",value:function(){this.emit({type:"exit",reason:"bye"})}},{key:"handleFailed",value:function(e){p.warn("ConferenceSession::handleFailed: ",e),clearTimeout(this.resumeTimer),clearTimeout(this.waitResumeTimer);var t="Desert";if(e&&e.name&&(t=e.name),!this.tryRecoveryFrom(t)){var n={NotFoundError:"devices",NotAllowedError:"permission",DevicesNotFoundError:"devices",PermissionDeniedError:"permission",NotReadableError:"not_readable",403:"session_in_use",410:"abrupt_disconnect",413:"request_too_large",426:"ice_error",486:"session_in_use",607:"meeting_locked"}[t]||"session_failed";this.emit({type:"error",name:n,code:this.errorCodeName(t,n)})}}},{key:"errorCodeName",value:function(e,t){return["permission","devices","not_readable","meeting_locked","session_in_use","transport_error"].includes(t)?"":String(e)}},{key:"tryRecoveryFrom",value:function(e){var t=this;p.debug("ConferenceSession::tryRecoveryFrom: ",e);var n={404:{condition:function(){return t.startAttempts<t.maxStartAttempts},action:function(){return t.restartSession()}}}[e];return this.startAttempts>=this.maxStartAttempts?(this.restarting=!1,!1):Boolean(n&&n.condition()&&n.action())}},{key:"restartSession",value:function(){var e=this;return p.debug("ConferenceSession::restartSession: ",this.startAttempts),this.restarting=!0,this.startAttempts+=1,setTimeout((function(){e.endSession(),e.start()}),1e3),!0}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"send",value:function(e){return this.connection.send(e)}}]),e}();function uo(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return lo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return lo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function lo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var ho={NO_CONNECTION:3,BAD:2,OK:1,GOOD:0},fo=function(e,t){e.length<3?e.push(Object.assign({},t)):Object.assign(function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time<t.time&&(t=e[r]);return t}(e),t)},po=function(e){var t,n=e.length,r={jitter:0,packetLoss:0,roundTripTime:0,nack:0,bitrateSend:0,bitrateRecv:0,status:ho.GOOD},i=function(e){for(var t=U(e,1)[0],n=e.length,r=1;r<n;r++)e[r].time>t.time&&(t=e[r]);return t}(e),o=uo(e);try{for(o.s();!(t=o.n()).done;){var s=t.value;r.jitter+=s.jitter,r.packetLoss+=s.packetLoss,r.roundTripTime+=s.roundTripTime,r.nack+=s.nack,r.bitrateSend+=s.bitrateSend,r.bitrateRecv+=s.bitrateRecv}}catch(e){o.e(e)}finally{o.f()}return r.jitter=null===i.jitter?null:r.jitter/n,r.packetLoss=null===i.packetLoss?null:r.packetLoss/n,r.roundTripTime=null===i.roundTripTime?null:r.roundTripTime/n,r.nack=null===i.nack?null:r.nack/n,r.bitrateSend/=n,r.bitrateRecv/=n,r.status=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return n>1||e>.2||t>.5||r>.2?ho.BAD:n>.3||e>.1||t>.3||r>.1?ho.OK:ho.GOOD}(r.packetLoss,r.jitter,r.roundTripTime,r.nack),r},mo=function(){function e(){c(this,e),this.peerConnection=null,this.timer=null,this.listeners=[],this.history=[],this.entry={jitter:0,packetLoss:0,roundTripTime:0,nack:0,time:0,bitrateSend:0,bitrateRecv:0},this.lastStat={time:null,bytesSent:null,bytesReceived:null,audio:{out:{packetsSent:null,packetsLost:null,bytesSent:null},in:{packetsReceived:null}},video:{out:{packetsSent:null,packetsLost:null,bytesSent:null,nackCount:null},in:{bytesReceived:null}}},this.boundPrintStats=this.printStats.bind(this)}var t;return d(e,[{key:"init",value:function(e){this.peerConnection=e}},{key:"printStats",value:(t=Qe(et().mark((function e(){var t,n,r,i,o,s,a,c;return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=this.peerConnection,n=this.entry,r=this.lastStat,i=this.history,e.next=3,t.getStats();case 3:o=e.sent,s=Date.now(),a=null,Object.keys(n).forEach((function(e){n[e]=0})),n.jitter=null,n.packetLoss=null,n.roundTripTime=null,n.nack=null,n.time=s,o.forEach((function(e){if("inbound-rtp"===e.type){var t=e.kind||e.mediaType;if(r.time){var i=(s-r.time)/1e3,c=Math.max(e.bytesReceived-r[t].in.bytesReceived,0);n.bitrateRecv+=8*c/i}r[t].in.bytesReceived=e.bytesReceived}else if("outbound-rtp"===e.type){var u=e.kind||e.mediaType;if(r.time){var l=(s-r.time)/1e3,d=e.bytesSent-r[u].out.bytesSent;n.bitrateSend+=8*d/l}r[u].out.bytesSent=e.bytesSent}else if("remote-inbound-rtp"===e.type){var h=e.kind||e.mediaType;if(r[h]){var f=o.get(e.localId),p=void 0!==e.roundTripTime,m=void 0!==e.jitter,v=void 0!==e.packetsLost,y=void 0!==f.nackCount;if(r.time){var g=e.packetsLost-r[h].out.packetsLost,b=f.packetsSent-r[h].out.packetsSent,S=b>0?g/b:0;if(n.jitter=m?Math.max(n.jitter,b>0?e.jitter:0):null,n.packetLoss=v?Math.max(n.packetLoss,S):null,n.roundTripTime=p?Math.max(n.roundTripTime,e.roundTripTime):null,"video"===h){var k=f.nackCount-r[h].out.nackCount,w=b>0?k/b:0;n.nack=y?Math.max(n.nack,w):null}}"video"===h&&(r[h].out.nackCount=f.nackCount),r[h].out.packetsSent=f.packetsSent,r[h].out.packetsLost=e.packetsLost}}else"candidate-pair"===e.type&&"succeeded"===e.state&&"currentRoundTripTime"in e&&(a=e.currentRoundTripTime)})),null===n.roundTripTime&&null!==a&&(n.roundTripTime=a),fo(i,n),c=po(i),!1===navigator.onLine&&(c.status=ho.BAD),["disconnected","failed","closed"].includes(t.iceConnectionState)&&(c.status=ho.NO_CONNECTION),this.emit(c),r.time=s;case 20:case"end":return e.stop()}}),e,this)}))),function(){return t.apply(this,arguments)})},{key:"getCurrentStatistics",value:function(){return po(this.history)}},{key:"onUpdate",value:function(e){var t=this.listeners,n=this.timer;0===t.length&&null===n&&(this.timer=setInterval(this.boundPrintStats,1e3),this.peerConnection.addEventListener("iceconnectionstatechange",this.boundPrintStats),window.addEventListener("offline",this.boundPrintStats)),t.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){try{t(e)}catch(e){p.error("ConnectionStatistics::emit",e)}}))}},{key:"destroy",value:function(){clearInterval(this.timer),window.removeEventListener("offline",this.boundPrintStats),this.peerConnection&&(this.peerConnection.removeEventListener("iceconnectionstatechange",this.boundPrintStats),this.peerConnection=null),this.timer=null,this.history.length=0,this.listeners.length=0}}]),e}();mo.Status=ho;const vo=mo;const yo=function(){function e(){c(this,e),this.pc=null,this.statistics=new vo,this.listeners=[],this.disconnectTimer=null,this.prevIceState="initial",this.onOffline=this.onOffline.bind(this),this.handleIceStateChange=this.handleIceStateChange.bind(this),this.handleConnectionStateChange=this.handleConnectionStateChange.bind(this),this.addEventListeners()}return d(e,[{key:"addEventListeners",value:function(){window.addEventListener("offline",this.onOffline)}},{key:"onOffline",value:function(){this.emit({type:"offline"})}},{key:"observe",value:function(e){this.pc||(this.pc=e,this.pc.oniceconnectionstatechange=this.handleIceStateChange,this.pc.onconnectionstatechange=this.handleConnectionStateChange,this.statistics.init(e),this.emit({type:"statistics_ready",statistics:this.statistics}))}},{key:"destroy",value:function(){var e=this.pc,t=this.statistics;clearTimeout(this.disconnectTimer),t&&(t.destroy(),this.statistics=null),e&&(e.onconnectionstatechange=null,e.oniceconnectionstatechange=null,this.pc=null),window.removeEventListener("offline",this.onOffline)}},{key:"onEvent",value:function(e){this.listeners.push(e)}},{key:"emit",value:function(e){this.listeners.forEach((function(t){return t(e)}))}},{key:"handleConnectionStateChange",value:function(e){e.currentTarget&&p.warn("connectionStateChange: ",e.currentTarget.connectionState)}},{key:"handleIceStateChange",value:function(e){var t=this;if(e.currentTarget){var n=e.currentTarget.iceConnectionState;"disconnected"===n&&(this.emit({type:"warning",name:"ice_disconnected"}),clearTimeout(this.disconnectTimer),this.disconnectTimer=window.setTimeout((function(){t.pc&&"connected"!==t.pc.iceConnectionState&&t.emit({type:"error",name:"ice_failed",code:"Goldfinger"})}),2e3)),"failed"===n&&this.emit({type:"error",name:"ice_failed",code:"Thunderball"}),"disconnected"===this.prevIceState&&["completed","connected"].includes(n)&&this.emit({type:"clear_warning",name:"ice_disconnected"}),this.prevIceState=n}}}]),e}();var go={logger:self.console,WebSocket:self.WebSocket},bo={log(...e){this.enabled&&(e.push(Date.now()),go.logger.log("[ActionCable]",...e))}};const So=()=>(new Date).getTime(),ko=e=>(So()-e)/1e3;class wo{constructor(e){this.visibilityDidChange=this.visibilityDidChange.bind(this),this.connection=e,this.reconnectAttempts=0}start(){this.isRunning()||(this.startedAt=So(),delete this.stoppedAt,this.startPolling(),addEventListener("visibilitychange",this.visibilityDidChange),bo.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`))}stop(){this.isRunning()&&(this.stoppedAt=So(),this.stopPolling(),removeEventListener("visibilitychange",this.visibilityDidChange),bo.log("ConnectionMonitor stopped"))}isRunning(){return this.startedAt&&!this.stoppedAt}recordPing(){this.pingedAt=So()}recordConnect(){this.reconnectAttempts=0,this.recordPing(),delete this.disconnectedAt,bo.log("ConnectionMonitor recorded connect")}recordDisconnect(){this.disconnectedAt=So(),bo.log("ConnectionMonitor recorded disconnect")}startPolling(){this.stopPolling(),this.poll()}stopPolling(){clearTimeout(this.pollTimeout)}poll(){this.pollTimeout=setTimeout((()=>{this.reconnectIfStale(),this.poll()}),this.getPollInterval())}getPollInterval(){const{staleThreshold:e,reconnectionBackoffRate:t}=this.constructor;return 1e3*e*Math.pow(1+t,Math.min(this.reconnectAttempts,10))*(1+(0===this.reconnectAttempts?1:t)*Math.random())}reconnectIfStale(){this.connectionIsStale()&&(bo.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${ko(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`),this.reconnectAttempts++,this.disconnectedRecently()?bo.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${ko(this.disconnectedAt)} s`):(bo.log("ConnectionMonitor reopening"),this.connection.reopen()))}get refreshedAt(){return this.pingedAt?this.pingedAt:this.startedAt}connectionIsStale(){return ko(this.refreshedAt)>this.constructor.staleThreshold}disconnectedRecently(){return this.disconnectedAt&&ko(this.disconnectedAt)<this.constructor.staleThreshold}visibilityDidChange(){"visible"===document.visibilityState&&setTimeout((()=>{!this.connectionIsStale()&&this.connection.isOpen()||(bo.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`),this.connection.reopen())}),200)}}wo.staleThreshold=6,wo.reconnectionBackoffRate=.15;var xo={message_types:{welcome:"welcome",disconnect:"disconnect",ping:"ping",confirmation:"confirm_subscription",rejection:"reject_subscription"},disconnect_reasons:{unauthorized:"unauthorized",invalid_request:"invalid_request",server_restart:"server_restart"},default_mount_path:"/cable",protocols:["actioncable-v1-json","actioncable-unsupported"]};const{message_types:Co,protocols:To}=xo,Ro=To.slice(0,To.length-1),_o=[].indexOf;class Po{constructor(e){this.open=this.open.bind(this),this.consumer=e,this.subscriptions=this.consumer.subscriptions,this.monitor=new wo(this),this.disconnected=!0}send(e){return!!this.isOpen()&&(this.webSocket.send(JSON.stringify(e)),!0)}open(){return this.isActive()?(bo.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`),!1):(bo.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${To}`),this.webSocket&&this.uninstallEventHandlers(),this.webSocket=new go.WebSocket(this.consumer.url,To),this.installEventHandlers(),this.monitor.start(),!0)}close({allowReconnect:e}={allowReconnect:!0}){if(e||this.monitor.stop(),this.isOpen())return this.webSocket.close()}reopen(){if(bo.log(`Reopening WebSocket, current state is ${this.getState()}`),!this.isActive())return this.open();try{return this.close()}catch(e){bo.log("Failed to reopen WebSocket",e)}finally{bo.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`),setTimeout(this.open,this.constructor.reopenDelay)}}getProtocol(){if(this.webSocket)return this.webSocket.protocol}isOpen(){return this.isState("open")}isActive(){return this.isState("open","connecting")}isProtocolSupported(){return _o.call(Ro,this.getProtocol())>=0}isState(...e){return _o.call(e,this.getState())>=0}getState(){if(this.webSocket)for(let e in go.WebSocket)if(go.WebSocket[e]===this.webSocket.readyState)return e.toLowerCase();return null}installEventHandlers(){for(let e in this.events){const t=this.events[e].bind(this);this.webSocket[`on${e}`]=t}}uninstallEventHandlers(){for(let e in this.events)this.webSocket[`on${e}`]=function(){}}}Po.reopenDelay=500,Po.prototype.events={message(e){if(!this.isProtocolSupported())return;const{identifier:t,message:n,reason:r,reconnect:i,type:o}=JSON.parse(e.data);switch(o){case Co.welcome:return this.monitor.recordConnect(),this.subscriptions.reload();case Co.disconnect:return bo.log(`Disconnecting. Reason: ${r}`),this.close({allowReconnect:i});case Co.ping:return this.monitor.recordPing();case Co.confirmation:return this.subscriptions.confirmSubscription(t),this.subscriptions.notify(t,"connected");case Co.rejection:return this.subscriptions.reject(t);default:return this.subscriptions.notify(t,"received",n)}},open(){if(bo.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`),this.disconnected=!1,!this.isProtocolSupported())return bo.log("Protocol is unsupported. Stopping monitor and disconnecting."),this.close({allowReconnect:!1})},close(e){if(bo.log("WebSocket onclose event"),!this.disconnected)return this.disconnected=!0,this.monitor.recordDisconnect(),this.subscriptions.notifyAll("disconnected",{willAttemptReconnect:this.monitor.isRunning()})},error(){bo.log("WebSocket onerror event")}};class Eo{constructor(e,t={},n){this.consumer=e,this.identifier=JSON.stringify(t),function(e,t){if(null!=t)for(let n in t){const r=t[n];e[n]=r}}(this,n)}perform(e,t={}){return t.action=e,this.send(t)}send(e){return this.consumer.send({command:"message",identifier:this.identifier,data:JSON.stringify(e)})}unsubscribe(){return this.consumer.subscriptions.remove(this)}}class Mo{constructor(e){this.subscriptions=e,this.pendingSubscriptions=[]}guarantee(e){-1==this.pendingSubscriptions.indexOf(e)?(bo.log(`SubscriptionGuarantor guaranteeing ${e.identifier}`),this.pendingSubscriptions.push(e)):bo.log(`SubscriptionGuarantor already guaranteeing ${e.identifier}`),this.startGuaranteeing()}forget(e){bo.log(`SubscriptionGuarantor forgetting ${e.identifier}`),this.pendingSubscriptions=this.pendingSubscriptions.filter((t=>t!==e))}startGuaranteeing(){this.stopGuaranteeing(),this.retrySubscribing()}stopGuaranteeing(){clearTimeout(this.retryTimeout)}retrySubscribing(){this.retryTimeout=setTimeout((()=>{this.subscriptions&&"function"==typeof this.subscriptions.subscribe&&this.pendingSubscriptions.map((e=>{bo.log(`SubscriptionGuarantor resubscribing ${e.identifier}`),this.subscriptions.subscribe(e)}))}),500)}}class Oo{constructor(e){this.consumer=e,this.guarantor=new Mo(this),this.subscriptions=[]}create(e,t){const n="object"==typeof e?e:{channel:e},r=new Eo(this.consumer,n,t);return this.add(r)}add(e){return this.subscriptions.push(e),this.consumer.ensureActiveConnection(),this.notify(e,"initialized"),this.subscribe(e),e}remove(e){return this.forget(e),this.findAll(e.identifier).length||this.sendCommand(e,"unsubscribe"),e}reject(e){return this.findAll(e).map((e=>(this.forget(e),this.notify(e,"rejected"),e)))}forget(e){return this.guarantor.forget(e),this.subscriptions=this.subscriptions.filter((t=>t!==e)),e}findAll(e){return this.subscriptions.filter((t=>t.identifier===e))}reload(){return this.subscriptions.map((e=>this.subscribe(e)))}notifyAll(e,...t){return this.subscriptions.map((n=>this.notify(n,e,...t)))}notify(e,t,...n){let r;return r="string"==typeof e?this.findAll(e):[e],r.map((e=>"function"==typeof e[t]?e[t](...n):void 0))}subscribe(e){this.sendCommand(e,"subscribe")&&this.guarantor.guarantee(e)}confirmSubscription(e){bo.log(`Subscription confirmed ${e}`),this.findAll(e).map((e=>this.guarantor.forget(e)))}sendCommand(e,t){const{identifier:n}=e;return this.consumer.send({command:t,identifier:n})}}class Ao{constructor(e){this._url=e,this.subscriptions=new Oo(this),this.connection=new Po(this)}get url(){return function(e){"function"==typeof e&&(e=e());if(e&&!/^wss?:/i.test(e)){const t=document.createElement("a");return t.href=e,t.href=t.href,t.protocol=t.protocol.replace("http","ws"),t.href}return e}(this._url)}send(e){return this.connection.send(e)}connect(){return this.connection.open()}disconnect(){return this.connection.close({allowReconnect:!1})}ensureActiveConnection(){if(!this.connection.isActive())return this.connection.open()}}function Do(e=function(e){const t=document.head.querySelector(`meta[name='action-cable-${e}']`);if(t)return t.getAttribute("content")}("url")||xo.default_mount_path){return new Ao(e)}const Io=function(){function e(t){c(this,e),this.channels={},this.onMessageHandler=this.defaultMessageHandler,this.onReceived=this.onReceived.bind(this),this.offMessage=this.offMessage.bind(this),this.onConnected=this.onConnected.bind(this),this.startSession=this.startSession.bind(this),this.onDisconnected=this.onDisconnected.bind(this),this.cable=Do(t)}return d(e,[{key:"startSession",value:function(){this.channels.RoomChannel=this.cable.subscriptions.create({channel:"RoomChannel"},{connected:this.onConnected,received:this.onReceived,disconnected:this.onDisconnected}),this.channels.UserChannel=this.cable.subscriptions.create({channel:"UserChannel"},{received:this.onReceived})}},{key:"onConnected",value:function(){this.disconnectTimestamp&&this.handleReconnect(),p.debug("ActionCableConnection::onConnected")}},{key:"handleReconnect",value:function(){this.onMessageHandler({type:"reconnect"})}},{key:"onReceived",value:function(e){p.debug("ActionCableConnection::onReceived",e),e._src="actioncable",this.onMessageHandler(e)}},{key:"onDisconnected",value:function(){p.debug("ActionCableConnection::onDisconnected"),this.disconnectTimestamp=Date.now(),this.onMessageHandler({type:"disconnect"})}},{key:"onMessage",value:function(e){"function"==typeof e&&(this.onMessageHandler=e)}},{key:"offMessage",value:function(){this.onMessageHandler=this.defaultMessageHandler}},{key:"defaultMessageHandler",value:function(e){p.debug("ActionCableConnection::defaultMessageHandler: ",e)}},{key:"send",value:function(e){var t=e.channel,n=void 0===t?"RoomChannel":t,r=e.type,i=void 0===r?"ping":r,o=this.channels[n];o?o.perform(i):p.warn("ActionCableConnection::send no subscription found! ",n)}},{key:"close",value:function(){this.cable.disconnect(),this.offMessage(),this.channels={},this.cable=null}}]),e}();var Bo=function(e,t){return e.core.eventHandler.send({type:"connection",connectionStatus:t})},Lo=function(e){var t=e.core;Bo(e,"fetch_room"),t.eventHandler.eyeson=e,t.comApi.onError((function(){return t.eventHandler.send({type:"warning",name:"error:comapi"})})),t.comApi.getRoom((function(n){if(n.error)return p.warn("eyeson::prepareConnection",n.error),void Bo(e,"access_denied");Bo(e,"received_room"),t.rtConnection=new Io(n.links.websocket),t.eventHandler.rtConnection=t.rtConnection,t.rtConnection.startSession(),t.eventHandler.monitor=new yo,t.eventHandler.api=t.comApi,function(e){e.core.keepRoomAlive=setInterval((function(){e.core.rtConnection.send({type:"user_joins"})}),3e4)}(e),function(e){var t=1;e.core.pollingFallbackInterval=setInterval((function(){var n=e.core;return 200===t?(p.debug("eyeson::pollingFallback: max count exceeded, clearing interval."),void clearInterval(n.pollingFallbackInterval)):n.eventHandler._connection?(p.debug("eyeson::pollingFallback: connection set, clearing interval."),void clearInterval(n.pollingFallbackInterval)):void n.comApi.getRoom((function(e){if(!0===e.ready)return p.debug("eyeson::pollingFallback: room ready"),void n.eventHandler.send({type:"room_ready",content:e});p.debug("eyeson::pollingFallback: room not ready",t),t+=1}))}),5e3)}(e)}))},Fo=function(){function e(){c(this,e),this.config=h,this.core={eventHandler:new no},this.room={},this.user={},this.links={},this.options=f}return d(e,[{key:"onEvent",value:function(e){"function"==typeof e?this.core.eventHandler.onReceive(e):p.error("A listener to eyeson events has to be of type function. The argument passed to onEvent is of type "+a(e)+".")}},{key:"offEvent",value:function(e){this.core.eventHandler.removeListener(e)}},{key:"connect",value:function(e){p.debug("eyeson::connect",e),this.core.comApi=new m(this.config.api,e),Lo(this)}},{key:"join",value:function(e){p.debug("eyeson::join",e),function(e,t){var n=e.core;if(n.eventHandler._connection){var r=new co(n.eventHandler._connection,n.comApi,t);r.setMonitor(n.eventHandler.monitor),n.eventHandler.session=r,r.start(),function(e){var t=e.core,n=t.eventHandler._rtData.broadcasts;n&&t.eventHandler.send({type:"broadcasts_update",broadcasts:n})}(e),clearInterval(n.keepRoomAlive),e.session=r}else p.error("You tried to join a session that is not yet available. Before calling join, a connection status of connected has to be received.")}(this,e)}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{audio:!0,video:!0};p.debug("eyeson::start");this.onEvent((function e(r){"ready"===r.connectionStatus&&(t.offEvent(e),t.join(n))})),this.connect(e)}},{key:"destroy",value:function(){var e=this.core;p.debug("eyeson::destroy"),clearInterval(e.keepRoomAlive),clearInterval(e.pollingFallbackInterval),e.eventHandler.destroy(),e.eventHandler=new no}},{key:"send",value:function(e){return e._src="client",this.core.eventHandler.send(e)}},{key:"throttledSend",value:function(e){var t=this;return this._throttledSend||(this._throttledSend=v((function(e){return t.send(e)}),500)),this._throttledSend(e)}},{key:"createInstance",value:function(){return new e}}]),e}();const jo=new Fo;function Vo(e){return function(e){if(Array.isArray(e))return j(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||V(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const Uo=function(){function e(t){c(this,e),this.roomUrl=t}return d(e,[{key:"search",value:function(e){return this.request("".concat(this.roomUrl,"/search?q=").concat(e)).then((function(e){return e.data}))}},{key:"random",value:function(){return this.request("".concat(this.roomUrl,"/random")).then((function(e){return e.data}))}},{key:"trending",value:function(){var e=this;return this.request("".concat(this.roomUrl,"/trending?limit=9")).then((function(t){var n=t.data;return e.staff().then((function(e){return[].concat(Vo(n),Vo(e))}))}))}},{key:"staff",value:function(){return this.request("".concat(this.roomUrl,"/staff")).then((function(e){return e.data}))}},{key:"randomForQuery",value:function(e){var t=this;return new Promise((function(n,r){t.search(e).then((function(e){return Array.isArray(e)?e.filter((function(e){return e.images.original_mp4.mp4_size>=4e4})):[]})).then((function(e){if(0===e.length)throw new TypeError("No data found");n(e[Math.floor(Math.random()*e.length)])})).catch(r)}))}},{key:"request",value:function(e){return fetch(new Request(e)).then((function(e){return e.json()})).catch((function(t){return p.warn("GiphyApi",e,t),{data:[]}}))}}]),e}();function No(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return Wo(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Wo(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){a=!0,o=e},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}function Wo(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}const Ho=function(){function e(){c(this,e),this.level=0,this.instant=0,this.silenceDuration=0,this.intervalCounter=0,this.track=null,this.context=null,this.source=null,this.analyser=null,this.volumes=null,this.listener=[],this.timer=null,this.errorTimer=null,this.boundOnTrackEnded=this.onTrackEnded.bind(this),this.initError=!1,this.init()}return d(e,[{key:"init",value:function(){var e=window.AudioContext||window.webkitAudioContext;void 0!==e?(this.context=new e,this.context.onstatechange=function(e){var t=e.target;"suspended"===t.state&&p.error("SoundMeter::init AudioContext: ",t.state)}):p.error("AudioContext is not available. Probably the current user agent does not support this feature. Use the feature detector to hide not supported elements. Any call on onUpdate will not send values.")}},{key:"connectToSource",value:function(e){var t=this;if(!this.context)return this;if(!e||e.getAudioTracks().length<1)return this.initError=!0,this.onTrackEnded(),this;p.debug("SoundMeter::connectToSource",e);var n=U(e.getAudioTracks(),1);if(this.track=n[0],"live"!==this.track.readyState)return this.initError=!0,this.onTrackEnded(),this;this.track.addEventListener("ended",this.boundOnTrackEnded),this.source=this.context.createMediaStreamSource(e);var r=this.context.createAnalyser();return r.fftSize=512,r.minDecibels=-127,r.maxDecibels=0,r.smoothingTimeConstant=.5,this.source.connect(r),this.analyser=r,this.volumes=new Uint8Array(r.frequencyBinCount),!this.running&&this.listener.length>0&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100)),this}},{key:"analyse",value:function(){var e=this,t=this.analyser,n=this.volumes,r=this.level;if(t){t.getByteFrequencyData(n);var i,o=0,s=No(n);try{for(s.s();!(i=s.n()).done;){o+=i.value}}catch(e){s.e(e)}finally{s.f()}var a=o/n.length,c=Math.min(Math.round(100*a/127),100);if(0===r&&0===c&&10===this.intervalCounter&&(this.silenceDuration++,this.silenceDuration>30&&!this.errorTimer&&(this.errorTimer=setTimeout((function(){e.emit({warning:"MicrophoneSilenceWarning"}),e.resetSilenceCounter()}),1e3))),r!==c)this.silenceDuration>0&&this.resetSilenceCounter(),Math.abs(r-c)>=1&&(this.level=c,this.emit({value:c}));this.intervalCounter<10&&this.intervalCounter++}}},{key:"resetSilenceCounter",value:function(){clearTimeout(this.errorTimer),this.errorTimer=null,this.silenceDuration=0}},{key:"stop",value:function(){this.offUpdate(),this.track&&(this.track.removeEventListener("ended",this.boundOnTrackEnded),this.track=null),this.analyser&&(this.analyser.disconnect(),this.analyser=null),this.source&&(this.source.disconnect(),this.source=null),this.volumes=null,this.context&&this.context.stop&&"closed"!==this.context.state&&(this.context.onstatechange=null,this.context.close(),this.context=null)}},{key:"onUpdate",value:function(e){var t=this;this.listener.push(e),this.initError?this.onTrackEnded():!this.running&&this.context&&this.track&&(this.running=!0,this.timer=setInterval((function(){return t.analyse()}),100))}},{key:"offUpdate",value:function(){clearTimeout(this.errorTimer),this.listener.length=0,this.running&&(clearInterval(this.timer),this.running=!1)}},{key:"onTrackEnded",value:function(){this.emit({error:"EyesonMicrophoneError"}),this.stop()}},{key:"emit",value:function(e){this.listener.forEach((function(t){return t(e)}))}}]),e}();const zo=function(){function e(){c(this,e),this._listener=[],this._monitor=null,this._running=!1,this.state=null}var t;return d(e,[{key:"onUpdate",value:function(e){"function"==typeof e&&this._listener.push(e)}},{key:"offUpdate",value:function(e){"function"==typeof e?this._listener=this._listener.filter((function(t){return t!==e})):this._listener.length=0}},{key:"_emit",value:function(e){var t=e[e.length-1].state;t!==this.state&&(this.state=t,p.debug("SystemPressureMonitor::emit",t),this._listener.forEach((function(e){try{e(t)}catch(e){p.error("SystemPressureMonitor::emit",e)}})))}},{key:"start",value:(t=Qe(et().mark((function e(){return et().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!1!==Xe.canMonitorSystemPressure()){e.next=3;break}return p.error("SystemPressureMonitor is not supported"),e.abrupt("return");case 3:if(e.prev=3,this._monitor||(this._monitor=new PressureObserver(this._emit.bind(this),{sampleRate:1})),this._running){e.next=9;break}return e.next=8,this._monitor.observe("cpu");case 8:this._running=!0;case 9:null===this.state&&this._emit([{state:"nominal"}]),p.debug("SystemPressureMonitor::start"),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(3),p.error("SystemPressureMonitor::start",e.t0);case 16:case"end":return e.stop()}}),e,this,[[3,13]])}))),function(){return t.apply(this,arguments)})},{key:"stop",value:function(){this._monitor&&this._running&&(this._monitor.disconnect(),this._running=!1)}},{key:"destroy",value:function(){this.stop(),this.offUpdate(),this.state=null,this._monitor=null}}]),e}(),Go=jo})(),r})())); //# sourceMappingURL=eyeson.js.map \ No newline at end of file diff --git a/dist/eyeson.js.map b/dist/eyeson.js.map index 014ee94f4bae2253be7ef45a62b96f674e0bed20..74c373b7de9620a39a0b183f0dd85d418a459717 100644 --- a/dist/eyeson.js.map +++ b/dist/eyeson.js.map @@ -1 +1 @@ -{"version":3,"file":"eyeson.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,SAAU,GAAIH,GACK,iBAAZC,QACdA,QAAgB,OAAID,IAEpBD,EAAa,OAAIC,GAClB,CATD,CASGK,MAAM,I,iCCTT;;;;;;cAME,WACA,aAGA,IAAIC,EAAc,CAChB,UAAY,EACZ,QAAU,GAIRP,EAAQO,SAAmBC,SAAWA,QAAWC,KAMjDC,EAAcH,SAAmBL,IAAYA,EAG7CS,EAAaJ,EAAyB,QAAKJ,IAAWA,EAAOS,UAAYT,EAGzEU,EAAaH,GAAeC,GAA+B,iBAAV,EAAAG,GAAsB,EAAAA,GACvED,GAAeA,EAAWE,SAAWF,GAAcA,EAAWL,SAAWK,GAAcA,EAAWP,OAASO,IAC7Gb,EAAOa,GAQT,IAAIG,EAAiBC,KAAKC,IAAI,EAAG,IAAM,EAGnCC,EAAU,UAMVC,EAAcC,OAAOC,UAGrBC,EAAiBH,EAAYG,eAG7BC,EAAWJ,EAAYI,SAW3B,SAASC,EAAWC,GAElB,OADAA,EAASC,OAAOD,IACFE,OAAO,GAAGC,cAAgBH,EAAOI,MAAM,EACvD,CAsFA,SAASC,EAAOL,GAEd,OADAA,EAASM,EAAKN,GACP,uBAAuBO,KAAKP,GAC/BA,EACAD,EAAWC,EACjB,CASA,SAASQ,EAAOC,EAAQC,GACtB,IAAK,IAAIC,KAAOF,EACVZ,EAAee,KAAKH,EAAQE,IAC9BD,EAASD,EAAOE,GAAMA,EAAKF,EAGjC,CASA,SAASI,EAAWC,GAClB,OAAgB,MAATA,EACHf,EAAWe,GACXhB,EAASc,KAAKE,GAAOV,MAAM,GAAI,EACrC,CAyBA,SAASW,EAAQf,GACf,OAAOC,OAAOD,GAAQgB,QAAQ,eAAgB,MAChD,CAUA,SAASC,EAAOC,EAAOR,GACrB,IAAIS,EAAc,KAIlB,OA/FF,SAAcV,EAAQC,GACpB,IAAIU,GAAS,EACTC,EAASZ,EAASA,EAAOY,OAAS,EAEtC,GAAqB,iBAAVA,GAAsBA,GAAU,GAAKA,GAAU/B,EACxD,OAAS8B,EAAQC,GACfX,EAASD,EAAOW,GAAQA,EAAOX,QAGjCD,EAAOC,EAAQC,EAEnB,CAiFEY,CAAKJ,GAAO,SAASJ,EAAOM,GAC1BD,EAAcT,EAASS,EAAaL,EAAOM,EAAOF,EACpD,IACOC,CACT,CASA,SAASb,EAAKN,GACZ,OAAOC,OAAOD,GAAQgB,QAAQ,WAAY,GAC5C,CAk+BA,IAAIO,EAt9BJ,SAASC,EAAMC,GAGb,IAAIC,EAAUpD,EAGVqD,EAAkBF,GAAmB,iBAANA,GAAoC,UAAlBZ,EAAWY,GAG5DE,IACFD,EAAUD,EACVA,EAAK,MAIP,IAAIG,EAAMF,EAAQG,WAAa,CAAC,EAG5BC,EAAYF,EAAIE,WAAa,GAEjCL,IAAOA,EAAKK,GAGZ,IA4CIC,EAkBAC,EA3IcvB,EAAQwB,EACtBC,EA+EAC,EAAaR,IACXC,EAAIO,WACN,aAAa5B,KAAKkB,KAAQ,eAAelB,KAAKT,EAASA,YAGvDsC,EAAc,SACdC,EAAkBV,EAAkBS,EAAc,4BAClDE,EAAcX,EAAkBS,EAAc,cAC9CG,EAAaZ,GAAmBD,EAAQc,KAAQ,cAAgB3B,EAAWa,EAAQc,MACnFC,EAAed,EAAkBS,EAAc,gBAG/CI,EAAO,SAASjC,KAAKgC,IAAcb,EAAQc,KAG3CE,EAAQF,GAAQ3B,EAAWa,EAAQiB,cAAgBL,EAGnDM,EAAQJ,EAAO,IAAM,IAGrBK,EAAOL,EAAO,IAAM,IAGpBM,EAAMpB,EAAQqB,UAAY,CAAC,EAO3BC,EAAQtB,EAAQuB,WAAavB,EAAQsB,MAGrCE,EAAazD,EAAQc,KAAK2C,EAAcvB,GAAmBqB,EAASA,EAAM,aAAenC,EAAWmC,IACpGE,EACCF,EAAQ,KAQTG,EAAO1B,EAGP2B,EAAc,GAGdC,EAAa,KAGbC,EAAc7B,GAAMK,EAGpByB,EAAUD,GAAeN,GAAiC,mBAAjBA,EAAMO,SAAyBP,EAAMO,UAM9EC,EA2KKvC,EA3Kc,CACrB,CAAE,MAAS,WAAY,QAAW,QAClC,UACA,CAAE,MAAS,SAAU,QAAW,eAChC,OACA,SACA,WACA,SACA,QACA,UAkKuB,SAASwC,EAAQC,GACtC,OAAOD,GAAUE,OAAO,OACtBD,EAAME,SAAW7C,EAAQ2C,IACvB,MAAO,KAAKG,KAAKpC,KAAQiC,EAAMI,OAASJ,EAC9C,IAlKEK,EA8LJ,SAAiBC,GACf,OAAO/C,EAAO+C,GAAS,SAASP,EAAQC,GACtC,OAAOD,GAAUE,OAAO,OACtBD,EAAME,SAAW7C,EAAQ2C,IACvB,MAAO,KAAKG,KAAKpC,KAAQiC,EAAMI,OAASJ,EAC9C,GACF,CApMWO,CAAQ,CACjB,YACA,QACA,gBACA,SACA,SACA,WACA,WACA,SACA,QACA,SACA,eACA,OACA,YACA,WACA,YACA,YACA,UACA,CAAE,MAAS,iBAAkB,QAAW,4BACxC,SACA,eACA,WACA,YACA,QACA,SACA,WACA,CAAE,MAAS,mBAAoB,QAAW,kBAC1C,YACA,CAAE,MAAS,OAAQ,QAAW,+BAC9B,WACA,cACA,CAAE,MAAS,cAAe,QAAW,QACrC,UACA,WACA,UACA,WACA,cACA,CAAE,MAAS,iBAAkB,QAAW,aACxC,CAAE,MAAS,aAAc,QAAW,aACpC,aACA,CAAE,MAAS,aAAc,QAAW,SACpC,QACA,CAAE,MAAS,QAAS,QAAW,OAC/B,WACA,SACA,CAAE,MAAS,SAAU,QAAW,sBAChC,CAAE,MAAS,gBAAiB,QAAW,kBACvC,CAAE,MAAS,UAAW,QAAW,yBACjC,CAAE,MAAS,kBAAmB,QAAW,SACzC,CAAE,MAAS,KAAM,QAAW,YAC5B,CAAE,MAAS,KAAM,QAAW,QAC5B,WAIEC,EAAUC,EAAW,CACvB,CAAE,MAAS,aAAc,QAAW,QACpC,aACA,CAAE,MAAS,WAAY,QAAW,YAClC,CAAE,MAAS,YAAa,QAAW,YACnC,CAAE,MAAS,YAAa,QAAW,YACnC,CAAE,MAAS,YAAa,QAAW,YACnC,CAAE,MAAS,YAAa,QAAW,WACnC,CAAE,MAAS,YAAa,QAAW,WACnC,CAAE,MAAS,iBAAkB,QAAW,WACxC,CAAE,MAAS,YAAa,QAAW,WACnC,CAAE,MAAS,iBAAkB,QAAW,WACxC,YACA,QACA,OACA,OACA,SACA,SACA,CAAE,MAAS,cAAe,QAAW,+BACrC,QACA,OACA,WACA,mBACA,cACA,WACA,cACA,CAAE,MAAS,QAAS,QAAW,QAC/B,MACA,WACA,CAAE,MAAS,WAAY,QAAW,QAClC,SAIEC,EAmFJ,SAAyBJ,GACvB,OAAO/C,EAAO+C,GAAS,SAASP,EAAQ3C,EAAOH,GAE7C,OAAO8C,IACL3C,EAAMoD,IACNpD,EAAM,0BAA0B+C,KAAKK,KACrCP,OAAO,MAAQ5C,EAAQJ,GAAO,kBAAmB,KAAKkD,KAAKpC,KACxDd,CACP,GACF,CA5FmB0D,CAAgB,CACjC,MAAS,CAAE,KAAQ,EAAG,OAAU,EAAG,KAAQ,GAC3C,QAAW,CAAC,EACZ,OAAU,CAAC,EACX,OAAU,CAAE,OAAU,EAAG,cAAe,GACxC,KAAQ,CAAE,YAAe,GACzB,iBAAkB,CAAE,KAAQ,GAC5B,WAAc,CAAE,SAAY,GAC5B,OAAU,CAAE,YAAa,EAAG,MAAS,GACrC,GAAM,CAAE,SAAY,GACpB,IAAO,CAAC,EACR,OAAU,CAAC,EACX,OAAU,CAAC,EACX,GAAM,CAAC,EACP,UAAa,CAAE,KAAQ,EAAG,WAAY,GACtC,SAAY,CAAE,KAAQ,GACtB,SAAY,CAAE,QAAS,EAAI,IAAO,GAClC,MAAS,CAAE,MAAS,GACpB,KAAQ,CAAC,EACT,QAAW,CAAE,WAAY,EAAG,YAAa,EAAG,YAAa,EAAG,YAAa,GACzE,KAAQ,CAAE,YAAe,EAAG,mBAAoB,GAChD,OAAU,CAAE,GAAM,EAAG,MAAS,KAI5BC,EA2FJ,SAAeN,GACb,OAAO/C,EAAO+C,GAAS,SAASP,EAAQC,GACtC,IAAIE,EAAUF,EAAME,SAAW7C,EAAQ2C,GAMvC,OALKD,IAAWA,EACVE,OAAO,MAAQC,EAAU,wBAAyB,KAAKC,KAAKpC,MAEhEgC,EAveR,SAAmBa,EAAIV,EAASE,GAI9B,IAAI/B,EAAO,CACT,OAAQ,KACR,IAAQ,uBACR,IAAQ,MACR,IAAQ,IACR,IAAQ,qBACR,MAAQ,sBACR,IAAQ,0BACR,IAAQ,KACR,KAAQ,WACR,MAAQ,OACR,MAAQ,KACR,OAAQ,MA8BV,OA3BI6B,GAAWE,GAAS,QAAQvD,KAAK+D,KAAQ,mBAAmB/D,KAAK+D,KAChEvC,EAAOA,EAAK,UAAU8B,KAAKS,OAC9BA,EAAK,WAAavC,GAGpBuC,EAAKrE,OAAOqE,GAERV,GAAWE,IACbQ,EAAKA,EAAGtD,QAAQ2C,OAAOC,EAAS,KAAME,IAGnCzD,EACHiE,EAAGtD,QAAQ,QAAS,OACjBA,QAAQ,SAAU,OAClBA,QAAQ,gBAAiB,UACzBA,QAAQ,cAAe,OACvBA,QAAQ,oBAAqB,MAC7BA,QAAQ,iBAAkB,MAC1BA,QAAQ,SAAU,OAClBA,QAAQ,KAAM,KACdA,QAAQ,6BAA8B,IACtCA,QAAQ,gBAAiB,UACzBA,QAAQ,yBAA0B,MAClCA,QAAQ,6BAA8B,MACtCuD,MAAM,QAAQ,GAIrB,CAwbiBC,CAAUf,EAAQG,EAASF,EAAMI,OAASJ,IAE9CD,CACT,GACF,CArGSgB,CAAM,CACb,gBACA,QACA,UACA,SACA,CAAE,MAAS,YAAa,QAAW,QACnC,SACA,CAAE,MAAS,gBAAiB,QAAW,aACvC,SACA,UACA,SACA,QACA,UACA,aACA,UACA,UACA,OACA,SACA,UACA,SACA,aACA,QACA,SACA,QACA,YACA,QACA,QACA,WACA,YACA,MACA,cACA,aA+EF,SAASN,EAAWH,GAClB,OAAO/C,EAAO+C,GAAS,SAASP,EAAQC,GACtC,IAAIE,EAAUF,EAAME,SAAW7C,EAAQ2C,GAiBvC,OAhBKD,IAAWA,EACVE,OAAO,MAAQC,EAAU,iBAAkB,KAAKC,KAAKpC,IACrDkC,OAAO,MAAQC,EAAU,gBAAiB,KAAKC,KAAKpC,IACpDkC,OAAO,MAAQC,EAAU,6CAA8C,KAAKC,KAAKpC,OAGhFgC,EAASxD,OAAQyD,EAAMI,QAAUH,OAAOC,EAAS,KAAKrD,KAAKmD,EAAMI,OAAUJ,EAAMI,MAAQL,GAAQc,MAAM,MAAM,KAAO,SAAShE,KAAKkD,EAAO,MAC5IA,EAAO,IAAM,IAAMA,EAAO,IAG5BC,EAAQA,EAAMI,OAASJ,EACvBD,EAASpD,EAAOoD,EAAO,GACpBzC,QAAQ2C,OAAOC,EAAS,KAAMF,GAC9B1C,QAAQ2C,OAAO,SAAWD,EAAQ,SAAU,KAAM,KAClD1C,QAAQ2C,OAAO,IAAMD,EAAQ,eAAgB,KAAM,WAEjDD,CACT,GACF,CASA,SAASiB,EAAWC,GAClB,OAAO1D,EAAO0D,GAAU,SAASlB,EAAQG,GACvC,OAAOH,IAAWE,OAAOC,EACvB,2DAA4D,KAAKC,KAAKpC,IAAO,GAAG,IAAM,IAC1F,GACF,CA4JA,GA5IA+B,IAAWA,EAAS,CAACA,IAQjB,cAAcjD,KAAK+D,KAAQJ,IAC1BnC,EAAO,kDAAkD8B,KAAKpC,MACjEyC,EAAU5D,EAAKyB,EAAK,IAEjBf,QAAQ,0BAA2B,KACjC,MAGHoD,IAAiBF,EACnBA,EAAUC,EAAW,CAACC,IACbA,GAAgBF,IACzBA,EAAUA,EACPlD,QAAQ2C,OAAO,KAAO5C,EAAQqD,GAAgB,YAAa,KAAMA,EAAe,KAChFpD,QAAQ2C,OAAO,KAAO5C,EAAQqD,GAAgB,eAAgB,KAAMA,EAAe,SAGnFrC,EAAO,gBAAgB8B,KAAKK,MAC/BA,EAAUnC,EAAK,IAGb,iBAAiBxB,KAAKkB,KACxByC,GAAWA,EAAUA,EAAU,IAAM,IAAM,aAGjC,cAARH,GAAwB,YAAYxD,KAAKkB,IAC3C2B,EAAYwB,KAAK,sCAGP,MAARb,GAAgB,qBAAqBxD,KAAKkB,IAE5C2C,GADArC,EAAOP,EAAMC,EAAGT,QAAQ,iBAAkB,MACtBoD,aACpBF,EAAUnC,EAAKmC,SAGR,MAAM3D,KAAK2D,IAClBH,IAASA,EAAO,UAChBO,EAAK,QAAUvC,EAAO,gBAAgB8B,KAAKpC,IACvC,IAAMM,EAAK,GAAGf,QAAQ,KAAM,KAC5B,KAGW,aAAR+C,GAAuB,YAAYxD,KAAK+D,GAC/CA,EAAK,UAGGF,GAAgC,UAAhBA,IACpB,SAAS7D,KAAKwD,KAAU,qBAAqBxD,KAAKkB,IAAQ,WAAWlB,KAAK2D,KAC3E,cAAc3D,KAAK+D,IAAO,UAAU/D,KAAKwD,IAAS,eAAexD,KAAKkB,IACzEsC,EAAO,kBACPO,EAAK,cAAc/D,KAAK+D,GAAMA,EAAK,WAGpB,QAARP,GACF,UAAUxD,KAAKkB,KAClB6C,EAAK,UACLlB,EAAYyB,QAAQ,iBAElB,wBAAwBtE,KAAKkB,IAC/B2B,EAAYyB,QAAQ,gBAIP,cAARd,GAAwB,YAAYxD,KAAKkB,GAChD2B,EAAYwB,KAAK,cAGF,YAARb,IAAuBhC,EAAO,wBAAwB8B,KAAKpC,IAClE2B,EAAYwB,KAAK,0BAA4B7C,EAAK,IAGnC,WAARgC,IAAsBhC,EAAO,0BAA0B8B,KAAKpC,KACnE6C,IAAOA,EAAK,cACZJ,IAAYA,EAAUnC,EAAK,MAGnBgC,IAAShC,GAAQ,iBAAiBxB,KAAKkB,IAAO,yBAAyBoC,KAAKE,KAEhFA,IAASG,GAAW,kBAAkB3D,KAAKkB,EAAGrB,MAAMqB,EAAGqD,QAAQ/C,EAAO,KAAO,MAE/EgC,EAAO,OAGJhC,EAAOmC,GAAWE,GAAgBE,KAClCJ,GAAWE,GAAgB,6CAA6C7D,KAAK+D,MAChFP,EAAO,mBAAmBF,KAAK,cAActD,KAAK+D,GAAMA,EAAKvC,GAAQ,aAIxD,YAARgC,IAAuBhC,GAAQ,uBAAuB8B,KAAKpC,IAAO,GAAG,KAC5E2B,EAAYwB,KAAK,YAAc7C,GAG5BwB,IACHA,EAAUmB,EAAW,CACnB,iKACA,UACA3D,EAAQgD,GACR,qCAIChC,GACW,QAAVyB,GAAoBuB,WAAWxB,GAAW,EAAK,SAC/C,YAAYhD,KAAKwD,KAAU,UAAUxD,KAAKkB,GAAM,QAAU,YAC1D,8BAA8BlB,KAAKkB,KAAQ,yBAAyBlB,KAAKiD,IAAW,WACnFA,GAAU,YAAYjD,KAAKkB,KAAc,UAAN6C,EAAiB,SAAW,YACtD,UAAVd,GAAsB,8BAA8BjD,KAAKwD,IAAS,cAEtEP,EAAS,CAACzB,IAGA,MAARgC,IAAiBhC,GAAQ,4BAA4B8B,KAAKpC,IAAO,GAAG,KACtEsC,GAAQ,UACRO,EAAK,kBAAoB,MAAM/D,KAAKwB,GAAQA,EAAOA,EAAO,MAC1DqB,EAAYyB,QAAQ,iBAGb,iBAAiBtE,KAAKkB,IAC7BsC,EAAO,YACPO,EAAK,oBACLlB,EAAYyB,QAAQ,gBACpBtB,IAAYA,GAAW,gBAAgBM,KAAKpC,IAAO,GAAG,KAGvC,MAARsC,GAA0B,WAAVP,IAAwBzB,EAAO,gBAAgB8B,KAAKpC,MACvEsC,GACFX,EAAYwB,KAAK,kBAAoBb,GAAQR,EAAU,IAAMA,EAAU,KAEzEQ,EAAO,KACPR,EAAUxB,EAAK,IAGbuB,EAAa,CAGf,GA7jBwBrB,EA6jBA,SA5jBtBC,EAAiB,OADHzB,EA6jBDiB,UA5jBkBjB,EAAOwB,GAAY,SAC9C,wCAAwC1B,KAAK2B,IAC1C,UAARA,IAAqBzB,EAAOwB,GAumBpBpB,EAAYkB,EAAOL,EAAQsD,UAAa3C,GAC/C0B,EAAO,YACPO,EAAKvC,EAAKkD,MAAMC,OAAOC,aAAab,IAG7BzD,EAAYkB,EAAOL,EAAQ0D,UAAa3C,GAC/CsB,EAAO,YACPR,GAAWxB,EAAOA,EAAKwB,SAAW,OAAUxB,EAAKsD,MAAQ,IAAMtD,EAAKuD,MAAQ,IAAMvD,EAAKwD,OAGrD,iBAApBzC,EAAI0C,eAA6BzD,EAAO,oBAAoB8B,KAAKpC,KAG/E8B,EAAU,CAACA,EAAST,EAAI0C,eACnBzD,GAAQA,EAAK,GAAK,IAAMwB,EAAQ,KACnCH,EAAYwB,KAAK,MAAQrB,EAAQ,GAAK,SACtCC,IAAWA,EAAO,GAAK,IACvBD,EAAQ,GAAKxB,GAEfwB,EAAkB,MAARQ,EAAe9D,OAAOsD,EAAQ,GAAGkC,QAAQ,IAAMlC,EAAQ,IAG/B,iBAApBT,EAAI0C,cAA4B,wBAAwBjF,KAAKwD,KAC3EX,EAAYwB,KAAK,cAAgBb,EAAO,IAAMR,GAC9CQ,EAAO,KACPR,EAAU,OACVC,EAAS,CAAC,WACVc,EAAK,gBAlEL,GALI9B,IAEFW,GADApB,EAAOS,EAAKkD,KAAKC,QACLC,YAAY,WACxBtB,EAAKA,GAAMvC,EAAK6D,YAAY,WAAa,IAAM7D,EAAK6D,YAAY,eAE9DlD,EAAO,CACT,IACEa,EAAU7B,EAAQmE,QAAQ,gBAAgBtC,QAAQuC,KAAK,KACvD/B,EAAO,SACT,CAAE,MAAMgC,IACDhE,EAAOL,EAAQwD,SAAWnD,EAAK1C,OAAO6F,QAAUxD,EAAQwD,SAC3DnB,EAAO,UACPO,IAAOA,EAAKvC,EAAK,GAAGuC,IAAM,MAE9B,CACKP,IACHA,EAAO,QAEX,KAE4B,iBAAnBrC,EAAQsE,UAAwBtE,EAAQsE,QAAQC,UACtDlE,EAAOL,EAAQsE,WAEY,iBAAjBjE,EAAKmE,WACuB,iBAA1BnE,EAAKmE,SAASC,UACvB/C,EAAYwB,KAAK,QAAU7C,EAAKmE,SAASE,MACzCrC,EAAO,WACPR,EAAUxB,EAAKmE,SAASC,UACY,iBAApBpE,EAAKmE,SAASG,KAC9BjD,EAAYwB,KAAK,YAAcrB,EAAS,QAAUxB,EAAKmE,SAASE,MAChErC,EAAO,QACPR,EAAUxB,EAAKmE,SAASG,KAGvBtC,IACHA,EAAO,UACPZ,EAAOpB,EAAKoB,KACZmB,EAAKvC,EAAKR,SAEVgC,GADAA,EAAU,SAASM,KAAK9B,EAAKwB,UACTA,EAAQ,GAAK,OAkCvCe,EAAKA,GAAMjE,EAAOiE,EACpB,CAYA,GAVIf,IAAYxB,EACV,0CAA0C8B,KAAKN,IAC/C,2BAA2BM,KAAKpC,EAAK,KAAO6B,GAAe1B,EAAI0E,mBAC/D,iBAAiB/F,KAAKkB,IAAO,OAEjC4B,EAAa,KAAK9C,KAAKwB,GAAQ,OAAS,QACxCwB,EAAUA,EAAQvC,QAAQ2C,OAAO5B,EAAO,SAAU,KACjC,QAAdsB,EAAuBR,EAAOD,IAAU,SAASiB,KAAK9B,IAAS,KAGxD,UAARgC,GAA4B,WAARA,GAAqB,mCAAmCxD,KAAK+D,GACnFP,EAAO,sBAGJ,GAAY,WAARA,GAAqBR,EAC5BA,EAAUA,EAAQvC,QAAQ,WAAY,WAGnC,GAAI,YAAYT,KAAK2D,GACT,YAAXA,IACFI,EAAK,MAEQ,YAAXJ,GAAyB,eAAe3D,KAAKkB,IAC/C2B,EAAYyB,QAAQ,oBAInB,IAAK,wBAAwBtE,KAAKwD,MAASA,GAASG,GAAY,eAAe3D,KAAKwD,KAC9E,cAANO,IAAsB,QAAQ/D,KAAKkB,GAInC,GAAY,MAARsC,GAAgBT,EACvB,IAC2B,OAArB5B,EAAQ6E,UACVnD,EAAYyB,QAAQ,mBAExB,CAAE,MAAMkB,GACN3C,EAAYyB,QAAQ,WACtB,MAIQ,iBAAiBtE,KAAK2D,IAAY,WAAW3D,KAAKkB,MAASM,GAC9D4B,OAAOO,EAAQlD,QAAQ,MAAO,MAAQ,aAAc,KAAK6C,KAAKpC,IAAO,GAAG,IACzE8B,IAGJe,IADAvC,EAAO,CAACA,EAAM,OAAOxB,KAAKkB,KACf,IAAMyC,EAAU,KAAME,EAAe,cAAgB,mBAAqB,IAAMrC,EAAK,GAChGwB,EAAU,MAIHxE,MAAQyB,GAAqB,OAAX0D,IACpBZ,GAAeN,GACf,QAAQzC,KAAKwD,IAAS,wBAAwBxD,KAAKkB,IAC3C,WAARsC,GAAqB,uBAAuBxD,KAAK+D,IACzC,MAARP,IACEO,IAAO,OAAO/D,KAAK+D,IAAOf,EAAU,KACrC,iBAAiBhD,KAAK+D,IAAOf,EAAU,GAC5B,GAAXA,IAAiB,cAAchD,KAAKkB,OAElChC,EAAQc,KAAMwB,EAAOP,EAAMZ,KAAKJ,EAAQiB,EAAGT,QAAQvB,EAAS,IAAM,OAAUsC,EAAKgC,OAEzFhC,EAAO,UAAYA,EAAKgC,OAAShC,EAAOA,EAAKwB,SAAW,IAAMxB,EAAO,IACjEtC,EAAQc,KAAKwD,IACX,SAASxD,KAAKwB,IAAe,UAANuC,IACzBA,EAAK,MAEPvC,EAAO,WAAaA,IAIpBA,EAAO,OAASA,EAEdgC,EADEb,EACK7C,EAAO6C,EAAWlC,QAAQ,kBAAmB,UAE7C,QAEL,SAAST,KAAKwB,KAChBuC,EAAK,MAEFhB,IACHC,EAAU,OAGdC,EAAS,CAAC,UACVJ,EAAYwB,KAAK7C,SA1DjBgC,GAAQ,WA6DLhC,GAAQ,8BAA8B8B,KAAKpC,IAAO,GAAG,MAGxDM,EAAO,CAACgD,WAAWhD,EAAKf,QAAQ,UAAW,SAAUe,GAEzC,UAARgC,GAAyC,KAArBhC,EAAK,GAAG3B,OAAO,IACrC2D,EAAO,iBACPV,EAAa,QACbE,EAAUxB,EAAK,GAAG3B,MAAM,GAAI,IAGrBmD,GAAWxB,EAAK,IACrBwB,IAAYxB,EAAK,IAAM,yBAAyB8B,KAAKpC,IAAO,GAAG,MACjE8B,EAAU,MAGZxB,EAAK,IAAM,mCAAmC8B,KAAKpC,IAAO,GAAG,GAE9C,QAAXM,EAAK,IAA2B,QAAXA,EAAK,IAAgBgD,WAAWhD,EAAK,KAAO,IAAgB,UAAVyB,IACzEA,EAAS,CAAC,UAIPF,IAAiBnB,GAAeJ,EAAK,KAIxCyB,IAAWA,EAAO,GAAK,eACvBzB,EAAOA,EAAK,MAAOA,EAAOA,EAAK,IAAW,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,OAAS,EAAIA,EAAO,IAAM,EAAIA,EAAO,OAAS,EAAIA,EAAO,OAAS,EAAIA,EAAO,MAAS,EAAIA,EAAO,OAAS,EAAIA,EAAO,OAAS,EAAIA,EAAO,OAAS,GAAKA,EAAO,MAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,MAAQA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,MAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,MAAQA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAS,GAAe,SAAVyB,EAAoB,KAAO,QAJ1iBA,IAAWA,EAAO,GAAK,eACvBzB,GAAQA,EAAOA,EAAK,IAAW,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,KAAOA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAAM,GAAKA,EAAO,IAAM,GAAKA,EAAO,IAAM,GAAK,MAM7PyB,IAAWA,EAAO,IAAM,KAAOzB,GAAuB,iBAARA,EAAmB,KAAO,OAAOxB,KAAKwB,GAAQ,GAAK,MAErF,UAARgC,KAAsBR,GAAWiD,SAASjD,GAAW,IACvDA,EAAUxB,EACO,UAARgC,GAAoB,oBAAoBxD,KAAKkB,IACtD2B,EAAYyB,QAAQ,aAIZ,SAARd,IAAqBhC,EAAO,eAAe8B,KAAKS,KAClDP,GAAQ,IACRX,EAAYyB,QAAQ,gBACR,QAAR9C,GACFgC,GAAQ,OACRR,EAAU,MAEVQ,GAAQ,SAEVO,EAAKA,EAAGtD,QAAQ2C,OAAO,KAAO5B,EAAO,KAAM,KAG5B,UAARgC,GAAoB,aAAaF,KAAKL,GAAUA,EAAO,KAC9DJ,EAAYyB,QAAQ,gBACpBd,EAAO,gBACPR,EAAU,KAEN,WAAWhD,KAAK+D,IAClBF,EAAe,QACfE,EAAK,YAELA,EAAK,MAIA,kBAAkB/D,KAAKwD,KAAUR,IACxCA,EAAUmB,EAAW,WAGnBnB,GAA2D,GAAhDA,EAAQuB,QAAS/C,EAAO,UAAU8B,KAAKS,KAClD7C,EAAGqD,QAAQ,IAAM/C,EAAO,MAAQ,IAClCuC,EAAKhE,EAAKgE,EAAGtD,QAAQe,EAAM,MAGzBuC,IAA2B,GAArBA,EAAGQ,QAAQf,KAAgBJ,OAAOI,EAAO,OAAOxD,KAAK+D,KAC7DA,EAAKA,EAAGtD,QAAQ2C,OAAO,KAAO5C,EAAQgD,GAAQ,MAAO,KAGnDP,IAAW,qBAAqBjD,KAAKwD,KACrC,4BAA4BxD,KAAKwD,IACzB,UAARA,GAAoB,OAAOxD,KAAK+D,IAAO,aAAa/D,KAAKiD,EAAO,KAChE,6GAA6GjD,KAAKwD,IAASP,EAAO,MAEnIzB,EAAOyB,EAAOA,EAAOnC,OAAS,KAAO+B,EAAYwB,KAAK7C,GAGrDqB,EAAY/B,SACd+B,EAAc,CAAC,IAAMA,EAAY0C,KAAK,MAAQ,MAG5C1B,GAAgBF,GAAWA,EAAQY,QAAQV,GAAgB,GAC7DhB,EAAYwB,KAAK,MAAQR,GAGvBF,GACFd,EAAYwB,MAAM,OAAOrE,KAAK6C,EAAYA,EAAY/B,OAAS,IAAM,GAAK,OAAS6C,GAGjFI,IACFvC,EAAO,cAAc8B,KAAKS,GAC1BtC,EAAmBD,GAAqD,KAA7CuC,EAAGpE,OAAOoE,EAAGjD,OAASU,EAAK,GAAGV,OAAS,GAClEiD,EAAK,CACH,aAAgB,GAChB,OAAWvC,IAASC,EAAoBsC,EAAGtD,QAAQe,EAAK,GAAI,IAAMuC,EAClE,QAAWvC,EAAOA,EAAK,GAAK,KAC5B,SAAY,WACV,IAAIwB,EAAUxE,KAAKwE,QACnB,OAAOxE,KAAK0H,QAAWlD,IAAYvB,EAAoB,IAAMuB,EAAU,KAA4B,IAArBxE,KAAK2H,aAAqB,UAAY,GACtH,KAIC3E,EAAO,mCAAmC8B,KAAKV,MAAW,YAAY5C,KAAK4C,IAC1EmB,IACFA,EAAGoC,aAAe,GAClBpC,EAAGmC,OAASnC,EAAGmC,OAAOzF,QAAQ2C,OAAO,KAAO5B,GAAO,KAGjDgC,IAAS,aAAaxD,KAAKkB,IAC1B6B,GAAe,eAAe/C,KAAKqB,EAAI+E,UAAY/E,EAAIL,YAAc,kBAAkBhB,KAAKkB,KAE/F2B,EAAYyB,QAAQ,WAKpBP,GAAM,QAAQ/D,KAAK+D,EAAGmC,SACd,UAAR1C,GAAoBgB,WAAWxB,IAAY,KAE7Ce,EAAGoC,aAAe,IAGpBjF,IAAOA,EAAK,MAUZ,IAAIF,EAAW,CAAC,EAoJhB,OA5IAA,EAAS6B,YAAc3B,EAWvBF,EAASiC,OAASA,GAAUA,EAAO,GAanCjC,EAAS6C,aAAeA,EAgBxB7C,EAASwC,KAAOA,EAQhBxC,EAAS8B,WAAaA,EAatB9B,EAAS2C,QAAUA,EAQnB3C,EAASE,GAAKA,EAQdF,EAASgC,QAAUQ,GAAQR,EAQ3BhC,EAAS+C,GAAKA,GAAM,CAQlB,aAAgB,KAahB,OAAU,KAQV,QAAW,KAQX,SAAY,WAAa,MAAO,MAAQ,GAG1C/C,EAASC,MAAQA,EACjBD,EAASzB,SAjlBT,WACE,OAAOf,KAAKqE,aAAe,EAC7B,EAilBI7B,EAASgC,SACXH,EAAYyB,QAAQtB,GAElBhC,EAASwC,MACXX,EAAYyB,QAAQd,GAElBO,GAAMP,IAAUO,GAAMrE,OAAOqE,GAAIC,MAAM,KAAK,IAAOD,GAAMP,EAAKQ,MAAM,KAAK,KAAML,IACjFd,EAAYwB,KAAKV,EAAU,IAAMI,EAAK,IAAM,MAAQA,GAElDlB,EAAY/B,SACdE,EAAS6B,YAAcA,EAAY0C,KAAK,MAEnCvE,CACT,CAKeC,GAOblD,EAAKiD,SAAWA,OAKf,KAFD,aACE,OAAOA,CACR,+BAaL,EAAEX,KAAK7B,K;;;;;;CCtuCP,WACC,aAEA,IAAIgE,EAA6B,oBAAXjE,aAAqD,IAApBA,OAAOiE,SAA2BjE,OAAOiE,SAAW,CAAC,EACxG6D,EAA8CnI,EAAOD,QAErDqI,EAAK,WAsDR,IArDA,IAAIC,EAEAC,EAAQ,CACX,CACC,oBACA,iBACA,oBACA,oBACA,mBACA,mBAGD,CACC,0BACA,uBACA,0BACA,0BACA,yBACA,yBAID,CACC,0BACA,yBACA,iCACA,yBACA,yBACA,yBAGD,CACC,uBACA,sBACA,uBACA,uBACA,sBACA,sBAED,CACC,sBACA,mBACA,sBACA,sBACA,qBACA,sBAIEC,EAAI,EACJC,EAAIF,EAAM1F,OACV6F,EAAM,CAAC,EAEJF,EAAIC,EAAGD,IAEb,IADAF,EAAMC,EAAMC,KACDF,EAAI,KAAM/D,EAAU,CAC9B,IAAKiE,EAAI,EAAGA,EAAIF,EAAIzF,OAAQ2F,IAC3BE,EAAIH,EAAM,GAAGC,IAAMF,EAAIE,GAExB,OAAOE,CACR,CAGD,OAAO,CACP,CAjEQ,GAmELC,EAAe,CAClBC,OAAQP,EAAGQ,iBACXC,MAAOT,EAAGU,iBAGPC,EAAa,CAChBC,QAAS,SAAUC,EAASC,GAC3B,OAAO,IAAIC,QAAQ,SAAUC,EAASC,GACrC,IAAIC,EAAsB,WACzBhJ,KAAKiJ,IAAI,SAAUD,GACnBF,GACD,EAAEI,KAAKlJ,MAEPA,KAAKmJ,GAAG,SAAUH,GAIlB,IAAII,GAFJT,EAAUA,GAAW3E,EAASqF,iBAEFvB,EAAGwB,mBAAmBV,GAE9CQ,aAAyBP,SAC5BO,EAAcG,KAAKP,GAAqBQ,MAAMT,EAEhD,EAAEG,KAAKlJ,MACR,EACAyJ,KAAM,WACL,OAAO,IAAIZ,QAAQ,SAAUC,EAASC,GACrC,GAAK/I,KAAK0J,aAAV,CAKA,IAAIC,EAAmB,WACtB3J,KAAKiJ,IAAI,SAAUU,GACnBb,GACD,EAAEI,KAAKlJ,MAEPA,KAAKmJ,GAAG,SAAUQ,GAElB,IAAIP,EAAgBpF,EAAS8D,EAAG8B,kBAE5BR,aAAyBP,SAC5BO,EAAcG,KAAKI,GAAkBH,MAAMT,EAZ5C,MAFCD,GAgBF,EAAEI,KAAKlJ,MACR,EACA6J,OAAQ,SAAUlB,EAASC,GAC1B,OAAO5I,KAAK0J,aAAe1J,KAAKyJ,OAASzJ,KAAK0I,QAAQC,EAASC,EAChE,EACAkB,SAAU,SAAUnI,GACnB3B,KAAKmJ,GAAG,SAAUxH,EACnB,EACAoI,QAAS,SAAUpI,GAClB3B,KAAKmJ,GAAG,QAASxH,EAClB,EACAwH,GAAI,SAAUa,EAAOrI,GACpB,IAAIsI,EAAY7B,EAAa4B,GACzBC,GACHjG,EAASkG,iBAAiBD,EAAWtI,GAAU,EAEjD,EACAsH,IAAK,SAAUe,EAAOrI,GACrB,IAAIsI,EAAY7B,EAAa4B,GACzBC,GACHjG,EAASmG,oBAAoBF,EAAWtI,GAAU,EAEpD,EACAyI,IAAKtC,GAGDA,GAULlH,OAAOyJ,iBAAiB5B,EAAY,CACnCiB,aAAc,CACbY,IAAK,WACJ,OAAOC,QAAQvG,EAAS8D,EAAG0C,mBAC5B,GAED7B,QAAS,CACR8B,YAAY,EACZH,IAAK,WACJ,OAAOtG,EAAS8D,EAAG0C,kBACpB,GAEDE,UAAW,CACVD,YAAY,EACZH,IAAK,WAEJ,OAAOC,QAAQvG,EAAS8D,EAAG6C,mBAC5B,KAIE9C,EACHnI,EAAOD,QAAUgJ,EAEjB1I,OAAO0I,WAAaA,GAjChBZ,EACHnI,EAAOD,QAAU,CAACiL,WAAW,GAE7B3K,OAAO0I,WAAa,CAACiC,WAAW,EAgClC,CAlLD,E,uBCDA,MAAME,EAAW,CAIjBA,mBAA8B,WAC5B,OAAOpK,KAAKqK,SAAS9J,SAAS,IAAI+J,UAAU,EAAG,GACjD,GAGAF,EAASG,WAAaH,EAASI,qBAG/BJ,EAASK,WAAa,SAASC,GAC7B,OAAOA,EAAK3J,OAAOiE,MAAM,MAAM2F,KAAIC,GAAQA,EAAK7J,QAClD,EAEAqJ,EAASS,cAAgB,SAASH,GAEhC,OADcA,EAAK1F,MAAM,QACZ2F,KAAI,CAACG,EAAMjJ,KAAWA,EAAQ,EACzC,KAAOiJ,EAAOA,GAAM/J,OAAS,QACjC,EAGAqJ,EAASW,eAAiB,SAASL,GACjC,MAAMM,EAAWZ,EAASS,cAAcH,GACxC,OAAOM,GAAYA,EAAS,EAC9B,EAGAZ,EAASa,iBAAmB,SAASP,GACnC,MAAMM,EAAWZ,EAASS,cAAcH,GAExC,OADAM,EAASE,QACFF,CACT,EAGAZ,EAASe,YAAc,SAAST,EAAMU,GACpC,OAAOhB,EAASK,WAAWC,GAAMW,QAAOT,GAAiC,IAAzBA,EAAKrF,QAAQ6F,IAC/D,EAMAhB,EAASkB,eAAiB,SAASV,GACjC,IAAIW,EAGFA,EADmC,IAAjCX,EAAKrF,QAAQ,gBACPqF,EAAKN,UAAU,IAAItF,MAAM,KAEzB4F,EAAKN,UAAU,IAAItF,MAAM,KAGnC,MAAMwG,EAAY,CAChBC,WAAYF,EAAM,GAClBG,UAAW,CAAC,EAAG,MAAO,EAAG,QAAQH,EAAM,KAAOA,EAAM,GACpDI,SAAUJ,EAAM,GAAGK,cACnBC,SAAU5E,SAASsE,EAAM,GAAI,IAC7BO,GAAIP,EAAM,GACVQ,QAASR,EAAM,GACfS,KAAM/E,SAASsE,EAAM,GAAI,IAEzB5I,KAAM4I,EAAM,IAGd,IAAK,IAAI9D,EAAI,EAAGA,EAAI8D,EAAMzJ,OAAQ2F,GAAK,EACrC,OAAQ8D,EAAM9D,IACZ,IAAK,QACH+D,EAAUS,eAAiBV,EAAM9D,EAAI,GACrC,MACF,IAAK,QACH+D,EAAUU,YAAcjF,SAASsE,EAAM9D,EAAI,GAAI,IAC/C,MACF,IAAK,UACH+D,EAAUW,QAAUZ,EAAM9D,EAAI,GAC9B,MACF,IAAK,QACH+D,EAAUY,MAAQb,EAAM9D,EAAI,GAC5B+D,EAAUa,iBAAmBd,EAAM9D,EAAI,GACvC,MACF,aAC8B6E,IAAxBd,EAAUD,EAAM9D,MAClB+D,EAAUD,EAAM9D,IAAM8D,EAAM9D,EAAI,IAKxC,OAAO+D,CACT,EAIApB,EAASmC,eAAiB,SAASf,GACjC,MAAMgB,EAAM,GACZA,EAAInH,KAAKmG,EAAUC,YAEnB,MAAMC,EAAYF,EAAUE,UACV,QAAdA,EACFc,EAAInH,KAAK,GACc,SAAdqG,EACTc,EAAInH,KAAK,GAETmH,EAAInH,KAAKqG,GAEXc,EAAInH,KAAKmG,EAAUG,SAAS/K,eAC5B4L,EAAInH,KAAKmG,EAAUK,UACnBW,EAAInH,KAAKmG,EAAUO,SAAWP,EAAUM,IACxCU,EAAInH,KAAKmG,EAAUQ,MAEnB,MAAMrJ,EAAO6I,EAAU7I,KAkBvB,OAjBA6J,EAAInH,KAAK,OACTmH,EAAInH,KAAK1C,GACI,SAATA,GAAmB6I,EAAUS,gBAC7BT,EAAUU,cACZM,EAAInH,KAAK,SACTmH,EAAInH,KAAKmG,EAAUS,gBACnBO,EAAInH,KAAK,SACTmH,EAAInH,KAAKmG,EAAUU,cAEjBV,EAAUW,SAAgD,QAArCX,EAAUG,SAASC,gBAC1CY,EAAInH,KAAK,WACTmH,EAAInH,KAAKmG,EAAUW,WAEjBX,EAAUa,kBAAoBb,EAAUY,SAC1CI,EAAInH,KAAK,SACTmH,EAAInH,KAAKmG,EAAUa,kBAAoBb,EAAUY,QAE5C,aAAeI,EAAIjG,KAAK,IACjC,EAKA6D,EAASqC,gBAAkB,SAAS7B,GAClC,OAAOA,EAAKN,UAAU,IAAItF,MAAM,IAClC,EAIAoF,EAASsC,YAAc,SAAS9B,GAC9B,IAAIW,EAAQX,EAAKN,UAAU,GAAGtF,MAAM,KACpC,MAAM2H,EAAS,CACbC,YAAa3F,SAASsE,EAAML,QAAS,KAUvC,OAPAK,EAAQA,EAAM,GAAGvG,MAAM,KAEvB2H,EAAOnI,KAAO+G,EAAM,GACpBoB,EAAOE,UAAY5F,SAASsE,EAAM,GAAI,IACtCoB,EAAOG,SAA4B,IAAjBvB,EAAMzJ,OAAemF,SAASsE,EAAM,GAAI,IAAM,EAEhEoB,EAAOI,YAAcJ,EAAOG,SACrBH,CACT,EAIAvC,EAAS4C,YAAc,SAASC,GAC9B,IAAIC,EAAKD,EAAML,iBACoBN,IAA/BW,EAAME,uBACRD,EAAKD,EAAME,sBAEb,MAAML,EAAWG,EAAMH,UAAYG,EAAMF,aAAe,EACxD,MAAO,YAAcG,EAAK,IAAMD,EAAMzI,KAAO,IAAMyI,EAAMJ,WACvC,IAAbC,EAAiB,IAAMA,EAAW,IAAM,MAC/C,EAKA1C,EAASgD,YAAc,SAASxC,GAC9B,MAAMW,EAAQX,EAAKN,UAAU,GAAGtF,MAAM,KACtC,MAAO,CACLqI,GAAIpG,SAASsE,EAAM,GAAI,IACvB+B,UAAW/B,EAAM,GAAGhG,QAAQ,KAAO,EAAIgG,EAAM,GAAGvG,MAAM,KAAK,GAAK,WAChEuI,IAAKhC,EAAM,GACXiC,WAAYjC,EAAM1K,MAAM,GAAG0F,KAAK,KAEpC,EAIA6D,EAASqD,YAAc,SAASC,GAC9B,MAAO,aAAeA,EAAgBL,IAAMK,EAAgBC,cACvDD,EAAgBJ,WAA2C,aAA9BI,EAAgBJ,UAC1C,IAAMI,EAAgBJ,UACtB,IACJ,IAAMI,EAAgBH,KACrBG,EAAgBF,WAAa,IAAME,EAAgBF,WAAa,IACjE,MACN,EAKApD,EAASwD,UAAY,SAAShD,GAC5B,MAAM+B,EAAS,CAAC,EAChB,IAAIkB,EACJ,MAAMtC,EAAQX,EAAKN,UAAUM,EAAKrF,QAAQ,KAAO,GAAGP,MAAM,KAC1D,IAAK,IAAI8I,EAAI,EAAGA,EAAIvC,EAAMzJ,OAAQgM,IAChCD,EAAKtC,EAAMuC,GAAG/M,OAAOiE,MAAM,KAC3B2H,EAAOkB,EAAG,GAAG9M,QAAU8M,EAAG,GAE5B,OAAOlB,CACT,EAGAvC,EAAS2D,UAAY,SAASd,GAC5B,IAAIrC,EAAO,GACPsC,EAAKD,EAAML,YAIf,QAHmCN,IAA/BW,EAAME,uBACRD,EAAKD,EAAME,sBAETF,EAAMe,YAAc5N,OAAO6N,KAAKhB,EAAMe,YAAYlM,OAAQ,CAC5D,MAAMoM,EAAS,GACf9N,OAAO6N,KAAKhB,EAAMe,YAAYG,SAAQC,SACJ9B,IAA5BW,EAAMe,WAAWI,GACnBF,EAAO7I,KAAK+I,EAAQ,IAAMnB,EAAMe,WAAWI,IAE3CF,EAAO7I,KAAK+I,EACd,IAEFxD,GAAQ,UAAYsC,EAAK,IAAMgB,EAAO3H,KAAK,KAAO,MACpD,CACA,OAAOqE,CACT,EAIAR,EAASiE,YAAc,SAASzD,GAC9B,MAAMW,EAAQX,EAAKN,UAAUM,EAAKrF,QAAQ,KAAO,GAAGP,MAAM,KAC1D,MAAO,CACLrC,KAAM4I,EAAML,QACZoD,UAAW/C,EAAMhF,KAAK,KAE1B,EAGA6D,EAASmE,YAAc,SAAStB,GAC9B,IAAIuB,EAAQ,GACRtB,EAAKD,EAAML,YAYf,YAXmCN,IAA/BW,EAAME,uBACRD,EAAKD,EAAME,sBAETF,EAAMwB,cAAgBxB,EAAMwB,aAAa3M,QAE3CmL,EAAMwB,aAAaN,SAAQO,IACzBF,GAAS,aAAetB,EAAK,IAAMwB,EAAG/L,MACrC+L,EAAGJ,WAAaI,EAAGJ,UAAUxM,OAAS,IAAM4M,EAAGJ,UAAY,IACxD,MAAM,IAGPE,CACT,EAIApE,EAASuE,eAAiB,SAAS/D,GACjC,MAAMgE,EAAKhE,EAAKrF,QAAQ,KAClBgG,EAAQ,CACZsD,KAAM5H,SAAS2D,EAAKN,UAAU,EAAGsE,GAAK,KAElCE,EAAQlE,EAAKrF,QAAQ,IAAKqJ,GAOhC,OANIE,GAAS,GACXvD,EAAMwD,UAAYnE,EAAKN,UAAUsE,EAAK,EAAGE,GACzCvD,EAAMhK,MAAQqJ,EAAKN,UAAUwE,EAAQ,IAErCvD,EAAMwD,UAAYnE,EAAKN,UAAUsE,EAAK,GAEjCrD,CACT,EAIAnB,EAAS4E,eAAiB,SAASpE,GACjC,MAAMW,EAAQX,EAAKN,UAAU,IAAItF,MAAM,KACvC,MAAO,CACLiK,UAAW1D,EAAML,QACjBgE,MAAO3D,EAAMZ,KAAIkE,GAAQ5H,SAAS4H,EAAM,MAE5C,EAIAzE,EAAS+E,OAAS,SAASC,GACzB,MAAMC,EAAMjF,EAASe,YAAYiE,EAAc,UAAU,GACzD,GAAIC,EACF,OAAOA,EAAI/E,UAAU,EAEzB,EAGAF,EAASkF,iBAAmB,SAAS1E,GACnC,MAAMW,EAAQX,EAAKN,UAAU,IAAItF,MAAM,KACvC,MAAO,CACLuK,UAAWhE,EAAM,GAAGK,cACpBrK,MAAOgK,EAAM,GAAG3K,cAEpB,EAKAwJ,EAASoF,kBAAoB,SAASJ,EAAcK,GAIlD,MAAO,CACLC,KAAM,OACNC,aALYvF,EAASe,YAAYiE,EAAeK,EAChD,kBAIoB9E,IAAIP,EAASkF,kBAErC,EAGAlF,EAASwF,oBAAsB,SAAS1B,EAAQ2B,GAC9C,IAAIrD,EAAM,WAAaqD,EAAY,OAInC,OAHA3B,EAAOyB,aAAaxB,SAAQ2B,IAC1BtD,GAAO,iBAAmBsD,EAAGP,UAAY,IAAMO,EAAGvO,MAAQ,MAAM,IAE3DiL,CACT,EAIApC,EAAS2F,gBAAkB,SAASnF,GAClC,MAAMW,EAAQX,EAAKN,UAAU,GAAGtF,MAAM,KACtC,MAAO,CACLgL,IAAK/I,SAASsE,EAAM,GAAI,IACxB0E,YAAa1E,EAAM,GACnB2E,UAAW3E,EAAM,GACjB4E,cAAe5E,EAAM1K,MAAM,GAE/B,EAEAuJ,EAASgG,gBAAkB,SAASpC,GAClC,MAAO,YAAcA,EAAWgC,IAAM,IACpChC,EAAWiC,YAAc,KACQ,iBAAzBjC,EAAWkC,UACf9F,EAASiG,qBAAqBrC,EAAWkC,WACzClC,EAAWkC,YACdlC,EAAWmC,cAAgB,IAAMnC,EAAWmC,cAAc5J,KAAK,KAAO,IACvE,MACJ,EAIA6D,EAASkG,qBAAuB,SAASJ,GACvC,GAAqC,IAAjCA,EAAU3K,QAAQ,WACpB,OAAO,KAET,MAAMgG,EAAQ2E,EAAU5F,UAAU,GAAGtF,MAAM,KAC3C,MAAO,CACLuL,UAAW,SACXC,QAASjF,EAAM,GACfkF,SAAUlF,EAAM,GAChBmF,SAAUnF,EAAM,GAAKA,EAAM,GAAGvG,MAAM,KAAK,QAAKsH,EAC9CqE,UAAWpF,EAAM,GAAKA,EAAM,GAAGvG,MAAM,KAAK,QAAKsH,EAEnD,EAEAlC,EAASiG,qBAAuB,SAASH,GACvC,OAAOA,EAAUK,UAAY,IACzBL,EAAUM,SACXN,EAAUO,SAAW,IAAMP,EAAUO,SAAW,KAChDP,EAAUQ,UAAYR,EAAUS,UAC7B,IAAMT,EAAUQ,SAAW,IAAMR,EAAUS,UAC3C,GACR,EAGAvG,EAASwG,oBAAsB,SAASxB,EAAcK,GAGpD,OAFcrF,EAASe,YAAYiE,EAAeK,EAChD,aACW9E,IAAIP,EAAS2F,gBAC5B,EAKA3F,EAASyG,iBAAmB,SAASzB,EAAcK,GACjD,MAAMrD,EAAQhC,EAASe,YAAYiE,EAAeK,EAChD,gBAAgB,GACZqB,EAAM1G,EAASe,YAAYiE,EAAeK,EAC9C,cAAc,GAChB,OAAMrD,GAAS0E,EAGR,CACLzE,iBAAkBD,EAAM9B,UAAU,IAClCyG,SAAUD,EAAIxG,UAAU,KAJjB,IAMX,EAGAF,EAAS4G,mBAAqB,SAAS9C,GACrC,IAAI1B,EAAM,eAAiB0B,EAAO7B,iBAAxB,iBACS6B,EAAO6C,SAAW,OAIrC,OAHI7C,EAAO+C,UACTzE,GAAO,kBAEFA,CACT,EAGApC,EAAS8G,mBAAqB,SAAS9B,GACrC,MAAMvL,EAAc,CAClBsN,OAAQ,GACRC,iBAAkB,GAClBC,cAAe,GACfC,KAAM,IAGFC,EADQnH,EAASK,WAAW2E,GACd,GAAGpK,MAAM,KAC7BnB,EAAY2N,QAAUD,EAAM,GAC5B,IAAK,IAAI9J,EAAI,EAAGA,EAAI8J,EAAMzP,OAAQ2F,IAAK,CACrC,MAAMyF,EAAKqE,EAAM9J,GACXgK,EAAarH,EAASe,YAC1BiE,EAAc,YAAclC,EAAK,KAAK,GACxC,GAAIuE,EAAY,CACd,MAAMxE,EAAQ7C,EAASsC,YAAY+E,GAC7BC,EAAQtH,EAASe,YACrBiE,EAAc,UAAYlC,EAAK,KAQjC,OANAD,EAAMe,WAAa0D,EAAM5P,OAASsI,EAASwD,UAAU8D,EAAM,IAAM,CAAC,EAClEzE,EAAMwB,aAAerE,EAASe,YAC5BiE,EAAc,aAAelC,EAAK,KACjCvC,IAAIP,EAASiE,aAChBxK,EAAYsN,OAAO9L,KAAK4H,GAEhBA,EAAMzI,KAAK5D,eACjB,IAAK,MACL,IAAK,SACHiD,EAAYwN,cAAchM,KAAK4H,EAAMzI,KAAK5D,eAKhD,CACF,CACAwJ,EAASe,YAAYiE,EAAc,aAAajB,SAAQvD,IACtD/G,EAAYuN,iBAAiB/L,KAAK+E,EAASgD,YAAYxC,GAAM,IAE/D,MAAM+G,EAAiBvH,EAASe,YAAYiE,EAAc,gBACvDzE,IAAIP,EAASiE,aAahB,OAZAxK,EAAYsN,OAAOhD,SAAQlB,IACzB0E,EAAexD,SAAQO,IACHzB,EAAMwB,aAAamD,MAAKC,GACjCA,EAAiBlP,OAAS+L,EAAG/L,MAClCkP,EAAiBvD,YAAcI,EAAGJ,aAGpCrB,EAAMwB,aAAapJ,KAAKqJ,EAC1B,GACA,IAGG7K,CACT,EAIAuG,EAAS0H,oBAAsB,SAASC,EAAMC,GAC5C,IAAIxF,EAAM,GAGVA,GAAO,KAAOuF,EAAO,IACrBvF,GAAOwF,EAAKb,OAAOrP,OAAS,EAAI,IAAM,IACtC0K,GAAO,KAAOwF,EAAKR,SAAW,qBAAuB,IACrDhF,GAAOwF,EAAKb,OAAOxG,KAAIsC,QACcX,IAA/BW,EAAME,qBACDF,EAAME,qBAERF,EAAML,cACZrG,KAAK,KAAO,OAEfiG,GAAO,uBACPA,GAAO,8BAGPwF,EAAKb,OAAOhD,SAAQlB,IAClBT,GAAOpC,EAAS4C,YAAYC,GAC5BT,GAAOpC,EAAS2D,UAAUd,GAC1BT,GAAOpC,EAASmE,YAAYtB,EAAM,IAEpC,IAAIgF,EAAW,EAgBf,OAfAD,EAAKb,OAAOhD,SAAQlB,IACdA,EAAMgF,SAAWA,IACnBA,EAAWhF,EAAMgF,SACnB,IAEEA,EAAW,IACbzF,GAAO,cAAgByF,EAAW,QAGhCD,EAAKZ,kBACPY,EAAKZ,iBAAiBjD,SAAQ+D,IAC5B1F,GAAOpC,EAASqD,YAAYyE,EAAU,IAInC1F,CACT,EAIApC,EAAS+H,2BAA6B,SAAS/C,GAC7C,MAAMgD,EAAqB,GACrBvO,EAAcuG,EAAS8G,mBAAmB9B,GAC1CiD,GAAuD,IAA9CxO,EAAYwN,cAAc9L,QAAQ,OAC3C+M,GAA6D,IAAjDzO,EAAYwN,cAAc9L,QAAQ,UAG9C2J,EAAQ9E,EAASe,YAAYiE,EAAc,WAC9CzE,KAAIC,GAAQR,EAASuE,eAAe/D,KACpCS,QAAOE,GAA6B,UAApBA,EAAMwD,YACnBwD,EAAcrD,EAAMpN,OAAS,GAAKoN,EAAM,GAAGL,KACjD,IAAI2D,EAEJ,MAAMC,EAAQrI,EAASe,YAAYiE,EAAc,oBAC9CzE,KAAIC,GACWA,EAAKN,UAAU,IAAItF,MAAM,KAC1B2F,KAAIG,GAAQ7D,SAAS6D,EAAM,QAExC2H,EAAM3Q,OAAS,GAAK2Q,EAAM,GAAG3Q,OAAS,GAAK2Q,EAAM,GAAG,KAAOF,IAC7DC,EAAgBC,EAAM,GAAG,IAG3B5O,EAAYsN,OAAOhD,SAAQlB,IACzB,GAAiC,QAA7BA,EAAMzI,KAAK5D,eAA2BqM,EAAMe,WAAW0E,IAAK,CAC9D,IAAIC,EAAW,CACb9D,KAAM0D,EACNK,iBAAkB3L,SAASgG,EAAMe,WAAW0E,IAAK,KAE/CH,GAAeC,IACjBG,EAASE,IAAM,CAAChE,KAAM2D,IAExBJ,EAAmB/M,KAAKsN,GACpBN,IACFM,EAAWG,KAAK7Q,MAAM6Q,KAAKC,UAAUJ,IACrCA,EAASK,IAAM,CACbnE,KAAM0D,EACNU,UAAWX,EAAY,aAAe,OAExCF,EAAmB/M,KAAKsN,GAE5B,KAEgC,IAA9BP,EAAmBtQ,QAAgByQ,GACrCH,EAAmB/M,KAAK,CACtBwJ,KAAM0D,IAKV,IAAIW,EAAY9I,EAASe,YAAYiE,EAAc,MAenD,OAdI8D,EAAUpR,SAEVoR,EADsC,IAApCA,EAAU,GAAG3N,QAAQ,WACX0B,SAASiM,EAAU,GAAG5I,UAAU,GAAI,IACL,IAAlC4I,EAAU,GAAG3N,QAAQ,SAEwB,IAA1C0B,SAASiM,EAAU,GAAG5I,UAAU,GAAI,IAAa,IACvD,UAEMgC,EAEd8F,EAAmBjE,SAAQD,IACzBA,EAAOiF,WAAaD,CAAS,KAG1Bd,CACT,EAGAhI,EAASgJ,oBAAsB,SAAShE,GACtC,MAAMiE,EAAiB,CAAC,EAIlBC,EAAalJ,EAASe,YAAYiE,EAAc,WACnDzE,KAAIC,GAAQR,EAASuE,eAAe/D,KACpCS,QAAOkI,GAAyB,UAAlBA,EAAIxE,YAAuB,GACxCuE,IACFD,EAAeG,MAAQF,EAAW/R,MAClC8R,EAAexE,KAAOyE,EAAWzE,MAKnC,MAAM4E,EAAQrJ,EAASe,YAAYiE,EAAc,gBACjDiE,EAAeK,YAAcD,EAAM3R,OAAS,EAC5CuR,EAAeM,SAA4B,IAAjBF,EAAM3R,OAIhC,MAAM8R,EAAMxJ,EAASe,YAAYiE,EAAc,cAG/C,OAFAiE,EAAeO,IAAMA,EAAI9R,OAAS,EAE3BuR,CACT,EAEAjJ,EAASyJ,oBAAsB,SAASR,GACtC,IAAI7G,EAAM,GAWV,OAVI6G,EAAeK,cACjBlH,GAAO,oBAEL6G,EAAeO,MACjBpH,GAAO,uBAEmBF,IAAxB+G,EAAexE,MAAsBwE,EAAeG,QACtDhH,GAAO,UAAY6G,EAAexE,KAChC,UAAYwE,EAAeG,MAAQ,QAEhChH,CACT,EAKApC,EAAS0J,UAAY,SAAS1E,GAC5B,IAAI7D,EACJ,MAAMwI,EAAO3J,EAASe,YAAYiE,EAAc,WAChD,GAAoB,IAAhB2E,EAAKjS,OAEP,OADAyJ,EAAQwI,EAAK,GAAGzJ,UAAU,GAAGtF,MAAM,KAC5B,CAACgP,OAAQzI,EAAM,GAAI0I,MAAO1I,EAAM,IAEzC,MAAM2I,EAAQ9J,EAASe,YAAYiE,EAAc,WAC9CzE,KAAIC,GAAQR,EAASuE,eAAe/D,KACpCS,QAAO8I,GAAqC,SAAxBA,EAAUpF,YACjC,OAAImF,EAAMpS,OAAS,GACjByJ,EAAQ2I,EAAM,GAAG3S,MAAMyD,MAAM,KACtB,CAACgP,OAAQzI,EAAM,GAAI0I,MAAO1I,EAAM,UAFzC,CAIF,EAKAnB,EAASgK,qBAAuB,SAAShF,GACvC,MAAMmC,EAAQnH,EAASiK,WAAWjF,GAC5BkF,EAAclK,EAASe,YAAYiE,EAAc,uBACvD,IAAImF,EACAD,EAAYxS,OAAS,IACvByS,EAAiBtN,SAASqN,EAAY,GAAGhK,UAAU,IAAK,KAEtDkK,MAAMD,KACRA,EAAiB,OAEnB,MAAME,EAAWrK,EAASe,YAAYiE,EAAc,gBACpD,GAAIqF,EAAS3S,OAAS,EACpB,MAAO,CACLkK,KAAM/E,SAASwN,EAAS,GAAGnK,UAAU,IAAK,IAC1CqB,SAAU4F,EAAMmD,IAChBH,kBAGJ,MAAMI,EAAevK,EAASe,YAAYiE,EAAc,cACxD,GAAIuF,EAAa7S,OAAS,EAAG,CAC3B,MAAMyJ,EAAQoJ,EAAa,GACxBrK,UAAU,IACVtF,MAAM,KACT,MAAO,CACLgH,KAAM/E,SAASsE,EAAM,GAAI,IACzBI,SAAUJ,EAAM,GAChBgJ,iBAEJ,CACF,EAOAnK,EAASwK,qBAAuB,SAASC,EAAOC,GAC9C,IAAIC,EAAS,GAiBb,OAfEA,EADqB,cAAnBF,EAAMlJ,SACC,CACP,KAAOkJ,EAAM9C,KAAO,MAAQ8C,EAAMlJ,SAAW,IAAMmJ,EAAKnJ,SAAW,OACnE,uBACA,eAAiBmJ,EAAK9I,KAAO,QAGtB,CACP,KAAO6I,EAAM9C,KAAO,MAAQ8C,EAAMlJ,SAAW,IAAMmJ,EAAK9I,KAAO,OAC/D,uBACA,aAAe8I,EAAK9I,KAAO,IAAM8I,EAAKnJ,SAAW,mBAGzBW,IAAxBwI,EAAKP,gBACPQ,EAAO1P,KAAK,sBAAwByP,EAAKP,eAAiB,QAErDQ,EAAOxO,KAAK,GACrB,EAMA6D,EAAS4K,kBAAoB,WAC3B,OAAOhV,KAAKqK,SAAS9J,WAAW0U,OAAO,EAAG,GAC5C,EAOA7K,EAAS8K,wBAA0B,SAASC,EAAQC,EAASC,GAC3D,IAAIC,EACJ,MAAMtR,OAAsBsI,IAAZ8I,EAAwBA,EAAU,EAEhDE,EADEH,GAGU/K,EAAS4K,oBAIvB,MAAO,aAFMK,GAAY,qBAGP,IAAMC,EAAY,IAAMtR,EADnC,uCAKT,EAGAoG,EAASmL,aAAe,SAASnG,EAAcK,GAE7C,MAAMjB,EAAQpE,EAASK,WAAW2E,GAClC,IAAK,IAAI3H,EAAI,EAAGA,EAAI+G,EAAM1M,OAAQ2F,IAChC,OAAQ+G,EAAM/G,IACZ,IAAK,aACL,IAAK,aACL,IAAK,aACL,IAAK,aACH,OAAO+G,EAAM/G,GAAG6C,UAAU,GAKhC,OAAImF,EACKrF,EAASmL,aAAa9F,GAExB,UACT,EAEArF,EAASoL,QAAU,SAASpG,GAG1B,OAFchF,EAASK,WAAW2E,GACd,GAAGpK,MAAM,KAChB,GAAGsF,UAAU,EAC5B,EAEAF,EAASqL,WAAa,SAASrG,GAC7B,MAAyC,MAAlCA,EAAapK,MAAM,IAAK,GAAG,EACpC,EAEAoF,EAASiK,WAAa,SAASjF,GAC7B,MACM7D,EADQnB,EAASK,WAAW2E,GACd,GAAG9E,UAAU,GAAGtF,MAAM,KAC1C,MAAO,CACL+M,KAAMxG,EAAM,GACZS,KAAM/E,SAASsE,EAAM,GAAI,IACzBI,SAAUJ,EAAM,GAChBmJ,IAAKnJ,EAAM1K,MAAM,GAAG0F,KAAK,KAE7B,EAEA6D,EAASsL,WAAa,SAAStG,GAC7B,MACM7D,EADOnB,EAASe,YAAYiE,EAAc,MAAM,GACnC9E,UAAU,GAAGtF,MAAM,KACtC,MAAO,CACL2Q,SAAUpK,EAAM,GAChB+J,UAAW/J,EAAM,GACjBqK,eAAgB3O,SAASsE,EAAM,GAAI,IACnCsK,QAAStK,EAAM,GACfuK,YAAavK,EAAM,GACnBQ,QAASR,EAAM,GAEnB,EAGAnB,EAAS2L,WAAa,SAASrL,GAC7B,GAAoB,iBAATA,GAAqC,IAAhBA,EAAK5I,OACnC,OAAO,EAET,MAAM0M,EAAQpE,EAASK,WAAWC,GAClC,IAAK,IAAIjD,EAAI,EAAGA,EAAI+G,EAAM1M,OAAQ2F,IAChC,GAAI+G,EAAM/G,GAAG3F,OAAS,GAA4B,MAAvB0M,EAAM/G,GAAG9G,OAAO,GACzC,OAAO,EAIX,OAAO,CACT,EAIEzB,EAAOD,QAAUmL,C,eChyBnB,IAAI4L,EAAU,eACd,SAASC,IACP,iKACA/W,EAAOD,QAAUgX,EAAsB,WACrC,OAAOhX,CACT,EAAGC,EAAOD,QAAQiX,YAAa,EAAMhX,EAAOD,QAAiB,QAAIC,EAAOD,QACxE,IAAIA,EAAU,CAAC,EACbkX,EAAK/V,OAAOC,UACZ+V,EAASD,EAAG7V,eACZ+V,EAAiBjW,OAAOiW,gBAAkB,SAAU9C,EAAKnS,EAAKkV,GAC5D/C,EAAInS,GAAOkV,EAAK/U,KAClB,EACAgV,EAAU,mBAAqBC,OAASA,OAAS,CAAC,EAClDC,EAAiBF,EAAQG,UAAY,aACrCC,EAAsBJ,EAAQK,eAAiB,kBAC/CC,EAAoBN,EAAQO,aAAe,gBAC7C,SAAS3X,EAAOoU,EAAKnS,EAAKG,GACxB,OAAOnB,OAAOiW,eAAe9C,EAAKnS,EAAK,CACrCG,MAAOA,EACP0I,YAAY,EACZ8M,cAAc,EACdC,UAAU,IACRzD,EAAInS,EACV,CACA,IACEjC,EAAO,CAAC,EAAG,GACb,CAAE,MAAO8X,GACP9X,EAAS,SAAgBoU,EAAKnS,EAAKG,GACjC,OAAOgS,EAAInS,GAAOG,CACpB,CACF,CACA,SAAS2V,EAAKC,EAASC,EAAS/X,EAAMgY,GACpC,IAAIC,EAAiBF,GAAWA,EAAQ/W,qBAAqBkX,EAAYH,EAAUG,EACjFC,EAAYpX,OAAOqX,OAAOH,EAAejX,WACzC8B,EAAU,IAAIuV,EAAQL,GAAe,IACvC,OAAOhB,EAAemB,EAAW,UAAW,CAC1CjW,MAAOoW,EAAiBR,EAAS9X,EAAM8C,KACrCqV,CACN,CACA,SAASI,EAAStQ,EAAIiM,EAAKsE,GACzB,IACE,MAAO,CACLlV,KAAM,SACNkV,IAAKvQ,EAAGjG,KAAKkS,EAAKsE,GAEtB,CAAE,MAAOZ,GACP,MAAO,CACLtU,KAAM,QACNkV,IAAKZ,EAET,CACF,CACAhY,EAAQiY,KAAOA,EACf,IAAIY,EAAmB,CAAC,EACxB,SAASP,IAAa,CACtB,SAASQ,IAAqB,CAC9B,SAASC,IAA8B,CACvC,IAAIC,EAAoB,CAAC,EACzB9Y,EAAO8Y,EAAmBxB,GAAgB,WACxC,OAAOjX,IACT,IACA,IAAI0Y,EAAW9X,OAAO+X,eACpBC,EAA0BF,GAAYA,EAASA,EAASG,EAAO,MACjED,GAA2BA,IAA4BjC,GAAMC,EAAO/U,KAAK+W,EAAyB3B,KAAoBwB,EAAoBG,GAC1I,IAAIE,EAAKN,EAA2B3X,UAAYkX,EAAUlX,UAAYD,OAAOqX,OAAOQ,GACpF,SAASM,EAAsBlY,GAC7B,CAAC,OAAQ,QAAS,UAAU8N,SAAQ,SAAUqK,GAC5CrZ,EAAOkB,EAAWmY,GAAQ,SAAUX,GAClC,OAAOrY,KAAKiZ,QAAQD,EAAQX,EAC9B,GACF,GACF,CACA,SAASa,EAAclB,EAAWmB,GAChC,SAASC,EAAOJ,EAAQX,EAAKvP,EAASC,GACpC,IAAIsQ,EAASjB,EAASJ,EAAUgB,GAAShB,EAAWK,GACpD,GAAI,UAAYgB,EAAOlW,KAAM,CAC3B,IAAIuB,EAAS2U,EAAOhB,IAClBtW,EAAQ2C,EAAO3C,MACjB,OAAOA,GAAS,UAAYyU,EAAQzU,IAAU6U,EAAO/U,KAAKE,EAAO,WAAaoX,EAAYrQ,QAAQ/G,EAAMuX,SAAS/P,MAAK,SAAUxH,GAC9HqX,EAAO,OAAQrX,EAAO+G,EAASC,EACjC,IAAG,SAAU0O,GACX2B,EAAO,QAAS3B,EAAK3O,EAASC,EAChC,IAAKoQ,EAAYrQ,QAAQ/G,GAAOwH,MAAK,SAAUgQ,GAC7C7U,EAAO3C,MAAQwX,EAAWzQ,EAAQpE,EACpC,IAAG,SAAU6D,GACX,OAAO6Q,EAAO,QAAS7Q,EAAOO,EAASC,EACzC,GACF,CACAA,EAAOsQ,EAAOhB,IAChB,CACA,IAAImB,EACJ3C,EAAe7W,KAAM,UAAW,CAC9B+B,MAAO,SAAeiX,EAAQX,GAC5B,SAASoB,IACP,OAAO,IAAIN,GAAY,SAAUrQ,EAASC,GACxCqQ,EAAOJ,EAAQX,EAAKvP,EAASC,EAC/B,GACF,CACA,OAAOyQ,EAAkBA,EAAkBA,EAAgBjQ,KAAKkQ,EAA4BA,GAA8BA,GAC5H,GAEJ,CACA,SAAStB,EAAiBR,EAAS9X,EAAM8C,GACvC,IAAI+W,EAAQ,iBACZ,OAAO,SAAUV,EAAQX,GACvB,GAAI,cAAgBqB,EAAO,MAAM,IAAIC,MAAM,gCAC3C,GAAI,cAAgBD,EAAO,CACzB,GAAI,UAAYV,EAAQ,MAAMX,EAC9B,MAAO,CACLtW,WAAO,EACP6X,MAAM,EAEV,CACA,IAAKjX,EAAQqW,OAASA,EAAQrW,EAAQ0V,IAAMA,IAAO,CACjD,IAAIwB,EAAWlX,EAAQkX,SACvB,GAAIA,EAAU,CACZ,IAAIC,EAAiBC,EAAoBF,EAAUlX,GACnD,GAAImX,EAAgB,CAClB,GAAIA,IAAmBxB,EAAkB,SACzC,OAAOwB,CACT,CACF,CACA,GAAI,SAAWnX,EAAQqW,OAAQrW,EAAQqX,KAAOrX,EAAQsX,MAAQtX,EAAQ0V,SAAS,GAAI,UAAY1V,EAAQqW,OAAQ,CAC7G,GAAI,mBAAqBU,EAAO,MAAMA,EAAQ,YAAa/W,EAAQ0V,IACnE1V,EAAQuX,kBAAkBvX,EAAQ0V,IACpC,KAAO,WAAa1V,EAAQqW,QAAUrW,EAAQwX,OAAO,SAAUxX,EAAQ0V,KACvEqB,EAAQ,YACR,IAAIL,EAASjB,EAAST,EAAS9X,EAAM8C,GACrC,GAAI,WAAa0W,EAAOlW,KAAM,CAC5B,GAAIuW,EAAQ/W,EAAQiX,KAAO,YAAc,iBAAkBP,EAAOhB,MAAQC,EAAkB,SAC5F,MAAO,CACLvW,MAAOsX,EAAOhB,IACduB,KAAMjX,EAAQiX,KAElB,CACA,UAAYP,EAAOlW,OAASuW,EAAQ,YAAa/W,EAAQqW,OAAS,QAASrW,EAAQ0V,IAAMgB,EAAOhB,IAClG,CACF,CACF,CACA,SAAS0B,EAAoBF,EAAUlX,GACrC,IAAIyX,EAAazX,EAAQqW,OACvBA,EAASa,EAAS3C,SAASkD,GAC7B,QAAItN,IAAckM,EAAQ,OAAOrW,EAAQkX,SAAW,KAAM,UAAYO,GAAcP,EAAS3C,SAAiB,SAAMvU,EAAQqW,OAAS,SAAUrW,EAAQ0V,SAAMvL,EAAWiN,EAAoBF,EAAUlX,GAAU,UAAYA,EAAQqW,SAAW,WAAaoB,IAAezX,EAAQqW,OAAS,QAASrW,EAAQ0V,IAAM,IAAIgC,UAAU,oCAAsCD,EAAa,aAAc9B,EAClY,IAAIe,EAASjB,EAASY,EAAQa,EAAS3C,SAAUvU,EAAQ0V,KACzD,GAAI,UAAYgB,EAAOlW,KAAM,OAAOR,EAAQqW,OAAS,QAASrW,EAAQ0V,IAAMgB,EAAOhB,IAAK1V,EAAQkX,SAAW,KAAMvB,EACjH,IAAIgC,EAAOjB,EAAOhB,IAClB,OAAOiC,EAAOA,EAAKV,MAAQjX,EAAQkX,EAASU,YAAcD,EAAKvY,MAAOY,EAAQ6X,KAAOX,EAASY,QAAS,WAAa9X,EAAQqW,SAAWrW,EAAQqW,OAAS,OAAQrW,EAAQ0V,SAAMvL,GAAYnK,EAAQkX,SAAW,KAAMvB,GAAoBgC,GAAQ3X,EAAQqW,OAAS,QAASrW,EAAQ0V,IAAM,IAAIgC,UAAU,oCAAqC1X,EAAQkX,SAAW,KAAMvB,EACrW,CACA,SAASoC,EAAaC,GACpB,IAAIC,EAAQ,CACVC,OAAQF,EAAK,IAEf,KAAKA,IAASC,EAAME,SAAWH,EAAK,IAAK,KAAKA,IAASC,EAAMG,WAAaJ,EAAK,GAAIC,EAAMI,SAAWL,EAAK,IAAK3a,KAAKib,WAAWpV,KAAK+U,EACrI,CACA,SAASM,EAAcN,GACrB,IAAIvB,EAASuB,EAAMO,YAAc,CAAC,EAClC9B,EAAOlW,KAAO,gBAAiBkW,EAAOhB,IAAKuC,EAAMO,WAAa9B,CAChE,CACA,SAASnB,EAAQL,GACf7X,KAAKib,WAAa,CAAC,CACjBJ,OAAQ,SACNhD,EAAYlJ,QAAQ+L,EAAc1a,MAAOA,KAAKob,OAAM,EAC1D,CACA,SAASvC,EAAOwC,GACd,GAAIA,GAAY,KAAOA,EAAU,CAC/B,IAAIC,EAAiBD,EAASpE,GAC9B,GAAIqE,EAAgB,OAAOA,EAAezZ,KAAKwZ,GAC/C,GAAI,mBAAqBA,EAASb,KAAM,OAAOa,EAC/C,IAAKrG,MAAMqG,EAAS/Y,QAAS,CAC3B,IAAI2F,GAAK,EACPuS,EAAO,SAASA,IACd,OAASvS,EAAIoT,EAAS/Y,QAAS,GAAIsU,EAAO/U,KAAKwZ,EAAUpT,GAAI,OAAOuS,EAAKzY,MAAQsZ,EAASpT,GAAIuS,EAAKZ,MAAO,EAAIY,EAC9G,OAAOA,EAAKzY,WAAQ+K,EAAW0N,EAAKZ,MAAO,EAAIY,CACjD,EACF,OAAOA,EAAKA,KAAOA,CACrB,CACF,CACA,MAAM,IAAIH,UAAU7D,EAAQ6E,GAAY,mBAC1C,CACA,OAAO9C,EAAkB1X,UAAY2X,EAA4B3B,EAAeiC,EAAI,cAAe,CACjG/W,MAAOyW,EACPjB,cAAc,IACZV,EAAe2B,EAA4B,cAAe,CAC5DzW,MAAOwW,EACPhB,cAAc,IACZgB,EAAkBgD,YAAc5b,EAAO6Y,EAA4BnB,EAAmB,qBAAsB5X,EAAQ+b,oBAAsB,SAAUC,GACtJ,IAAIC,EAAO,mBAAqBD,GAAUA,EAAOE,YACjD,QAASD,IAASA,IAASnD,GAAqB,uBAAyBmD,EAAKH,aAAeG,EAAK1W,MACpG,EAAGvF,EAAQmc,KAAO,SAAUH,GAC1B,OAAO7a,OAAOib,eAAiBjb,OAAOib,eAAeJ,EAAQjD,IAA+BiD,EAAOK,UAAYtD,EAA4B7Y,EAAO8b,EAAQpE,EAAmB,sBAAuBoE,EAAO5a,UAAYD,OAAOqX,OAAOa,GAAK2C,CAC5O,EAAGhc,EAAQsc,MAAQ,SAAU1D,GAC3B,MAAO,CACLiB,QAASjB,EAEb,EAAGU,EAAsBG,EAAcrY,WAAYlB,EAAOuZ,EAAcrY,UAAWsW,GAAqB,WACtG,OAAOnX,IACT,IAAIP,EAAQyZ,cAAgBA,EAAezZ,EAAQuc,MAAQ,SAAUrE,EAASC,EAAS/X,EAAMgY,EAAasB,QACxG,IAAWA,IAAgBA,EAActQ,SACzC,IAAIoT,EAAO,IAAI/C,EAAcxB,EAAKC,EAASC,EAAS/X,EAAMgY,GAAcsB,GACxE,OAAO1Z,EAAQ+b,oBAAoB5D,GAAWqE,EAAOA,EAAKzB,OAAOjR,MAAK,SAAU7E,GAC9E,OAAOA,EAAOkV,KAAOlV,EAAO3C,MAAQka,EAAKzB,MAC3C,GACF,EAAGzB,EAAsBD,GAAKnZ,EAAOmZ,EAAIzB,EAAmB,aAAc1X,EAAOmZ,EAAI7B,GAAgB,WACnG,OAAOjX,IACT,IAAIL,EAAOmZ,EAAI,YAAY,WACzB,MAAO,oBACT,IAAIrZ,EAAQgP,KAAO,SAAU1G,GAC3B,IAAIrG,EAASd,OAAOmH,GAClB0G,EAAO,GACT,IAAK,IAAI7M,KAAOF,EAAQ+M,EAAK5I,KAAKjE,GAClC,OAAO6M,EAAKyN,UAAW,SAAS1B,IAC9B,KAAO/L,EAAKnM,QAAS,CACnB,IAAIV,EAAM6M,EAAK0N,MACf,GAAIva,KAAOF,EAAQ,OAAO8Y,EAAKzY,MAAQH,EAAK4Y,EAAKZ,MAAO,EAAIY,CAC9D,CACA,OAAOA,EAAKZ,MAAO,EAAIY,CACzB,CACF,EAAG/a,EAAQoZ,OAASA,EAAQX,EAAQrX,UAAY,CAC9C8a,YAAazD,EACbkD,MAAO,SAAegB,GACpB,GAAIpc,KAAKqc,KAAO,EAAGrc,KAAKwa,KAAO,EAAGxa,KAAKga,KAAOha,KAAKia,WAAQnN,EAAW9M,KAAK4Z,MAAO,EAAI5Z,KAAK6Z,SAAW,KAAM7Z,KAAKgZ,OAAS,OAAQhZ,KAAKqY,SAAMvL,EAAW9M,KAAKib,WAAWtM,QAAQuM,IAAiBkB,EAAe,IAAK,IAAIpX,KAAQhF,KAAM,MAAQgF,EAAK7D,OAAO,IAAMyV,EAAO/U,KAAK7B,KAAMgF,KAAUgQ,OAAOhQ,EAAK3D,MAAM,MAAQrB,KAAKgF,QAAQ8H,EACtU,EACAwP,KAAM,WACJtc,KAAK4Z,MAAO,EACZ,IAAI2C,EAAavc,KAAKib,WAAW,GAAGE,WACpC,GAAI,UAAYoB,EAAWpZ,KAAM,MAAMoZ,EAAWlE,IAClD,OAAOrY,KAAKwc,IACd,EACAtC,kBAAmB,SAA2BuC,GAC5C,GAAIzc,KAAK4Z,KAAM,MAAM6C,EACrB,IAAI9Z,EAAU3C,KACd,SAAS0c,EAAOC,EAAKC,GACnB,OAAOvD,EAAOlW,KAAO,QAASkW,EAAOhB,IAAMoE,EAAW9Z,EAAQ6X,KAAOmC,EAAKC,IAAWja,EAAQqW,OAAS,OAAQrW,EAAQ0V,SAAMvL,KAAc8P,CAC5I,CACA,IAAK,IAAI3U,EAAIjI,KAAKib,WAAW3Y,OAAS,EAAG2F,GAAK,IAAKA,EAAG,CACpD,IAAI2S,EAAQ5a,KAAKib,WAAWhT,GAC1BoR,EAASuB,EAAMO,WACjB,GAAI,SAAWP,EAAMC,OAAQ,OAAO6B,EAAO,OAC3C,GAAI9B,EAAMC,QAAU7a,KAAKqc,KAAM,CAC7B,IAAIQ,EAAWjG,EAAO/U,KAAK+Y,EAAO,YAChCkC,EAAalG,EAAO/U,KAAK+Y,EAAO,cAClC,GAAIiC,GAAYC,EAAY,CAC1B,GAAI9c,KAAKqc,KAAOzB,EAAME,SAAU,OAAO4B,EAAO9B,EAAME,UAAU,GAC9D,GAAI9a,KAAKqc,KAAOzB,EAAMG,WAAY,OAAO2B,EAAO9B,EAAMG,WACxD,MAAO,GAAI8B,GACT,GAAI7c,KAAKqc,KAAOzB,EAAME,SAAU,OAAO4B,EAAO9B,EAAME,UAAU,OACzD,CACL,IAAKgC,EAAY,MAAM,IAAInD,MAAM,0CACjC,GAAI3Z,KAAKqc,KAAOzB,EAAMG,WAAY,OAAO2B,EAAO9B,EAAMG,WACxD,CACF,CACF,CACF,EACAZ,OAAQ,SAAgBhX,EAAMkV,GAC5B,IAAK,IAAIpQ,EAAIjI,KAAKib,WAAW3Y,OAAS,EAAG2F,GAAK,IAAKA,EAAG,CACpD,IAAI2S,EAAQ5a,KAAKib,WAAWhT,GAC5B,GAAI2S,EAAMC,QAAU7a,KAAKqc,MAAQzF,EAAO/U,KAAK+Y,EAAO,eAAiB5a,KAAKqc,KAAOzB,EAAMG,WAAY,CACjG,IAAIgC,EAAenC,EACnB,KACF,CACF,CACAmC,IAAiB,UAAY5Z,GAAQ,aAAeA,IAAS4Z,EAAalC,QAAUxC,GAAOA,GAAO0E,EAAahC,aAAegC,EAAe,MAC7I,IAAI1D,EAAS0D,EAAeA,EAAa5B,WAAa,CAAC,EACvD,OAAO9B,EAAOlW,KAAOA,EAAMkW,EAAOhB,IAAMA,EAAK0E,GAAgB/c,KAAKgZ,OAAS,OAAQhZ,KAAKwa,KAAOuC,EAAahC,WAAYzC,GAAoBtY,KAAKgd,SAAS3D,EAC5J,EACA2D,SAAU,SAAkB3D,EAAQ2B,GAClC,GAAI,UAAY3B,EAAOlW,KAAM,MAAMkW,EAAOhB,IAC1C,MAAO,UAAYgB,EAAOlW,MAAQ,aAAekW,EAAOlW,KAAOnD,KAAKwa,KAAOnB,EAAOhB,IAAM,WAAagB,EAAOlW,MAAQnD,KAAKwc,KAAOxc,KAAKqY,IAAMgB,EAAOhB,IAAKrY,KAAKgZ,OAAS,SAAUhZ,KAAKwa,KAAO,OAAS,WAAanB,EAAOlW,MAAQ6X,IAAahb,KAAKwa,KAAOQ,GAAW1C,CACtQ,EACA2E,OAAQ,SAAgBlC,GACtB,IAAK,IAAI9S,EAAIjI,KAAKib,WAAW3Y,OAAS,EAAG2F,GAAK,IAAKA,EAAG,CACpD,IAAI2S,EAAQ5a,KAAKib,WAAWhT,GAC5B,GAAI2S,EAAMG,aAAeA,EAAY,OAAO/a,KAAKgd,SAASpC,EAAMO,WAAYP,EAAMI,UAAWE,EAAcN,GAAQtC,CACrH,CACF,EACA,MAAS,SAAgBuC,GACvB,IAAK,IAAI5S,EAAIjI,KAAKib,WAAW3Y,OAAS,EAAG2F,GAAK,IAAKA,EAAG,CACpD,IAAI2S,EAAQ5a,KAAKib,WAAWhT,GAC5B,GAAI2S,EAAMC,SAAWA,EAAQ,CAC3B,IAAIxB,EAASuB,EAAMO,WACnB,GAAI,UAAY9B,EAAOlW,KAAM,CAC3B,IAAI+Z,EAAS7D,EAAOhB,IACpB6C,EAAcN,EAChB,CACA,OAAOsC,CACT,CACF,CACA,MAAM,IAAIvD,MAAM,wBAClB,EACAwD,cAAe,SAAuB9B,EAAUd,EAAYE,GAC1D,OAAOza,KAAK6Z,SAAW,CACrB3C,SAAU2B,EAAOwC,GACjBd,WAAYA,EACZE,QAASA,GACR,SAAWza,KAAKgZ,SAAWhZ,KAAKqY,SAAMvL,GAAYwL,CACvD,GACC7Y,CACL,CACAC,EAAOD,QAAUgX,EAAqB/W,EAAOD,QAAQiX,YAAa,EAAMhX,EAAOD,QAAiB,QAAIC,EAAOD,O,UC1S3G,SAAS+W,EAAQzC,GAGf,OAAQrU,EAAOD,QAAU+W,EAAU,mBAAqBQ,QAAU,iBAAmBA,OAAOE,SAAW,SAAUnD,GAC/G,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBiD,QAAUjD,EAAI4H,cAAgB3E,QAAUjD,IAAQiD,OAAOnW,UAAY,gBAAkBkT,CAC1H,EAAGrU,EAAOD,QAAQiX,YAAa,EAAMhX,EAAOD,QAAiB,QAAIC,EAAOD,QAAU+W,EAAQzC,EAC5F,CACArU,EAAOD,QAAU+W,EAAS9W,EAAOD,QAAQiX,YAAa,EAAMhX,EAAOD,QAAiB,QAAIC,EAAOD,O,gBCP/F,IAAIwG,EAAU,EAAQ,GAAR,GACdvG,EAAOD,QAAUwG,EAGjB,IACEmX,mBAAqBnX,CACvB,CAAE,MAAOoX,GACmB,iBAAfC,WACTA,WAAWF,mBAAqBnX,EAEhCsX,SAAS,IAAK,yBAAdA,CAAwCtX,EAE5C,C,GCbIuX,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB5Q,IAAjB6Q,EACH,OAAOA,EAAale,QAGrB,IAAIC,EAAS8d,EAAyBE,GAAY,CACjD7P,GAAI6P,EACJE,QAAQ,EACRne,QAAS,CAAC,GAUX,OANAoe,EAAoBH,GAAU7b,KAAKnC,EAAOD,QAASC,EAAQA,EAAOD,QAASge,GAG3E/d,EAAOke,QAAS,EAGTle,EAAOD,OACf,CCxBAge,EAAoBK,EAAKpe,IACxB,IAAIqe,EAASre,GAAUA,EAAOgX,WAC7B,IAAOhX,EAAiB,QACxB,IAAM,EAEP,OADA+d,EAAoBO,EAAED,EAAQ,CAAEE,EAAGF,IAC5BA,CAAM,ECLdN,EAAoBO,EAAI,CAACve,EAASye,KACjC,IAAI,IAAItc,KAAOsc,EACXT,EAAoBU,EAAED,EAAYtc,KAAS6b,EAAoBU,EAAE1e,EAASmC,IAC5EhB,OAAOiW,eAAepX,EAASmC,EAAK,CAAE6I,YAAY,EAAMH,IAAK4T,EAAWtc,IAE1E,ECND6b,EAAoBpd,EAAI,WACvB,GAA0B,iBAAfid,WAAyB,OAAOA,WAC3C,IACC,OAAOtd,MAAQ,IAAIud,SAAS,cAAb,EAChB,CAAE,MAAOvW,GACR,GAAsB,iBAAXjH,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB0d,EAAoBU,EAAI,CAACpK,EAAKqK,IAAUxd,OAAOC,UAAUC,eAAee,KAAKkS,EAAKqK,GCClFX,EAAoBY,EAAK5e,IACH,oBAAXuX,QAA0BA,OAAOM,aAC1C1W,OAAOiW,eAAepX,EAASuX,OAAOM,YAAa,CAAEvV,MAAO,WAE7DnB,OAAOiW,eAAepX,EAAS,aAAc,CAAEsC,OAAO,GAAO,ECL9D0b,EAAoBa,IAAO5e,IAC1BA,EAAO6e,MAAQ,GACV7e,EAAO8e,WAAU9e,EAAO8e,SAAW,IACjC9e,G,2iDCHO,SAAS8W,EAAQzC,GAG9B,OAAOyC,EAAU,mBAAqBQ,QAAU,iBAAmBA,OAAOE,SAAW,SAAUnD,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBiD,QAAUjD,EAAI4H,cAAgB3E,QAAUjD,IAAQiD,OAAOnW,UAAY,gBAAkBkT,CAC1H,EAAGyC,EAAQzC,EACb,CCRe,SAAS0K,EAAgBC,EAAUC,GAChD,KAAMD,aAAoBC,GACxB,MAAM,IAAItE,UAAU,oCAExB,CCFe,SAASuE,EAAevG,GACrC,IAAIzW,ECFS,SAAsBid,EAAOC,GAC1C,GAAuB,WAAnBtI,EAAQqI,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAIE,EAAOF,EAAM7H,OAAOgI,aACxB,QAAalS,IAATiS,EAAoB,CACtB,IAAIE,EAAMF,EAAKld,KAAKgd,EAAOC,GAAQ,WACnC,GAAqB,WAAjBtI,EAAQyI,GAAmB,OAAOA,EACtC,MAAM,IAAI5E,UAAU,+CACtB,CACA,OAAiB,WAATyE,EAAoB5d,OAASge,QAAQL,EAC/C,CDPY,CAAYxG,EAAK,UAC3B,MAAwB,WAAjB7B,EAAQ5U,GAAoBA,EAAMV,OAAOU,EAClD,CEJA,SAASud,EAAkBC,EAAQC,GACjC,IAAK,IAAIpX,EAAI,EAAGA,EAAIoX,EAAM/c,OAAQ2F,IAAK,CACrC,IAAIqX,EAAaD,EAAMpX,GACvBqX,EAAW7U,WAAa6U,EAAW7U,aAAc,EACjD6U,EAAW/H,cAAe,EACtB,UAAW+H,IAAYA,EAAW9H,UAAW,GACjD5W,OAAOiW,eAAeuI,EAAQ,EAAcE,EAAW1d,KAAM0d,EAC/D,CACF,CACe,SAASC,EAAaZ,EAAaa,EAAYC,GAM5D,OALID,GAAYL,EAAkBR,EAAY9d,UAAW2e,GACrDC,GAAaN,EAAkBR,EAAac,GAChD7e,OAAOiW,eAAe8H,EAAa,YAAa,CAC9CnH,UAAU,IAELmH,CACT,C,8vBCjBA,SACEe,IAAK,0BACLC,gBAAgB,EAChBC,eAAe,GCHjB,GACEC,YAAY,GCId,EACS,CACLtX,MAAO,WAAmB,IAAAuX,EACxB,OAAOA,EAAAC,SAAQxX,MAAKyX,MAAAF,EAAAG,UACtB,EACAC,KAAM,WAAmB,IAAAC,EACvB,OAAOA,EAAAJ,SAAQG,KAAIF,MAAAG,EAAAF,UACrB,EACA3F,KAAM,WAAmB,IAAA8F,EACvB,OAAOA,EAAAL,SAAQM,IAAGL,MAAAI,EAAAH,UACpB,EACAK,MAAO,WAAmB,IAAAC,EACxB,OAAKR,QAAQO,OAGNC,EAAAR,SAAQO,MAAKN,MAAAO,EAAAN,WAFX,IAGX,GCyUJ,QAxVY,WACV,SAAAO,EAAYzS,EAAK0S,GAAOhC,EAAA,KAAA+B,GACtBxgB,KAAK+N,IAAMA,EACX/N,KAAKygB,MAAQA,EAAMxe,QAAQ,OAAQ,IACnCjC,KAAK0gB,MAAQ,CAAEC,MAAO,IACtB3gB,KAAK4gB,cAAgB,KACrB5gB,KAAK6gB,aAAe7gB,KAAK6gB,aAAa3X,KAAKlJ,KAC7C,CA8UC,OA9UAuf,EAAAiB,EAAA,EAAA5e,IAAA,WAAAG,MAED,SAAS+e,GAAoB,IAAdlY,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EACxB,OAAOc,MAAM,IAAIC,QAAQhhB,KAAK+N,IAAM+S,GAAOlY,GAASW,MAAK,SAAA0X,GACvD,IAAMC,EAAcD,EAASE,QAAQ7W,IAAI,gBAEzC,GACE4W,IAC6C,IAA7CA,EAAYnb,QAAQ,qBACpBkb,EAASG,GAET,OAAOH,EAASI,OAIlB,GAAIJ,EAASG,GACX,OAAOH,EAASK,OAGlB,MAAM,IAAI3H,MAAM,gBAAD4H,OAAiBN,EAASO,QAC3C,GACF,GAMA,CAAA5f,IAAA,oBAAAG,MACA,SAAkBgS,EAAK0N,EAAMC,GAC3B,IAAIC,EAAKF,GAAQ,IAAIG,SACjBC,EAAU,KAEd,IAAK,IAAI3e,KAAY6Q,EAAK,CACxB,IAAKA,EAAIjT,eAAeoC,GACtB,OAEF,GAAIwe,EAGFG,EAAUH,EAAY,KADX1M,MAAMvN,SAASvE,IAAaA,EAAW,IACf,SAEnC2e,EAAU3e,EAIe,WAAzBsT,EAAOzC,EAAI7Q,KACT6Q,EAAI7Q,aAAqB4e,KAK3BH,EAAGI,OAAOF,EAAS9N,EAAI7Q,IAHvBlD,KAAKgiB,kBAAkBjO,EAAI7Q,GAAWye,EAAIze,EAK9C,CAEA,OAAOye,CACT,GACA,CAAA/f,IAAA,QAAAG,MAEA,SAAM+e,EAAM9d,GACV,OAAOhD,KAAKiiB,SAASnB,EAAM,CACzB9H,OAAQ,OACRkJ,KAAMliB,KAAKgiB,kBAAkBhf,IAEjC,GAAC,CAAApB,IAAA,OAAAG,MAED,SAAK+e,EAAM9d,GACT,IAAMmf,EAAW,IAAIP,SAErB,IAAK,IAAMhgB,KAAOoB,EAChBmf,EAASJ,OAAOngB,EAAKoB,EAAKpB,IAG5B,OAAO5B,KAAKiiB,SAASnB,EAAM,CACzB9H,OAAQ,MACRkJ,KAAMC,GAEV,GAAC,CAAAvgB,IAAA,eAAAG,MAED,SAAawG,GAKX,OAJA6Z,EAAO7Z,MAAM,sBAAuBA,GAChCvI,KAAK4gB,eACP5gB,KAAK4gB,cAAcrY,IAEd,CACT,GAAC,CAAA3G,IAAA,UAAAG,MAED,SAAQJ,GACN3B,KAAK4gB,cAAgBjf,CACvB,GAEA,CAAAC,IAAA,UAAAG,MAGA,SAAQJ,GACN,OAAO3B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,QACjClX,KAAK5H,GAAS,OACR,SAAA4G,GACL,OAAO5G,EAAWA,EAAS,CAAE4G,MAAOA,IAAW,CAAEA,MAAOA,EAC1D,GACJ,GAEA,CAAA3G,IAAA,mBAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,OAAS,CAC3CzH,OAAQ,WACR,MAAOhZ,KAAK6gB,aAChB,GAEA,CAAAjf,IAAA,UAAAG,MAGA,SAAQsgB,EAAQ1gB,GAAU,IAAA2gB,EAAA,KAClBC,EAAOviB,KAAK0gB,MAAMC,MAAMvO,MAAK,SAAAoQ,GAAU,OAAIA,EAAW3U,KAAOwU,CAAM,IAEzE,OAAIE,GACF5gB,EAAS4gB,GACF,MAGFviB,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,WAAAc,OAAUc,IAChD9Y,MAAK,SAAAkZ,GACJ,IAAI9B,EAAQ2B,EAAK5B,MAAMC,MAAM9U,QAC3B,SAAA2W,GAAU,OAAIA,EAAW3U,KAAOwU,CAAM,IAEpCK,EAAeJ,EAAKK,kBAAkBF,EAASJ,EAAQA,GAC3D1B,EAAM9a,KAAK6c,GACXJ,EAAK5B,MAAMC,MAAQA,EACnBhf,EAAS+gB,EACX,IAAE,MACK1iB,KAAK6gB,aAChB,GAAC,CAAAjf,IAAA,oBAAAG,MAED,SAAkBwgB,EAAMF,EAAQO,GAC9B,IAAIC,EAAiBN,EAAKO,OAE1B,IACED,EAAiB,GAAHtB,OAAMgB,EAAKO,OAAM,cACjC,CAAE,MAAOva,GACP6Z,EAAOlC,KAAK,oCAAqCqC,EACnD,CAEA,OAAO3hB,OAAOmiB,OAAOR,EAAM,CACzB1U,GAAIwU,EACJW,MAAOT,EAAK1U,GACZ+U,SAAUA,EAEVK,MAAOL,EACPM,YAAaL,GAEjB,GAEA,CAAAjhB,IAAA,WAAAG,MAGA,SAASsgB,GAAQ,IAAAc,EAAA,KACf,OAAOnjB,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,WAAAc,OAAUc,GAAU,CAC3DrJ,OAAQ,WAEPzP,MAAK,WAIJ,GAHa4Z,EAAKzC,MAAMC,MAAMvO,MAC5B,SAAAoQ,GAAU,OAAIA,EAAW3U,KAAOwU,CAAM,IAE9B,CACR,IAAI1B,EAAQwC,EAAKzC,MAAMC,MAAM9U,QAC3B,SAAA2W,GAAU,OAAIA,EAAW3U,KAAOwU,CAAM,IAExCc,EAAKzC,MAAMC,MAAQA,CACrB,CACF,IAAE,MACK3gB,KAAK6gB,aAChB,GAKA,CAAAjf,IAAA,cAAAG,MACA,SAAYwgB,EAAM5gB,GAChB,OAAO3B,KAAKojB,MAAM,WAAD7B,OAAYvhB,KAAKygB,OAAS,CACzCzb,KAAMud,EAAKvd,KACXqe,MAAOd,EAAKc,MACZC,cAAe,CACbC,OAAQhB,EAAKgB,QAAU,QAGxBha,KAAK5H,GAAS,OACR,SAAA4G,GAAK,OAAI5G,EAAS,CAAE4G,MAAOA,GAAQ,GAC9C,GAKA,CAAA3G,IAAA,iBAAAG,MACA,SAAeiB,EAAMR,GACnB,OAAOxC,KAAKojB,MAAM,UAAD7B,OAAWvhB,KAAKygB,MAAK,eAAe,CACnDje,SAAUA,EACVghB,WAAYxgB,EAAKygB,WAAa,GAC9BC,WAAY1gB,EAAK2gB,WAErB,GAMA,CAAA/hB,IAAA,mBAAAG,MACA,SAAiBiB,EAAMR,GACrB,OAAOxC,KAAK4jB,KAAK,UAADrC,OAAWvhB,KAAKygB,MAAK,gBAAAc,OAAe/e,GAAY,CAC9DghB,WAAYxgB,EAAKygB,WAErB,GAGA,CAAA7hB,IAAA,gBAAAG,MAGA,SAAcS,GACZ,OAAOxC,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,gBAAAc,OAAe/e,GAAY,CAClEwW,OAAQ,UAEZ,GAEA,CAAApX,IAAA,oBAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,eAAe,CACtDzH,OAAQ,UAEZ,GAEA,CAAApX,IAAA,iBAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,cAAc,CACrDzH,OAAQ,QAEZ,GAEA,CAAApX,IAAA,gBAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,cAAc,CACrDzH,OAAQ,WACR,MAAOhZ,KAAK6gB,aAChB,GAEA,CAAAjf,IAAA,YAAAG,MAIA,SAAU2M,GACR,OAAO1O,KAAKojB,MAAM,UAAD7B,OAAWvhB,KAAKygB,MAAK,WAAW/R,GAAO,MACtD1O,KAAK6gB,aAET,GAEA,CAAAjf,IAAA,WAAAG,MAYA,SAAS2M,GACP,OAAO1O,KAAKojB,MAAM,UAAD7B,OAAWvhB,KAAKygB,MAAK,WAAW/R,GAAO,MACtD1O,KAAK6gB,aAET,GAEA,CAAAjf,IAAA,kBAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,aAAa,CACpDzH,OAAQ,WACR,MAAOhZ,KAAK6gB,aAChB,GAEA,CAAAjf,IAAA,eAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,aAAa,CACpDzH,OAAQ,SACR,MAAOhZ,KAAK6gB,aAChB,GAAC,CAAAjf,IAAA,cAAAG,MAED,SAAY8hB,EAAYliB,GAAU,IAAAmiB,EAAA,KAChC,OAAO9jB,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,eAAAc,OAAcsC,IACpDta,KAAK5H,GAAS,OACR,SAAA4G,GACD5G,EACFA,EAAS,CAAE4G,MAAAA,IAGbub,EAAKjD,aAAatY,EACpB,GACJ,GAEA,CAAA3G,IAAA,gBAAAG,MAGA,SAAcgiB,GACZ,OAAO/jB,KAAKojB,MAAM,UAAD7B,OAAWvhB,KAAKygB,MAAK,cAAc,CAClDsD,SAAUA,IACV,MAAO/jB,KAAK6gB,aAChB,GAEA,CAAAjf,IAAA,eAAAG,MAGA,SAAagiB,GACX,OAAO/jB,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,eAAAc,OAAcwC,EAASC,SAAW,CACzEhL,OAAQ,WACR,MAAOhZ,KAAK6gB,aAChB,GAEA,CAAAjf,IAAA,cAAAG,MAGA,WACE,OAAO/B,KAAKiiB,SAAS,UAADV,OAAWvhB,KAAKygB,MAAK,SAAS,CAChDzH,OAAQ,SACR,MAAOhZ,KAAK6gB,aAChB,KAACL,CAAA,CArVS,GCSZ,WAAgByD,EAAMC,EAAMtb,GAC1B,IAAIjG,EAASwhB,EAAMzf,EACf0f,EAAU,KACVC,EAAW,EACVzb,IAASA,EAAU,CAAC,GACzB,IAAI0b,EAAQ,WACVD,GAA+B,IAApBzb,EAAQ2b,QAAoB,EAAIC,KAAKC,MAChDL,EAAU,KACV1f,EAASuf,EAAKjE,MAAMrd,EAASwhB,GACxBC,IAASzhB,EAAUwhB,EAAO,KACjC,EACA,OAAO,WACL,IAAIM,EAAMD,KAAKC,MACVJ,IAAgC,IAApBzb,EAAQ2b,UAAmBF,EAAWI,GACvD,IAAIC,EAAYR,GAAQO,EAAMJ,GAc9B,OAbA1hB,EAAU3C,KACVmkB,EAAOlE,UACHyE,GAAa,GAAKA,EAAYR,GAC5BE,IACFO,aAAaP,GACbA,EAAU,MAEZC,EAAWI,EACX/f,EAASuf,EAAKjE,MAAMrd,EAASwhB,GACxBC,IAASzhB,EAAUwhB,EAAO,OACrBC,IAAgC,IAArBxb,EAAQgc,WAC7BR,EAAUS,WAAWP,EAAOI,IAEvBhgB,CACT,CACD,EC7Cc,SAASogB,EAAgB3G,EAAG4G,GAKzC,OAJAD,EAAkBlkB,OAAOib,eAAiBjb,OAAOib,eAAe3S,OAAS,SAAyBiV,EAAG4G,GAEnG,OADA5G,EAAErC,UAAYiJ,EACP5G,CACT,EACO2G,EAAgB3G,EAAG4G,EAC5B,CCLe,SAASC,EAAUC,EAAUC,GAC1C,GAA0B,mBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAI7K,UAAU,sDAEtB4K,EAASpkB,UAAYD,OAAOqX,OAAOiN,GAAcA,EAAWrkB,UAAW,CACrE8a,YAAa,CACX5Z,MAAOkjB,EACPzN,UAAU,EACVD,cAAc,KAGlB3W,OAAOiW,eAAeoO,EAAU,YAAa,CAC3CzN,UAAU,IAER0N,GAAY,EAAeD,EAAUC,EAC3C,CChBe,SAASC,EAAuBtlB,GAC7C,QAAa,IAATA,EACF,MAAM,IAAIulB,eAAe,6DAE3B,OAAOvlB,CACT,CCHe,SAASwlB,EAA2BxlB,EAAMgC,GACvD,GAAIA,IAA2B,WAAlB2U,EAAQ3U,IAAsC,mBAATA,GAChD,OAAOA,EACF,QAAa,IAATA,EACT,MAAM,IAAIwY,UAAU,4DAEtB,OAAO,EAAsBxa,EAC/B,CCTe,SAASylB,EAAgBnH,GAItC,OAHAmH,EAAkB1kB,OAAOib,eAAiBjb,OAAO+X,eAAezP,OAAS,SAAyBiV,GAChG,OAAOA,EAAErC,WAAalb,OAAO+X,eAAewF,EAC9C,EACOmH,EAAgBnH,EACzB,CCOA,QAVe,WACb,SAAAoH,EAAY5iB,GAAS8b,EAAA,KAAA8G,GACnBvlB,KAAK2C,QAAUA,CACjB,CAIC,OAJA4c,EAAAgG,EAAA,EAAA3jB,IAAA,SAAAG,MAED,SAAOyjB,GACLpD,EAAO7Z,MAAM,uCAAwCid,EACvD,KAACD,CAAA,CAPY,G,uaCFwB,IAEjCE,EAAkB,SAAAC,GAAAV,EAAAS,EAAAC,GAAA,IAAAC,EAAAC,EAAAH,GAAA,SAAAA,IAAA,OAAAhH,EAAA,KAAAgH,GAAAE,EAAA3F,MAAA,KAAAC,UAAA,CAGrB,OAHqBV,EAAAkG,EAAA,EAAA7jB,IAAA,SAAAG,MACtB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKC,cAAcN,EAAIzB,SACtC,KAAC0B,CAAA,CAHqB,CAASF,GAM3BQ,EAAiB,SAAAC,GAAAhB,EAAAe,EAAAC,GAAA,IAAAC,EAAAL,EAAAG,GAAA,SAAAA,IAAA,OAAAtH,EAAA,KAAAsH,GAAAE,EAAAjG,MAAA,KAAAC,UAAA,CAGpB,OAHoBV,EAAAwG,EAAA,EAAAnkB,IAAA,SAAAG,MACrB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKK,aAAaV,EAAIzB,SACrC,KAACgC,CAAA,CAHoB,CAASR,GCPjB,SAASY,IActB,OAZEA,EADqB,oBAAZC,SAA2BA,QAAQ9b,IACrC8b,QAAQ9b,IAAIpB,OAEZ,SAAckW,EAAQlc,EAAUmjB,GACrC,IAAIC,ECLK,SAAwB5kB,EAAQwB,GAC7C,MAAQtC,OAAOC,UAAUC,eAAee,KAAKH,EAAQwB,IAEpC,QADfxB,EAAS,EAAeA,MAG1B,OAAOA,CACT,CDDiB,CAAc0d,EAAQlc,GACjC,GAAKojB,EAAL,CACA,IAAIxP,EAAOlW,OAAO2lB,yBAAyBD,EAAMpjB,GACjD,OAAI4T,EAAKxM,IACAwM,EAAKxM,IAAIzI,KAAKoe,UAAU3d,OAAS,EAAI8c,EAASiH,GAEhDvP,EAAK/U,KALK,CAMnB,EAEKokB,EAAKnG,MAAMhgB,KAAMigB,UAC1B,C,uaEHA,QAXiB,SAAAyF,GAAAV,EAAAwB,EAAAd,GAAA,IAAAC,EAAAC,EAAAY,GAAA,SAAAA,IAAA,OAAA/H,EAAA,KAAA+H,GAAAb,EAAA3F,MAAA,KAAAC,UAAA,CAQd,OARcV,EAAAiH,EAAA,EAAA5kB,IAAA,SAAAG,MACf,SAAOyjB,GACY,WAAbA,EAAIiB,OAIRL,QAAQM,eAAelB,EAAK,QAC5BxlB,KAAK2C,QAAQgkB,UAAUhY,SAAQ,SAAAhN,GAAQ,OAAIA,EAAS6jB,EAAI,IAC1D,KAACgB,CAAA,CARc,CAASjB,G,uaCFiB,IAErCqB,EAAoB,SAAAC,GAAA7B,EAAA4B,EAAAC,GAAA,IAAAlB,EAAAC,EAAAgB,GAAA,SAAAA,IAAA,OAAAnI,EAAA,KAAAmI,GAAAjB,EAAA3F,MAAA,KAAAC,UAAA,CAYvB,OAZuBV,EAAAqH,EAAA,EAAAhlB,IAAA,SAAAG,MACxB,WAAS,IAAAugB,EAAA,KACPtiB,KAAK2C,QAAQmkB,eAAiB/mB,OAAOgnB,aAAY,WAC/CzE,EAAK3f,QAAQkjB,KAAKmB,kBAChB,SAAA/F,GACE,OAAAkF,EAAAb,EAAAsB,EAAA/lB,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAoB,CAAEnf,KAAM,aAAc8jB,WAAYhG,GACxD,IACA,WACElhB,OAAOmnB,cAAc5E,EAAK3f,QAAQmkB,eACpC,GAEJ,GAAG,IACL,KAACF,CAAA,CAZuB,CAASJ,GAe7BW,EAAmB,SAAAC,GAAApC,EAAAmC,EAAAC,GAAA,IAAAnB,EAAAL,EAAAuB,GAAA,SAAAA,IAAA,OAAA1I,EAAA,KAAA0I,GAAAlB,EAAAjG,MAAA,KAAAC,UAAA,CAItB,OAJsBV,EAAA4H,EAAA,EAAAvlB,IAAA,SAAAG,MACvB,WACEhC,OAAOmnB,cAAclnB,KAAK2C,QAAQmkB,gBAClC9mB,KAAK2C,QAAQkjB,KAAKwB,gBACpB,KAACF,CAAA,CAJsB,CAASX,G,uaCTlC,QANe,SAAAK,GAAA7B,EAAAsC,EAAAT,GAAA,IAAAlB,EAAAC,EAAA0B,GAAA,SAAAA,IAAA,OAAA7I,EAAA,KAAA6I,GAAA3B,EAAA3F,MAAA,KAAAC,UAAA,CAGZ,OAHYV,EAAA+H,EAAA,EAAA1lB,IAAA,SAAAG,MACb,WACE/B,KAAK2C,QAAQ4kB,cAAcC,KAAK,CAAErkB,KAAM,QAC1C,KAACmkB,CAAA,CAHY,CAASd,G,uaCMxB,QANiB,SAAAd,GAAAV,EAAAyC,EAAA/B,GAAA,IAAAC,EAAAC,EAAA6B,GAAA,SAAAA,IAAA,OAAAhJ,EAAA,KAAAgJ,GAAA9B,EAAA3F,MAAA,KAAAC,UAAA,CAGd,OAHcV,EAAAkI,EAAA,EAAA7lB,IAAA,SAAAG,MACf,WACE,KACD0lB,CAAA,CAHc,CAASlC,G,uaCM1B,QANkB,SAAAG,GAAAV,EAAA0C,EAAAhC,GAAA,IAAAC,EAAAC,EAAA8B,GAAA,SAAAA,IAAA,OAAAjJ,EAAA,KAAAiJ,GAAA/B,EAAA3F,MAAA,KAAAC,UAAA,CAGf,OAHeV,EAAAmI,EAAA,EAAA9lB,IAAA,SAAAG,MAChB,SAAOyjB,GACLxlB,KAAK2C,QAAQgkB,UAAUhY,SAAQ,SAAAhN,GAAQ,OAAIA,EAAS6jB,EAAI,GAC1D,KAACkC,CAAA,CAHe,CAASnC,GCFZ,SAASoC,EAAkBC,EAAKC,IAClC,MAAPA,GAAeA,EAAMD,EAAItlB,UAAQulB,EAAMD,EAAItlB,QAC/C,IAAK,IAAI2F,EAAI,EAAG6f,EAAO,IAAIC,MAAMF,GAAM5f,EAAI4f,EAAK5f,IAAK6f,EAAK7f,GAAK2f,EAAI3f,GACnE,OAAO6f,CACT,CCHe,SAASE,EAA4B7J,EAAG8J,GACrD,GAAK9J,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAO,EAAiBA,EAAG8J,GACtD,IAAInK,EAAIld,OAAOC,UAAUE,SAASc,KAAKsc,GAAG9c,MAAM,GAAI,GAEpD,MADU,WAANyc,GAAkBK,EAAExC,cAAamC,EAAIK,EAAExC,YAAY3W,MAC7C,QAAN8Y,GAAqB,QAANA,EAAoBiK,MAAMG,KAAK/J,GACxC,cAANL,GAAqB,2CAA2Ctc,KAAKsc,GAAW,EAAiBK,EAAG8J,QAAxG,CALc,CAMhB,CCJe,SAASE,EAAeP,EAAK3f,GAC1C,OCLa,SAAyB2f,GACtC,GAAIG,MAAMK,QAAQR,GAAM,OAAOA,CACjC,CDGS,CAAeA,IELT,SAA+BA,EAAK3f,GACjD,IAAIogB,EAAK,MAAQT,EAAM,KAAO,oBAAsB5Q,QAAU4Q,EAAI5Q,OAAOE,WAAa0Q,EAAI,cAC1F,GAAI,MAAQS,EAAI,CACd,IAAIC,EACFC,EACAC,EACAC,EACAC,EAAO,GACPC,GAAK,EACLC,GAAK,EACP,IACE,GAAIJ,GAAMH,EAAKA,EAAGxmB,KAAK+lB,IAAMpN,KAAM,IAAMvS,EAAG,CAC1C,GAAIrH,OAAOynB,KAAQA,EAAI,OACvBM,GAAK,CACP,MAAO,OAASA,GAAML,EAAKE,EAAG3mB,KAAKwmB,IAAKzO,QAAU8O,EAAK7iB,KAAKyiB,EAAGvmB,OAAQ2mB,EAAKpmB,SAAW2F,GAAI0gB,GAAK,GAClG,CAAE,MAAOlR,GACPmR,GAAK,EAAIL,EAAK9Q,CAChB,CAAE,QACA,IACE,IAAKkR,GAAM,MAAQN,EAAW,SAAMI,EAAKJ,EAAW,SAAKznB,OAAO6nB,KAAQA,GAAK,MAC/E,CAAE,QACA,GAAIG,EAAI,MAAML,CAChB,CACF,CACA,OAAOG,CACT,CACF,CFrBgC,CAAqBd,EAAK3f,IAAM,EAA2B2f,EAAK3f,IGLjF,WACb,MAAM,IAAIoS,UAAU,4IACtB,CHGsG,EACtG,CIIA,IAAIwO,GAAe,EACfC,GAAuB,EAUpB,SAASC,EAAeC,EAAUC,EAAMC,GAC7C,MAAMC,EAAQH,EAASG,MAAMF,GAC7B,OAAOE,GAASA,EAAM7mB,QAAU4mB,GAAOzhB,SAAS0hB,EAAMD,GAAM,GAC9D,CAKO,SAASE,EAAwBrpB,EAAQspB,EAAiBC,GAC/D,IAAKvpB,EAAOwpB,kBACV,OAEF,MAAMC,EAAQzpB,EAAOwpB,kBAAkB1oB,UACjC4oB,EAAyBD,EAAMtf,iBACrCsf,EAAMtf,iBAAmB,SAASwf,EAAiBC,GACjD,GAAID,IAAoBL,EACtB,OAAOI,EAAuBzJ,MAAMhgB,KAAMigB,WAE5C,MAAM2J,EAAmB5iB,IACvB,MAAM6iB,EAAgBP,EAAQtiB,GAC1B6iB,IACEF,EAAGG,YACLH,EAAGG,YAAYD,GAEfF,EAAGE,GAEP,EAOF,OALA7pB,KAAK+pB,UAAY/pB,KAAK+pB,WAAa,CAAC,EAC/B/pB,KAAK+pB,UAAUV,KAClBrpB,KAAK+pB,UAAUV,GAAmB,IAAIW,KAExChqB,KAAK+pB,UAAUV,GAAiBY,IAAIN,EAAIC,GACjCH,EAAuBzJ,MAAMhgB,KAAM,CAAC0pB,EACzCE,GACJ,EAEA,MAAMM,EAA4BV,EAAMrf,oBACxCqf,EAAMrf,oBAAsB,SAASuf,EAAiBC,GACpD,GAAID,IAAoBL,IAAoBrpB,KAAK+pB,YACzC/pB,KAAK+pB,UAAUV,GACrB,OAAOa,EAA0BlK,MAAMhgB,KAAMigB,WAE/C,IAAKjgB,KAAK+pB,UAAUV,GAAiBc,IAAIR,GACvC,OAAOO,EAA0BlK,MAAMhgB,KAAMigB,WAE/C,MAAMmK,EAAcpqB,KAAK+pB,UAAUV,GAAiB/e,IAAIqf,GAQxD,OAPA3pB,KAAK+pB,UAAUV,GAAiBgB,OAAOV,GACM,IAAzC3pB,KAAK+pB,UAAUV,GAAiBiB,aAC3BtqB,KAAK+pB,UAAUV,GAEmB,IAAvCzoB,OAAO6N,KAAKzO,KAAK+pB,WAAWznB,eACvBtC,KAAK+pB,UAEPG,EAA0BlK,MAAMhgB,KAAM,CAAC0pB,EAC5CU,GACJ,EAEAxpB,OAAOiW,eAAe2S,EAAO,KAAOH,EAAiB,CACnD,GAAA/e,GACE,OAAOtK,KAAK,MAAQqpB,EACtB,EACA,GAAAY,CAAIN,GACE3pB,KAAK,MAAQqpB,KACfrpB,KAAKmK,oBAAoBkf,EACvBrpB,KAAK,MAAQqpB,WACRrpB,KAAK,MAAQqpB,IAElBM,GACF3pB,KAAKkK,iBAAiBmf,EACpBrpB,KAAK,MAAQqpB,GAAmBM,EAEtC,EACAlf,YAAY,EACZ8M,cAAc,GAElB,CAEO,SAASgT,EAAWC,GACzB,MAAoB,kBAATA,EACF,IAAI7Q,MAAM,yBAA2B6Q,EACxC,4BAEN3B,EAAe2B,EACR,EAAS,8BACd,6BACJ,CAMO,SAASC,EAAgBD,GAC9B,MAAoB,kBAATA,EACF,IAAI7Q,MAAM,yBAA2B6Q,EACxC,4BAEN1B,GAAwB0B,EACjB,oCAAsCA,EAAO,WAAa,WACnE,CAEO,SAASnK,IACd,GAAsB,iBAAXtgB,OAAqB,CAC9B,GAAI8oB,EACF,OAEqB,oBAAZ9I,SAAkD,mBAAhBA,QAAQM,KACnDN,QAAQM,IAAIL,MAAMD,QAASE,UAE/B,CACF,CAKO,SAASyK,EAAWC,EAAWC,GAC/B9B,GAGL/I,QAAQG,KAAKyK,EAAY,8BAAgCC,EACrD,YACN,CAuDA,SAASC,EAAS9iB,GAChB,MAA+C,oBAAxCnH,OAAOC,UAAUE,SAASc,KAAKkG,EACxC,CAOO,SAAS+iB,EAAc9nB,GAC5B,OAAK6nB,EAAS7nB,GAIPpC,OAAO6N,KAAKzL,GAAMd,QAAO,SAASE,EAAaR,GACpD,MAAMmpB,EAAQF,EAAS7nB,EAAKpB,IACtBG,EAAQgpB,EAAQD,EAAc9nB,EAAKpB,IAAQoB,EAAKpB,GAChDopB,EAAgBD,IAAUnqB,OAAO6N,KAAK1M,GAAOO,OACnD,YAAcwK,IAAV/K,GAAuBipB,EAClB5oB,EAEFxB,OAAOmiB,OAAO3gB,EAAa,CAAC,CAACR,GAAMG,GAC5C,GAAG,CAAC,GAXKiB,CAYX,CAGO,SAASioB,EAAUC,EAAO5E,EAAM6E,GAChC7E,IAAQ6E,EAAUhB,IAAI7D,EAAKzY,MAGhCsd,EAAUlB,IAAI3D,EAAKzY,GAAIyY,GACvB1lB,OAAO6N,KAAK6X,GAAM3X,SAAQ3J,IACpBA,EAAKomB,SAAS,MAChBH,EAAUC,EAAOA,EAAM5gB,IAAIgc,EAAKthB,IAAQmmB,GAC/BnmB,EAAKomB,SAAS,QACvB9E,EAAKthB,GAAM2J,SAAQd,IACjBod,EAAUC,EAAOA,EAAM5gB,IAAIuD,GAAKsd,EAAU,GAE9C,IAEJ,CAGO,SAASE,EAAY3mB,EAAQ+P,EAAO6W,GACzC,MAAMC,EAAkBD,EAAW,eAAiB,cAC9CE,EAAiB,IAAIxB,IAC3B,GAAc,OAAVvV,EACF,OAAO+W,EAET,MAAMC,EAAa,GAcnB,OAbA/mB,EAAOiK,SAAQ5M,IACM,UAAfA,EAAMoB,MACNpB,EAAM2pB,kBAAoBjX,EAAM5G,IAClC4d,EAAW5lB,KAAK9D,EAClB,IAEF0pB,EAAW9c,SAAQgd,IACjBjnB,EAAOiK,SAAQuc,IACTA,EAAM/nB,OAASooB,GAAmBL,EAAMU,UAAYD,EAAU9d,IAChEod,EAAUvmB,EAAQwmB,EAAOM,EAC3B,GACA,IAEGA,CACT,CC3PA,MAAMK,EAAU,EAET,SAASC,GAAiB/rB,EAAQgsB,GACvC,MAAMjpB,EAAY/C,GAAUA,EAAO+C,UAEnC,IAAKA,EAAUkpB,aACb,OAGF,MAAMC,EAAuB,SAASC,GACpC,GAAiB,iBAANA,GAAkBA,EAAEC,WAAaD,EAAEE,SAC5C,OAAOF,EAET,MAAMG,EAAK,CAAC,EA4CZ,OA3CAzrB,OAAO6N,KAAKyd,GAAGvd,SAAQ/M,IACrB,GAAY,YAARA,GAA6B,aAARA,GAA8B,gBAARA,EAC7C,OAEF,MAAMyc,EAAuB,iBAAX6N,EAAEtqB,GAAqBsqB,EAAEtqB,GAAO,CAAC0qB,MAAOJ,EAAEtqB,SAC5CkL,IAAZuR,EAAEkO,OAA0C,iBAAZlO,EAAEkO,QACpClO,EAAEmO,IAAMnO,EAAEoO,IAAMpO,EAAEkO,OAEpB,MAAMG,EAAW,SAAS9gB,EAAQ5G,GAChC,OAAI4G,EACKA,EAAS5G,EAAK7D,OAAO,GAAGC,cAAgB4D,EAAK3D,MAAM,GAE3C,aAAT2D,EAAuB,WAAaA,CAC9C,EACA,QAAgB8H,IAAZuR,EAAEiO,MAAqB,CACzBD,EAAGD,SAAWC,EAAGD,UAAY,GAC7B,IAAIO,EAAK,CAAC,EACa,iBAAZtO,EAAEiO,OACXK,EAAGD,EAAS,MAAO9qB,IAAQyc,EAAEiO,MAC7BD,EAAGD,SAASvmB,KAAK8mB,GACjBA,EAAK,CAAC,EACNA,EAAGD,EAAS,MAAO9qB,IAAQyc,EAAEiO,MAC7BD,EAAGD,SAASvmB,KAAK8mB,KAEjBA,EAAGD,EAAS,GAAI9qB,IAAQyc,EAAEiO,MAC1BD,EAAGD,SAASvmB,KAAK8mB,GAErB,MACgB7f,IAAZuR,EAAEkO,OAA0C,iBAAZlO,EAAEkO,OACpCF,EAAGF,UAAYE,EAAGF,WAAa,CAAC,EAChCE,EAAGF,UAAUO,EAAS,GAAI9qB,IAAQyc,EAAEkO,OAEpC,CAAC,MAAO,OAAO5d,SAAQie,SACN9f,IAAXuR,EAAEuO,KACJP,EAAGF,UAAYE,EAAGF,WAAa,CAAC,EAChCE,EAAGF,UAAUO,EAASE,EAAKhrB,IAAQyc,EAAEuO,GACvC,GAEJ,IAEEV,EAAEW,WACJR,EAAGD,UAAYC,EAAGD,UAAY,IAAI7K,OAAO2K,EAAEW,WAEtCR,CACT,EAEMS,EAAmB,SAASC,EAAa9I,GAC7C,GAAI8H,EAAevnB,SAAW,GAC5B,OAAOyf,EAAK8I,GAGd,IADAA,EAAczZ,KAAK7Q,MAAM6Q,KAAKC,UAAUwZ,MACQ,iBAAtBA,EAAYC,MAAoB,CACxD,MAAMC,EAAQ,SAASlZ,EAAKkK,EAAGiP,GACzBjP,KAAKlK,KAASmZ,KAAKnZ,KACrBA,EAAImZ,GAAKnZ,EAAIkK,UACNlK,EAAIkK,GAEf,EAEAgP,GADAF,EAAczZ,KAAK7Q,MAAM6Q,KAAKC,UAAUwZ,KACtBC,MAAO,kBAAmB,uBAC5CC,EAAMF,EAAYC,MAAO,mBAAoB,wBAC7CD,EAAYC,MAAQf,EAAqBc,EAAYC,MACvD,CACA,GAAID,GAA4C,iBAAtBA,EAAYI,MAAoB,CAExD,IAAIC,EAAOL,EAAYI,MAAME,WAC7BD,EAAOA,IAA0B,iBAATA,EAAqBA,EAAO,CAACd,MAAOc,IAC5D,MAAME,EAA6BvB,EAAevnB,QAAU,GAE5D,GAAK4oB,IAAwB,SAAfA,EAAKb,OAAmC,gBAAfa,EAAKb,OACf,SAAfa,EAAKd,OAAmC,gBAAfc,EAAKd,UACtCxpB,EAAUkpB,aAAauB,0BACvBzqB,EAAUkpB,aAAauB,0BAA0BF,YAChDC,GAA6B,CAElC,IAAIE,EAMJ,UAPOT,EAAYI,MAAME,WAEN,gBAAfD,EAAKb,OAA0C,gBAAfa,EAAKd,MACvCkB,EAAU,CAAC,OAAQ,QACK,SAAfJ,EAAKb,OAAmC,SAAfa,EAAKd,QACvCkB,EAAU,CAAC,UAETA,EAEF,OAAO1qB,EAAUkpB,aAAayB,mBAC3BlkB,MAAKmkB,IAEJ,IAAIC,GADJD,EAAUA,EAAQ7hB,QAAOmS,GAAgB,eAAXA,EAAEzL,QACdH,MAAK4L,GAAKwP,EAAQI,MAAKzE,GACvCnL,EAAEjZ,MAAMqH,cAAcyhB,SAAS1E,OAWjC,OAVKwE,GAAOD,EAAQprB,QAAUkrB,EAAQK,SAAS,UAC7CF,EAAMD,EAAQA,EAAQprB,OAAS,IAE7BqrB,IACFZ,EAAYI,MAAMW,SAAWV,EAAKb,MAC9B,CAACA,MAAOoB,EAAIG,UACZ,CAACxB,MAAOqB,EAAIG,WAElBf,EAAYI,MAAQlB,EAAqBc,EAAYI,OACrDtB,EAAQ,WAAavY,KAAKC,UAAUwZ,IAC7B9I,EAAK8I,EAAY,GAGhC,CACAA,EAAYI,MAAQlB,EAAqBc,EAAYI,MACvD,CAEA,OADAtB,EAAQ,WAAavY,KAAKC,UAAUwZ,IAC7B9I,EAAK8I,EACd,EAEMgB,EAAa,SAAS/mB,GAC1B,OAAI+kB,EAAevnB,SAAW,GACrBwC,EAEF,CACLhC,KAAM,CACJgpB,sBAAuB,kBACvBC,yBAA0B,kBAC1BC,kBAAmB,kBACnBC,qBAAsB,gBACtBC,4BAA6B,uBAC7BC,gBAAiB,mBACjBC,+BAAgC,kBAChCC,wBAAyB,kBACzBC,gBAAiB,aACjBC,mBAAoB,aACpBC,mBAAoB,cACpB1nB,EAAEhC,OAASgC,EAAEhC,KACf2pB,QAAS3nB,EAAE2nB,QACXC,WAAY5nB,EAAE4nB,YAAc5nB,EAAE6nB,eAC9B,QAAA9tB,GACE,OAAOf,KAAKgF,MAAQhF,KAAK2uB,SAAW,MAAQ3uB,KAAK2uB,OACnD,EAEJ,EAgBA,GALA7rB,EAAUgsB,aATY,SAAS/B,EAAagC,EAAWC,GACrDlC,EAAiBC,GAAab,IAC5BppB,EAAUmsB,mBAAmB/C,EAAG6C,GAAW/nB,IACrCgoB,GACFA,EAAQjB,EAAW/mB,GACrB,GACA,GAEN,EACuCkC,KAAKpG,GAKxCA,EAAUkpB,aAAa8C,aAAc,CACvC,MAAMI,EAAmBpsB,EAAUkpB,aAAa8C,aAC9C5lB,KAAKpG,EAAUkpB,cACjBlpB,EAAUkpB,aAAa8C,aAAe,SAASK,GAC7C,OAAOrC,EAAiBqC,GAAIjD,GAAKgD,EAAiBhD,GAAG3iB,MAAKiL,IACxD,GAAI0X,EAAEc,QAAUxY,EAAO4a,iBAAiB9sB,QACpC4pB,EAAEiB,QAAU3Y,EAAO6a,iBAAiB/sB,OAItC,MAHAkS,EAAO8a,YAAY3gB,SAAQ8F,IACzBA,EAAM6H,MAAM,IAER,IAAIiT,aAAa,GAAI,iBAE7B,OAAO/a,CAAM,IACZxN,GAAK6B,QAAQE,OAAOglB,EAAW/mB,OACpC,CACF,CACF,CCnLO,SAASwoB,GAAoBzvB,EAAQ0vB,GACtC1vB,EAAO+C,UAAUkpB,cACnB,oBAAqBjsB,EAAO+C,UAAUkpB,cAGlCjsB,EAAO+C,UAAsB,eAKR,mBAAhB2sB,EAKX1vB,EAAO+C,UAAUkpB,aAAa0D,gBAC5B,SAAyB3C,GACvB,OAAO0C,EAAY1C,GAChBxjB,MAAKomB,IACJ,MAAMC,EAAiB7C,EAAYI,OAASJ,EAAYI,MAAM0C,MACxDC,EAAkB/C,EAAYI,OAClCJ,EAAYI,MAAM4C,OACdC,EAAqBjD,EAAYI,OACrCJ,EAAYI,MAAM8C,UAcpB,OAbAlD,EAAYI,MAAQ,CAClBhB,UAAW,CACT+D,kBAAmB,UACnBC,oBAAqBR,EACrBS,aAAcJ,GAAsB,IAGpCJ,IACF7C,EAAYI,MAAMhB,UAAUkE,SAAWT,GAErCE,IACF/C,EAAYI,MAAMhB,UAAUmE,UAAYR,GAEnC/vB,EAAO+C,UAAUkpB,aAAa8C,aAAa/B,EAAY,GAEpE,EA5BAhN,QAAQxX,MAAM,+DA6BlB,CCnCO,SAASgoB,GAAgBxwB,GAC9BA,EAAOywB,YAAczwB,EAAOywB,aAAezwB,EAAO0wB,iBACpD,CAEO,SAASC,GAAY3wB,GAC1B,GAAsB,iBAAXA,GAAuBA,EAAOwpB,qBAAuB,YAC5DxpB,EAAOwpB,kBAAkB1oB,WAAY,CACvCD,OAAOiW,eAAe9W,EAAOwpB,kBAAkB1oB,UAAW,UAAW,CACnE,GAAAyJ,GACE,OAAOtK,KAAK2wB,QACd,EACA,GAAA1G,CAAI2G,GACE5wB,KAAK2wB,UACP3wB,KAAKmK,oBAAoB,QAASnK,KAAK2wB,UAEzC3wB,KAAKkK,iBAAiB,QAASlK,KAAK2wB,SAAWC,EACjD,EACAnmB,YAAY,EACZ8M,cAAc,IAEhB,MAAMsZ,EACF9wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACvC/wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACjC,WAuCE,OAtCK9wB,KAAK+wB,eACR/wB,KAAK+wB,aAAgB/pB,IAGnBA,EAAEwN,OAAOtK,iBAAiB,YAAY8mB,IACpC,IAAI3K,EAEFA,EADEtmB,EAAOwpB,kBAAkB1oB,UAAUowB,aAC1BjxB,KAAKixB,eACb7e,MAAKiM,GAAKA,EAAE5J,OAAS4J,EAAE5J,MAAM5G,KAAOmjB,EAAGvc,MAAM5G,KAErC,CAAC4G,MAAOuc,EAAGvc,OAGxB,MAAMzK,EAAQ,IAAIknB,MAAM,SACxBlnB,EAAMyK,MAAQuc,EAAGvc,MACjBzK,EAAMqc,SAAWA,EACjBrc,EAAMmnB,YAAc,CAAC9K,YACrBrc,EAAMonB,QAAU,CAACpqB,EAAEwN,QACnBxU,KAAKqxB,cAAcrnB,EAAM,IAE3BhD,EAAEwN,OAAO8a,YAAY3gB,SAAQ8F,IAC3B,IAAI4R,EAEFA,EADEtmB,EAAOwpB,kBAAkB1oB,UAAUowB,aAC1BjxB,KAAKixB,eACb7e,MAAKiM,GAAKA,EAAE5J,OAAS4J,EAAE5J,MAAM5G,KAAO4G,EAAM5G,KAElC,CAAC4G,SAEd,MAAMzK,EAAQ,IAAIknB,MAAM,SACxBlnB,EAAMyK,MAAQA,EACdzK,EAAMqc,SAAWA,EACjBrc,EAAMmnB,YAAc,CAAC9K,YACrBrc,EAAMonB,QAAU,CAACpqB,EAAEwN,QACnBxU,KAAKqxB,cAAcrnB,EAAM,GACzB,EAEJhK,KAAKkK,iBAAiB,YAAalK,KAAK+wB,eAEnCF,EAAyB7Q,MAAMhgB,KAAMigB,UAC9C,CACJ,MAIE,EAA8BlgB,EAAQ,SAASiH,IACxCA,EAAEmqB,aACLvwB,OAAOiW,eAAe7P,EAAG,cACvB,CAACjF,MAAO,CAACskB,SAAUrf,EAAEqf,YAElBrf,IAGb,CAEO,SAASsqB,GAAuBvxB,GAErC,GAAsB,iBAAXA,GAAuBA,EAAOwpB,qBACnC,eAAgBxpB,EAAOwpB,kBAAkB1oB,YAC3C,qBAAsBd,EAAOwpB,kBAAkB1oB,UAAW,CAC5D,MAAM0wB,EAAqB,SAASC,EAAI/c,GACtC,MAAO,CACLA,QACA,QAAIgd,GAQF,YAPmB3kB,IAAf9M,KAAK0xB,QACY,UAAfjd,EAAMlC,KACRvS,KAAK0xB,MAAQF,EAAGG,iBAAiBld,GAEjCzU,KAAK0xB,MAAQ,MAGV1xB,KAAK0xB,KACd,EACAE,IAAKJ,EAET,EAGA,IAAKzxB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAAY,CAClD9xB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAAa,WAE9C,OADA7xB,KAAK8xB,SAAW9xB,KAAK8xB,UAAY,GAC1B9xB,KAAK8xB,SAASzwB,OACvB,EACA,MAAM0wB,EAAehyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACxDjyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACjC,SAAkBvd,EAAOD,GACvB,IAAIyd,EAASF,EAAa/R,MAAMhgB,KAAMigB,WAKtC,OAJKgS,IACHA,EAASV,EAAmBvxB,KAAMyU,GAClCzU,KAAK8xB,SAASjsB,KAAKosB,IAEdA,CACT,EAEF,MAAMC,EAAkBnyB,EAAOwpB,kBAAkB1oB,UAAUsxB,YAC3DpyB,EAAOwpB,kBAAkB1oB,UAAUsxB,YACjC,SAAqBF,GACnBC,EAAgBlS,MAAMhgB,KAAMigB,WAC5B,MAAMmS,EAAMpyB,KAAK8xB,SAAS/rB,QAAQksB,IACrB,IAATG,GACFpyB,KAAK8xB,SAASO,OAAOD,EAAK,EAE9B,CACJ,CACA,MAAME,EAAgBvyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UACzDxyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UAAY,SAAmB/d,GAChExU,KAAK8xB,SAAW9xB,KAAK8xB,UAAY,GACjCQ,EAActS,MAAMhgB,KAAM,CAACwU,IAC3BA,EAAO8a,YAAY3gB,SAAQ8F,IACzBzU,KAAK8xB,SAASjsB,KAAK0rB,EAAmBvxB,KAAMyU,GAAO,GAEvD,EAEA,MAAM+d,EAAmBzyB,EAAOwpB,kBAAkB1oB,UAAU4xB,aAC5D1yB,EAAOwpB,kBAAkB1oB,UAAU4xB,aACjC,SAAsBje,GACpBxU,KAAK8xB,SAAW9xB,KAAK8xB,UAAY,GACjCU,EAAiBxS,MAAMhgB,KAAM,CAACwU,IAE9BA,EAAO8a,YAAY3gB,SAAQ8F,IACzB,MAAMwd,EAASjyB,KAAK8xB,SAAS1f,MAAKsgB,GAAKA,EAAEje,QAAUA,IAC/Cwd,GACFjyB,KAAK8xB,SAASO,OAAOryB,KAAK8xB,SAAS/rB,QAAQksB,GAAS,EACtD,GAEJ,CACJ,MAAO,GAAsB,iBAAXlyB,GAAuBA,EAAOwpB,mBACrC,eAAgBxpB,EAAOwpB,kBAAkB1oB,WACzC,qBAAsBd,EAAOwpB,kBAAkB1oB,WAC/Cd,EAAO4yB,gBACL,SAAU5yB,EAAO4yB,aAAa9xB,WAAY,CACrD,MAAM+xB,EAAiB7yB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAC1D9xB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAAa,WAC9C,MAAMgB,EAAUD,EAAe5S,MAAMhgB,KAAM,IAE3C,OADA6yB,EAAQlkB,SAAQsjB,GAAUA,EAAOL,IAAM5xB,OAChC6yB,CACT,EAEAjyB,OAAOiW,eAAe9W,EAAO4yB,aAAa9xB,UAAW,OAAQ,CAC3D,GAAAyJ,GAQE,YAPmBwC,IAAf9M,KAAK0xB,QACiB,UAApB1xB,KAAKyU,MAAMlC,KACbvS,KAAK0xB,MAAQ1xB,KAAK4xB,IAAID,iBAAiB3xB,KAAKyU,OAE5CzU,KAAK0xB,MAAQ,MAGV1xB,KAAK0xB,KACd,GAEJ,CACF,CAEO,SAASoB,GAAa/yB,GAC3B,IAAKA,EAAOwpB,kBACV,OAGF,MAAMwJ,EAAehzB,EAAOwpB,kBAAkB1oB,UAAUmyB,SACxDjzB,EAAOwpB,kBAAkB1oB,UAAUmyB,SAAW,WAC5C,MAAOC,EAAUC,EAAQC,GAASlT,UAIlC,GAAIA,UAAU3d,OAAS,GAAyB,mBAAb2wB,EACjC,OAAOF,EAAa/S,MAAMhgB,KAAMigB,WAKlC,GAA4B,IAAxB8S,EAAazwB,SAAsC,IAArB2d,UAAU3d,QACpB,mBAAb2wB,GACT,OAAOF,EAAa/S,MAAMhgB,KAAM,IAGlC,MAAMozB,EAAkB,SAASnS,GAC/B,MAAMoS,EAAiB,CAAC,EAiBxB,OAhBgBpS,EAASvc,SACjBiK,SAAQ2kB,IACd,MAAMC,EAAgB,CACpB1lB,GAAIylB,EAAOzlB,GACX2lB,UAAWF,EAAOE,UAClBrwB,KAAM,CACJswB,eAAgB,kBAChBC,gBAAiB,oBACjBJ,EAAOnwB,OAASmwB,EAAOnwB,MAE3BmwB,EAAOK,QAAQhlB,SAAQ3J,IACrBuuB,EAAcvuB,GAAQsuB,EAAOM,KAAK5uB,EAAK,IAEzCquB,EAAeE,EAAc1lB,IAAM0lB,CAAa,IAG3CF,CACT,EAGMQ,EAAe,SAAS3I,GAC5B,OAAO,IAAIlB,IAAIppB,OAAO6N,KAAKyc,GAAO/f,KAAIvJ,GAAO,CAACA,EAAKspB,EAAMtpB,MAC3D,EAEA,GAAIqe,UAAU3d,QAAU,EAAG,CACzB,MAAMwxB,EAA0B,SAAS7S,GACvCiS,EAAOW,EAAaT,EAAgBnS,IACtC,EAEA,OAAO8R,EAAa/S,MAAMhgB,KAAM,CAAC8zB,EAC/Bb,GACJ,CAGA,OAAO,IAAIpqB,SAAQ,CAACC,EAASC,KAC3BgqB,EAAa/S,MAAMhgB,KAAM,CACvB,SAASihB,GACPnY,EAAQ+qB,EAAaT,EAAgBnS,IACvC,EAAGlY,GAAQ,IACZQ,KAAK2pB,EAAQC,EAClB,CACF,CAEO,SAASY,GAA2Bh0B,GACzC,KAAwB,iBAAXA,GAAuBA,EAAOwpB,mBACvCxpB,EAAO4yB,cAAgB5yB,EAAOi0B,gBAChC,OAIF,KAAM,aAAcj0B,EAAO4yB,aAAa9xB,WAAY,CAClD,MAAM+xB,EAAiB7yB,EAAOwpB,kBAAkB1oB,UAAUgxB,WACtDe,IACF7yB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAAa,WAC9C,MAAMgB,EAAUD,EAAe5S,MAAMhgB,KAAM,IAE3C,OADA6yB,EAAQlkB,SAAQsjB,GAAUA,EAAOL,IAAM5xB,OAChC6yB,CACT,GAGF,MAAMd,EAAehyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACpDD,IACFhyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SAAW,WAC5C,MAAMC,EAASF,EAAa/R,MAAMhgB,KAAMigB,WAExC,OADAgS,EAAOL,IAAM5xB,KACNiyB,CACT,GAEFlyB,EAAO4yB,aAAa9xB,UAAUmyB,SAAW,WACvC,MAAMf,EAASjyB,KACf,OAAOA,KAAK4xB,IAAIoB,WAAWzpB,MAAK7E,GAK9B,EAAkBA,EAAQutB,EAAOxd,OAAO,IAC5C,CACF,CAGA,KAAM,aAAc1U,EAAOi0B,eAAenzB,WAAY,CACpD,MAAMozB,EAAmBl0B,EAAOwpB,kBAAkB1oB,UAAUowB,aACxDgD,IACFl0B,EAAOwpB,kBAAkB1oB,UAAUowB,aACjC,WACE,MAAMiD,EAAYD,EAAiBjU,MAAMhgB,KAAM,IAE/C,OADAk0B,EAAUvlB,SAAQ0X,GAAYA,EAASuL,IAAM5xB,OACtCk0B,CACT,GAEJ,EAA8Bn0B,EAAQ,SAASiH,IAC7CA,EAAEqf,SAASuL,IAAM5qB,EAAEmtB,WACZntB,KAETjH,EAAOi0B,eAAenzB,UAAUmyB,SAAW,WACzC,MAAM3M,EAAWrmB,KACjB,OAAOA,KAAK4xB,IAAIoB,WAAWzpB,MAAK7E,GAC9B,EAAkBA,EAAQ2hB,EAAS5R,OAAO,IAC9C,CACF,CAEA,KAAM,aAAc1U,EAAO4yB,aAAa9xB,cACpC,aAAcd,EAAOi0B,eAAenzB,WACtC,OAIF,MAAMkyB,EAAehzB,EAAOwpB,kBAAkB1oB,UAAUmyB,SACxDjzB,EAAOwpB,kBAAkB1oB,UAAUmyB,SAAW,WAC5C,GAAI/S,UAAU3d,OAAS,GACnB2d,UAAU,aAAclgB,EAAOq0B,iBAAkB,CACnD,MAAM3f,EAAQwL,UAAU,GACxB,IAAIgS,EACA5L,EACA5O,EAoBJ,OAnBAzX,KAAK6xB,aAAaljB,SAAQ+jB,IACpBA,EAAEje,QAAUA,IACVwd,EACFxa,GAAM,EAENwa,EAASS,EAEb,IAEF1yB,KAAKixB,eAAetiB,SAAQ0P,IACtBA,EAAE5J,QAAUA,IACV4R,EACF5O,GAAM,EAEN4O,EAAWhI,GAGRA,EAAE5J,QAAUA,KAEjBgD,GAAQwa,GAAU5L,EACbxd,QAAQE,OAAO,IAAIwmB,aACxB,4DACA,uBACO0C,EACFA,EAAOe,WACL3M,EACFA,EAAS2M,WAEXnqB,QAAQE,OAAO,IAAIwmB,aACxB,gDACA,sBACJ,CACA,OAAOwD,EAAa/S,MAAMhgB,KAAMigB,UAClC,CACF,CAEO,SAASoU,GAAkCt0B,GAIhDA,EAAOwpB,kBAAkB1oB,UAAUyzB,gBACjC,WAEE,OADAt0B,KAAKu0B,qBAAuBv0B,KAAKu0B,sBAAwB,CAAC,EACnD3zB,OAAO6N,KAAKzO,KAAKu0B,sBACrBppB,KAAIqpB,GAAYx0B,KAAKu0B,qBAAqBC,GAAU,IACzD,EAEF,MAAMzC,EAAehyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACxDjyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACjC,SAAkBvd,EAAOD,GACvB,IAAKA,EACH,OAAOud,EAAa/R,MAAMhgB,KAAMigB,WAElCjgB,KAAKu0B,qBAAuBv0B,KAAKu0B,sBAAwB,CAAC,EAE1D,MAAMtC,EAASF,EAAa/R,MAAMhgB,KAAMigB,WAMxC,OALKjgB,KAAKu0B,qBAAqB/f,EAAO3G,KAE+B,IAA1D7N,KAAKu0B,qBAAqB/f,EAAO3G,IAAI9H,QAAQksB,IACtDjyB,KAAKu0B,qBAAqB/f,EAAO3G,IAAIhI,KAAKosB,GAF1CjyB,KAAKu0B,qBAAqB/f,EAAO3G,IAAM,CAAC2G,EAAQyd,GAI3CA,CACT,EAEF,MAAMK,EAAgBvyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UACzDxyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UAAY,SAAmB/d,GAChExU,KAAKu0B,qBAAuBv0B,KAAKu0B,sBAAwB,CAAC,EAE1D/f,EAAO8a,YAAY3gB,SAAQ8F,IAEzB,GADsBzU,KAAK6xB,aAAazf,MAAKsgB,GAAKA,EAAEje,QAAUA,IAE5D,MAAM,IAAI8a,aAAa,wBACrB,qBACJ,IAEF,MAAMkF,EAAkBz0B,KAAK6xB,aAC7BS,EAActS,MAAMhgB,KAAMigB,WAC1B,MAAMyU,EAAa10B,KAAK6xB,aACrBhmB,QAAO8oB,IAAqD,IAAxCF,EAAgB1uB,QAAQ4uB,KAC/C30B,KAAKu0B,qBAAqB/f,EAAO3G,IAAM,CAAC2G,GAAQ+M,OAAOmT,EACzD,EAEA,MAAMlC,EAAmBzyB,EAAOwpB,kBAAkB1oB,UAAU4xB,aAC5D1yB,EAAOwpB,kBAAkB1oB,UAAU4xB,aACjC,SAAsBje,GAGpB,OAFAxU,KAAKu0B,qBAAuBv0B,KAAKu0B,sBAAwB,CAAC,SACnDv0B,KAAKu0B,qBAAqB/f,EAAO3G,IACjC2kB,EAAiBxS,MAAMhgB,KAAMigB,UACtC,EAEF,MAAMiS,EAAkBnyB,EAAOwpB,kBAAkB1oB,UAAUsxB,YAC3DpyB,EAAOwpB,kBAAkB1oB,UAAUsxB,YACjC,SAAqBF,GAanB,OAZAjyB,KAAKu0B,qBAAuBv0B,KAAKu0B,sBAAwB,CAAC,EACtDtC,GACFrxB,OAAO6N,KAAKzO,KAAKu0B,sBAAsB5lB,SAAQ6lB,IAC7C,MAAMpC,EAAMpyB,KAAKu0B,qBAAqBC,GAAUzuB,QAAQksB,IAC3C,IAATG,GACFpyB,KAAKu0B,qBAAqBC,GAAUnC,OAAOD,EAAK,GAEC,IAA/CpyB,KAAKu0B,qBAAqBC,GAAUlyB,eAC/BtC,KAAKu0B,qBAAqBC,EACnC,IAGGtC,EAAgBlS,MAAMhgB,KAAMigB,UACrC,CACJ,CAEO,SAAS2U,GAAwB70B,EAAQgsB,GAC9C,IAAKhsB,EAAOwpB,kBACV,OAGF,GAAIxpB,EAAOwpB,kBAAkB1oB,UAAUmxB,UACnCjG,EAAevnB,SAAW,GAC5B,OAAO6vB,GAAkCt0B,GAK3C,MAAM80B,EAAsB90B,EAAOwpB,kBAAkB1oB,UAClDyzB,gBACHv0B,EAAOwpB,kBAAkB1oB,UAAUyzB,gBACjC,WACE,MAAMQ,EAAgBD,EAAoB7U,MAAMhgB,MAEhD,OADAA,KAAK+0B,gBAAkB/0B,KAAK+0B,iBAAmB,CAAC,EACzCD,EAAc3pB,KAAIqJ,GAAUxU,KAAK+0B,gBAAgBvgB,EAAO3G,KACjE,EAEF,MAAMykB,EAAgBvyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UACzDxyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UAAY,SAAmB/d,GAahE,GAZAxU,KAAKg1B,SAAWh1B,KAAKg1B,UAAY,CAAC,EAClCh1B,KAAK+0B,gBAAkB/0B,KAAK+0B,iBAAmB,CAAC,EAEhDvgB,EAAO8a,YAAY3gB,SAAQ8F,IAEzB,GADsBzU,KAAK6xB,aAAazf,MAAKsgB,GAAKA,EAAEje,QAAUA,IAE5D,MAAM,IAAI8a,aAAa,wBACrB,qBACJ,KAIGvvB,KAAK+0B,gBAAgBvgB,EAAO3G,IAAK,CACpC,MAAMonB,EAAY,IAAIl1B,EAAOywB,YAAYhc,EAAO8a,aAChDtvB,KAAKg1B,SAASxgB,EAAO3G,IAAMonB,EAC3Bj1B,KAAK+0B,gBAAgBE,EAAUpnB,IAAM2G,EACrCA,EAASygB,CACX,CACA3C,EAActS,MAAMhgB,KAAM,CAACwU,GAC7B,EAEA,MAAMge,EAAmBzyB,EAAOwpB,kBAAkB1oB,UAAU4xB,aA6D5D,SAASyC,EAAwB1D,EAAIntB,GACnC,IAAI2I,EAAM3I,EAAY2I,IAOtB,OANApM,OAAO6N,KAAK+iB,EAAGuD,iBAAmB,IAAIpmB,SAAQwmB,IAC5C,MAAMC,EAAiB5D,EAAGuD,gBAAgBI,GACpCE,EAAiB7D,EAAGwD,SAASI,EAAevnB,IAClDb,EAAMA,EAAI/K,QAAQ,IAAI2C,OAAOywB,EAAexnB,GAAI,KAC9CunB,EAAevnB,GAAG,IAEf,IAAIynB,sBAAsB,CAC/BnyB,KAAMkB,EAAYlB,KAClB6J,OAEJ,CAxEAjN,EAAOwpB,kBAAkB1oB,UAAU4xB,aACjC,SAAsBje,GACpBxU,KAAKg1B,SAAWh1B,KAAKg1B,UAAY,CAAC,EAClCh1B,KAAK+0B,gBAAkB/0B,KAAK+0B,iBAAmB,CAAC,EAEhDvC,EAAiBxS,MAAMhgB,KAAM,CAAEA,KAAKg1B,SAASxgB,EAAO3G,KAAO2G,WACpDxU,KAAK+0B,gBAAiB/0B,KAAKg1B,SAASxgB,EAAO3G,IAChD7N,KAAKg1B,SAASxgB,EAAO3G,IAAIA,GAAK2G,EAAO3G,WAChC7N,KAAKg1B,SAASxgB,EAAO3G,GAC9B,EAEF9N,EAAOwpB,kBAAkB1oB,UAAUmxB,SACjC,SAAkBvd,EAAOD,GACvB,GAA4B,WAAxBxU,KAAKu1B,eACP,MAAM,IAAIhG,aACR,sDACA,qBAEJ,MAAM6B,EAAU,GAAG/vB,MAAMQ,KAAKoe,UAAW,GACzC,GAAuB,IAAnBmR,EAAQ9uB,SACP8uB,EAAQ,GAAG9B,YAAYld,MAAKojB,GAAKA,IAAM/gB,IAG1C,MAAM,IAAI8a,aACR,gHAEA,qBAIJ,GADsBvvB,KAAK6xB,aAAazf,MAAKsgB,GAAKA,EAAEje,QAAUA,IAE5D,MAAM,IAAI8a,aAAa,wBACrB,sBAGJvvB,KAAKg1B,SAAWh1B,KAAKg1B,UAAY,CAAC,EAClCh1B,KAAK+0B,gBAAkB/0B,KAAK+0B,iBAAmB,CAAC,EAChD,MAAMU,EAAYz1B,KAAKg1B,SAASxgB,EAAO3G,IACvC,GAAI4nB,EAKFA,EAAUzD,SAASvd,GAGnB5L,QAAQC,UAAUS,MAAK,KACrBvJ,KAAKqxB,cAAc,IAAIH,MAAM,qBAAqB,QAE/C,CACL,MAAM+D,EAAY,IAAIl1B,EAAOywB,YAAY,CAAC/b,IAC1CzU,KAAKg1B,SAASxgB,EAAO3G,IAAMonB,EAC3Bj1B,KAAK+0B,gBAAgBE,EAAUpnB,IAAM2G,EACrCxU,KAAKuyB,UAAU0C,EACjB,CACA,OAAOj1B,KAAK6xB,aAAazf,MAAKsgB,GAAKA,EAAEje,QAAUA,GACjD,EA8BF,CAAC,cAAe,gBAAgB9F,SAAQ,SAASqK,GAC/C,MAAM0c,EAAe31B,EAAOwpB,kBAAkB1oB,UAAUmY,GAClD2c,EAAY,CAAC,CAAC3c,KAClB,MAAMmL,EAAOlE,UAGb,OAFqBA,UAAU3d,QACH,mBAAjB2d,UAAU,GAEZyV,EAAa1V,MAAMhgB,KAAM,CAC7BqE,IACC,MAAMyS,EAAOoe,EAAwBl1B,KAAMqE,GAC3C8f,EAAK,GAAGnE,MAAM,KAAM,CAAClJ,GAAM,EAE5BW,IACK0M,EAAK,IACPA,EAAK,GAAGnE,MAAM,KAAMvI,EACtB,EACCwI,UAAU,KAGVyV,EAAa1V,MAAMhgB,KAAMigB,WAC7B1W,MAAKlF,GAAe6wB,EAAwBl1B,KAAMqE,IACvD,GACAtE,EAAOwpB,kBAAkB1oB,UAAUmY,GAAU2c,EAAU3c,EACzD,IAEA,MAAM4c,EACF71B,EAAOwpB,kBAAkB1oB,UAAUg1B,oBACvC91B,EAAOwpB,kBAAkB1oB,UAAUg1B,oBACjC,WACE,OAAK5V,UAAU3d,QAAW2d,UAAU,GAAG9c,MAGvC8c,UAAU,GA7Cd,SAAiCuR,EAAIntB,GACnC,IAAI2I,EAAM3I,EAAY2I,IAOtB,OANApM,OAAO6N,KAAK+iB,EAAGuD,iBAAmB,IAAIpmB,SAAQwmB,IAC5C,MAAMC,EAAiB5D,EAAGuD,gBAAgBI,GACpCE,EAAiB7D,EAAGwD,SAASI,EAAevnB,IAClDb,EAAMA,EAAI/K,QAAQ,IAAI2C,OAAOwwB,EAAevnB,GAAI,KAC9CwnB,EAAexnB,GAAG,IAEf,IAAIynB,sBAAsB,CAC/BnyB,KAAMkB,EAAYlB,KAClB6J,OAEJ,CAiCmB8oB,CAAwB91B,KAAMigB,UAAU,IAChD2V,EAAwB5V,MAAMhgB,KAAMigB,YAHlC2V,EAAwB5V,MAAMhgB,KAAMigB,UAI/C,EAIF,MAAM8V,EAAuBn1B,OAAO2lB,yBAClCxmB,EAAOwpB,kBAAkB1oB,UAAW,oBACtCD,OAAOiW,eAAe9W,EAAOwpB,kBAAkB1oB,UAC7C,mBAAoB,CAClB,GAAAyJ,GACE,MAAMjG,EAAc0xB,EAAqBzrB,IAAI0V,MAAMhgB,MACnD,MAAyB,KAArBqE,EAAYlB,KACPkB,EAEF6wB,EAAwBl1B,KAAMqE,EACvC,IAGJtE,EAAOwpB,kBAAkB1oB,UAAUsxB,YACjC,SAAqBF,GACnB,GAA4B,WAAxBjyB,KAAKu1B,eACP,MAAM,IAAIhG,aACR,sDACA,qBAIJ,IAAK0C,EAAOL,IACV,MAAM,IAAIrC,aAAa,yFAC2B,aAGpD,KADgB0C,EAAOL,MAAQ5xB,MAE7B,MAAM,IAAIuvB,aAAa,6CACrB,sBAKJ,IAAI/a,EADJxU,KAAKg1B,SAAWh1B,KAAKg1B,UAAY,CAAC,EAElCp0B,OAAO6N,KAAKzO,KAAKg1B,UAAUrmB,SAAQqnB,IAChBh2B,KAAKg1B,SAASgB,GAAU1G,YACtCld,MAAKqC,GAASwd,EAAOxd,QAAUA,MAEhCD,EAASxU,KAAKg1B,SAASgB,GACzB,IAGExhB,IACgC,IAA9BA,EAAO8a,YAAYhtB,OAGrBtC,KAAKyyB,aAAazyB,KAAK+0B,gBAAgBvgB,EAAO3G,KAG9C2G,EAAO2d,YAAYF,EAAOxd,OAE5BzU,KAAKqxB,cAAc,IAAIH,MAAM,sBAEjC,CACJ,CAEO,SAAS+E,GAAmBl2B,EAAQgsB,IACpChsB,EAAOwpB,mBAAqBxpB,EAAOm2B,0BAEtCn2B,EAAOwpB,kBAAoBxpB,EAAOm2B,yBAE/Bn2B,EAAOwpB,mBAKRwC,EAAevnB,QAAU,IAC3B,CAAC,sBAAuB,uBAAwB,mBAC7CmK,SAAQ,SAASqK,GAChB,MAAM0c,EAAe31B,EAAOwpB,kBAAkB1oB,UAAUmY,GAClD2c,EAAY,CAAC,CAAC3c,KAIlB,OAHAiH,UAAU,GAAK,IAAiB,oBAAXjH,EACnBjZ,EAAOo2B,gBACPp2B,EAAOu1B,uBAAuBrV,UAAU,IACnCyV,EAAa1V,MAAMhgB,KAAMigB,UAClC,GACAlgB,EAAOwpB,kBAAkB1oB,UAAUmY,GAAU2c,EAAU3c,EACzD,GAEN,CAGO,SAASod,GAAqBr2B,EAAQgsB,GAC3C,EAA8BhsB,EAAQ,qBAAqBiH,IACzD,MAAMwqB,EAAKxqB,EAAEoY,OACb,KAAI2M,EAAevnB,QAAU,IAAOgtB,EAAG6E,kBACI,WAAvC7E,EAAG6E,mBAAmBC,eACE,WAAtB9E,EAAG+D,eAIT,OAAOvuB,CAAC,GAEZ,CCjrBO,SAAS,GAAiBjH,EAAQgsB,GACvC,MAAMjpB,EAAY/C,GAAUA,EAAO+C,UAC7BsxB,EAAmBr0B,GAAUA,EAAOq0B,iBAS1C,GAPAtxB,EAAUgsB,aAAe,SAAS/B,EAAagC,EAAWC,GAExD,EAAiB,yBACf,uCACFlsB,EAAUkpB,aAAa8C,aAAa/B,GAAaxjB,KAAKwlB,EAAWC,EACnE,IAEMjD,EAAevnB,QAAU,IAC3B,oBAAqB1B,EAAUkpB,aAAauB,2BAA4B,CAC1E,MAAMN,EAAQ,SAASlZ,EAAKkK,EAAGiP,GACzBjP,KAAKlK,KAASmZ,KAAKnZ,KACrBA,EAAImZ,GAAKnZ,EAAIkK,UACNlK,EAAIkK,GAEf,EAEMsY,EAAqBzzB,EAAUkpB,aAAa8C,aAChD5lB,KAAKpG,EAAUkpB,cAUjB,GATAlpB,EAAUkpB,aAAa8C,aAAe,SAAS5C,GAM7C,MALiB,iBAANA,GAAqC,iBAAZA,EAAEc,QACpCd,EAAI5Y,KAAK7Q,MAAM6Q,KAAKC,UAAU2Y,IAC9Be,EAAMf,EAAEc,MAAO,kBAAmB,sBAClCC,EAAMf,EAAEc,MAAO,mBAAoB,wBAE9BuJ,EAAmBrK,EAC5B,EAEIkI,GAAoBA,EAAiBvzB,UAAU21B,YAAa,CAC9D,MAAMC,EAAoBrC,EAAiBvzB,UAAU21B,YACrDpC,EAAiBvzB,UAAU21B,YAAc,WACvC,MAAMziB,EAAM0iB,EAAkBzW,MAAMhgB,KAAMigB,WAG1C,OAFAgN,EAAMlZ,EAAK,qBAAsB,mBACjCkZ,EAAMlZ,EAAK,sBAAuB,oBAC3BA,CACT,CACF,CAEA,GAAIqgB,GAAoBA,EAAiBvzB,UAAU61B,iBAAkB,CACnE,MAAMC,EACJvC,EAAiBvzB,UAAU61B,iBAC7BtC,EAAiBvzB,UAAU61B,iBAAmB,SAASxK,GAMrD,MALkB,UAAdlsB,KAAKuS,MAAiC,iBAAN2Z,IAClCA,EAAI5Y,KAAK7Q,MAAM6Q,KAAKC,UAAU2Y,IAC9Be,EAAMf,EAAG,kBAAmB,sBAC5Be,EAAMf,EAAG,mBAAoB,wBAExByK,EAAuB3W,MAAMhgB,KAAM,CAACksB,GAC7C,CACF,CACF,CACF,CCxDO,SAAS,GAAoBnsB,EAAQ62B,GACtC72B,EAAO+C,UAAUkpB,cACnB,oBAAqBjsB,EAAO+C,UAAUkpB,cAGlCjsB,EAAO+C,UAAsB,eAGnC/C,EAAO+C,UAAUkpB,aAAa0D,gBAC5B,SAAyB3C,GACvB,IAAMA,IAAeA,EAAYI,MAAQ,CACvC,MAAM1V,EAAM,IAAI8X,aAAa,0DAK7B,OAHA9X,EAAIzS,KAAO,gBAEXyS,EAAIof,KAAO,EACJhuB,QAAQE,OAAO0O,EACxB,CAMA,OAL0B,IAAtBsV,EAAYI,MACdJ,EAAYI,MAAQ,CAAC2J,YAAaF,GAElC7J,EAAYI,MAAM2J,YAAcF,EAE3B72B,EAAO+C,UAAUkpB,aAAa8C,aAAa/B,EACpD,EACJ,CCrBO,SAAS,GAAYhtB,GACJ,iBAAXA,GAAuBA,EAAOg3B,eACpC,aAAch3B,EAAOg3B,cAAcl2B,aAClC,gBAAiBd,EAAOg3B,cAAcl2B,YAC1CD,OAAOiW,eAAe9W,EAAOg3B,cAAcl2B,UAAW,cAAe,CACnE,GAAAyJ,GACE,MAAO,CAAC+b,SAAUrmB,KAAKqmB,SACzB,GAGN,CAEO,SAAS,GAAmBtmB,EAAQgsB,GACzC,GAAsB,iBAAXhsB,IACLA,EAAOwpB,oBAAqBxpB,EAAOi3B,qBACvC,QAEGj3B,EAAOwpB,mBAAqBxpB,EAAOi3B,uBAEtCj3B,EAAOwpB,kBAAoBxpB,EAAOi3B,sBAGhCjL,EAAevnB,QAAU,IAE3B,CAAC,sBAAuB,uBAAwB,mBAC7CmK,SAAQ,SAASqK,GAChB,MAAM0c,EAAe31B,EAAOwpB,kBAAkB1oB,UAAUmY,GAClD2c,EAAY,CAAC,CAAC3c,KAIlB,OAHAiH,UAAU,GAAK,IAAiB,oBAAXjH,EACnBjZ,EAAOo2B,gBACPp2B,EAAOu1B,uBAAuBrV,UAAU,IACnCyV,EAAa1V,MAAMhgB,KAAMigB,UAClC,GACAlgB,EAAOwpB,kBAAkB1oB,UAAUmY,GAAU2c,EAAU3c,EACzD,IAGJ,MAAMie,EAAmB,CACvBC,WAAY,cACZC,YAAa,eACbC,cAAe,iBACf3D,eAAgB,kBAChBC,gBAAiB,oBAGb2D,EAAiBt3B,EAAOwpB,kBAAkB1oB,UAAUmyB,SAC1DjzB,EAAOwpB,kBAAkB1oB,UAAUmyB,SAAW,WAC5C,MAAOC,EAAUC,EAAQC,GAASlT,UAClC,OAAOoX,EAAerX,MAAMhgB,KAAM,CAACizB,GAAY,OAC5C1pB,MAAK2hB,IACJ,GAAIa,EAAevnB,QAAU,KAAO0uB,EAGlC,IACEhI,EAAMvc,SAAQilB,IACZA,EAAKzwB,KAAO8zB,EAAiBrD,EAAKzwB,OAASywB,EAAKzwB,IAAI,GAExD,CAAE,MAAO6D,GACP,GAAe,cAAXA,EAAEhC,KACJ,MAAMgC,EAGRkkB,EAAMvc,SAAQ,CAACilB,EAAM3rB,KACnBijB,EAAMjB,IAAIhiB,EAAGrH,OAAOmiB,OAAO,CAAC,EAAG6Q,EAAM,CACnCzwB,KAAM8zB,EAAiBrD,EAAKzwB,OAASywB,EAAKzwB,OACzC,GAEP,CAEF,OAAO+nB,CAAK,IAEb3hB,KAAK2pB,EAAQC,EAClB,CACF,CAEO,SAASmE,GAAmBv3B,GACjC,GAAwB,iBAAXA,IAAuBA,EAAOwpB,oBACvCxpB,EAAO4yB,aACT,OAEF,GAAI5yB,EAAO4yB,cAAgB,aAAc5yB,EAAO4yB,aAAa9xB,UAC3D,OAEF,MAAM+xB,EAAiB7yB,EAAOwpB,kBAAkB1oB,UAAUgxB,WACtDe,IACF7yB,EAAOwpB,kBAAkB1oB,UAAUgxB,WAAa,WAC9C,MAAMgB,EAAUD,EAAe5S,MAAMhgB,KAAM,IAE3C,OADA6yB,EAAQlkB,SAAQsjB,GAAUA,EAAOL,IAAM5xB,OAChC6yB,CACT,GAGF,MAAMd,EAAehyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SACpDD,IACFhyB,EAAOwpB,kBAAkB1oB,UAAUmxB,SAAW,WAC5C,MAAMC,EAASF,EAAa/R,MAAMhgB,KAAMigB,WAExC,OADAgS,EAAOL,IAAM5xB,KACNiyB,CACT,GAEFlyB,EAAO4yB,aAAa9xB,UAAUmyB,SAAW,WACvC,OAAOhzB,KAAKyU,MAAQzU,KAAK4xB,IAAIoB,SAAShzB,KAAKyU,OACzC5L,QAAQC,QAAQ,IAAIkhB,IACxB,CACF,CAEO,SAASuN,GAAqBx3B,GACnC,GAAwB,iBAAXA,IAAuBA,EAAOwpB,oBACvCxpB,EAAO4yB,aACT,OAEF,GAAI5yB,EAAO4yB,cAAgB,aAAc5yB,EAAOi0B,eAAenzB,UAC7D,OAEF,MAAMozB,EAAmBl0B,EAAOwpB,kBAAkB1oB,UAAUowB,aACxDgD,IACFl0B,EAAOwpB,kBAAkB1oB,UAAUowB,aAAe,WAChD,MAAMiD,EAAYD,EAAiBjU,MAAMhgB,KAAM,IAE/C,OADAk0B,EAAUvlB,SAAQ0X,GAAYA,EAASuL,IAAM5xB,OACtCk0B,CACT,GAEF,EAA8Bn0B,EAAQ,SAASiH,IAC7CA,EAAEqf,SAASuL,IAAM5qB,EAAEmtB,WACZntB,KAETjH,EAAOi0B,eAAenzB,UAAUmyB,SAAW,WACzC,OAAOhzB,KAAK4xB,IAAIoB,SAAShzB,KAAKyU,MAChC,CACF,CAEO,SAAS+iB,GAAiBz3B,GAC1BA,EAAOwpB,qBACR,iBAAkBxpB,EAAOwpB,kBAAkB1oB,aAG/Cd,EAAOwpB,kBAAkB1oB,UAAU4xB,aACjC,SAAsBje,GACpB,EAAiB,eAAgB,eACjCxU,KAAK6xB,aAAaljB,SAAQsjB,IACpBA,EAAOxd,OAASD,EAAO8a,YAAYzB,SAASoE,EAAOxd,QACrDzU,KAAKmyB,YAAYF,EACnB,GAEJ,EACJ,CAEO,SAASwF,GAAmB13B,GAG7BA,EAAO23B,cAAgB33B,EAAO43B,iBAChC53B,EAAO43B,eAAiB53B,EAAO23B,YAEnC,CAEO,SAASE,GAAmB73B,GAIjC,GAAwB,iBAAXA,IAAuBA,EAAOwpB,kBACzC,OAEF,MAAMsO,EAAqB93B,EAAOwpB,kBAAkB1oB,UAAUi3B,eAC1DD,IACF93B,EAAOwpB,kBAAkB1oB,UAAUi3B,eACjC,WACE93B,KAAK+3B,sBAAwB,GAE7B,IAAIC,EAAgB/X,UAAU,IAAMA,UAAU,GAAG+X,mBAC3BlrB,IAAlBkrB,IACFA,EAAgB,IAElBA,EAAgB,IAAIA,GACpB,MAAMC,EAAqBD,EAAc11B,OAAS,EAC9C21B,GAEFD,EAAcrpB,SAASupB,IACrB,GAAI,QAASA,EAAe,CAE1B,IADiB,oBACH12B,KAAK02B,EAAcC,KAC/B,MAAM,IAAI9d,UAAU,8BAExB,CACA,GAAI,0BAA2B6d,KACvBlyB,WAAWkyB,EAAcE,wBAA0B,GACvD,MAAM,IAAIC,WAAW,2CAGzB,GAAI,iBAAkBH,KACdlyB,WAAWkyB,EAAcI,eAAiB,GAC9C,MAAM,IAAID,WAAW,+BAEzB,IAGJ,MAAMlH,EAAc0G,EAAmB7X,MAAMhgB,KAAMigB,WACnD,GAAIgY,EAAoB,CAQtB,MAAM,OAAChG,GAAUd,EACXziB,EAASujB,EAAOsG,mBAChB,cAAe7pB,IAEY,IAA5BA,EAAO8pB,UAAUl2B,QAC2B,IAA5C1B,OAAO6N,KAAKC,EAAO8pB,UAAU,IAAIl2B,UACpCoM,EAAO8pB,UAAYR,EACnB/F,EAAO+F,cAAgBA,EACvBh4B,KAAK+3B,sBAAsBlyB,KAAKosB,EAAOwG,cAAc/pB,GAClDnF,MAAK,YACG0oB,EAAO+F,aAAa,IAC1BxuB,OAAM,YACAyoB,EAAO+F,aAAa,KAInC,CACA,OAAO7G,CACT,EAEN,CAEO,SAASuH,GAAkB34B,GAChC,GAAwB,iBAAXA,IAAuBA,EAAO4yB,aACzC,OAEF,MAAMgG,EAAoB54B,EAAO4yB,aAAa9xB,UAAU03B,cACpDI,IACF54B,EAAO4yB,aAAa9xB,UAAU03B,cAC5B,WACE,MAAM7pB,EAASiqB,EAAkB3Y,MAAMhgB,KAAMigB,WAI7C,MAHM,cAAevR,IACnBA,EAAO8pB,UAAY,GAAGjX,OAAOvhB,KAAKg4B,eAAiB,CAAC,CAAC,KAEhDtpB,CACT,EAEN,CAEO,SAASkqB,GAAgB74B,GAI9B,GAAwB,iBAAXA,IAAuBA,EAAOwpB,kBACzC,OAEF,MAAMsP,EAAkB94B,EAAOwpB,kBAAkB1oB,UAAUi4B,YAC3D/4B,EAAOwpB,kBAAkB1oB,UAAUi4B,YAAc,WAC/C,OAAI94B,KAAK+3B,uBAAyB/3B,KAAK+3B,sBAAsBz1B,OACpDuG,QAAQkwB,IAAI/4B,KAAK+3B,uBACrBxuB,MAAK,IACGsvB,EAAgB7Y,MAAMhgB,KAAMigB,aAEpC+Y,SAAQ,KACPh5B,KAAK+3B,sBAAwB,EAAE,IAG9Bc,EAAgB7Y,MAAMhgB,KAAMigB,UACrC,CACF,CAEO,SAASgZ,GAAiBl5B,GAI/B,GAAwB,iBAAXA,IAAuBA,EAAOwpB,kBACzC,OAEF,MAAM2P,EAAmBn5B,EAAOwpB,kBAAkB1oB,UAAUs4B,aAC5Dp5B,EAAOwpB,kBAAkB1oB,UAAUs4B,aAAe,WAChD,OAAIn5B,KAAK+3B,uBAAyB/3B,KAAK+3B,sBAAsBz1B,OACpDuG,QAAQkwB,IAAI/4B,KAAK+3B,uBACrBxuB,MAAK,IACG2vB,EAAiBlZ,MAAMhgB,KAAMigB,aAErC+Y,SAAQ,KACPh5B,KAAK+3B,sBAAwB,EAAE,IAG9BmB,EAAiBlZ,MAAMhgB,KAAMigB,UACtC,CACF,CCjSO,SAASmZ,GAAoBr5B,GAClC,GAAsB,iBAAXA,GAAwBA,EAAOwpB,kBAA1C,CAYA,GATM,oBAAqBxpB,EAAOwpB,kBAAkB1oB,YAClDd,EAAOwpB,kBAAkB1oB,UAAUyzB,gBACjC,WAIE,OAHKt0B,KAAKq5B,gBACRr5B,KAAKq5B,cAAgB,IAEhBr5B,KAAKq5B,aACd,KAEE,cAAet5B,EAAOwpB,kBAAkB1oB,WAAY,CACxD,MAAMy4B,EAAYv5B,EAAOwpB,kBAAkB1oB,UAAUmxB,SACrDjyB,EAAOwpB,kBAAkB1oB,UAAU0xB,UAAY,SAAmB/d,GAC3DxU,KAAKq5B,gBACRr5B,KAAKq5B,cAAgB,IAElBr5B,KAAKq5B,cAAcxL,SAASrZ,IAC/BxU,KAAKq5B,cAAcxzB,KAAK2O,GAI1BA,EAAO4a,iBAAiBzgB,SAAQ8F,GAAS6kB,EAAUz3B,KAAK7B,KAAMyU,EAC5DD,KACFA,EAAO6a,iBAAiB1gB,SAAQ8F,GAAS6kB,EAAUz3B,KAAK7B,KAAMyU,EAC5DD,IACJ,EAEAzU,EAAOwpB,kBAAkB1oB,UAAUmxB,SACjC,SAAkBvd,KAAU2c,GAU1B,OATIA,GACFA,EAAQziB,SAAS6F,IACVxU,KAAKq5B,cAEEr5B,KAAKq5B,cAAcxL,SAASrZ,IACtCxU,KAAKq5B,cAAcxzB,KAAK2O,GAFxBxU,KAAKq5B,cAAgB,CAAC7kB,EAGxB,IAGG8kB,EAAUtZ,MAAMhgB,KAAMigB,UAC/B,CACJ,CACM,iBAAkBlgB,EAAOwpB,kBAAkB1oB,YAC/Cd,EAAOwpB,kBAAkB1oB,UAAU4xB,aACjC,SAAsBje,GACfxU,KAAKq5B,gBACRr5B,KAAKq5B,cAAgB,IAEvB,MAAMh3B,EAAQrC,KAAKq5B,cAActzB,QAAQyO,GACzC,IAAe,IAAXnS,EACF,OAEFrC,KAAKq5B,cAAchH,OAAOhwB,EAAO,GACjC,MAAMk3B,EAAS/kB,EAAO8a,YACtBtvB,KAAK6xB,aAAaljB,SAAQsjB,IACpBsH,EAAO1L,SAASoE,EAAOxd,QACzBzU,KAAKmyB,YAAYF,EACnB,GAEJ,EA1DJ,CA4DF,CAEO,SAASuH,GAAqBz5B,GACnC,GAAsB,iBAAXA,GAAwBA,EAAOwpB,oBAGpC,qBAAsBxpB,EAAOwpB,kBAAkB1oB,YACnDd,EAAOwpB,kBAAkB1oB,UAAU44B,iBACjC,WACE,OAAOz5B,KAAK05B,eAAiB15B,KAAK05B,eAAiB,EACrD,KAEE,gBAAiB35B,EAAOwpB,kBAAkB1oB,YAAY,CAC1DD,OAAOiW,eAAe9W,EAAOwpB,kBAAkB1oB,UAAW,cAAe,CACvE,GAAAyJ,GACE,OAAOtK,KAAK25B,YACd,EACA,GAAA1P,CAAI2G,GACE5wB,KAAK25B,eACP35B,KAAKmK,oBAAoB,YAAanK,KAAK25B,cAC3C35B,KAAKmK,oBAAoB,QAASnK,KAAK45B,mBAEzC55B,KAAKkK,iBAAiB,YAAalK,KAAK25B,aAAe/I,GACvD5wB,KAAKkK,iBAAiB,QAASlK,KAAK45B,iBAAoB5yB,IACtDA,EAAEoqB,QAAQziB,SAAQ6F,IAIhB,GAHKxU,KAAK05B,iBACR15B,KAAK05B,eAAiB,IAEpB15B,KAAK05B,eAAe7L,SAASrZ,GAC/B,OAEFxU,KAAK05B,eAAe7zB,KAAK2O,GACzB,MAAMxK,EAAQ,IAAIknB,MAAM,aACxBlnB,EAAMwK,OAASA,EACfxU,KAAKqxB,cAAcrnB,EAAM,GACzB,EAEN,IAEF,MAAM6mB,EACJ9wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACrC/wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACjC,WACE,MAAMU,EAAKxxB,KAiBX,OAhBKA,KAAK45B,kBACR55B,KAAKkK,iBAAiB,QAASlK,KAAK45B,iBAAmB,SAAS5yB,GAC9DA,EAAEoqB,QAAQziB,SAAQ6F,IAIhB,GAHKgd,EAAGkI,iBACNlI,EAAGkI,eAAiB,IAElBlI,EAAGkI,eAAe3zB,QAAQyO,IAAW,EACvC,OAEFgd,EAAGkI,eAAe7zB,KAAK2O,GACvB,MAAMxK,EAAQ,IAAIknB,MAAM,aACxBlnB,EAAMwK,OAASA,EACfgd,EAAGH,cAAcrnB,EAAM,GAE3B,GAEK6mB,EAAyB7Q,MAAMwR,EAAIvR,UAC5C,CACJ,CACF,CAEO,SAAS4Z,GAAiB95B,GAC/B,GAAsB,iBAAXA,IAAwBA,EAAOwpB,kBACxC,OAEF,MAAM1oB,EAAYd,EAAOwpB,kBAAkB1oB,UACrCg4B,EAAkBh4B,EAAUi4B,YAC5BI,EAAmBr4B,EAAUs4B,aAC7BtD,EAAsBh1B,EAAUg1B,oBAChC/E,EAAuBjwB,EAAUiwB,qBACjCgJ,EAAkBj5B,EAAUi5B,gBAElCj5B,EAAUi4B,YACR,SAAqBiB,EAAiBC,GACpC,MAAMpxB,EAAWqX,UAAU3d,QAAU,EAAK2d,UAAU,GAAKA,UAAU,GAC7Dga,EAAUpB,EAAgB7Y,MAAMhgB,KAAM,CAAC4I,IAC7C,OAAKoxB,GAGLC,EAAQ1wB,KAAKwwB,EAAiBC,GACvBnxB,QAAQC,WAHNmxB,CAIX,EAEFp5B,EAAUs4B,aACR,SAAsBY,EAAiBC,GACrC,MAAMpxB,EAAWqX,UAAU3d,QAAU,EAAK2d,UAAU,GAAKA,UAAU,GAC7Dga,EAAUf,EAAiBlZ,MAAMhgB,KAAM,CAAC4I,IAC9C,OAAKoxB,GAGLC,EAAQ1wB,KAAKwwB,EAAiBC,GACvBnxB,QAAQC,WAHNmxB,CAIX,EAEF,IAAIC,EAAe,SAAS71B,EAAa01B,EAAiBC,GACxD,MAAMC,EAAUpE,EAAoB7V,MAAMhgB,KAAM,CAACqE,IACjD,OAAK21B,GAGLC,EAAQ1wB,KAAKwwB,EAAiBC,GACvBnxB,QAAQC,WAHNmxB,CAIX,EACAp5B,EAAUg1B,oBAAsBqE,EAEhCA,EAAe,SAAS71B,EAAa01B,EAAiBC,GACpD,MAAMC,EAAUnJ,EAAqB9Q,MAAMhgB,KAAM,CAACqE,IAClD,OAAK21B,GAGLC,EAAQ1wB,KAAKwwB,EAAiBC,GACvBnxB,QAAQC,WAHNmxB,CAIX,EACAp5B,EAAUiwB,qBAAuBoJ,EAEjCA,EAAe,SAASluB,EAAW+tB,EAAiBC,GAClD,MAAMC,EAAUH,EAAgB9Z,MAAMhgB,KAAM,CAACgM,IAC7C,OAAKguB,GAGLC,EAAQ1wB,KAAKwwB,EAAiBC,GACvBnxB,QAAQC,WAHNmxB,CAIX,EACAp5B,EAAUi5B,gBAAkBI,CAC9B,CAEO,SAAS,GAAiBn6B,GAC/B,MAAM+C,EAAY/C,GAAUA,EAAO+C,UAEnC,GAAIA,EAAUkpB,cAAgBlpB,EAAUkpB,aAAa8C,aAAc,CAEjE,MAAM9C,EAAelpB,EAAUkpB,aACzBmO,EAAgBnO,EAAa8C,aAAa5lB,KAAK8iB,GACrDlpB,EAAUkpB,aAAa8C,aAAgB/B,GAC9BoN,EAAcC,GAAgBrN,GAEzC,EAEKjqB,EAAUgsB,cAAgBhsB,EAAUkpB,cACvClpB,EAAUkpB,aAAa8C,eACvBhsB,EAAUgsB,aAAe,SAAsB/B,EAAapD,EAAI0Q,GAC9Dv3B,EAAUkpB,aAAa8C,aAAa/B,GACjCxjB,KAAKogB,EAAI0Q,EACd,EAAEnxB,KAAKpG,GAEX,CAEO,SAASs3B,GAAgBrN,GAC9B,OAAIA,QAAqCjgB,IAAtBigB,EAAYI,MACtBvsB,OAAOmiB,OAAO,CAAC,EACpBgK,EACA,CAACI,MAAO,EAAoBJ,EAAYI,SAIrCJ,CACT,CAEO,SAASuN,GAAqBv6B,GACnC,IAAKA,EAAOwpB,kBACV,OAGF,MAAMgR,EAAqBx6B,EAAOwpB,kBAClCxpB,EAAOwpB,kBACL,SAA2BiR,EAAUC,GACnC,GAAID,GAAYA,EAASE,WAAY,CACnC,MAAMC,EAAgB,GACtB,IAAK,IAAI1yB,EAAI,EAAGA,EAAIuyB,EAASE,WAAWp4B,OAAQ2F,IAAK,CACnD,IAAI2yB,EAASJ,EAASE,WAAWzyB,QACb6E,IAAhB8tB,EAAOC,MAAsBD,EAAOE,KACtC,EAAiB,mBAAoB,qBACrCF,EAAStnB,KAAK7Q,MAAM6Q,KAAKC,UAAUqnB,IACnCA,EAAOC,KAAOD,EAAOE,WACdF,EAAOE,IACdH,EAAc90B,KAAK+0B,IAEnBD,EAAc90B,KAAK20B,EAASE,WAAWzyB,GAE3C,CACAuyB,EAASE,WAAaC,CACxB,CACA,OAAO,IAAIJ,EAAmBC,EAAUC,EAC1C,EACF16B,EAAOwpB,kBAAkB1oB,UAAY05B,EAAmB15B,UAEpD,wBAAyB05B,GAC3B35B,OAAOiW,eAAe9W,EAAOwpB,kBAAmB,sBAAuB,CACrEjf,IAAG,IACMiwB,EAAmBQ,qBAIlC,CAEO,SAASC,GAA0Bj7B,GAElB,iBAAXA,GAAuBA,EAAOg3B,eACrC,aAAch3B,EAAOg3B,cAAcl2B,aACjC,gBAAiBd,EAAOg3B,cAAcl2B,YAC1CD,OAAOiW,eAAe9W,EAAOg3B,cAAcl2B,UAAW,cAAe,CACnE,GAAAyJ,GACE,MAAO,CAAC+b,SAAUrmB,KAAKqmB,SACzB,GAGN,CAEO,SAAS4U,GAAsBl7B,GACpC,MAAM84B,EAAkB94B,EAAOwpB,kBAAkB1oB,UAAUi4B,YAC3D/4B,EAAOwpB,kBAAkB1oB,UAAUi4B,YACjC,SAAqBoC,GACnB,GAAIA,EAAc,MACgC,IAArCA,EAAaC,sBAEtBD,EAAaC,sBACTD,EAAaC,qBAEnB,MAAMC,EAAmBp7B,KAAKq7B,kBAAkBjpB,MAAK+e,GACf,UAApCA,EAAY9K,SAAS5R,MAAMlC,QACY,IAArC2oB,EAAaC,qBAAiCC,EACb,aAA/BA,EAAiBttB,UACfstB,EAAiBE,aACnBF,EAAiBE,aAAa,YAE9BF,EAAiBttB,UAAY,WAES,aAA/BstB,EAAiBttB,YACtBstB,EAAiBE,aACnBF,EAAiBE,aAAa,YAE9BF,EAAiBttB,UAAY,aAGa,IAArCotB,EAAaC,qBACnBC,GACHp7B,KAAK83B,eAAe,QAAS,CAAChqB,UAAW,kBAGK,IAArCotB,EAAaK,sBAEtBL,EAAaK,sBACTL,EAAaK,qBAEnB,MAAMC,EAAmBx7B,KAAKq7B,kBAAkBjpB,MAAK+e,GACf,UAApCA,EAAY9K,SAAS5R,MAAMlC,QACY,IAArC2oB,EAAaK,qBAAiCC,EACb,aAA/BA,EAAiB1tB,UACf0tB,EAAiBF,aACnBE,EAAiBF,aAAa,YAE9BE,EAAiB1tB,UAAY,WAES,aAA/B0tB,EAAiB1tB,YACtB0tB,EAAiBF,aACnBE,EAAiBF,aAAa,YAE9BE,EAAiB1tB,UAAY,aAGa,IAArCotB,EAAaK,qBACnBC,GACHx7B,KAAK83B,eAAe,QAAS,CAAChqB,UAAW,YAE7C,CACA,OAAO+qB,EAAgB7Y,MAAMhgB,KAAMigB,UACrC,CACJ,CAEO,SAASwb,GAAiB17B,GACT,iBAAXA,GAAuBA,EAAO27B,eAGzC37B,EAAO27B,aAAe37B,EAAO47B,mBAC/B,C,yBCjVO,SAASC,GAAoB77B,GAGlC,IAAKA,EAAOo2B,iBAAoBp2B,EAAOo2B,iBAAmB,eACtDp2B,EAAOo2B,gBAAgBt1B,UACzB,OAGF,MAAMg7B,EAAwB97B,EAAOo2B,gBACrCp2B,EAAOo2B,gBAAkB,SAAyBhS,GAQhD,GANoB,iBAATA,GAAqBA,EAAKnY,WACA,IAAjCmY,EAAKnY,UAAUjG,QAAQ,SACzBoe,EAAO7Q,KAAK7Q,MAAM6Q,KAAKC,UAAU4Q,KAC5BnY,UAAYmY,EAAKnY,UAAUlB,UAAU,IAGxCqZ,EAAKnY,WAAamY,EAAKnY,UAAU1J,OAAQ,CAE3C,MAAMw5B,EAAkB,IAAID,EAAsB1X,GAC5C4X,EAAkB,oBAAwB5X,EAAKnY,WACrD,IAAK,MAAMpK,KAAOm6B,EACVn6B,KAAOk6B,GACXl7B,OAAOiW,eAAeilB,EAAiBl6B,EACrC,CAACG,MAAOg6B,EAAgBn6B,KAa9B,OARAk6B,EAAgBE,OAAS,WACvB,MAAO,CACLhwB,UAAW8vB,EAAgB9vB,UAC3BiwB,OAAQH,EAAgBG,OACxBC,cAAeJ,EAAgBI,cAC/BrvB,iBAAkBivB,EAAgBjvB,iBAEtC,EACOivB,CACT,CACA,OAAO,IAAID,EAAsB1X,EACnC,EACApkB,EAAOo2B,gBAAgBt1B,UAAYg7B,EAAsBh7B,UAIzD,EAA8Bd,EAAQ,gBAAgBiH,IAChDA,EAAEgF,WACJpL,OAAOiW,eAAe7P,EAAG,YAAa,CACpCjF,MAAO,IAAIhC,EAAOo2B,gBAAgBnvB,EAAEgF,WACpCwL,SAAU,UAGPxQ,IAEX,CAEO,SAASm1B,GAAiCp8B,IAC1CA,EAAOo2B,iBAAoBp2B,EAAOo2B,iBAAmB,kBACtDp2B,EAAOo2B,gBAAgBt1B,WAM3B,EAA8Bd,EAAQ,gBAAgBiH,IACpD,GAAIA,EAAEgF,UAAW,CACf,MAAM+vB,EAAkB,oBAAwB/0B,EAAEgF,UAAUA,WAC/B,UAAzB+vB,EAAgB54B,OAGlB6D,EAAEgF,UAAUowB,cAAgB,CAC1B,EAAG,MACH,EAAG,MACH,EAAG,OACHL,EAAgB1vB,UAAY,IAElC,CACA,OAAOrF,CAAC,GAEZ,CAEO,SAASq1B,GAAmBt8B,EAAQgsB,GACzC,IAAKhsB,EAAOwpB,kBACV,OAGI,SAAUxpB,EAAOwpB,kBAAkB1oB,WACvCD,OAAOiW,eAAe9W,EAAOwpB,kBAAkB1oB,UAAW,OAAQ,CAChE,GAAAyJ,GACE,YAA6B,IAAftK,KAAKs8B,MAAwB,KAAOt8B,KAAKs8B,KACzD,IAIJ,MAmFMzL,EACF9wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACvC/wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACjC,WAKE,GAJA9wB,KAAKs8B,MAAQ,KAIkB,WAA3BvQ,EAAe7kB,SAAwB6kB,EAAevnB,SAAW,GAAI,CACvE,MAAM,aAAC8xB,GAAgBt2B,KAAKq2B,mBACP,WAAjBC,GACF11B,OAAOiW,eAAe7W,KAAM,OAAQ,CAClC,GAAAsK,GACE,YAA6B,IAAftK,KAAKs8B,MAAwB,KAAOt8B,KAAKs8B,KACzD,EACA7xB,YAAY,EACZ8M,cAAc,GAGpB,CAEA,GAxGsB,SAASlT,GACjC,IAAKA,IAAgBA,EAAY2I,IAC/B,OAAO,EAET,MAAMxB,EAAW,mBAAuBnH,EAAY2I,KAEpD,OADAxB,EAASE,QACFF,EAASoiB,MAAKhe,IACnB,MAAM2sB,EAAQ,gBAAoB3sB,GAClC,OAAO2sB,GAAwB,gBAAfA,EAAMhqB,OACqB,IAApCgqB,EAAMpwB,SAASpG,QAAQ,OAAc,GAEhD,CA6FQy2B,CAAkBvc,UAAU,IAAK,CAEnC,MAAMwc,EA7FoB,SAASp4B,GAEvC,MAAM8kB,EAAQ9kB,EAAY2I,IAAImc,MAAM,mCACpC,GAAc,OAAVA,GAAkBA,EAAM7mB,OAAS,EACnC,OAAQ,EAEV,MAAMkC,EAAUiD,SAAS0hB,EAAM,GAAI,IAEnC,OAAO3kB,GAAYA,GAAW,EAAIA,CACpC,CAoFwBk4B,CAAwBzc,UAAU,IAG9C0c,EArFqB,SAASC,GAKxC,IAAIC,EAAwB,MAwB5B,MAvB+B,YAA3B9Q,EAAe7kB,UAKb21B,EAJA9Q,EAAevnB,QAAU,IACF,IAArBo4B,EAGsB,MAIA,WAEjB7Q,EAAevnB,QAAU,GAML,KAA3BunB,EAAevnB,QAAiB,MAAQ,MAGlB,YAGrBq4B,CACT,CAuDyBC,CAAyBL,GAGtCM,EAxDc,SAAS14B,EAAau4B,GAG9C,IAAI7nB,EAAiB,MAKU,YAA3BgX,EAAe7kB,SACgB,KAA3B6kB,EAAevnB,UACrBuQ,EAAiB,OAGnB,MAAMoU,EAAQ,iBAAqB9kB,EAAY2I,IAC7C,uBAUF,OATImc,EAAM7mB,OAAS,EACjByS,EAAiBtN,SAAS0hB,EAAM,GAAGre,UAAU,IAAK,IACd,YAA3BihB,EAAe7kB,UACO,IAArB01B,IAIV7nB,EAAiB,YAEZA,CACT,CA+BwBioB,CAAkB/c,UAAU,GAAIwc,GAGlD,IAAI1nB,EAEFA,EADiB,IAAf4nB,GAAkC,IAAdI,EACL7d,OAAO+d,kBACA,IAAfN,GAAkC,IAAdI,EACZv8B,KAAKisB,IAAIkQ,EAAYI,GAErBv8B,KAAKgsB,IAAImQ,EAAYI,GAKxC,MAAMznB,EAAO,CAAC,EACd1U,OAAOiW,eAAevB,EAAM,iBAAkB,CAC5ChL,IAAG,IACMyK,IAGX/U,KAAKs8B,MAAQhnB,CACf,CAEA,OAAOub,EAAyB7Q,MAAMhgB,KAAMigB,UAC9C,CACJ,CAEO,SAASid,GAAuBn9B,GACrC,IAAMA,EAAOwpB,qBACT,sBAAuBxpB,EAAOwpB,kBAAkB1oB,WAClD,OAOF,SAASs8B,EAAWC,EAAI5L,GACtB,MAAM6L,EAAsBD,EAAG5V,KAC/B4V,EAAG5V,KAAO,WACR,MAAMxkB,EAAOid,UAAU,GACjB3d,EAASU,EAAKV,QAAUU,EAAKsnB,MAAQtnB,EAAKs6B,WAChD,GAAsB,SAAlBF,EAAGG,YACH/L,EAAGlc,MAAQhT,EAASkvB,EAAGlc,KAAKP,eAC9B,MAAM,IAAIsF,UAAU,4CAClBmX,EAAGlc,KAAKP,eAAiB,WAE7B,OAAOsoB,EAAoBrd,MAAMod,EAAInd,UACvC,CACF,CACA,MAAMud,EACJz9B,EAAOwpB,kBAAkB1oB,UAAU48B,kBACrC19B,EAAOwpB,kBAAkB1oB,UAAU48B,kBACjC,WACE,MAAMC,EAAcF,EAAsBxd,MAAMhgB,KAAMigB,WAEtD,OADAkd,EAAWO,EAAa19B,MACjB09B,CACT,EACF,EAA8B39B,EAAQ,eAAeiH,IACnDm2B,EAAWn2B,EAAE22B,QAAS32B,EAAEoY,QACjBpY,IAEX,CAUO,SAAS42B,GAAoB79B,GAClC,IAAKA,EAAOwpB,mBACR,oBAAqBxpB,EAAOwpB,kBAAkB1oB,UAChD,OAEF,MAAM2oB,EAAQzpB,EAAOwpB,kBAAkB1oB,UACvCD,OAAOiW,eAAe2S,EAAO,kBAAmB,CAC9C,GAAAlf,GACE,MAAO,CACLuzB,UAAW,YACXC,SAAU,cACV99B,KAAK+9B,qBAAuB/9B,KAAK+9B,kBACrC,EACAtzB,YAAY,EACZ8M,cAAc,IAEhB3W,OAAOiW,eAAe2S,EAAO,0BAA2B,CACtD,GAAAlf,GACE,OAAOtK,KAAKg+B,0BAA4B,IAC1C,EACA,GAAA/T,CAAIN,GACE3pB,KAAKg+B,2BACPh+B,KAAKmK,oBAAoB,wBACvBnK,KAAKg+B,iCACAh+B,KAAKg+B,0BAEVrU,GACF3pB,KAAKkK,iBAAiB,wBACpBlK,KAAKg+B,yBAA2BrU,EAEtC,EACAlf,YAAY,EACZ8M,cAAc,IAGhB,CAAC,sBAAuB,wBAAwB5I,SAASqK,IACvD,MAAMilB,EAAazU,EAAMxQ,GACzBwQ,EAAMxQ,GAAU,WAcd,OAbKhZ,KAAKk+B,6BACRl+B,KAAKk+B,2BAA6Bl3B,IAChC,MAAMwqB,EAAKxqB,EAAEoY,OACb,GAAIoS,EAAG2M,uBAAyB3M,EAAG4M,gBAAiB,CAClD5M,EAAG2M,qBAAuB3M,EAAG4M,gBAC7B,MAAMC,EAAW,IAAInN,MAAM,wBAAyBlqB,GACpDwqB,EAAGH,cAAcgN,EACnB,CACA,OAAOr3B,CAAC,EAEVhH,KAAKkK,iBAAiB,2BACpBlK,KAAKk+B,6BAEFD,EAAWje,MAAMhgB,KAAMigB,UAChC,CAAC,GAEL,CAEO,SAASqe,GAAuBv+B,EAAQgsB,GAE7C,IAAKhsB,EAAOwpB,kBACV,OAEF,GAA+B,WAA3BwC,EAAe7kB,SAAwB6kB,EAAevnB,SAAW,GACnE,OAEF,GAA+B,WAA3BunB,EAAe7kB,SAAwB6kB,EAAevnB,SAAW,IACnE,OAEF,MAAM+5B,EAAYx+B,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACrD/wB,EAAOwpB,kBAAkB1oB,UAAUiwB,qBACnC,SAA8Bha,GAC5B,GAAIA,GAAQA,EAAK9J,MAAuD,IAAhD8J,EAAK9J,IAAIjH,QAAQ,0BAAkC,CACzE,MAAMiH,EAAM8J,EAAK9J,IAAIxH,MAAM,MAAMqG,QAAQT,GAChB,yBAAhBA,EAAK7J,SACXwF,KAAK,MAEJhH,EAAOu1B,uBACPxe,aAAgB/W,EAAOu1B,sBACzBrV,UAAU,GAAK,IAAIlgB,EAAOu1B,sBAAsB,CAC9CnyB,KAAM2T,EAAK3T,KACX6J,QAGF8J,EAAK9J,IAAMA,CAEf,CACA,OAAOuxB,EAAUve,MAAMhgB,KAAMigB,UAC/B,CACF,CAEO,SAASue,GAA+Bz+B,EAAQgsB,GAKrD,IAAMhsB,EAAOwpB,oBAAqBxpB,EAAOwpB,kBAAkB1oB,UACzD,OAEF,MAAM49B,EACF1+B,EAAOwpB,kBAAkB1oB,UAAUi5B,gBAClC2E,GAA0D,IAAjCA,EAAsBn8B,SAGpDvC,EAAOwpB,kBAAkB1oB,UAAUi5B,gBACjC,WACE,OAAK7Z,UAAU,IAWkB,WAA3B8L,EAAe7kB,SAAwB6kB,EAAevnB,QAAU,IAClC,YAA3BunB,EAAe7kB,SACZ6kB,EAAevnB,QAAU,IACD,WAA3BunB,EAAe7kB,UACjB+Y,UAAU,IAAiC,KAA3BA,UAAU,GAAGjU,UAC3BnD,QAAQC,UAEV21B,EAAsBze,MAAMhgB,KAAMigB,YAjBnCA,UAAU,IACZA,UAAU,GAAGD,MAAM,MAEdnX,QAAQC,UAenB,EACJ,CAIO,SAAS41B,GAAqC3+B,EAAQgsB,GAC3D,IAAMhsB,EAAOwpB,oBAAqBxpB,EAAOwpB,kBAAkB1oB,UACzD,OAEF,MAAM89B,EACF5+B,EAAOwpB,kBAAkB1oB,UAAUg1B,oBAClC8I,GAAkE,IAArCA,EAA0Br8B,SAG5DvC,EAAOwpB,kBAAkB1oB,UAAUg1B,oBACjC,WACE,IAAI/e,EAAOmJ,UAAU,IAAM,CAAC,EAC5B,GAAoB,iBAATnJ,GAAsBA,EAAK3T,MAAQ2T,EAAK9J,IACjD,OAAO2xB,EAA0B3e,MAAMhgB,KAAMigB,WAU/C,GADAnJ,EAAO,CAAC3T,KAAM2T,EAAK3T,KAAM6J,IAAK8J,EAAK9J,MAC9B8J,EAAK3T,KACR,OAAQnD,KAAKu1B,gBACX,IAAK,SACL,IAAK,mBACL,IAAK,uBACHze,EAAK3T,KAAO,QACZ,MACF,QACE2T,EAAK3T,KAAO,SAIlB,GAAI2T,EAAK9J,KAAsB,UAAd8J,EAAK3T,MAAkC,WAAd2T,EAAK3T,KAC7C,OAAOw7B,EAA0B3e,MAAMhgB,KAAM,CAAC8W,IAGhD,OAD2B,UAAdA,EAAK3T,KAAmBnD,KAAK84B,YAAc94B,KAAKm5B,cACjDnZ,MAAMhgB,MACfuJ,MAAKyU,GAAK2gB,EAA0B3e,MAAMhgB,KAAM,CAACge,KACtD,EACJ,CChcA,MAAM4gB,GCIC,UAAwB,OAAC7+B,GAAU,CAAC,EAAG6I,EAAU,CACtDi2B,YAAY,EACZC,aAAa,EACbC,YAAY,IAGZ,MAAMlT,EAAU,EACVE,EV8HD,SAAuBhsB,GAE5B,MAAM2E,EAAS,CAACwC,QAAS,KAAM1C,QAAS,MAGxC,QAAsB,IAAXzE,IAA2BA,EAAO+C,YACxC/C,EAAO+C,UAAUC,UAEpB,OADA2B,EAAOwC,QAAU,iBACVxC,EAGT,MAAM,UAAC5B,GAAa/C,EAEpB,GAAI+C,EAAUk8B,gBACZt6B,EAAOwC,QAAU,UACjBxC,EAAOF,QAAUukB,EAAejmB,EAAUC,UACxC,mBAAoB,QACjB,GAAID,EAAUmsB,qBACW,IAA3BlvB,EAAOk/B,iBAA6Bl/B,EAAOm2B,wBAK9CxxB,EAAOwC,QAAU,SACjBxC,EAAOF,QAAUukB,EAAejmB,EAAUC,UACxC,wBAAyB,OACtB,KAAIhD,EAAOwpB,oBACdzmB,EAAUC,UAAUomB,MAAM,wBAQ5B,OADAzkB,EAAOwC,QAAU,2BACVxC,EAPPA,EAAOwC,QAAU,SACjBxC,EAAOF,QAAUukB,EAAejmB,EAAUC,UACxC,uBAAwB,GAC1B2B,EAAOw6B,oBAAsBn/B,EAAOo/B,mBAChC,qBAAsBp/B,EAAOo/B,kBAAkBt+B,SAIrD,CAEA,OAAO6D,CACT,CUrKyB,CAAoB3E,GAErC6+B,EAAU,CACd7S,iBACAqT,WAAU,EACVrW,eAAgB,EAChBwB,WAAY,EACZE,gBAAiB,EAEjBzd,IAAG,IAIL,OAAQ+e,EAAe7kB,SACrB,IAAK,SACH,IAAK,IAAe,KACf0B,EAAQi2B,WAEX,OADAhT,EAAQ,wDACD+S,EAET,GAA+B,OAA3B7S,EAAevnB,QAEjB,OADAqnB,EAAQ,wDACD+S,EAET/S,EAAQ,+BAER+S,EAAQS,YAAc,EAGtB,GAA0Ct/B,EAAQgsB,GAClD,GAAgDhsB,GAEhD,GAA4BA,EAAQgsB,GACpC,GAA2BhsB,GAC3B,GAA8BA,EAAQgsB,GACtC,GAAuBhsB,GACvB,GAAmCA,EAAQgsB,GAC3C,GAAkChsB,GAClC,GAAwBA,GACxB,GAAsCA,GACtC,GAAgCA,EAAQgsB,GAExC,GAA+BhsB,GAC/B,GAA4CA,GAC5C,GAA+BA,GAC/B,GAA8BA,EAAQgsB,GACtC,GAAkChsB,GAClC,GAAkCA,EAAQgsB,GAC1C,MACF,IAAK,UACH,IAAK,IAAgB,KAChBnjB,EAAQk2B,YAEX,OADAjT,EAAQ,yDACD+S,EAET/S,EAAQ,gCAER+S,EAAQS,YAAc,EAGtB,GAA0Ct/B,EAAQgsB,GAClD,GAAgDhsB,GAEhD,GAA6BA,EAAQgsB,GACrC,GAA+BhsB,EAAQgsB,GACvC,GAAwBhsB,GACxB,GAA6BA,GAC7B,GAA+BA,GAC/B,GAAiCA,GACjC,GAA+BA,GAC/B,GAA+BA,GAC/B,GAA8BA,GAC9B,GAA4BA,GAC5B,GAA6BA,GAE7B,GAA+BA,GAC/B,GAA+BA,GAC/B,GAA8BA,EAAQgsB,GACtC,GAAkChsB,GAClC,MACF,IAAK,SACH,IAAK,IAAe6I,EAAQm2B,WAE1B,OADAlT,EAAQ,wDACD+S,EAET/S,EAAQ,+BAER+S,EAAQS,YAAc,EAGtB,GAA0Ct/B,EAAQgsB,GAClD,GAAgDhsB,GAEhD,GAAgCA,GAChC,GAAiCA,GACjC,GAA4BA,GAC5B,GAA+BA,GAC/B,GAAgCA,GAChC,GAAqCA,GACrC,GAA4BA,GAC5B,GAA4BA,GAE5B,GAA+BA,GAC/B,GAA4CA,GAC5C,GAA8BA,EAAQgsB,GACtC,GAAkChsB,GAClC,GAAkCA,EAAQgsB,GAC1C,MACF,QACEF,EAAQ,wBAIZ,OAAO+S,CACT,CD5HEU,CAAe,CAACv/B,OAA0B,oBAAXA,YAAyB+M,EAAY/M,SACtE,M,8CEsBA,SAnCsB,WACpB,SAAAw/B,IAAc9gB,EAAA,KAAA8gB,GACZv/B,KAAKw/B,SAAWx/B,KAAKw/B,SAASt2B,KAAKlJ,MACnCA,KAAKy/B,WAAal1B,QAAQ9B,KAAAA,UAC5B,CA4BC,OA5BA8W,EAAAggB,EAAA,EAAA39B,IAAA,SAAAG,MAED,WACE,OAAO/B,KAAK0J,eAAiBjB,KAAAA,OAAoBA,KAAAA,SACnD,GAAC,CAAA7G,IAAA,gBAAAG,MAED,WACE,OAAO/B,KAAKy/B,UACd,GAAC,CAAA79B,IAAA,eAAAG,MAED,WACE,OAAO/B,KAAKy/B,YAAch3B,KAAAA,YAC5B,GAAC,CAAA7G,IAAA,WAAAG,MAED,SAASJ,GAAU,IAAA2gB,EAAA,KACZtiB,KAAKy/B,YAIVh3B,KAAAA,GAAc,UAAU,kBAAM9G,EAAS2gB,EAAK5Y,eAAe,GAC7D,GAAC,CAAA9H,IAAA,MAAAG,MAED,WACO/B,KAAKy/B,YAIVh3B,KAAAA,IAAe,SACjB,KAAC82B,CAAA,CAhCmB,GCKtB,IAAIG,GAAqB,KAKzB,UACE97B,YAAa,WACX,MAAO,CACL+7B,OAAQ3/B,KAAK2/B,SACbC,OAAQ5/B,KAAK6/B,gBACbC,OAAQ9/B,KAAK8/B,SACbC,QAAS//B,KAAK+/B,UACdC,SAAUhgC,KAAKggC,WACfC,YAAajgC,KAAKigC,cAClBC,aAAclgC,KAAKkgC,eACnBC,cAAengC,KAAKmgC,gBACpBC,gBAAiBpgC,KAAKogC,kBACtBC,gBAAiBrgC,KAAKqgC,kBACtBC,gBAAiBtgC,KAAKsgC,kBACtBC,iBAAkBvgC,KAAKugC,mBACvBC,kBAAmBxgC,KAAKygC,0BACxBC,oBAAqB1gC,KAAK0gC,sBAC1BC,sBAAuB3gC,KAAK2gC,wBAEhC,EAEAn+B,SAAU,kBAAMA,IAAQ,EAMxB09B,aAAc,WACZ,OACGlgC,KAAK4gC,aACN5gC,KAAK6gC,mBACL7gC,KAAK8gC,kBACL9gC,KAAK+gC,0BAET,EAEAF,gBAAiB,WACf,MACE,iBAAkB/9B,WAAa,iBAAkBA,UAAUkpB,YAE/D,EAEAgV,mBAAoB,WAClB,MACE,iBAAkBl+B,WAAa,oBAAqBA,UAAUkpB,YAElE,EAEAiV,kBAAmB,WACjB,MAAO,sBAAuBlhC,MAChC,EAEAmhC,iBAAkB,WAChB,MACE,kBAAmBC,iBAAiBtgC,WACpC,qBAAsBsgC,iBAAiBtgC,SAE3C,EAEAugC,wBAAyB,WACvB,MACE,6BAA8BrhC,QAC9B,kCAAmCA,MAEvC,EAEAshC,WAAY,WACV,MAAO,iBAAkBthC,MAC3B,EAKAuhC,iBAAkB,WAChB,QACEthC,KAAKuhC,YACLvhC,KAAKwhC,iBAAmB,KACvBxhC,KAAKyhC,wBAID,aAAcrN,iBAAiBvzB,SACxC,EAKA6gC,eAAgB,WACd,OAAI1hC,KAAK2hC,WACA/C,GAAQ7S,eAAevnB,SAAW,KAEvCxE,KAAK4hC,QACAhD,GAAQ7S,eAAevnB,SAAW,EAI7C,EAIAq9B,qBAAsB,WACpB,OAAK79B,UAGE,cAAem9B,iBAAiBtgC,SACzC,EAOAihC,oBAAqB,WACnB,IAAIC,GAAc,EAIlB,MAHuC,WAAnCnD,GAAQ7S,eAAe7kB,UACzB66B,EAAc/hC,KAAKwhC,iBAAmB,KAAOxhC,KAAKyhC,wBAE5CzhC,KAAKgiC,gBAAkBD,CACjC,EAOAE,gCAAiC,WAC/B,QAASjiC,KAAK4hC,QAAU5hC,KAAKwhC,iBAAmB,IAClD,EAOAU,gBAAiB,WACf,IAAIH,GAAc,EAIlB,MAHuC,WAAnCnD,GAAQ7S,eAAe7kB,UACzB66B,EAAc/hC,KAAKwhC,iBAAmB,KAAOxhC,KAAKyhC,wBAE5CzhC,KAAKgiC,gBAAkBD,CACjC,EAQAxB,iBAAkB,WAChB,SACG4B,EAAOviB,eACR5f,KAAKgiC,gBACJhiC,KAAKkgC,gBACNlgC,KAAKogC,qBAIApgC,KAAKghC,sBAAyBhhC,KAAK4hC,QAAU5hC,KAAK6gC,kBAC3D,EAEAP,gBAAiB,WACf,QACEtgC,KAAKgiC,gBACJhiC,KAAKkgC,gBACLlgC,KAAK4hC,QAAUhD,GAAQ7S,eAAevnB,SAAW,IAClDxE,KAAKoiC,YACJpiC,KAAKigC,eACJjgC,KAAKwhC,iBAAmB,KACvBxhC,KAAKyhC,sBAKZ,EAEAf,oBAAqB,WACnB,IAAM2B,EAAetiC,OAAO27B,cAAgB37B,OAAO47B,mBACnD,GAA4B,mBAAjB0G,EACT,OAAO,EAET,IAAM7Y,EAAQ6Y,EAAaxhC,UAO3B,MANkB,CAChB,aACA,0BACA,2BACA,gCACAyhC,OAAM,SAAAtpB,GAAM,MAA6B,mBAAlBwQ,EAAMxQ,EAAsB,KACjChZ,KAAKohC,yBAC3B,EAMAmB,yBAA0B,WACxB,OACEviC,KAAKuhC,YACLvhC,KAAKwhC,iBAAmB,KACvBxhC,KAAKyhC,qBAEV,EAEAe,YAAa,WAIX,OAHW5D,GAAQ7S,eAAe7kB,QAAQjF,QAAQ,UAAU,SAAAwgC,GAC1D,OAAOA,EAAIthC,OAAO,GAAGC,cAAgBqhC,EAAIhtB,OAAO,GAAGrJ,aACrD,GAEF,EAEAo1B,eAAgB,WACd,MAAuC,WAAnC5C,GAAQ7S,eAAe7kB,QAClB03B,GAAQ7V,eAAejmB,UAAUC,UAAW,mBAAoB,GAElE67B,GAAQ7S,eAAevnB,OAChC,EAEAk+B,OAAQ,WACN,MAA0C,SAAnC9D,GAAQ7S,eAAe7kB,OAChC,EAEA06B,KAAM,WACJ,MAA0C,YAAnChD,GAAQ7S,eAAe7kB,OAChC,EAEAy6B,SAAU,WACR,MAA0C,WAAnC/C,GAAQ7S,eAAe7kB,OAChC,EAEAq6B,SAAU,WACR,MAA0C,WAAnC3C,GAAQ7S,eAAe7kB,OAChC,EAEA65B,yBAA0B,WACxB,OAAI/gC,KAAK2hC,WACA3hC,KAAK2iC,0BAEV3iC,KAAK4hC,OACA5hC,KAAK4iC,wBAEV5iC,KAAKuhC,YACAvhC,KAAK6iC,yBAGhB,EAMAC,sBAAuB,WACrB,OAAO,CACT,EAQAF,oBAAqB,WACnB,QAAK5iC,KAAK4hC,QAGHhD,GAAQ7S,eAAevnB,SAAW,EAC3C,EAKAm+B,wBAAyB,WACvB,QAAK3iC,KAAK2hC,YAGH/C,GAAQ7S,eAAevnB,SAAW,EAC3C,EAEAq+B,wBAAyB,WACvB,QAAK7iC,KAAKuhC,aAGHvhC,KAAKwhC,kBAAoB,IAAMxhC,KAAKyhC,sBAC7C,EAEAA,oBAAqB,WAEnB,IAAMsB,EAAa,kBAAkBvhC,KAAKsB,UAAUC,WAC9CigC,EAAalgC,UAAUC,UAAUgD,QAAQ,UAAY,EAC3D,OAAQg9B,GAAcC,IAAehjC,KAAK6gC,iBAC5C,EAEAF,sBAAuB,WACrB,MAAO,CAAC,SAAU,QAAQ9S,SAAS+Q,GAAQ7S,eAAe7kB,QAC5D,EAMA24B,cAAe,WACb,OAAK77B,UAIEuG,QACL,mCAAoC04B,iBAAiBpiC,WAClD,4BAA6BmD,UAC5BA,SAASk/B,wBAEjB,EAKAC,YAAa,WAAY,IAAA7gB,EAAA,KACvB,OAAO,IAAIzZ,SAAQ,SAAAC,GACjB,IAAMs6B,EAAU9gB,EAAKud,gBACrB,GAAKuD,GAAY9gB,EAAK2d,cAAtB,CAIA,IAAM9S,EAAQnpB,SAASq/B,cAAc,SACrClW,EAAMmW,QAAU,OAChBnW,EAAMoW,IAAM,cACZpW,EAAMqW,UAAY,WAChB,IAAMC,EACJtW,EAAMuW,+BAA+B,sBACvC56B,EAAQ26B,EACV,CARA,MAFE36B,EAAQs6B,EAWZ,GACF,EAKAO,gBAAiB,WACf,OAAOp5B,QAAQzH,UAAUC,UAAUomB,MAAM,YAC3C,EAMA8W,YAAa,WAEX,OACG,mBAAmBz+B,KAAKsB,UAAUN,WACT,aAAvBM,UAAUN,UAA2BM,UAAU8gC,eAAiB,KAClE7jC,OAAO8jC,QAEZ,EAQAzB,SAAU,WAER,OACG,SAAS5gC,KAAKsB,UAAUN,WACC,aAAvBM,UAAUN,UACTM,UAAU8gC,eAAiB,GAC3B7jC,OAAO+jC,OAAO/T,OAAShwB,OAAO+jC,OAAOjU,OAAS,OACjD9vB,OAAO8jC,QAEZ,EASAE,eAAgB,WACd,IAAMC,EAAY,aAAaxiC,KAAKsB,UAAUC,WACxCkhC,EAAW,YAAYziC,KAAKsB,UAAUC,WAC5C,OAAOihC,GAAaC,CACtB,EAEAC,QAAS,WACP,YAAuC,IAA5BphC,UAAUqhC,cACyB,UAArCrhC,UAAUqhC,cAAc3hC,SAEY,IAAtCM,UAAUN,SAASuD,QAAQ,MACpC,EAMAi6B,SAAU,WACR,IACE,OAAOjgC,OAAOF,OAASE,OAAOqkC,GAChC,CAAE,MAAO77B,GACP,OAAO,CACT,CACF,EAKAw3B,QAAS,WACP,OAAO//B,KAAKoiC,YAAcpiC,KAAK+jC,gBACjC,EAKA3D,gBAAiB,WACf,OAAOpgC,KAAKigC,eAAiBjgC,KAAK2jC,iBACpC,EAQAU,cAAe,WACb,OAAO95B,QAAQ,iBAAkBxK,QAAU+C,UAAU8gC,eACvD,EAOAU,mBAAoB,WAClB,OAAQtkC,KAAKigC,gBAAkBjgC,KAAKgiC,aACtC,EAMAvB,wBAAyB,WACvB,OAAQzgC,KAAKigC,aACf,EAMAI,gBAAiB,WACf,OAAO,CACT,EAKAkE,cAAe,WACb,OAAQvkC,KAAKigC,aACf,EAEAN,OAAQ,WACN,OACE3/B,KAAK2hC,YACL3hC,KAAKugC,oBACLvgC,KAAKohC,yBAET,EAUAoD,sCAAuC,WACrC,QAAIxkC,KAAK4hC,MAIX,EAMA6C,kBAAmB,WACjB,MACwB,oBAAfC,iBAC8B,IAA9BA,WAAW7jC,UAAU8jC,IAEhC,EAMAC,gBAAiB,WACf,IACE,IAAMA,EAC2B,WAA/BpuB,EAAOzW,OAAO8kC,eAAqD,OAAxB9kC,OAAO8kC,aACpD9kC,OAAO8kC,aAAaC,QAAQ,cAAe,QAC3C,IAAMC,EAAwD,SAA/ChlC,OAAO8kC,aAAaG,QAAQ,eAC3C,OAAOJ,GAAmBG,CAC5B,CAAE,MAAOx8B,GAEP,OADA6Z,EAAO9B,MAAM,oCAAqC/X,EAAMomB,UACjD,CACT,CACF,EAEAwR,cAAe,WACb,OAAO,IAAIZ,IAAmBY,eAChC,EAEAz2B,aAAc,WACZ,OAAO,IAAI61B,IAAmB71B,cAChC,EAMAo2B,OAAQ,WACN,IAAImF,GAAmB,EACvB,GAAIjlC,KAAKuhC,WAAY,CACnB,IAAKY,EAAOxiB,eACV,OAAO,EAET,GAAI3f,KAAKyhC,sBACP,OAAO,EAET,IAAMyD,EAAYpiC,UAAUC,UAAUomB,MAAM,wBACxC+b,GAAaA,EAAU5iC,OAAS,IAClC2iC,EACE/lB,OAAOgmB,EAAU,IAAM,IACG,KAAzBhmB,OAAOgmB,EAAU,KAAchmB,OAAOgmB,EAAU,IAAM,EAE7D,CACA,OAAQD,IAAqBjlC,KAAKgiC,aACpC,EAEAlB,eAAgB,WACd,OACE9gC,KAAKihC,qBACoD,mBAAlD1X,kBAAkB1oB,UAAU48B,mBACnC,mBAAoB19B,MAExB,EAMAolC,2BAA4B,WAC1B,OAAOnlC,KAAKuhC,YAAcvhC,KAAK8/B,QACjC,EAEAsF,SAAU,WACR,OAAO76B,QAAQzH,UAAUuiC,MAC3B,EAYAzE,UAAW,WACT,MAAO,gBAAgBp/B,KAAKsB,UAAUC,YAAc/C,KAAK2jC,iBAC3D,EAIA3B,YAAa,WACX,MAEqC,eAAnCpD,GAAQ7S,eAAe7kB,OAE3B,EAOAo+B,qBAAsB,WACpB,OACGtlC,KAAKigC,eACN11B,QAAQxK,OAAOwlC,cACiB,mBAAzBA,YAAYC,WAC0B,mBAArCD,YAAYE,sBACiB,mBAA5BF,YAAYG,cACrBn7B,QAAQxK,OAAO4lC,2BACa,mBAArB5lC,OAAO6lC,WAC0B,mBAAjC7lC,OAAO8lC,qBAElB,EAGAC,kBAAmB,WACjB,GAA2B,OAAvBpG,GACF,OAAOA,GAKT,KAFE3/B,OAAO4lC,0BACP,WAAYA,yBAAyB9kC,WAGrC,OADA6+B,IAAqB,EAGvB,IAAIqG,EAAU/hC,SAASq/B,cAAc,UACjC2C,EAAUhiC,SAASq/B,cAAc,UACrC0C,EAAQlW,MAAQ,GAChBkW,EAAQhW,OAAS,GACjBiW,EAAQnW,MAAQ,GAChBmW,EAAQjW,OAAS,GACjB,IAAIkW,EAAOF,EAAQG,WAAW,MAC1BC,EAAOH,EAAQE,WAAW,MAC9BD,EAAKp6B,OAAS,YACdo6B,EAAKG,UAAY,UACjBH,EAAKI,SAAS,EAAG,EAAG,EAAG,GACvBF,EAAKC,UAAY,UACjBD,EAAKE,SAAS,EAAG,EAAG,EAAG,GACvB,IAAIC,EAAQL,EAAKM,aAAa,EAAG,EAAG,EAAG,GACnCC,EAAQL,EAAKI,aAAa,EAAG,EAAG,EAAG,GAEvC,OADA7G,GAAqB4G,EAAMtjC,KAAK,KAAOwjC,EAAMxjC,KAAK,EAEpD,EAQAyjC,UAAW,WACT,QAASzmC,KAAKuhC,YAAcvhC,KAAK2jC,kBACnC,EAGA+C,wBAAyB,WACvB,OACE1mC,KAAKghC,sBACLl+B,UAAUkpB,aAAauB,0BAA0BoZ,cAErD,EAEAC,iBAAkB,WAChB,OAAO5mC,KAAK2hC,YAAc3hC,KAAK6/B,eACjC,EAEAgH,yBAA0B,WAExB,MACqC,mBAA5B9mC,OAAO+mC,kBACd/e,MAAMK,QAAQ0e,iBAAiBC,mBAC/BD,iBAAiBC,iBAAiBlZ,SAAS,MAG/C,GChqBF,SAASmZ,GAAmBC,EAAKn+B,EAASC,EAAQm+B,EAAOC,EAAQvlC,EAAKyW,GACpE,IACE,IAAIiC,EAAO2sB,EAAIrlC,GAAKyW,GAChBtW,EAAQuY,EAAKvY,KACnB,CAAE,MAAOwG,GAEP,YADAQ,EAAOR,EAET,CACI+R,EAAKV,KACP9Q,EAAQ/G,GAER8G,QAAQC,QAAQ/G,GAAOwH,KAAK29B,EAAOC,EAEvC,CACe,SAASC,GAAkBt/B,GACxC,OAAO,WACL,IAAIjI,EAAOG,KACTmkB,EAAOlE,UACT,OAAO,IAAIpX,SAAQ,SAAUC,EAASC,GACpC,IAAIk+B,EAAMn/B,EAAGkY,MAAMngB,EAAMskB,GACzB,SAAS+iB,EAAMnlC,GACbilC,GAAmBC,EAAKn+B,EAASC,EAAQm+B,EAAOC,EAAQ,OAAQplC,EAClE,CACA,SAASolC,EAAO1vB,GACduvB,GAAmBC,EAAKn+B,EAASC,EAAQm+B,EAAOC,EAAQ,QAAS1vB,EACnE,CACAyvB,OAAMp6B,EACR,GACF,CACF,C,yBCUA,SApCiB,WACf,SAAAu6B,IAAc5oB,EAAA,KAAA4oB,GACZrnC,KAAKsnC,QAAUtnC,KAAKunC,cACtB,CA8BC,OA9BAhoB,EAAA8nB,EAAA,EAAAzlC,IAAA,SAAA0I,IAED,WACE,OAAOtK,KAAKsnC,OACd,GAKA,CAAA1lC,IAAA,eAAAG,MACA,WACE,IAEIylC,EAAS5mC,OAAOmiB,OAAO/e,SAASq/B,cAAc,UAAW,CAC3DxT,MAHY,EAIZE,OAHa,IAKfyX,EAAO35B,GAAK,sBACZ25B,EAAOtB,WAAW,MAAMG,SAAS,EAAG,EAPtB,EACC,GAOf,IAAI7xB,EAASgzB,EAAOC,gBACfhzB,EAAgC0T,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GASV,OANEtvB,OAAO2nC,0BACPlzB,aAAkBzU,OAAO2nC,2BAEzBjzB,EAAMtR,KAAO,eACbsR,EAAM+yB,OAASA,GAEVhzB,CACT,KAAC6yB,CAAA,CAjCc,GCKjB,IACQz7B,GAAS,UACT+7B,GAAkB,CAAC,EACnB/C,GAAkBgD,GAAgBhD,kBAEjC,CACLiD,MAAO,SAAUjmC,EAAKG,GACpB,IAAK6iC,GAEH,OADA+C,GAAgB/lC,GAAOG,GAChB,EAET,IACEhC,OAAO8kC,aAAaC,QAAQl5B,GAAShK,EAAK0R,KAAKC,UAAUxR,GAC3D,CAAE,MAAOwG,GAEP,OADA6Z,EAAO7Z,MAAM,sBAAuBA,IAC7B,CACT,CACA,OAAO,CACT,EAEAu/B,KAAM,SAAUlmC,EAAKmmC,GACnB,IAAIC,EAAeD,EAInB,GAH4B,WAAxBvxB,EAAOwxB,IAA8BjgB,MAAMK,QAAQ4f,KACrDA,EAAepnC,OAAOmiB,OAAO,CAAC,EAAGilB,KAE9BpD,GACH,OAAO+C,GAAgB/lC,IAAQomC,EAEjC,IAAIC,EAAcloC,OAAO8kC,aAAaG,QAAQp5B,GAAShK,GACvD,IAAKqmC,EACH,OAAOD,EAET,IACE,OAAO10B,KAAK7Q,MAAMwlC,EACpB,CAAE,MAAO1/B,GAEP,OADA6Z,EAAO7Z,MAAM,qBAAsB3G,EAAK2G,GACjCy/B,CACT,CACF,IAtCW,IACPp8B,GACA+7B,GACA/C,GCTAsD,GAEAC,GCAFC,GACJroC,OAAO2nC,0BAA4B3nC,OAAOsoC,8BAE/BC,GAAW,SAAA9zB,GACtB,OAAOjK,QACLiK,GACEA,EAAO4a,iBAAiB9sB,OAAS,GACjCkS,EAAO4a,iBAAiB,GAAGmZ,QAEjC,EAEaC,GAAW,SAAAh0B,GACtB,OAAOjK,QACLiK,GACEA,EAAO6a,iBAAiB/sB,OAAS,GACjCkS,EAAO6a,iBAAiB,GAAGkZ,QAEjC,EAEaE,GAAe,SAAAj0B,GAI1B,OAHIA,GACFA,EAAO4a,iBAAiBzgB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,SAAU,CAAK,IAE1D/zB,CACT,EAEak0B,GAAc,SAAAl0B,GAIzB,OAHIA,GACFA,EAAO4a,iBAAiBzgB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,SAAU,CAAI,IAEzD/zB,CACT,EAEam0B,GAAc,SAACn0B,EAAQ+zB,GAIlC,OAHI/zB,GACFA,EAAO4a,iBAAiBzgB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUA,CAAO,IAE5D/zB,CACT,EAEao0B,GAAc,SAACp0B,EAAQ+zB,GAIlC,OAHI/zB,GACFA,EAAO6a,iBAAiB1gB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUA,CAAO,IAE5D/zB,CACT,EAOaq0B,GAAY,SAAAp0B,GAEvB,OADAA,EAAM6H,OACC7H,EAAM4c,cAAc,IAAIH,MAAM,WACvC,EAEa4X,GAAa,SAAAt0B,GACpBA,GACFA,EAAO8a,YAAY3gB,QAAQk6B,GAE/B,EAEME,GAAgB,SAAAt0B,GACpB,MACE,mDAAmDjT,KAAKiT,EAAM1P,QAC/C,iBAAf0P,EAAMtR,MACS,uBAAfsR,EAAMtR,IAEV,EAEM6lC,GAA4B,SAAAv0B,GAChC,OAAOs0B,GAAct0B,IAAyB,uBAAfA,EAAMtR,IACvC,EAEa8lC,GAAuB,SAAAx0B,GAClC,OAAOs0B,GAAct0B,IAAyB,uBAAfA,EAAMtR,IACvC,EAEM+lC,GAAgB,SAAAz0B,GACpB,OAAOlK,SACW,iBAAfkK,EAAMtR,MAA2BsR,aAAiB2zB,KACjD3zB,EAAM+yB,QACc,wBAApB/yB,EAAM+yB,OAAO35B,IACO,sBAApB4G,EAAM+yB,OAAO35B,GAEnB,EAEas7B,GAAqB,SAAA10B,GAChC,OAAOlK,SACW,iBAAfkK,EAAMtR,MAA2BsR,aAAiB2zB,KACjD3zB,EAAM+yB,QACc,wBAApB/yB,EAAM+yB,OAAO35B,GAEnB,EAEau7B,GAAmB,SAAA30B,GAC9B,OAAOlK,SACW,iBAAfkK,EAAMtR,MAA2BsR,aAAiB2zB,KACjD3zB,EAAM+yB,QACc,sBAApB/yB,EAAM+yB,OAAO35B,GAEnB,EAEMw7B,GAAgB,SAAA50B,GACpB,OACGy0B,GAAcz0B,KAAWs0B,GAAct0B,KAAW20B,GAAiB30B,EAExE,EAEa60B,GAAkB,SAAA90B,GAC7B,OAAKA,EAGEA,EAAO6a,iBAAiBxjB,OAAOk9B,IAF7B,EAGX,EAEaQ,GAA8B,SAAA/0B,GACzC,OAAKA,EAGEA,EAAO6a,iBAAiBxjB,OAAOm9B,IAF7B,EAGX,EAEaQ,GAAyB,SAAAh1B,GACpC,OAAKA,EAGEA,EAAO6a,iBAAiBxjB,OAAOo9B,IAF7B,EAGX,EAEaQ,GAAkB,SAAAj1B,GAC7B,OAAKA,EAGEA,EAAO6a,iBAAiBxjB,OAAOw9B,IAF7B,EAGX,EAEaK,GAAe,SAAAl1B,GAC1B,OAAKA,EAGEA,EAAO6a,iBAAiBxjB,OAAOu9B,IAF7B,EAGX,EAEaO,GAAa,SAAAn1B,GACxBi1B,GAAgBj1B,GAAQ7F,QAAQk6B,GAClC,EAEae,GAAgB,SAAAp1B,GAE3B,OADAi1B,GAAgBj1B,GAAQ7F,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,SAAU,CAAK,IACxD/zB,CACT,EAEaq1B,GAAe,SAAAr1B,GAE1B,OADAi1B,GAAgBj1B,GAAQ7F,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,SAAU,CAAI,IACvD/zB,CACT,EAEas1B,GAAe,SAACt1B,EAAQ+zB,GAEnC,OADAkB,GAAgBj1B,GAAQ7F,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUA,CAAO,IAC1D/zB,CACT,EAEau1B,GAAiB,SAACv1B,EAAQ+zB,GAErC,OADAmB,GAAal1B,GAAQ7F,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUA,CAAO,IACvD/zB,CACT,EAEaw1B,GAAkB,SAAAx1B,GAE7B,OAAIA,aAAkB4zB,GACb5zB,EAAO6a,iBAEX7a,EAGEA,EAAO6a,iBAAiBxjB,OAAOq9B,IAF7B,EAGX,EAEae,GAAiB,SAAAz1B,GAC5B,OAAOg0B,GAASh0B,IAAWA,EAAO6a,iBAAiBzB,KAAKmb,GAC1D,EAEamB,GAA6B,SAAA11B,GACxC,OACEg0B,GAASh0B,IAAWA,EAAO6a,iBAAiBzB,KAAKob,GAErD,EAEamB,GAAiB,SAAA31B,GAC5B,SAAKozB,GAAgBxG,4BAA8B5sB,IAI5CA,EAAO6a,iBAAiBzB,KAAKsb,GACtC,EAEakB,GAAc,SAAA51B,GACzB,SAAKozB,GAAgBxG,4BAA8B5sB,KAG5Cg0B,GAASh0B,IAAWA,EAAO6a,iBAAiBzB,KAAKwb,IAC1D,EAEaiB,GAAiB,SAAA71B,GAC5B,OACEg0B,GAASh0B,KACRy1B,GAAez1B,KACf21B,GAAe31B,KACf41B,GAAY51B,EAEjB,EAEa81B,GAA6B,SAAA91B,GACxC,QAAKA,IAGE21B,GAAe31B,IAAWA,EAAO6a,iBAAiBzB,KAAKsb,IAChE,EAEaqB,GAAuB,SAAA/1B,GAClC,OAAO01B,GAA2B11B,IAAW21B,GAAe31B,EAC9D,EAEag2B,GAAiB,SAAAh2B,GAC5B,OAAOi1B,GAAgBj1B,GAAQoZ,MAAK,SAAAnZ,GAAK,OAAIA,EAAM8zB,OAAO,GAC5D,EAEakC,GAAgB,SAAAj2B,GAC3B,IAAM+kB,EAASkQ,GAAgBj1B,GAC/B,GAAI+kB,EAAOj3B,OAAS,EAAG,CACrB,IAAOmS,EAAP0T,EAAgBoR,EAAM,GAAV,GACZ,GAAiC,mBAAtB9kB,EAAM+hB,YAA4B,CAC3C,IAAMkU,EAAWj2B,EAAM+hB,cACvB,GAAIkU,GAAY,eAAgBA,EAC9B,OAAOA,EAASrd,UAEpB,CACF,CACA,OAAO,IACT,EAGaoa,GAAgB,SAAAD,GAI3BA,EAAOtB,WAAW,MAIlB,IAAM1xB,EAASgzB,EAAOC,cAAc,IAC7BhzB,EAAgC0T,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GAOZ,MANM,iBAAkB5a,IACtBA,EAAMtR,KAAO,eACbsR,EAAM+yB,OAASA,EACf/yB,EAAMk2B,aAAe,kBAAMn2B,EAAOm2B,cAAc,GAG3Cn2B,CACT,EA4Cao2B,GAAuB,SAACp2B,GAA8B,IAAtBq2B,EAAS5qB,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,IAAAA,UAAA,GACpD,GACEzL,GACAA,aAAkBgc,aAClBhc,EAAO8a,YAAYhtB,OAAS,EAC5B,CACA,IAAMwoC,EAASt2B,EACZ4a,iBACAhd,MAAK,SAAAqC,GAAK,MAAyB,SAArBA,EAAM8oB,UAAqB,IACtCwN,EAASv2B,EACZ6a,iBACAjd,MAAK,SAAAqC,GAAK,MAAyB,SAArBA,EAAM8oB,UAAqB,IACtCyN,EAAaF,GArDM,WAC3B,IACE,IAAMG,EAAK,IAAKlrC,OAAO27B,cAAgB37B,OAAO47B,oBACtCnnB,EAAWy2B,EAAGC,+BAAd12B,OACDC,EAAgC0T,EAAvB3T,EAAO4a,iBAAgB,GAA3B,GAKZ,OAJA3a,EAAMtR,KAAO,aACbsR,EAAM8zB,SAAU,EAChBO,GAAWt0B,GACXy2B,EAAGE,QACI12B,CACT,CAAE,MAAOlM,GACP6Z,EAAOlC,KACL,mEACA3X,EAEJ,CACA,OAAO,IACT,CAoCiC6iC,GACvBC,EAAaN,GAlCM,WAC3B,IACE,IAAMvD,EAASxjC,SAASq/B,cAAc,UAEtCmE,EAAOtB,WAAW,MAAMG,SAAS,EAAG,EAAGmB,EAAO3X,MAAO2X,EAAOzX,QAC5D,IAAMvb,EAASgzB,EAAOC,gBACfhzB,EAAgC0T,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GAIZ,OAHA5a,EAAMtR,KAAO,aACbsR,EAAM8zB,SAAU,EAChBO,GAAWt0B,GACJC,CACT,CAAE,MAAOlM,GACP6Z,EAAOlC,KACL,mEACA3X,EAEJ,CACA,OAAO,IACT,CAgBiC+iC,GACvB/R,EAAS,GAOf,OANIyR,GACFzR,EAAO1zB,KAAKmlC,GAEVK,IAAeR,GACjBtR,EAAO1zB,KAAKwlC,GAEP,IAAI7a,YAAY+I,EACzB,CACA,OAAO,CACT,EDxTA,UAnBQ2O,GAAQ,GAERC,GAAc,uBAUpBpoC,OAAOmK,iBAAiB,WATF,SAAAF,GACpB,GAAIA,EAAMuhC,SAAWxrC,QAAUiK,EAAMhH,OAASmlC,GAAa,CACzDn+B,EAAMwhC,kBACN,IAAM1jC,EAAKogC,GAAMx8B,QACb5D,GACFA,GAEJ,CACF,IAEO,SAAAA,GACLogC,GAAMriC,KAAKiC,GACX/H,OAAO0rC,YAAYtD,GAdN,IAef,GEyCF,SAzDgC,SAACrgC,EAAI4jC,GACnC,IAAIC,EAAM,KACNC,GAAQ,EACRC,GAAQ,EACRC,EAAqB,EACnB7b,EAAY,IAAOyb,EACnBK,EAAe,SAAfA,IACJ,IAAMtnB,EAAMD,KAAKC,MACXunB,EAAUvnB,EAAMqnB,EAClBE,GAAW/b,EACb0b,EAAM9F,sBAAsBkG,IAG9BD,EAAqBrnB,EAAOunB,EAAU/b,EACtCnoB,IACF,EACMmkC,EAAqB,SAArBA,IACJ,IAAMxnB,EAAMD,KAAKC,MACXunB,EAAUvnB,EAAMqnB,EAClBE,GAAW/b,EACbic,GAAUD,IAGZH,EAAqBrnB,EAAOunB,EAAU/b,EACjC4b,GACH/jC,IAEJ,EACMpD,EAAS,CACbmhC,sBAAuB,SAAFsG,GAAA,SAAAtG,IAAA,OAAAsG,EAAAnsB,MAAA,KAAAC,UAAA,QAAA4lB,EAAA9kC,SAAA,kBAAAorC,EAAAprC,UAAA,EAAA8kC,CAAA,CAAE,aACjB+F,EACFD,EAAM9F,sBAAsBkG,IAExBF,IACFA,GAAQ,GAEVK,GAAUD,GAEd,IACAG,qBAAsB,SAAFC,GAAA,SAAAD,IAAA,OAAAC,EAAArsB,MAAA,KAAAC,UAAA,QAAAmsB,EAAArrC,SAAA,kBAAAsrC,EAAAtrC,UAAA,EAAAqrC,CAAA,CAAE,aACpBP,GAAQ,EACJF,IACFS,qBAAqBT,GACrBA,EAAM,KAEV,KASF,OAPA3nC,SAASkG,iBAAiB,oBAAoB,aAC5C0hC,EAAqC,YAA7B5nC,SAASsoC,kBACHX,IACZjnC,EAAO0nC,uBACP1nC,EAAOmhC,wBAEX,IACOnhC,CACT,EC5BA,SAzBqB,SAACo2B,GAA0B,IAArByR,EAAStsB,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,KACrC,OAAO,IAAIpX,SAAQ,SAACC,EAASC,GAC3B,IAAMw6B,EAAM,IAAIiJ,IAAI1R,EAAK2R,SAASC,MAC5BC,EAAS3oC,SAASq/B,cAAc,UACtCsJ,EAAO3wB,OAAQ,EACf2wB,EAAOC,OAAS,WACVD,EAAOE,YACTF,EAAOG,SAEThkC,EAAQ6jC,EACV,EACAA,EAAO5iC,QAAU,WACX4iC,EAAOE,YACTF,EAAOG,SAET/jC,EAAO,IAAI4Q,MAAM,6BAA+BmhB,GAClD,EACIyR,IACFI,EAAOJ,UAAYA,EAAUQ,KAAO,IAAMR,EAAUS,MAEtDL,EAAOpJ,IAAMA,EACbv/B,SAASipC,KAAKlrB,OAAO4qB,EACvB,GACF,EC3BA,IAAMO,GAAqD,mBAAxBntC,OAAOotC,aAuC1C,UACEC,aAtCgB,eAAAC,EAAAjG,GAAA3wB,KAAAA,MAAG,SAAA62B,EAAOC,EAASzsB,GAAI,IAAAG,EAAA/V,EAAAwV,EAAA,OAAAjK,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,UAClC0yB,GAAqB,CAAFM,EAAAhzB,KAAA,eAAAgzB,EAAArzB,OAAA,wBAAAqzB,EAAAnxB,KAAA,EAAAmxB,EAAAhzB,KAAA,EAICuG,MAAMwsB,GAAQ,OAAvB,OAARtsB,EAAQusB,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,EACEyG,EAAS/V,OAAM,OAAxB,OAAJA,EAAIsiC,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,GACOizB,OAAOC,KAAK,SAAQ,QAA7B,OAALhtB,EAAK8sB,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,GACRkG,EAAMitB,IAAI7sB,EAAM,IAAI8sB,SAAS1iC,IAAM,QAAAsiC,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,kCAAAA,EAAAlxB,OAAA,GAAAgxB,EAAA,mBAG5C,gBAXiB9kB,EAAAslB,GAAA,OAAAT,EAAArtB,MAAA,KAAAC,UAAA,KAuChB8tB,YA1Be,eAAAC,EAAA5G,GAAA3wB,KAAAA,MAAG,SAAAw3B,EAAMntB,GAAI,IAAAJ,EAAAO,EAAA/V,EAAA,OAAAuL,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,WACxB0yB,GAAqB,CAAFgB,EAAA1zB,KAAA,gBAAA0zB,EAAA7xB,KAAA,EAAA6xB,EAAA1zB,KAAA,EAECizB,OAAOC,KAAK,SAAQ,OAA7B,OAALhtB,EAAKwtB,EAAAl0B,KAAAk0B,EAAA1zB,KAAG,EACSkG,EAAMyI,MAAMrI,GAAK,OAA1B,OAARG,EAAQitB,EAAAl0B,KAAAk0B,EAAA1zB,KAAG,GACEyG,EAAS/V,OAAM,QAAxB,OAAJA,EAAIgjC,EAAAl0B,KAAAk0B,EAAA/zB,OAAA,SACHqyB,IAAI2B,gBAAgBjjC,IAAK,QAAAgjC,EAAA7xB,KAAA,GAAA6xB,EAAAL,GAAAK,EAAA,wBAAAA,EAAA/zB,OAAA,UAI7B,GAAK,yBAAA+zB,EAAA5xB,OAAA,GAAA2xB,EAAA,mBACb,gBAXgBG,GAAA,OAAAJ,EAAAhuB,MAAA,KAAAC,UAAA,KA2BfouB,WAdc,eAAAC,EAAAlH,GAAA3wB,KAAAA,MAAG,SAAA83B,EAAMztB,GAAI,IAAAJ,EAAA,OAAAjK,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,UACtB0yB,GAAqB,CAAFsB,EAAAh0B,KAAA,eAAAg0B,EAAAr0B,OAAA,wBAAAq0B,EAAAnyB,KAAA,EAAAmyB,EAAAh0B,KAAA,EAIFizB,OAAOC,KAAK,SAAQ,OAA7B,OAALhtB,EAAK8tB,EAAAx0B,KAAAw0B,EAAAh0B,KAAG,EACRkG,EAAK,OAAQI,GAAK,OAAA0tB,EAAAh0B,KAAA,iBAAAg0B,EAAAnyB,KAAA,GAAAmyB,EAAAX,GAAAW,EAAA,kCAAAA,EAAAlyB,OAAA,GAAAiyB,EAAA,mBAG3B,gBATeE,GAAA,OAAAH,EAAAtuB,MAAA,KAAAC,UAAA,MCvBhB,IAAMyuB,GAAY,CAChB,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IACzE,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACzE,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACxE,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAC1E,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAC3E,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAC3E,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IACxE,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IACtE,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GACzE,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAC3E,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IACzE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IACxE,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IACzE,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC1E,GAAI,IAAK,GAAI,IAAK,GAEdC,GAAY,CAChB,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1E,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GACxE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAoJlC,SAjJmB,WACjB,IAAIC,EAAU,KACVC,EAAO,KACPC,GAAY,EACZrmB,EAAK,KACLsmB,EAAK,KACLC,EAAK,KACLC,EAAQ,KACRC,EAAQ,KAsIZ,MAAO,CAAEC,IApIG,SAACC,GACX,GAAIN,GAAaF,EAEf,OADAE,GAAY,EACLF,EAETE,GAAY,EACZ,IAAMO,EAASrpC,WANeia,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,GAQzB4P,EAAkBuf,EAAlBvf,MAAOE,EAAWqf,EAAXrf,OACV6e,IACHA,EAAU5qC,SAASq/B,cAAc,UACjCwL,EAAOD,EAAQ1I,WAAW,KAAM,CAAEriC,OAAO,EAAOyrC,gBAAgB,IAChEV,EAAQ/e,MAAQA,EAChB+e,EAAQ7e,OAASA,GAEnB8e,EAAKU,UAAUH,EAAa,EAAG,GAC/B,IAAMI,EAAYX,EAAKtI,aAAa,EAAG,EAAG1W,EAAOE,GACzC/sB,EAASwsC,EAATxsC,KAGFysC,EAAK5f,EAAQ,EACb6f,EAAK3f,EAAS,EACd4f,EAAON,EAAS,EAEhBO,EAASlB,GAAUW,GACnBQ,EAASlB,GAAUU,GAEpB5mB,IACHA,EAAK,IAAIqnB,YAAY9sC,EAAKV,OAAS,GACnCysC,EAAK,IAAIe,YAAY9sC,EAAKV,OAAS,GACnC0sC,EAAK,IAAIc,YAAY9sC,EAAKV,OAAS,GAEnC2sC,EAAQ,IAAIa,YAAYjgB,GACxBqf,EAAQ,IAAIY,YAAYjgB,IAQ1B,IALA,IAAIkgB,EAAa,EACbhrB,EAAI,EACJirB,EAAK,EACLC,EAAK,EAEFF,KAAe,GAAG,CAIvB,IAHA,IAAIG,EAAK,EACLC,EAAK,EAEAC,EAAI,EAAGA,EAAIrgB,EAAQqgB,IAAK,CAK/B,IAJA,IAAIC,EAAOrtC,EAAKktC,GAAMP,EAClBW,EAAOttC,EAAKktC,EAAK,GAAKP,EACtBY,EAAOvtC,EAAKktC,EAAK,GAAKP,EAEjB1nC,EAAI,EAAGA,GAAKonC,EAAQpnC,IAC3B8c,EAAImrB,IAAOjoC,EAAIwnC,EAAKA,EAAKxnC,IAAM,GAC/BooC,GAAQrtC,EAAK+hB,KACburB,GAAQttC,EAAK+hB,KACbwrB,GAAQvtC,EAAK+hB,KAGf,IAAK,IAAIyrB,EAAI,EAAGA,EAAI3gB,EAAO2gB,IACzB/nB,EAAG0nB,GAAME,EACTtB,EAAGoB,GAAMG,EACTtB,EAAGmB,GAAMI,EAEC,IAANH,IACFnB,EAAMuB,KAAOzrB,EAAIyrB,EAAIb,GAAQF,EAAK1qB,EAAI0qB,IAAO,EAC7CP,EAAMsB,IAAMzrB,EAAIyrB,EAAInB,GAAU,EAAItqB,GAAK,EAAI,GAG7CirB,EAAKE,EAAKjB,EAAMuB,GAChBP,EAAKC,EAAKhB,EAAMsB,GAEhBH,GAAQrtC,EAAKgtC,KAAQhtC,EAAKitC,KAC1BK,GAAQttC,EAAKgtC,KAAQhtC,EAAKitC,KAC1BM,GAAQvtC,EAAKgtC,KAAQhtC,EAAKitC,KAE1BE,IAEFD,GAAMrgB,GAAS,CACjB,CAEA,IAAK,IAAI2gB,EAAI,EAAGA,EAAI3gB,EAAO2gB,IAAK,CAM9B,IALA,IAAIC,EAAKD,EACLH,EAAO5nB,EAAGgoB,GAAMd,EAChBW,EAAOvB,EAAG0B,GAAMd,EAChBY,EAAOvB,EAAGyB,GAAMd,EAEX1nC,EAAI,EAAGA,GAAKonC,EAAQpnC,IAE3BooC,GAAQ5nB,EADRgoB,GAAMxoC,EAAIynC,EAAK,EAAI7f,GAEnBygB,GAAQvB,EAAG0B,GACXF,GAAQvB,EAAGyB,GAGbN,EAAKK,GAAK,EAEV,IAAK,IAAIJ,EAAI,EAAGA,EAAIrgB,EAAQqgB,IAC1BptC,EAAKmtC,GAAOE,EAAOT,IAAYC,EAC/B7sC,EAAKmtC,EAAK,GAAMG,EAAOV,IAAYC,EACnC7sC,EAAKmtC,EAAK,GAAMI,EAAOX,IAAYC,EAEzB,IAANW,IACFvB,EAAMmB,KAAOrrB,EAAIqrB,EAAIT,GAAQD,EAAK3qB,EAAI2qB,GAAM7f,EAC5Cqf,EAAMkB,IAAMrrB,EAAIqrB,EAAIf,GAAU,EAAItqB,EAAI8K,EAAQ,GAGhDmgB,EAAKQ,EAAIvB,EAAMmB,GACfH,EAAKO,EAAItB,EAAMkB,GAEfC,GAAQ5nB,EAAGunB,GAAMvnB,EAAGwnB,GACpBK,GAAQvB,EAAGiB,GAAMjB,EAAGkB,GACpBM,GAAQvB,EAAGgB,GAAMhB,EAAGiB,GAEpBE,GAAMtgB,GAAS,CAEnB,CACF,CAIA,OAFAgf,EAAK6B,aAAalB,EAAW,EAAG,GAEzBZ,CACT,EAacxzB,MAXA,WACZwzB,EAAU,KACVC,EAAO,KACPC,GAAY,EACZrmB,EAAK,KACLsmB,EAAK,KACLC,EAAK,KACLC,EAAQ,KACRC,EAAQ,IACV,EAGF,EC5KAnvC,OAAON,QAAUM,OAAON,SAAW,CAAC,EAEpC,IAAMkxC,GAC8B,mBAA3B5wC,OAAO6wC,iBACb,WACC,IAEE,OADA,IAAIA,gBAAgB,EAAG,GAAG1K,WAAW,OAC9B,CAET,CAAE,MAAO39B,GAAQ,CACjB,OAAO,CACT,CAPC,GAQGsoC,GACJF,IACApmC,QAAQxK,OAAO+wC,oCACf,WAAYA,kCAAkCjwC,UAC1CkwC,GAAyD,mBAA7BhxC,OAAOixC,kBACnCC,GACwC,mBAArClxC,OAAOmxC,0BACVC,GACJpxC,OAAOwlC,aACPA,YAAYC,SACV,IAAI4L,WAAW,CACb,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EACtE,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,MAGvBC,GAAiC,WACrC,IAGE,OADA,IAAIC,aACG,CAET,CAAE,MAAO/oC,GAAQ,CACjB,OAAO,CACT,CARuC,GAUjCgpC,GAAO/wC,KAAKisB,IAGZ+kB,GAAeH,GACjB,IAAIC,YACJttC,SAASq/B,cAAc,KACrBoO,GAEE,gCAFFA,GAGG,IAHHA,GAII,IAJJA,GAKQ,MAGVC,GAAU,KACVC,IAAe,EACfC,IAAiB,EACjBC,GAAqB,KACrBC,GAAsB,KAEtBC,GAAkB,KAClBC,GAAwB,KAEtBC,GAAc,eAAA5E,EAAAjG,GAAA3wB,KAAAA,MAAG,SAAA62B,IAAA,IAAA4E,EAAAC,EAAAC,EAAA,OAAA37B,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,WACjBk3B,GAAS,CAAFlE,EAAAhzB,KAAA,eAAAgzB,EAAArzB,OAAA,iBAIqC,OADhDy3B,IAAiB,EACjBJ,GAAangB,cAAc,IAAIH,MAAM,WAAWsc,EAAAhzB,KAAA,EAC1B3R,QAAQkwB,IAAI,CAE5BsZ,GADJlB,GACiB,+BACA,2BACjBpwB,MAAM,wBAADQ,OAAyBkwB,GAAuB,cACrD,OALW,OAAPS,EAAO1E,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,EAMAza,OAAON,QACrB0xC,GAAc,yBAA2B,wBACxC,OAFI,OAAPO,GAAOlE,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,GAGU03B,EAAQ,GAAGI,cAAa,QAAtCH,EAAK3E,EAAAxzB,KACLo4B,EAAoBV,GAAQa,8BAClCb,GAAQc,OAAOvoB,IAAI,IAAImnB,WAAWe,GAAQC,GAC1CV,GAAQe,WAAWN,EAAM7U,YACzBuU,GAAqBH,GAAQgB,wBAA0B,EACvDZ,GAAsBJ,GAAQiB,yBAA2B,EACzDf,IAAiB,EACjBD,IAAe,EACfH,GAAangB,cAAc,IAAIH,MAAM,WAAW,yBAAAsc,EAAAlxB,OAAA,GAAAgxB,EAAA,KACjD,kBAxBmB,OAAAD,EAAArtB,MAAA,KAAAC,UAAA,KA0Bd2yB,GAAwB,SAAC/iB,EAAOE,GAA+B,IAAvBnnB,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EACjDvb,EAAS,CACb8iC,OAAQ,KACRqL,IAAK,MAGP,OAAIlC,KADmB,UALuC1wB,UAAA3d,OAAA,EAAA2d,UAAA,QAAAnT,IAK7B+jC,KAE/BnsC,EAAO8iC,OAAS,IAAIoJ,gBAAgB/gB,EAAOE,GAC3CrrB,EAAOmuC,IAAMnuC,EAAO8iC,OAAOtB,WAAW,KAAMt9B,GACrClE,IAETA,EAAO8iC,OAASxjC,SAASq/B,cAAc,UACvC3+B,EAAO8iC,OAAO3X,MAAQA,EACtBnrB,EAAO8iC,OAAOzX,OAASA,EACvBrrB,EAAOmuC,IAAMnuC,EAAO8iC,OAAOtB,WACzB,KACAtlC,OAAOmiB,OAAO,CAAEusB,gBAAgB,GAAQ1mC,IAEnClE,EACT,EAEA0iC,GAAA3wB,KAAAA,MAAC,SAAAw3B,IAAA,IAAAnT,EAAA,OAAArkB,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,OACyE,GAC1C,eADAs4B,GAAahL,KAAK,yBACN,CAAAoG,EAAA1zB,KAAA,eAAA0zB,EAAA1zB,KAAA,EACtBu4B,GAAahF,YAAY,gCAA+B,QAApEjT,EAAGoT,EAAAl0B,QAEP+3B,GAAkBjX,GACnB,wBAAAoT,EAAA5xB,OAAA,GAAA2xB,EAAA,IANL7G,GAUA,IAqCMvoB,GArCAm0B,GAAY,SAAClY,EAAKpc,GACtB,OAAO,IAAI7V,SAAQ,SAAAC,GAIjB,GAHI4V,GAA+B,UAAnBA,EAAShF,OACvBgF,EAASu0B,aAAY,GAEX,SAARnY,GAAmBiX,GAAvB,CAIA,IAAMmB,EAAM,IAAIC,MAChBD,EAAInpC,QAAU,kBAAMjB,EAAQ,KAAK,EACjCoqC,EAAItG,OAAS,kBAAM9jC,EAAQoqC,EAAI,EAC3B,iBAAiB1xC,KAAKs5B,KAAwC,IAAhCA,EAAI/0B,QAAQ0mC,SAAS2G,QACrDF,EAAIG,YAAc,aAEpBH,EAAI3P,IAAc,SAARzI,GAAkBiX,GAAkBA,GAAkBjX,CAPhE,MAFEhyB,EAAQ,KAUZ,IAAGS,MAAK,SAAA2pC,GAIN,OAHIx0B,GAA+B,UAAnBA,EAAShF,OACvBgF,EAASu0B,aAAY,GAEhBC,CACT,GACF,EAEMI,GAAiB,SAAAxY,GACrB,OAAO,IAAIjyB,SAAQ,SAACC,EAASC,GAC3B,IAAMmqC,EAAM,IAAIC,MAChBD,EAAInpC,QAAU,kBAAMhB,EAAO,IAAIsR,UAAU,sBAAsB,EAC/D64B,EAAItG,OAAS,kBAAM9jC,GAAS,EACxB,iBAAiBtH,KAAKs5B,KAAwC,IAAhCA,EAAI/0B,QAAQ0mC,SAAS2G,QACrDF,EAAIG,YAAc,aAEpBH,EAAI3P,IAAMzI,CACZ,GACF,EAEMyY,IACA10B,GAAQ,KACL,SAAA20B,GACA30B,KACHA,GAAQje,OAAOmiB,OAAO/e,SAASq/B,cAAc,SAAU,CACrDlgC,KAAM,OACNswC,OAAQ,aAGZ50B,GAAM/U,SAAW,SAAAwkC,GAA2B,IAAdoF,EAAKpF,EAAflvB,OAAUs0B,MAC5B,GAAIA,EAAMpxC,OAAS,EAAG,CACpB,IAAMw4B,EAAM0R,IAAI2B,gBAAgBuF,EAAM,IACtCJ,GAAexY,GAAKvxB,MAAK,WACnBwoC,IAAmBA,KAAoBC,IACzCxF,IAAImH,gBAAgB5B,IAEtBA,GAAkBjX,EAClB0Y,GACF,GAAGA,EACL,CACA30B,GAAM/U,SAAW,KACjB+U,GAAM9c,MAAQ,EAChB,EACA8c,GAAM+0B,OACR,GAGIC,GAAoB,SAACC,EAAOjkB,EAAOE,GACvC,IAAMgkB,EAASlkB,EAAQikB,EAAMjkB,MACvBmkB,EAASjkB,EAAS+jB,EAAM/jB,OACxBkkB,EAAQ1C,GAAKwC,EAAQC,GACrBE,EAAWJ,EAAMjkB,MAAQokB,EACzBE,EAAYL,EAAM/jB,OAASkkB,EAC3BG,GAAgBvkB,EAAQqkB,GAAY,EACpCG,GAAgBtkB,EAASokB,GAAa,EACtC3M,EAASoL,GAAsB/iB,EAAOE,EAAQ,CAAElsB,OAAO,IAY7D,OAXA2jC,EAAOqL,IAAItD,UACTuE,EACA,EACA,EACAA,EAAMjkB,MACNikB,EAAM/jB,OACNqkB,EACAC,EACAH,EACAC,GAEK3M,EAAOA,MAChB,EAEM8M,GAAuB,SAACR,EAAOjkB,EAAOE,GAC1C,IAAMyX,EAASoL,GAAsB/iB,EAAOE,EAAQ,CAAElsB,OAAO,IACrDgvC,EAAQrL,EAARqL,IAIR,OAHAA,EAAIzM,UAAY,UAChByM,EAAIxM,SAAS,EAAG,EAAGxW,EAAOE,GAC1B8iB,EAAItD,UAAUuE,EAAO,GAAI,IAClBtM,EAAOA,MAChB,EAEM+M,GAAuB,SAAC1kB,EAAOE,EAAQnnB,GAC3C,IAAM4+B,EAASoL,GAAsB/iB,EAAOE,EAAQ,CAAElsB,OAAO,IACrDgvC,EAAQrL,EAARqL,IACF2B,EAAW3B,EAAI4B,qBACnB7rC,EAAQ8rC,OACR9rC,EAAQ+rC,OACR/rC,EAAQgsC,KACRhsC,EAAQisC,MAMV,OAJAL,EAASM,aAAa,EAAGlsC,EAAQmsC,QACjCP,EAASM,aAAa,EAAGlsC,EAAQosC,QACjCnC,EAAIzM,UAAYoO,EAChB3B,EAAIxM,SAAS,EAAG,EAAGxW,EAAOE,GACnByX,EAAOA,MAChB,EAEMyN,GAAmB,SAACv2B,EAAUmR,EAAOE,EAAQ4U,GACjD,IACMuQ,EAAsB,GADN,EAAPvQ,GAETwQ,EAAWtlB,EAAQqlB,EACnBE,EAAYrlB,EAASmlB,EAC3Bx2B,EAAS22B,WAAazC,GACpBuC,EACAC,EACA,CACEvxC,OAAO,GAET,QAEF6a,EAAS42B,YAAc1C,GAAsBuC,EAAUC,EAAW,CAChEvxC,OAAO,IAET6a,EAAS22B,WAAWxC,IAAIhnC,OAAS,QAAH0V,OAAWojB,EAAI,MAC/C,EAEM4Q,GACJ,uDAEIC,GAAW,WACf,OAAI7D,GACK,QAELC,GACK,aAEF,EACT,EAEM6D,GAAsB,WAC1B,SAAAA,IAA6B,IAAAnzB,EAAA,KAAjBtd,EAAIib,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,SAAQxB,EAAA,KAAAg3B,GACzBrzB,EAAO9H,KAAK,sCAAuCtV,GACnDhF,KAAKgF,KAAOA,EACZhF,KAAKwnC,OAAS,KACdxnC,KAAK6yC,IAAM,KACX7yC,KAAK01C,eAAiB,KACtB11C,KAAK21C,UAAY,KACjB31C,KAAKmtB,MAAQ,KACbntB,KAAK41C,OAAS,KACd51C,KAAKsqB,KAAO,CAAEuF,MAAO,EAAGE,OAAQ,GAChC/vB,KAAK61C,uBAAyB,KAC9B71C,KAAK81C,oBAAsB,KAC3B91C,KAAK+1C,iBAAmB,KACxB/1C,KAAKg2C,YAAc,KACnBh2C,KAAKi2C,SAAW,KAChBj2C,KAAKk2C,YAAc,KACnBl2C,KAAK6rC,OAAQ,EACb7rC,KAAKm2C,QAAS,EACdn2C,KAAK2rC,IAAMyK,GAAwBp2C,KAAKq2C,UAAUntC,KAAKlJ,MAAO,IAC9DA,KAAKs2C,cAAgB,KACrBt2C,KAAKu2C,eAAiB,KACtBv2C,KAAKw2C,gBAAkB,KACvBx2C,KAAKy2C,UAAW,EAChBz2C,KAAKq1C,WAAa,KAClBr1C,KAAK02C,WAAaA,KAClB12C,KAAKs1C,YAAc,KACnBt1C,KAAK0Z,MAAQ87B,KACbx1C,KAAK22C,gBAAkB,GACvB32C,KAAK42C,kBAAoB,WACvB,IAAMl9B,EAAQ87B,KACdlzB,EAAK5I,MAAQA,EACb4I,EAAK2wB,YAAsB,eAAVv5B,EACnB,EACA83B,GAAatnC,iBAAiB,SAAUlK,KAAK42C,kBAC/C,CAIC,IAAAC,EAsaAC,EAxMDC,EA5MC,OAtBAx3B,EAAAk2B,EAAA,EAAA7zC,IAAA,sBAAAG,MAwBD,WACMgwC,KACFC,GAAwBD,GAE5B,GAAC,CAAAnwC,IAAA,sBAAAG,MAED,WACMiwC,KACED,IAAmBA,KAAoBC,IACzCxF,IAAImH,gBAAgB5B,IAEtBA,GAAkBC,GAClBA,GAAwB,KAE5B,GAAC,CAAApwC,IAAA,qBAAAG,MAED,WACMiwC,KACED,IAAmBA,KAAoBC,IACzCxF,IAAImH,gBAAgB3B,IAEtBA,GAAwB,KAE5B,GAAC,CAAApwC,IAAA,cAAAG,MAED,SAAYoB,GACG,eAATA,EACE4uC,IACFgB,GAAa3F,aACX2E,GACA,gCAIJgB,GAAa1E,WAAW,+BAE5B,GAAC,CAAAzsC,IAAA,YAAAG,MAED,SAAUi1C,GACRh3C,KAAK22C,gBAAgB9wC,KAAKmxC,EAC5B,GAAC,CAAAp1C,IAAA,aAAAG,MAED,SAAWi1C,GACTh3C,KAAK22C,gBAAkB32C,KAAK22C,gBAAgB9qC,QAAO,SAAA/D,GAAE,OAAIA,IAAOkvC,CAAQ,GAC1E,GAAC,CAAAp1C,IAAA,cAAAG,MAED,SAAYmwC,GACVlyC,KAAK22C,gBAAgBhoC,SAAQ,SAAAqoC,GAAQ,OAAIA,EAAS9E,EAAQ,GAC5D,GAAC,CAAAtwC,IAAA,iBAAAG,MAED,SAAek1C,GAAiB,IAAA9zB,EAAA,KAC9Bf,EAAO9H,KAAK,mCAAoCta,KAAKgF,MACrDitC,KACA,IAAMiF,EAAcD,EAAgB5nB,iBACpC,GAA2B,IAAvB6nB,EAAY50C,OAMd,OALA8f,EAAOlC,KACL,mCACAlgB,KAAKgF,KACL,iBAEKiyC,EAET,IAAO5L,EAAPljB,EAAqB+uB,EAAW,GAAf,GACXC,EAAgB9L,EAAW7U,cACjC,GAC4B,SAA1B6U,EAAW9N,aACV4Z,EAActnB,QACdsnB,EAAcpnB,OAUf,OARA3N,EAAOlC,KACL,mCACAlgB,KAAKgF,KACL,kCACAqmC,EAAW9N,WACX4Z,EAActnB,MACdsnB,EAAcpnB,QAETknB,EAELj3C,KAAK01C,iBACPtzB,EAAOlC,KACL,mCACAlgB,KAAKgF,KACL,2BACAhF,KAAK01C,eAAe7nC,GACpBopC,EAAgBppC,IAEd7N,KAAK01C,eAAe7nC,KAAOopC,EAAgBppC,IAC7C7N,KAAKo3C,qBAEPp3C,KAAKq3C,aAEPr3C,KAAK01C,eAAiBuB,EACtBj3C,KAAKwnC,OAASxjC,SAASq/B,cAAc,UACrCrjC,KAAKwnC,OAAO35B,GAAK,oBACjB7N,KAAK6yC,IAAM7yC,KAAKwnC,OAAOtB,WAAW,KAAM,CAAEoJ,gBAAgB,IAC1DtvC,KAAK6yC,IAAIyE,uBAAwB,EACjCt3C,KAAKsqB,KAAKuF,MAAQsnB,EAActnB,MAChC7vB,KAAKsqB,KAAKyF,OAASonB,EAAcpnB,OACjC/vB,KAAKwnC,OAAO3X,MAAQsnB,EAActnB,MAClC7vB,KAAKwnC,OAAOzX,OAASonB,EAAcpnB,OACnC,IACOwnB,EAA4CpvB,EAD9BnoB,KAAKwnC,OAAOC,cA7XlB,IA8XoBpY,iBAAgB,GAAjC,GACbkoB,EAAY/P,SACf+P,EAAYp0C,KAAO,eACnBo0C,EAAY/P,OAASxnC,KAAKwnC,QAE5B,IAAMkD,EAAW,CAAC,EAalB,MAZuC,mBAA5B6M,EAAY/gB,aACrB51B,OAAOmiB,OAAO2nB,EAAU6M,EAAY/gB,eAEtC51B,OAAOmiB,OAAO2nB,EAAUyM,GACxBI,EAAY/gB,YAAc,kBAAMkU,CAAQ,EACxC6M,EAAYC,SAAWnM,EAAWtmC,MAClCwyC,EAAYE,YAAcN,EAAcrpB,SACxC9tB,KAAK21C,UAAY,IAAInlB,YAAY,CAAC+mB,IAClCN,EACG7nB,iBACAzgB,SAAQ,SAAA8F,GAAK,OAAI0O,EAAKwyB,UAAU3jB,SAASvd,EAAM,IAClDzU,KAAK03C,QACE13C,KAAK21C,SACd,GAAC,CAAA/zC,IAAA,QAAAG,MAED,WAAQ,IAAA+hB,EAAA,KACN1B,EAAO9H,KAAK,gCAAiCta,KAAKgF,MAClD,IAAIwiC,EAAS,KACTra,EAAQ,KACZwqB,EAA0B33C,KAAKsqB,KAAvBuF,EAAK8nB,EAAL9nB,MAAOE,EAAM4nB,EAAN5nB,OACf,GAAKF,GAAUE,EAAf,CASA,GAAIkhB,GACF,IACE,IAAOx8B,EAA6C0T,EAApCnoB,KAAK01C,eAAermB,iBAAgB,GAAxC,GAENuoB,EAAY,IAAI1G,0BAA0Bz8B,GAChDzU,KAAK41C,OAASgC,EAAUC,SAASC,WAEnC,CAAE,MAAOvvC,GAAQ,CAEdvI,KAAK41C,UACRzoB,EAAQnpB,SAASq/B,cAAc,UACzB0U,aAAc,EACpB5qB,EAAM6qB,OAAQ,EACd7qB,EAAM0C,MAAQA,EACd1C,EAAM4C,OAASA,EACf5C,EAAM8qB,UAAYj4C,KAAK01C,eACvB11C,KAAKmtB,MAAQA,GAEfntB,KAAK+1C,iBAAmB,IAAInQ,UAC1B6L,GACAA,IAEFjK,EAASoL,GACPnB,GACAA,GACA,CAAEyG,oBAAoB,IAExBl4C,KAAK61C,uBAAyBrO,EAAOA,OACrCxnC,KAAK81C,oBAAsBtO,EAAOqL,IAClC7yC,KAAK81C,oBAAoBwB,uBAAwB,EAC7CnqB,IAAU4jB,KACZvJ,EAASoL,GAAsB/iB,EAAOE,GACtC/vB,KAAKg2C,YAAcxO,EAAOA,OAC1BxnC,KAAKi2C,SAAWzO,EAAOqL,KAEzB7yC,KAAK6rC,OAAQ,EACb7rC,KAAKm2C,QAAS,EACdn2C,KAAKy2C,UAAW,EAChBz2C,KAAK02C,WAAWt7B,QAChBpb,KAAKm4C,iBACDn4C,KAAK41C,QACPxzB,EAAO9H,KACL,qDACAta,KAAKgF,MAEPhF,KAAK2rC,IAAI9F,0BAET1Y,EAAMirB,aAAe,WACnBh2B,EAAO9H,KACL,kDACAwJ,EAAK9e,MAEP8e,EAAK6nB,IAAI9F,uBACX,EACA7lC,KAAKk2C,YAAc/oB,EAAMkrB,OACzBr4C,KAAKk2C,YAAW,OAAO,SAAA3tC,GACrB6Z,EAAO7Z,MACL,4CACAub,EAAK9e,KACLuD,EAEJ,IA9DF,MAPE6Z,EAAOlC,KACL,kDACAlgB,KAAKgF,KACL6qB,EACAE,EAmEN,GAEA,CAAAnuB,IAAA,YAAAG,OAAAg1C,EAAA3P,GAAA3wB,KAAAA,MACA,SAAA83B,IAAA,IAAA+J,EAAAzF,EAAAvoB,EAAA6rB,EAAAJ,EAAAD,EAAAD,EAAA0C,EAAAx2C,EAAAytC,EAAAxsC,EAAAw1C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAv2C,EAAAw2C,EAAAC,EAAA,OAAAriC,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,OACkB,GAAZ89B,EAAQ,MACRt4C,KAAK6rC,MAAO,CAAF2C,EAAAh0B,KAAA,eAAAg0B,EAAAr0B,OAAA,iBASU,GALtB04B,EAME7yC,KANF6yC,IACAvoB,EAKEtqB,KALFsqB,KACA6rB,EAIEn2C,KAJFm2C,OACAJ,EAGE/1C,KAHF+1C,iBACAD,EAEE91C,KAFF81C,oBACAD,EACE71C,KADF61C,wBAEE71C,KAAK41C,OAAQ,CAAFpH,EAAAh0B,KAAA,gBAAAg0B,EAAAnyB,KAAA,EAAAmyB,EAAAh0B,KAAA,EAEaxa,KAAK41C,OAAOmD,OAAM,OAAAR,EAAA/J,EAAAx0B,MAAlCjY,EAAKw2C,EAALx2C,SAENA,EAAM8tB,MAAQ9tB,EAAMi3C,aACpBj3C,EAAMguB,OAAShuB,EAAMk3C,cACrBX,EAAQv2C,GAEVysC,EAAAh0B,KAAA,iBAAAg0B,EAAAnyB,KAAA,GAAAmyB,EAAAX,GAAAW,EAAA,oBAGCmD,KAAgBwE,EAAM,CAAA3H,EAAAh0B,KAAA,SACzBq4B,EAAItD,UAAU+I,GAASt4C,KAAKmtB,MAAO,EAAG,GAAGqhB,EAAAh0B,KAAA,oBAEpC89B,EAAO,CAAF9J,EAAAh0B,KAAA,aACJu2B,GAAoB,CAAFvC,EAAAh0B,KAAA,gBAAAg0B,EAAAnyB,KAAA,GAAAmyB,EAAAh0B,KAAA,GAEJw2B,kBAAkBhxC,KAAKmtB,OAAM,QAA3CmrB,EAAK9J,EAAAx0B,KAAAw0B,EAAAh0B,KAAG,GAAH,cAAAg0B,EAAAnyB,KAAG,GAAHmyB,EAAA0K,GAAA1K,EAAA,kBAAAA,EAAAh0B,KAAG,GAAH,cAIPxa,KAAKi2C,SAAS1G,UAAUvvC,KAAKmtB,MAAO,EAAG,GACvCmrB,EAAQt4C,KAAKg2C,YAAY,YAGzBh2C,KAAK6rC,MAAO,CAAF2C,EAAAh0B,KAAA,gBAAAg0B,EAAAr0B,OAAA,kBAGd,GAAIm+B,GAASA,EAAMzoB,MAAQ,GAAKyoB,EAAMvoB,OAAS,EAAG,CAsBhD,IArBA+lB,EAAoBvG,UAClB+I,EACA,EACA,EACAA,EAAMzoB,MACNyoB,EAAMvoB,OACN,EACA,EACA0hB,GACAA,IAEIjC,EAAYsG,EAAoBvP,aACpC,EACA,EACAkL,GACAA,IAEMzuC,EAASwsC,EAATxsC,KACFw1C,EAAO9G,GAAQyH,QACfV,EAAW1C,EAAiB/yC,KAC1B01C,EAAejH,GAEjBkH,EAAY,EAAGC,EAAW,EAAGv2C,EAAQ,EACzCA,EAAQq2C,EACRr2C,IAIAu2C,EAAmB,EAARv2C,EACXm2C,EAFAG,EAAY9G,GADM,EAARxvC,GAGQW,EAAK41C,GAAY,IACnCJ,EAAKG,EAAY,GAAK31C,EAAK41C,EAAW,GAAK,IAC3CJ,EAAKG,EAAY,GAAK31C,EAAK41C,EAAW,GAAK,IAG7C,IADAlH,GAAQ0H,gBAEF/2C,EAAQ,EAAiBy2C,EAAS,EACtCz2C,EAAQq2C,EACRr2C,IAEAy2C,EAASN,EAAK1G,GAAsBzvC,GAGpCo2C,EADmB,EAARp2C,EACS,GAAK,IAAMy2C,EAEjChD,EAAoBpF,aAAaqF,EAAkB,EAAG,GACtDlD,EAAIwG,yBAA2B,OAC/BxG,EAAIhnC,OAAS,YACbgnC,EAAItD,UACFsG,EACA,EACA,EACApE,GACAA,GACA,EACA,EACAnnB,EAAKuF,MACLvF,EAAKyF,QAEP8iB,EAAIwG,yBAA2B,YAC/BxG,EAAIhnC,OAAS,OACbgnC,EAAItD,UAAU+I,EAAO,EAAG,GACpBt4C,KAAKu2C,gBACPv2C,KAAKs5C,eAAehB,EAExB,CAAC,SAEEnC,GAAUn2C,KAAKm2C,SAClBtD,EAAIhnC,OAAS,OACbgnC,EAAIwG,yBAA2B,eAE7Bf,GAAgC,mBAAhBA,EAAMnN,OACxBmN,EAAMnN,QAEHnrC,KAAK6rC,OACR7rC,KAAK2rC,IAAI9F,wBACV,yBAAA2I,EAAAlyB,OAAA,GAAAiyB,EAAA,2BACF,kBAAAwI,EAAA/2B,MAAA,KAAAC,UAAA,KAAAre,IAAA,UAAAG,MAED,WACE,IAAQ8wC,EAAQ7yC,KAAR6yC,IACR7yC,KAAKm2C,QAAS,EACVtD,IACFA,EAAIhnC,OAAS,OACbgnC,EAAIwG,yBAA2B,cAEnC,GAAC,CAAAz3C,IAAA,SAAAG,MAED,WACE/B,KAAKm2C,QAAS,CAChB,GAAC,CAAAv0C,IAAA,iBAAAG,MAED,SAAeu2C,GACb,IACE/B,EAMEv2C,KANFu2C,eACA1D,EAKE7yC,KALF6yC,IACAwC,EAIEr1C,KAJFq1C,WACAC,EAGEt1C,KAHFs1C,YACAkB,EAEEx2C,KAFFw2C,gBACAlsB,EACEtqB,KADFsqB,KAEF,GAAKisB,GAAmB1D,EAIxB,GADAA,EAAIwG,yBAA2B,mBACR,SAAnB9C,EACF,GAAI3O,GAAgB9B,oBAAqB,CACvC,IAAMxjC,EAAmC,EAA1B4c,OAAOs3B,GAChBtB,EAAsB,EAAT5yC,EACdtC,KAAKy2C,WACRnB,EAAYzC,IAAItD,UACd+I,EACA,EACA,EACAhuB,EAAKuF,MACLvF,EAAKyF,OACL,EACA,EACAzF,EAAKuF,MAAQqlB,EACb5qB,EAAKyF,OAASmlB,GAEhBl1C,KAAKy2C,UAAW,GAElBnB,EAAYzC,IAAItD,UACd+I,EACA,EACA,EACAhuB,EAAKuF,MACLvF,EAAKyF,OACLztB,EACAA,EACAgoB,EAAKuF,MACLvF,EAAKyF,QAEPslB,EAAWxC,IAAItD,UAAU+F,EAAY9N,OAAQ,EAAG,GAChDqL,EAAItD,UACF8F,EAAW7N,OACXllC,EACAA,EACAgoB,EAAKuF,MACLvF,EAAKyF,OACL,EACA,EACAzF,EAAKuF,MACLvF,EAAKyF,OAET,KAAO,CACL,IAAMwpB,EAAUv5C,KAAK02C,WAAWvH,IAAImJ,EAAO9B,GAC3C3D,EAAItD,UAAUgK,EAAS,EAAG,EAC5B,KAC4B,UAAnBhD,GACT1D,EAAIzM,UAAYoQ,EAChB3D,EAAIxM,SAAS,EAAG,EAAG/b,EAAKuF,MAAOvF,EAAKyF,SAC3BulB,EACTzC,EAAItD,UAAU+F,EAAa,EAAG,GAE9BzC,EAAItD,UAAU+I,EAAO,EAAG,EAE5B,GAAC,CAAA12C,IAAA,iBAAAG,OAAA+0C,EAAA1P,GAAA3wB,KAAAA,MAED,SAAA+iC,IAAA,IAAAjD,EAAAC,EAAAiD,EAAA5pB,EAAAE,EAAAnW,EAAAk6B,EAAA4F,EAAA,OAAAjjC,KAAAA,MAAA,SAAAkjC,GAAA,cAAAA,EAAAt9B,KAAAs9B,EAAAn/B,MAAA,OAGkB,GAFR+7B,EAAoCv2C,KAApCu2C,eAAgBC,EAAoBx2C,KAApBw2C,gBAAeiD,EACbz5C,KAAKsqB,KAAvBuF,EAAK4pB,EAAL5pB,MAAOE,EAAM0pB,EAAN1pB,OACXnW,GAAO,EACNiW,GAAUE,EAAM,CAAA4pB,EAAAn/B,KAAA,eAAAm/B,EAAAx/B,OAAA,oBAGE,WAAnBo8B,EAA2B,CAAAoD,EAAAn/B,KAAA,SAC7Bxa,KAAKs1C,YAAcf,GAAqB1kB,EAAOE,EAAQ,CACrD2kB,OAAQ,EACRC,OAAQ,EACRC,KAAM/kB,EACNglB,KAAM,GACNE,OAAQ,UACRC,OAAQ,YAEVp7B,GAAO,EAAK+/B,EAAAn/B,KAAA,oBACgB,aAAnB+7B,EAA6B,CAAAoD,EAAAn/B,KAAA,SACT,OAA7Bxa,KAAK45C,wBAAwBD,EAAAn/B,KAAA,GACTw4B,GAAUwD,EAAiBx2C,MAAK,SAA9C8zC,EAAK6F,EAAA3/B,QAETha,KAAKu2C,eAAiB,QACtBv2C,KAAKw2C,gBAAkBA,EACvBx2C,KAAKs1C,YAAchB,GAAqBR,EAAOjkB,EAAOE,GACtDnW,GAAO,GACR+/B,EAAAn/B,KAAA,oBAC2B,UAAnB+7B,EAA0B,CAAAoD,EAAAn/B,KAAA,SACN,OAA7Bxa,KAAK45C,wBAAwBD,EAAAn/B,KAAA,GACTw4B,GAAUwD,EAAiBx2C,MAAK,SAA9C8zC,EAAK6F,EAAA3/B,QAETha,KAAKu2C,eAAiB,QACtBv2C,KAAKw2C,gBAAkBA,EACvBx2C,KAAKs1C,YAAczB,GAAkBC,EAAOjkB,EAAOE,GACnDnW,GAAO,GACR+/B,EAAAn/B,KAAA,iBAC2B,SAAnB+7B,GACTv2C,KAAKy2C,UAAW,EAChBxB,GAAiBj1C,KAAM6vB,EAAOE,EAAQ7Q,OAAOs3B,IAC7Cx2C,KAAK02C,WAAWt7B,QAChBxB,GAAO,IAEP5Z,KAAKs1C,YAAc,KACnB17B,GAAO,GACR,QACGA,IACF5Z,KAAKs2C,cAAgB,CACnBnzC,KAAMozC,EACNx0C,MAAOy0C,IAEV,yBAAAmD,EAAAr9B,OAAA,GAAAk9B,EAAA,UACF,kBAAA1C,EAAA92B,MAAA,KAAAC,UAAA,KAAAre,IAAA,wBAAAG,MAED,WACE,IAAQu0C,EAAkBt2C,KAAlBs2C,cACR,GAAIA,EACFt2C,KAAKu2C,eAAiBD,EAAcnzC,KACpCnD,KAAKw2C,gBAAkBF,EAAcv0C,UAChC,CACL,IAAK/B,KAAKs1C,YAAa,CACrB,IAAAuE,EAA0B75C,KAAKsqB,KAAvBuF,EAAKgqB,EAALhqB,MAAOE,EAAM8pB,EAAN9pB,OACf/vB,KAAKy2C,UAAW,EAChBxB,GAAiBj1C,KAAM6vB,EAAOE,EAAQ,EACxC,CACA/vB,KAAKu2C,eAAiB,OACtBv2C,KAAKw2C,gBAAkB,GACzB,CACF,GAAC,CAAA50C,IAAA,mBAAAG,MAED,SAAiBoB,GAEf,GADAif,EAAO9H,KAAK,2CAA4Cta,KAAKgF,KAAM7B,GAC/C,iBAATA,EAAX,CAGA,IAAMmM,EAAQnM,EAAK4C,QAAQ,MACZ,IAAXuJ,GACFtP,KAAKu2C,eAA0B,QAATpzC,EAAiB,KAAOA,EAC9CnD,KAAKw2C,gBAAkB,OAEvBx2C,KAAKu2C,eAAiBpzC,EAAK2H,UAAU,EAAGwE,GACxCtP,KAAKw2C,gBAAkBrzC,EAAK2H,UAAUwE,EAAQ,IAE3CtP,KAAK6rC,OACR7rC,KAAKm4C,gBAVP,CAYF,GAAC,CAAAv2C,IAAA,OAAAG,MAED,WAME,GALAqgB,EAAO9H,KAAK,+BAAgCta,KAAKgF,MACjDhF,KAAK6rC,OAAQ,EACT7rC,KAAK2rC,KACP3rC,KAAK2rC,IAAIS,uBAEPpsC,KAAKmtB,MAAO,CACd,IAAQA,EAAuBntB,KAAvBmtB,MAAO+oB,EAAgBl2C,KAAhBk2C,YACXA,GAAe/oB,GACjB+oB,EAAY3sC,MAAK,kBAAM4jB,EAAM2sB,OAAO,IAEtC95C,KAAKmtB,MAAMirB,aAAe,KAC1Bp4C,KAAKmtB,MAAQ,KACbntB,KAAKk2C,YAAc,IACrB,CACIl2C,KAAK41C,SACP51C,KAAK41C,OAAS,MAEhB51C,KAAK61C,uBAAyB,KAC9B71C,KAAK81C,oBAAsB,KAC3B91C,KAAK+1C,iBAAmB,KACxB/1C,KAAKg2C,YAAc,KACnBh2C,KAAKi2C,SAAW,KAChBj2C,KAAKs2C,cAAgB,KACrBt2C,KAAKs1C,YAAc,KACnBt1C,KAAKq1C,WAAa,KAClBr1C,KAAK02C,WAAWt7B,OAClB,GAAC,CAAAxZ,IAAA,qBAAAG,MAED,WACEqgB,EAAO9H,KACL,6CACAta,KAAKgF,KACLhF,KAAK01C,gBAEP11C,KAAKsc,OACLwsB,GAAW9oC,KAAK01C,eAClB,GAAC,CAAA9zC,IAAA,YAAAG,MAED,WAAY,IAAAg4C,EAAA,KACV33B,EAAO9H,KAAK,oCAAqCta,KAAKgF,MACtDhF,KAAKsc,OACDtc,KAAK21C,WACPjM,GAAa1pC,KAAK21C,WAAWhnC,SAAQ,SAAA8F,GACnCo0B,GAAUp0B,GACV2N,EAAO9H,KACL,+CACAy/B,EAAK/0C,KACLyP,EAEJ,IAEFzU,KAAK01C,eAAiB,KACtB11C,KAAK21C,UAAY,KACjB31C,KAAKwnC,OAAS,KACdxnC,KAAK6yC,IAAM,KACX7yC,KAAKmtB,MAAQ,IACf,GAAC,CAAAvrB,IAAA,UAAAG,MAED,WACEqgB,EAAO9H,KAAK,kCAAmCta,KAAKgF,MACpDwsC,GAAarnC,oBAAoB,SAAUnK,KAAK42C,mBAChD52C,KAAK22C,gBAAgBr0C,OAAS,EAC9BtC,KAAK02C,WAAa,IACpB,IAAC,EAAA90C,IAAA,gBAAAG,MAhkBD,SAAqBoB,GACnB,OAAOoyC,GAAmB/zC,KAAK2B,EACjC,GAAC,CAAAvB,IAAA,qBAAAG,OAAA80C,EAAAzP,GAAA3wB,KAAAA,MAED,SAAAujC,EAAgC72C,GAAI,IAAA23B,EAAA,OAAArkB,KAAAA,MAAA,SAAAwjC,GAAA,cAAAA,EAAA59B,KAAA49B,EAAAz/B,MAAA,WAC9B,wBAAwBhZ,KAAK2B,GAAO,CAAF82C,EAAAz/B,KAAA,QACP,OAAvBsgB,EAAM33B,EAAK2H,UAAU,GAAEmvC,EAAAz/B,KAAA,EACvB84B,GAAexY,GAAI,wBAAAmf,EAAA39B,OAAA,GAAA09B,EAAA,KAE5B,SAAAxxB,GAAA,OAAAquB,EAAA72B,MAAA,KAAAC,UAAA,KAAAre,IAAA,iBAAAG,MAED,SAAsByxC,GACpBD,GAAcC,EAChB,GAAC,CAAA5xC,IAAA,yBAAAG,MAED,WACE,OAAIgwC,OADuC9xB,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,KAAAA,UAAA,IAElC,aAEF,QACT,KAACw1B,CAAA,CAzDyB,GAwmB5B,YC/2BA,IAAMyE,GAAiB,SAACC,EAAOC,GAC7B,GAAID,EAAM73C,SAAW83C,EAAM93C,OACzB,OAAO,EAET,IADC,IAkBA+3C,EAlBAC,EAAA,SAAAC,EAAAC,GAeC,GATAD,EAAUJ,EAAM93C,KAChBm4C,EAAQJ,EAAMhoC,MAAK,SAAAqoC,GACjB,OACEF,EAAQzsB,WAAa2sB,EAAQ3sB,UAC7BysB,EAAQG,UAAYD,EAAQC,SAC5BH,EAAQx1C,QAAU01C,EAAQ11C,OAC1Bw1C,EAAQhoC,OAASkoC,EAAQloC,IAE7B,KACY,OAAAooC,GACH,GACRC,EAAAL,EAAAM,EAAAL,CACH,EAhBMI,EAAU,KAAMC,GAAQ,EAASv4C,EAAW63C,EAAX73C,OAAkBD,EAAQ,EAC/DA,EAAQC,EACRD,IAAO,GAAAg4C,EAAAC,EAAAM,EAAAC,GAAA,OAAAR,EAAAM,EAeT,OAAO,CACT,EAugBA,SAlgBmB,WAEjB,SAAAG,EAAYlyC,GAAS,IAAA0Z,EAAA,KAAA7D,EAAA,KAAAq8B,GACnB96C,KAAK+6C,OAAS,UACd/6C,KAAK4I,QAAUA,GAAW,CAAEokB,OAAO,EAAMG,OAAO,EAAM6tB,KAAK,GAC3Dh7C,KAAKwU,OAAS,KACdxU,KAAKi7C,QAAU,GACfj7C,KAAK2mB,UAAY,GACjB3mB,KAAKk7C,SAAW,GAChBl7C,KAAKm7C,YAAc,GACnBn7C,KAAK+sB,YAAc,CAAC,EACpB/sB,KAAKo7C,uBAAwB,EAC7Bp7C,KAAKq7C,kBAAoB,IAAI5F,GAAuB,iBACpDz1C,KAAKs7C,sBAAwB,MAE7BR,EAAcS,YAAYhyC,MAAK,SAAAwxC,GAAM,OAAKz4B,EAAKy4B,OAASA,CAAM,IAE9D/6C,KAAKw7C,UAAYx7C,KAAKw7C,UAAUtyC,KAAKlJ,MACrCA,KAAKy7C,YAAcz7C,KAAKy7C,YAAYvyC,KAAKlJ,MACzCA,KAAK07C,aAAe17C,KAAK07C,aAAaxyC,KAAKlJ,MAC3CA,KAAK27C,iBAAmB37C,KAAK27C,iBAAiBzyC,KAAKlJ,MACnDA,KAAK47C,iBAAmB57C,KAAK47C,iBAAiB1yC,KAAKlJ,MACnDA,KAAK67C,0BAA4B77C,KAAK67C,0BAA0B3yC,KAAKlJ,KACvE,CACA,IAAA87C,EAqNC,OArNDv8B,EAAAu7B,EAAA,EAAAl5C,IAAA,2BAAAG,OAAA+5C,EAAA1U,GAAA3wB,KAAAA,MA6LA,SAAA62B,EAA+BnqC,GAAI,IAAA44C,EAAAC,EAAA,OAAAvlC,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,UAC5Bi7B,GAAuBwG,cAAc94C,GAAO,CAAFqqC,EAAAhzB,KAAA,QAI3C,OAHF4H,EAAOlC,KACL,0DACA/c,GACAqqC,EAAArzB,OAAA,wBAAAqzB,EAAAhzB,KAAA,EAGEi7B,GAAuByG,mBAAmB/4C,GAAK,OAC/C44C,EAAwC,QAA/B/7C,KAAKs7C,sBACdU,EAAqB,QAAT74C,EAClBnD,KAAKs7C,sBAAwBn4C,EAC7BnD,KAAKq7C,kBAAkBc,iBAAiBh5C,GACpCnD,KAAKwU,SAAYunC,IAAWC,IAAgBD,GAAUC,IACxDh8C,KAAKo8C,SACN,yBAAA5O,EAAAlxB,OAAA,GAAAgxB,EAAA,UACF,SAAA9kB,GAAA,OAAAszB,EAAA97B,MAAA,KAAAC,UAAA,KAAAre,IAAA,qCAAAG,MAUD,SAAmCyxC,GAAY,IAAArwB,EAAA,KAC7CsyB,GAAuB4G,gBAAe,SAAA9zC,GAC/BA,GACH4a,EAAKm5B,yBAAyB,cAEhC9I,EAAWjrC,EACb,GACF,GAEA,CAAA3G,IAAA,QAAAG,MAIA,WAAQ,IAAA+hB,EAAA,KAGN,OAFA9jB,KAAKu8C,qBAEEzB,EAAc0B,eAClBjzC,MAAK,SAAAmkB,GAAO,OAAI5J,EAAK24B,WAAW/uB,EAAQ,IACxCnkB,MAAK,kBAAMuxC,EAAc4B,eAAe54B,EAAKlb,QAAQ,IACrDW,MAAK,SAAAwjB,GAEJ,OADAjJ,EAAKiJ,YAAcA,EACZjqB,UAAUkpB,aAAa8C,aAAa,CACzC3B,OAAOrJ,EAAKlb,QAAQoyC,KAAcl3B,EAAKiJ,YAAYI,MACnDH,MAAOlJ,EAAKiJ,YAAYC,QAAS,GAErC,IACCzjB,KAAKvJ,KAAK47C,kBACVryC,KAAKvJ,KAAK67C,2BACVtyC,KAAKvJ,KAAKw7C,WAAU,MACdx7C,KAAKy7C,YAChB,GAAC,CAAA75C,IAAA,aAAAG,MAED,WACO/B,KAAKwU,SAGNxU,KAAKq7C,kBAAkB3F,gBACzB11C,KAAKq7C,kBAAkBjE,qBACvBp3C,KAAKq7C,kBAAkBhE,aAEvBvO,GAAW9oC,KAAKwU,QAElBxU,KAAKwU,OAAS,KAChB,GAEA,CAAA5S,IAAA,OAAAG,MAIA,WACE/B,KAAK8oC,YACP,GAAC,CAAAlnC,IAAA,YAAAG,MAED,WAAY,IAAAg4C,EAAA,KACVj3C,UAAUkpB,aAAa2wB,eAAiB,KACxC38C,KAAKo7C,uBAAwB,EAC7Br7C,OAAO8kB,YAAW,WAChBk1B,EAAKz9B,OACLy9B,EAAKsB,kBAAkBuB,SACzB,GAAG,GACL,GAAC,CAAAh7C,IAAA,aAAAG,MAED,SAAW2rB,GACT,IAAMmvB,EAAgB3C,GAAel6C,KAAKi7C,QAASvtB,EAAQutB,SACrD6B,EAAgB5C,GAAel6C,KAAKm7C,YAAaztB,EAAQytB,aACzD4B,EAAoB7C,GAAel6C,KAAKk7C,SAAUxtB,EAAQwtB,UAChEl7C,KAAKi7C,QAAUvtB,EAAQutB,QACvBj7C,KAAKm7C,YAAcztB,EAAQytB,YAC3Bn7C,KAAKk7C,SAAWxtB,EAAQwtB,SACxBl7C,KAAK4I,QAAQokB,MACXhtB,KAAKm7C,YAAY74C,OAAS,GAAItC,KAAK4I,QAAQokB,MAC7ChtB,KAAK4I,QAAQukB,MAAQntB,KAAKi7C,QAAQ34C,OAAS,GAAItC,KAAK4I,QAAQukB,OACxD0vB,GAAiBC,GAAiBC,IACpC/8C,KAAKg9C,KAAKtvB,EAEd,GAAC,CAAA9rB,IAAA,qBAAAG,MAED,WAAqB,IAAAk7C,EAAA,KACnBn6C,UAAUkpB,aAAa2wB,eAAiB,WACtC7B,EAAc0B,eACXjzC,MAAK,SAAAmkB,GAAO,OAAIuvB,EAAKR,WAAW/uB,EAAQ,IAAC,MACnCuvB,EAAKxB,YAChB,CACF,GAEA,CAAA75C,IAAA,WAAAG,MAGA,SAASJ,GACP3B,KAAK2mB,UAAU9gB,KAAKlE,EACtB,GAEA,CAAAC,IAAA,iBAAAG,MAGA,SAAeJ,GACb3B,KAAK2mB,UAAY3mB,KAAK2mB,UAAU9a,QAAO,SAAAmrC,GAAQ,OAAIA,IAAar1C,CAAQ,GAC1E,GAEA,CAAAC,IAAA,SAAAG,MAIA,SAAOgrB,GAML,OALA/sB,KAAK+sB,YAAcA,GAAe/sB,KAAK+sB,YACvC/sB,KAAKsc,OAELtc,KAAKu8C,qBAEEz5C,UAAUkpB,aACd8C,aAAa9uB,KAAK+sB,aAClBxjB,KAAKvJ,KAAK67C,2BACVtyC,KAAKvJ,KAAKw7C,WAAU,MACdx7C,KAAKy7C,YAChB,GAEA,CAAA75C,IAAA,oBAAAG,MAIA,SAAkB6G,GAA2B,IAAAs0C,EAAA,KAAlBjZ,EAAQhkB,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,IAAAA,UAAA,GAOjC,OANAjgB,KAAK4I,QAAUA,GAAW5I,KAAK4I,QAC/B5I,KAAKsc,OAELtc,KAAKu8C,qBAGEzB,EADe7W,EAAW,uBAAyB,kBACtBjkC,KAAK4I,SACtCW,MAAK,SAAAwjB,GAEJ,OADAmwB,EAAKnwB,YAAcA,EACZjqB,UAAUkpB,aAAa8C,aAAa,CACzC3B,OAAO+vB,EAAKt0C,QAAQoyC,KAAckC,EAAKnwB,YAAYI,MACnDH,MAAOkwB,EAAKnwB,YAAYC,QAAS,GAErC,IACCzjB,KAAKvJ,KAAK47C,kBACVryC,KAAKvJ,KAAK67C,2BACVtyC,KAAKvJ,KAAKw7C,WAAU,MACdx7C,KAAKy7C,YAChB,GAAC,CAAA75C,IAAA,mBAAAG,MAED,SAAiByS,GAIf,OAHuC,IAAnCA,EAAO4a,iBAAiB9sB,SAC1BkS,EAAO4a,iBAAiB,GAAGmZ,QAAUvoC,KAAK4I,QAAQokB,OAE7CxY,CACT,GAAC,CAAA5S,IAAA,4BAAAG,MAED,SAA0ByS,GACxB,MACiC,QAA/BxU,KAAKs7C,uBACL9mC,GACmC,IAAnCA,EAAO6a,iBAAiB/sB,OAEjBtC,KAAKq7C,kBAAkB8B,eAAe3oC,GAExCA,CACT,GAEA,CAAA5S,IAAA,mBAAAG,MACA,WACE,IAAQgrB,EAAgB/sB,KAAhB+sB,YACAI,EAAiBJ,EAAjBI,MAAOH,EAAUD,EAAVC,MACf5K,EAAO9B,MAAM,kCAAmCyM,GAChD+lB,GAAajL,MAAM,mBAAoB9a,GACvC+lB,GAAajL,MAAM,SAAU7nC,KAAK+6C,QAClCjI,GAAajL,MAAM,wBAAyB7nC,KAAKs7C,uBAC7CnuB,GAASA,EAAMW,UAAYX,EAAMW,SAASvB,OAC5CumB,GAAajL,MAAM,UAAW1a,EAAMW,SAASvB,OAE3CS,GAASA,EAAMc,UAAYd,EAAMc,SAASvB,OAC5CumB,GAAajL,MAAM,UAAW7a,EAAMc,SAASvB,OAE/CvsB,KAAKq7C,kBAAkB+B,YAAYp9C,KAAKs7C,sBAC1C,GAOA,CAAA15C,IAAA,YAAAG,MACA,SAAUyS,GAAQ,IAAA6oC,EAAA,KACVC,EAA2B,OAAhBt9C,KAAKwU,OAEtB,GADAxU,KAAKwU,OAASA,EACVxU,KAAKo7C,sBAEP,OADAp7C,KAAKsc,OACEzT,QAAQC,UAEjB,IAAMy0C,EAAmB,WACvBF,EAAKL,KAAK,CACRxoC,OAAQ6oC,EAAK7oC,OACbuY,YAAaswB,EAAKtwB,YAClBnkB,QAASy0C,EAAKz0C,UAEhBy0C,EAAK3B,cACP,EACA,OAAI4B,EACKxC,EAAc0B,eAAejzC,MAAK,SAAAmkB,GACvC2vB,EAAKZ,WAAW/uB,GAChB6vB,GACF,KAEFA,IACO10C,QAAQC,UACjB,GAAC,CAAAlH,IAAA,eAAAG,MAED,WAEI/B,KAAK+sB,YAAYI,OACjBntB,KAAKwU,QACmC,IAAxCxU,KAAKwU,OAAO6a,iBAAiB/sB,SAC5BtC,KAAK4I,QAAQoyC,KAEdh7C,KAAKy7C,YAAY,CAAEz2C,KAAM,sBAIzBhF,KAAK+sB,YAAYC,OACjBhtB,KAAKwU,QACmC,IAAxCxU,KAAKwU,OAAO4a,iBAAiB9sB,QAE7BtC,KAAKy7C,YAAY,CAAEz2C,KAAM,yBAE7B,GAEA,CAAApD,IAAA,gBAAAG,MAGA,SAAc+rB,GACZ,IAAI0vB,EAAmB,CAAC,EAKxB,OAJA58C,OAAOmiB,OAAOy6B,EAAkBx9C,KAAK+sB,YAAYI,MAAO,CACtDW,SAAU,CAAEvB,MAAOuB,KAErB9tB,KAAK+sB,YAAYI,MAAQqwB,EAClBx9C,KAAKo8C,QACd,GAEA,CAAAx6C,IAAA,gBAAAG,MAGA,SAAc+rB,GAAwB,IAAdllB,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC7Bw9B,EAAmB,CAAC,EAKxB,OAJA78C,OAAOmiB,OAAO06B,EAAkBz9C,KAAK+sB,YAAYC,MAAO,CACtDc,SAAU,CAAEvB,MAAOuB,KAErB9tB,KAAK+sB,YAAYC,MAAQywB,GACK,IAA1B70C,EAAQ80C,cACH70C,QAAQC,UAEV9I,KAAKo8C,QACd,GAEA,CAAAx6C,IAAA,iBAAAG,MAGA,SAAeg5C,GACb/6C,KAAK+6C,OAASA,GAAU,UACxBjI,GAAajL,MAAM,SAAU7nC,KAAK+6C,QAClC/6C,KAAKg9C,KAAK,CAAEjC,OAAQ/6C,KAAK+6C,QAC3B,GAAC,CAAAn5C,IAAA,cAAAG,MAED,SAAYwG,GACV6Z,EAAO7Z,MAAM,kBAAmBA,GAChCvI,KAAKg9C,KAAK,CAAEz0C,MAAOA,EAAOwkB,YAAa/sB,KAAK+sB,aAC9C,GAEA,CAAAnrB,IAAA,OAAAG,MAGA,SAAK2X,GACH1Z,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GAAQ,OAAIA,EAASt9B,EAAM,GACpD,IAAC,EAAA9X,IAAA,aAAAG,MAreD,WACE,MAAM,iBAAkBe,UAGjBA,UAAUkpB,aAAayB,mBAAmBlkB,MAAK,SAAAmkB,GAEpD,OACqB,IAAnBA,EAAQprB,QACRorB,EAAQ4U,OACN,SAAAqb,GAAM,MAAoB,eAAhBA,EAAOprC,MAA6C,KAApBorC,EAAO7vB,QAAe,IAG3D,CACL,CAAEA,SAAU,GAAI4sB,QAAS,GAAInoC,KAAM,aAAcxN,MAAO,IACxD,CAAE+oB,SAAU,GAAI4sB,QAAS,GAAInoC,KAAM,aAAcxN,MAAO,KAGrD2oB,CACT,IAhBS7kB,QAAQC,QAAQ,GAiB3B,GAEA,CAAAlH,IAAA,iBAAAG,MAKA,SAAsB67C,GACpB,IAAMh1C,EAAUg1C,GAAgB,CAAE5wB,OAAO,EAAMG,OAAO,GACtD,OAAO2tB,EAAc+C,aAClBt0C,MAAK,SAAAmkB,GACJ,OAAOotB,EAAcgD,+BAA+BpwB,EAAS9kB,EAC/D,IAAE,OACK,SAAAL,GACL6Z,EAAO7Z,MAAM,iCAAkCA,EACjD,GACJ,GAEA,CAAA3G,IAAA,iCAAAG,MACA,SAAsC2rB,EAAS9kB,GAC7C,IAAMmkB,EAAc+lB,GAAahL,KAAK,mBAAoBl/B,GAEpD60C,EAAmB,CAAEM,aADZnW,GAAgBnB,cAAgB79B,EAAQoyC,IACL,EAAI,GAStD,GAPM,UAAWjuB,IACfA,EAAYI,OAAQ,GAEhB,UAAWJ,IACfA,EAAYC,MAAQywB,GAGlB1wB,EAAYI,MAAMW,SAAU,CAC9B,IAAMkwB,EAAgBjxB,EAAYI,MAAMW,SAASvB,MAC5CmB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAakwB,CAAa,MAC3DjxB,EAAYI,MAAQvkB,EAAQukB,MAEhC,CACA,GAAIJ,EAAYC,MAAMc,SAAU,CAC9B,IAAMmwB,EAAgBlxB,EAAYC,MAAMc,SAASvB,MAC5CmB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAamwB,CAAa,MAC3DlxB,EAAYC,QAAQpkB,EAAQokB,OAAQywB,EAExC,CA+BA,OA7BsB,IAAlB70C,EAAQukB,OAAoBvkB,EAAQoyC,MACtCjuB,EAAYI,OAAQ,IAEA,IAAlBvkB,EAAQukB,QAAwC,IAAtBJ,EAAYI,QACxCJ,EAAYI,OAAQ,KAGD,IAAlBvkB,EAAQokB,QAAwC,IAAtBD,EAAYC,QACjB,IAAtBD,EAAYC,SAEZD,EAAYC,MAAQywB,GAGpB1wB,EAAYC,OACZD,EAAYC,MAAM+wB,eAAiBN,EAAiBM,eAEpDhxB,EAAYC,MAAM+wB,aAAeN,EAAiBM,cAMkB,IAAlErwB,EAAQ7hB,QAAO,SAAA8xC,GAAM,MAAoB,eAAhBA,EAAOprC,IAAqB,IAAEjQ,SACzDyqB,EAAYI,OAAQ,GAGtB2tB,EAAcoD,qBAAqBnxB,EAAaW,GAChDotB,EAAcqD,gBAAgBpxB,GAEvBA,CACT,GACA,CAAAnrB,IAAA,uBAAAG,MAEA,SAA4BgrB,EAAaW,GACvC,IAAM0wB,EAAUtL,GAAahL,KAAK,WAC5BuW,EAAUvL,GAAahL,KAAK,YAEV,IAAtB/a,EAAYI,OACZixB,GACA1wB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAaswB,CAAO,MAElDrxB,EAAYI,MAAQ,CAAEW,SAAU,CAAEvB,MAAO6xB,KAGzCrxB,EAAYC,OACZqxB,GACA3wB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAauwB,CAAO,MAElDtxB,EAAYC,MAAMc,SAAW,CAAEvB,MAAO8xB,GAE1C,GAAC,CAAAz8C,IAAA,kBAAAG,MAED,SAAuBgrB,GACEuxB,EAAfz+B,aAEoB,IAAtBkN,EAAYI,QACdJ,EAAYI,MAAQ,CAAC,GAEnBJ,EAAYI,OACdvsB,OAAOmiB,OAAOgK,EAAYI,MAAO,CAAE0C,MAAO,IAAKE,OAAQ,OAG5B,WAA7BvZ,EAAOuW,EAAYI,SAClB,UAAWJ,EAAYI,OAAS,WAAYJ,EAAYI,SAEzD/G,QAAQM,eAAeqG,EAAYI,MAAO,SAC1C/G,QAAQM,eAAeqG,EAAYI,MAAO,UAE9C,GAEA,CAAAvrB,IAAA,uBAAAG,MAIA,SAA4B6G,GAC1B,IAAImkB,EAAcnsB,OAAOmiB,OAAO,CAAEiK,OAAO,EAAMG,OAAO,GAAQvkB,GAE9D,OADAkyC,EAAcqD,gBAAgBpxB,GACvBlkB,QAAQC,QAAQikB,EACzB,GAEA,CAAAnrB,IAAA,YAAAG,MAGA,WACE,IAAIg5C,EAASjI,GAAahL,KAAK,SAAU,IACzC,OAAOgT,EAAc+C,aAAat0C,MAAK,SAAAmkB,GAIrC,OAHKA,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAaitB,CAAM,MACpDA,EAAS,WAEJA,CACT,GACF,GAEA,CAAAn5C,IAAA,eAAAG,MAGA,WACE,OAAO+4C,EAAc+C,aAAat0C,MAAK,SAAAmkB,GACrC,IAAMwtB,EAAWxtB,EAAQ7hB,QAAO,SAAA8xC,GAAM,MAAoB,gBAAhBA,EAAOprC,IAAsB,IAYvE,OAVE2oC,EAAS54C,OAAS,IACiD,IAAnE44C,EAASqD,WAAU,SAAAC,GAAO,MAAyB,YAArBA,EAAQ1wB,QAAsB,KAE5DotB,EAASp1C,QAAQ,CACfgoB,SAAU,UACVvb,KAAM,cACNmoC,QAAS,UACT31C,MAAO,mBAGJ,CACLk2C,QAASvtB,EAAQ7hB,QAAO,SAAA8xC,GAAM,MAAoB,eAAhBA,EAAOprC,IAAqB,IAC9D4oC,YAAaztB,EAAQ7hB,QAAO,SAAA8xC,GAAM,MAAoB,eAAhBA,EAAOprC,IAAqB,IAClE2oC,SAAUA,EAEd,GACF,GAAC,CAAAt5C,IAAA,oBAAAG,MAED,WACE,OAAO+4C,EAAc+C,aAAat0C,MAAK,SAAAmkB,GACrC,OAAOA,EAAQ7hB,QAAO,SAAA8xC,GAAM,OAAIA,EAAOprC,KAAKsb,SAAS,QAAQ,GAC/D,GACF,GAAC,CAAAjsB,IAAA,iCAAAG,MAoBD,SAAsC08C,GACpC,IAAMt7C,EAAO2vC,GAAahL,KAAK,wBAAyB,OACxD,MAAa,eAAT3kC,EACKsyC,GAAuBiJ,uBAAuBD,GAEhDt7C,CACT,KAAC23C,CAAA,CA7OgB,GC0WnB,SApXwB,WACtB,SAAA6D,IAgBE,IAfA/1C,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CACR+6B,KAAK,EACLhuB,OAAO,EACPG,OAAO,EACP2W,QAAQ,EACR8a,QAAS,KACTC,aAAc,KACdrX,OAAQ,KACRsX,eAAgB,KAChBC,SAAU,KACVC,SAAU,KACVC,gBAAgB,EAChB5D,mBAAmB,EACnB6D,cAAe,MAChBzgC,EAAA,KAAAkgC,GAED3+C,KAAK4I,QAAUA,EACf5I,KAAKm/C,WAAa,KAClBn/C,KAAKo/C,oBAAsB,KAC3Bp/C,KAAKq/C,aACP,CA0OA,IAAAC,EAiHC,OA3VA//B,EAAAo/B,EAAA,EAAA/8C,IAAA,cAAAG,MAED,WACE/B,KAAKu/C,eAAiBv/C,KAAKu/C,eAAer2C,KAAKlJ,MAC/CA,KAAKw/C,cAAgBx/C,KAAKw/C,cAAct2C,KAAKlJ,MAC7CA,KAAKy/C,eAAiBz/C,KAAKy/C,eAAev2C,KAAKlJ,MAC/CA,KAAK0/C,eAAiB1/C,KAAK0/C,eAAex2C,KAAKlJ,MAC/CA,KAAK47C,iBAAmB57C,KAAK47C,iBAAiB1yC,KAAKlJ,MACnDA,KAAK2/C,iBAAmB3/C,KAAK2/C,iBAAiBz2C,KAAKlJ,MACnDA,KAAK4/C,qBAAuB5/C,KAAK4/C,qBAAqB12C,KAAKlJ,MAC3DA,KAAK6/C,4BACH7/C,KAAK6/C,4BAA4B32C,KAAKlJ,KAC1C,GAEA,CAAA4B,IAAA,QAAAG,MAeA,WAAQ,IAAAugB,EAAA,KACNF,EAAO9B,MAAM,4BAA6BtgB,KAAK4I,SAC/C,IAAAk3C,EAQI9/C,KAAK4I,QAPPk2C,EAAcgB,EAAdhB,eACA3xB,EAAK2yB,EAAL3yB,MACAH,EAAK8yB,EAAL9yB,MACA8W,EAAMgc,EAANhc,OACA0D,EAAMsY,EAANtY,OACAuX,EAAQe,EAARf,SACAF,EAAYiB,EAAZjB,aAEF,OACEjX,GAAgB3H,eAChB6e,GACiB,kBAAV3xB,GACP2xB,EAAeiB,QACftW,GAAgBqV,GAAgBx8C,OAAS,GACS,UAAlDmnC,GAAgBqV,GAAgB,GAAGvhB,WAG5B,IAAI10B,SAAQ,SAAAC,GACjB,IAAOiiC,EAAyC5iB,EAA/BshB,GAAgBqV,GAAe,GAAnC,GAab,GAZA/T,EAAOxC,QAAUpb,EACjB4d,EAAOiV,QACL7yB,GAAS7K,EAAK88B,oBACV,WACEh9B,EAAO7Z,MAAM,0BACbu2C,EAAexvB,YAAY3gB,SAAQ,SAAA8F,GAAK,OAAIA,EAAM6H,MAAM,IACxDgG,EAAK88B,qBACP,EACA,KACe,kBAAVpyB,GACT2b,GAAYmW,EAAgB9xB,GAE1Bwa,EAAQ,CACV,IAAMvS,EAAY,IAAIzE,YAAYsuB,EAAexvB,aAC3C2wB,EAAexY,GAAcD,GAC5B+P,EAA4CpvB,EAA7B6hB,GAAgBiW,GAAa,GAAjC,GAGlB,OAFAhrB,EAAUjD,SAASulB,QACnBzuC,EAAQmsB,EAEV,CACAnsB,EAAQg2C,EACV,IAGElX,GAAgBrG,YAAcuC,GAAUib,IAAavX,GAErDqX,EAAeh2C,QAAQC,QAAQ+1C,GAAgB7+C,KAAK0vB,mBAEnDnmB,MAAK,SAAA22C,GACJ,OAAOpF,GAAc4B,iBAAiBnzC,MAAK,SAAAwjB,GACzC,IAAMvY,EAAS,IAAIgc,YAGnB,OAFAlO,EAAKs9B,qBAAqBprC,EAAQ0rC,GAClC59B,EAAK68B,WAAa,IAAI3uB,YAAY0vB,EAAc5wB,aACzCxsB,UAAUkpB,aACd8C,aAAa,CAAE9B,MAAOD,EAAYC,QAClCzjB,MAAK,SAAA42C,GAaJ,OAZA79B,EAAKs5B,iBAAiBuE,GACtBA,EACG7wB,YACA3gB,SAAQ,SAAA8F,GAAK,OAAI6N,EAAK68B,WAAWntB,SAASvd,EAAM,IACnDsqC,EAASqB,oBACPD,EACAD,EACA1rC,GAEEuqC,EAASgB,QACXhB,EAASsB,iBAAiBF,EAAaD,GAElC1rC,CACT,GACJ,GACF,IACCjL,MAAK,SAAAiL,GAEJ,OADA8N,EAAK68B,WAAa,KACX3qC,CACT,IAAE,OACK,SAAAjM,GAML,OALI+Z,EAAK68B,aACPrW,GAAWxmB,EAAK68B,YAChB78B,EAAK68B,WAAa,MAEpB/8B,EAAO7Z,MAAM,6BAA8BA,EAAOA,EAAMomB,SACjD9lB,QAAQE,OAAOR,EACxB,IAGGuyC,GAAcwF,oBAClB/2C,KAAKvJ,KAAKu/C,gBACVh2C,KAAKvJ,KAAK2/C,kBACVp2C,KAAKvJ,KAAK47C,kBACVryC,KAAKvJ,KAAK6/C,6BACVt2C,KAAKvJ,KAAKy/C,gBACVl2C,KAAKvJ,KAAK0/C,gBACVn2C,KAAKvJ,KAAKw/C,eACVj2C,MAAK,SAAAiL,GAKJ,OAJA8N,EAAK68B,WAAa,KACd78B,EAAK1Z,QAAQs2C,eACf58B,EAAK1Z,QAAQs2C,cAAcqB,kBAEtB/rC,CACT,IAAE,OACK,SAAAjM,GAML,OALA+Z,EAAKk+B,oBACDl+B,EAAK1Z,QAAQs2C,eACf58B,EAAK1Z,QAAQs2C,cAAcuB,oBAE7Br+B,EAAO7Z,MAAM,6BAA8BA,EAAOA,EAAMomB,SACjD9lB,QAAQE,OAAOR,EACxB,GACJ,GAEA,CAAA3G,IAAA,iBAAAG,MACA,SAAe2rB,GAAS,IAAAvK,EAAA,KACtB,GAAuB,IAAnBuK,EAAQprB,OAGV,OAFAtC,KAAK4I,QAAU,CAAEokB,OAAO,EAAOG,OAAO,GACtCntB,KAAKm/C,YAAa,IAAI9X,IAAc7yB,OAC7BxU,KAAKm/C,WAEd,IAAAuB,EAAuC1gD,KAAK4I,QAApCoyC,EAAG0F,EAAH1F,IAAK7tB,EAAKuzB,EAALvzB,MAAO2xB,EAAc4B,EAAd5B,eACdl2C,EAAU,CACdukB,OAAOya,GAAgBxG,4BAA6B4Z,GAAM7tB,EAC1DH,OAAO,IAEK,IAAVG,IAAoB6tB,GAAOpT,GAAgB3H,gBAC7Cr3B,EAAQukB,OAAQ,GAElB,IAAMuvB,EAAmB5B,GAAnB4B,eAQN,OAPK9U,GAAgB3F,mCACnB6G,GAAWgW,IAETlX,GAAgB7H,WAAa6H,GAAgB3H,iBAC/C6I,GAAWgW,GACXpC,EAAiB5B,GAAc6F,sBAE1BjE,EAAe9zC,GAASW,MAAK,SAAAwjB,GAClC,OAAOjqB,UAAUkpB,aAAa8C,aAAa/B,GAAaxjB,MAAK,SAAAiL,GAE3D,OADA2O,EAAKg8B,WAAa3qC,EACXA,CACT,GACF,GACF,GAEA,CAAA5S,IAAA,mBAAAG,MASA,SAAiByS,GACf,GAAuC,IAAnCA,EAAO6a,iBAAiB/sB,OAAc,CACxC,IAAOyoC,EAAiC5iB,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GACb0b,EAAOxC,QAAUvoC,KAAK4I,QAAQukB,OACH,IAAvBntB,KAAK4I,QAAQukB,OAAoBya,GAAgB3H,eACnD4I,GAAUkC,GAER/qC,KAAK4I,QAAQs2C,eACfl/C,KAAK4I,QAAQs2C,cAAc0B,cAAc7V,EAE7C,CACA,OAAOv2B,CACT,GAAC,CAAA5S,IAAA,8BAAAG,MAED,SAA4ByS,GAC1B,IAAAqsC,EAAgD7gD,KAAK4I,QAA7Ck7B,EAAM+c,EAAN/c,OAAQuX,EAAiBwF,EAAjBxF,kBAAmB2D,EAAQ6B,EAAR7B,SACnC,OACGlb,GACDuX,GACA7mC,GACmC,IAAnCA,EAAO6a,iBAAiB/sB,OAEjB08C,EAAS7B,eAAe3oC,GAE1BA,CACT,GAAC,CAAA5S,IAAA,mBAAAG,MAED,SAAiByS,GACf,GAAuC,IAAnCA,EAAO4a,iBAAiB9sB,OAAc,CACxC,IAAOwoC,EAAiC3iB,EAAvB3T,EAAO4a,iBAAgB,GAA3B,GACb0b,EAAOvC,QAAUvoC,KAAK4I,QAAQokB,MAC1BhtB,KAAK4I,QAAQs2C,eACfl/C,KAAK4I,QAAQs2C,cAAc4B,cAAchW,EAE7C,CACA,OAAOt2B,CACT,GAAC,CAAA5S,IAAA,iBAAAG,MAED,SAAeyS,GACb,IAAAusC,EAAmC/gD,KAAK4I,QAAhC4+B,EAAMuZ,EAANvZ,OAAQsX,EAAciC,EAAdjC,eAChB,GAAItX,EAAQ,CACV,IAAMyY,EAAexY,GAAcD,GAC5B+P,EAA4CpvB,EAA7B6hB,GAAgBiW,GAAa,GAAjC,GAClBzrC,EAAOwd,SAASulB,EAClB,CACA,GAAIjN,GAA2BwU,GAAiB,CAC9C,IAAOvH,EAA8CpvB,EAA/B6hB,GAAgB8U,GAAe,GAAnC,GAClBtqC,EAAOwd,SAASulB,EAClB,CACA,OAAO/iC,CACT,GAEA,CAAA5S,IAAA,iBAAAG,OAAAu9C,EAAAlY,GAAA3wB,KAAAA,MACA,SAAA62B,EAAqB94B,GAAM,IAAAqqC,EAAAmC,EAAAld,EAAAgb,EAAAC,EAAApJ,EAAAsL,EAAAC,EAAAC,EAAA,OAAA1qC,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OAEe,GADlCqkC,EAAiB7+C,KAAK4I,QAAtBi2C,aAAYmC,EAC2BhhD,KAAK4I,QAA1Ck7B,EAAMkd,EAANld,OAAQgb,EAAckC,EAAdlC,eAAgBC,EAAQiC,EAARjC,UAC5Bjb,IAAUib,EAAQ,CAAAvR,EAAAhzB,KAAA,kBAChBqkC,EAA4D,CAAArR,EAAAhzB,KAAA,eAAAgzB,EAAAhzB,KAAA,EACzCxa,KAAK0vB,kBAAiB,OAA3CmvB,EAAYrR,EAAAxzB,KAAA,OAUZ,OARI27B,EAAY,IAAInlB,YACtBxwB,KAAK4/C,qBAAqBjK,EAAWkJ,GACrCE,EAASqB,oBAAoB5rC,EAAQqqC,EAAclJ,GAC/CoJ,EAASgB,QACXhB,EAASsB,iBAAiB7rC,EAAQqqC,GAEpC7+C,KAAKm/C,WAAa,IAAI3uB,YACpBhc,EAAO8a,YAAY/N,OAAOs9B,EAAavvB,cACvCke,EAAArzB,OAAA,SACKw7B,GAAS,QAMjB,OAHGzL,GAA2B4U,KAAiBmC,EACxB1X,GAA4BuV,GAAeoC,EAAA/4B,EAAA84B,EAAA,GAA1DE,EAAWD,EAAA,GAClB1sC,EAAOwd,SAASmvB,IACjB3T,EAAArzB,OAAA,SACM3F,GAAM,yBAAAg5B,EAAAlxB,OAAA,GAAAgxB,EAAA,UACd,SAAA9kB,GAAA,OAAA82B,EAAAt/B,MAAA,KAAAC,UAAA,KAAAre,IAAA,uBAAAG,MAED,SAAqByS,EAAQqqC,GAC3B,IAAOsC,EAA4Ch5B,EAA7B02B,EAAaxvB,iBAAgB,GAAjC,GAElB8xB,EAAYh+C,KAAOnD,KAAK4I,QAAQq2C,eAC5B,eACA,qBACAzqC,GACFA,EAAOwd,SAASmvB,EAEpB,GAAC,CAAAv/C,IAAA,kBAAAG,MAED,WACE,GAAI6lC,GAAgB5G,qBAAsB,CACxC,IACMyc,EAAmB,CAAEM,aADZnW,GAAgBnB,cAAgBzmC,KAAK4I,QAAQoyC,IACV,EAAI,GAChDwC,EAAmB,CAGvBztB,OAAQ,CAAEtD,IAAK,MACfwD,UAAW,CAAExD,IAAK,KAUpB,OARImb,GAAgBjG,YAAciG,GAAgB1D,YAGhDuZ,EAAiB2D,kBAAmB,GAElCphD,KAAK4I,QAAQg2C,SAAWhX,GAAgBlB,4BAC1C8W,EAAiB7W,eAAiB3mC,KAAK4I,QAAQg2C,SAE1C97C,UAAUkpB,aAAa0D,gBAAgB,CAC5C1C,MAAOywB,EACPtwB,MAAOqwB,EACP6D,iBAAkB,UAClBC,mBAAoB,UACpBC,YAAa,WAEjB,CACA,OAAOz+C,UAAUkpB,aAAa8C,aAAa,CACzC3B,MAAO,CACL2J,YAAa,SACbjH,MAAO,CAAEpD,IAAK,MACdsD,OAAQ,CAAEtD,IAAK,MACfwD,UAAW,CAAExD,IAAK,MAGxB,GAAC,CAAA7qB,IAAA,gBAAAG,MAED,SAAcyS,GACZ,IAAAgtC,EAAuBxhD,KAAK4I,QAApBoyC,EAAGwG,EAAHxG,IAAK7tB,EAAKq0B,EAALr0B,MACb,GAAI6tB,IAAQpT,GAAgBxG,0BAC1B,OAAO5sB,EAET,GAAuC,IAAnCA,EAAO6a,iBAAiB/sB,OAAc,CACxC,IAAOm/C,EAAwDt5B,GAAzC,IAAIkf,IAAc7yB,OAAO6a,iBAAgB,GAA7C,GAClBoyB,EAAYlZ,QAAUpb,EACtB3Y,EAAOwd,SAASyvB,EAClB,CACA,OAAOjtC,CACT,GAEA,CAAA5S,IAAA,oBAAAG,MACA,WACE,IAAMo9C,EAAen/C,KAAfm/C,WACN,GAAKA,EAAL,CAGA,IAAAuC,EAAyC1hD,KAAK4I,QAAtCk2C,EAAc4C,EAAd5C,eAAgBD,EAAY6C,EAAZ7C,aACxB,GAAIvU,GAA2BwU,GAAiB,CAC9C,IAAOvH,EAA8CpvB,EAA/B6hB,GAAgB8U,GAAe,GAAnC,GAClBK,EAAWhtB,YAAYolB,EACzB,CACA,GAAItN,GAAe6U,GAAiB,CAClC,IAAOqC,EAA8Ch5B,EAA/BmhB,GAAgBwV,GAAe,GAAnC,GAClBK,EAAWhtB,YAAYgvB,EACzB,CACA,GAAIjX,GAA2B2U,GAAe,CAC5C,IAAOsC,EAAwDh5B,EAAzCohB,GAA4BsV,GAAa,GAA7C,GAClBM,EAAWhtB,YAAYgvB,EACzB,CACArY,GAAWqW,GACXn/C,KAAKm/C,WAAa,IAflB,CAgBF,GAAC,CAAAv9C,IAAA,qBAAAG,MAED,SAAmBJ,GAEjB,OADA3B,KAAKo/C,oBAAsBz9C,EACpB3B,IACT,KAAC2+C,CAAA,CAjXqB,GCiExB,SAxFc,WACZ,SAAAgD,IAAcljC,EAAA,KAAAkjC,GACZ3hD,KAAK+/C,QAAS,EACd//C,KAAKqiC,aAAe,KACpBriC,KAAK4hD,MAAQ,KACb5hD,KAAK6hD,cAAgB,KACrB7hD,KAAK01C,eAAiB,IACxB,CA8EC,OA9EAn2B,EAAAoiC,EAAA,EAAA//C,IAAA,mBAAAG,MAED,SAAiBo+C,EAAa2B,GAC5B9hD,KAAK6hD,cAAgB,IAAIrxB,YACzB,IAAMuxB,EAAc5B,EAAY/wB,iBAC1B8nB,EAAc4K,EAAYzyB,iBAOhC,OANI0yB,EAAYz/C,OAAS,GACvBtC,KAAK6hD,cAAc7vB,SAAS+vB,EAAY,IAEtC7K,EAAY50C,OAAS,GACvBtC,KAAK6hD,cAAc7vB,SAASklB,EAAY,IAEnCl3C,KAAK6hD,aACd,GAAC,CAAAjgD,IAAA,mBAAAG,MAED,WACE,OAAO/B,KAAK6hD,aACd,GAAC,CAAAjgD,IAAA,oBAAAG,MAED,WACE,OAAO/B,KAAK01C,cACd,GAAC,CAAA9zC,IAAA,qBAAAG,MAED,WACE+mC,GAAW9oC,KAAK01C,eAClB,GAAC,CAAA9zC,IAAA,QAAAG,MAED,SAAMk1C,EAAiBtB,GACrB,IAAMoM,EAAc9K,EAAgB7nB,iBAChC2yB,EAAYz/C,OAAS,GACvBqzC,EAAU3jB,SAAS+vB,EAAY,GAEnC,GAAC,CAAAngD,IAAA,wBAAAG,MAED,SAAsBk1C,EAAiBiJ,EAAevK,GACpD31C,KAAKqiC,aAAe,IAAKtiC,OAAO27B,cAC9B37B,OAAO47B,oBACT37B,KAAK4hD,MAAQ5hD,KAAKqiC,aAAa6I,+BAC/BlrC,KAAKqiC,aACF2f,wBAAwB9B,GACxB+B,QAAQjiD,KAAK4hD,OAChB5hD,KAAKqiC,aACF2f,wBAAwB/K,GACxBgL,QAAQjiD,KAAK4hD,OAChBjM,EAAU3jB,SAAShyB,KAAK4hD,MAAMptC,OAAO4a,iBAAiB,GACxD,GAAC,CAAAxtB,IAAA,sBAAAG,MAED,SAAoBk1C,EAAiBiJ,EAAevK,GAClD31C,KAAK01C,eAAiBwK,EACtB,IAAMgC,EAAehC,EAAc9wB,iBACnC,GAA4B,IAAxB8yB,EAAa5/C,OACftC,KAAKmiD,MAAMlL,EAAiBtB,QAE5B,IACE31C,KAAKoiD,sBAAsBnL,EAAiBiJ,EAAevK,GAC3D31C,KAAK+/C,QAAS,CAChB,CAAE,MAAOsC,GACPjgC,EAAO7Z,MAAM,gCAAiC85C,GAC9CxZ,GAAUqZ,EAAa,IACvBliD,KAAKmiD,MAAMlL,EAAiBtB,EAC9B,CAEJ,GAAC,CAAA/zC,IAAA,UAAAG,MAED,WAAU,IAAAugB,EAAA,KAIR,GAHAtiB,KAAKo3C,qBACLp3C,KAAK6hD,cAAgB,KACrB7hD,KAAK01C,eAAiB,KAClB11C,KAAKqiC,aAOP,OANAyG,GAAW9oC,KAAK4hD,MAAMptC,aACtBxU,KAAKqiC,aAAa8I,QAAQ5hC,MAAK,WAC7B+Y,EAAK+f,aAAe,KACpB/f,EAAKs/B,MAAQ,KACbt/B,EAAKy9B,QAAS,CAChB,IAGF//C,KAAK+/C,QAAS,CAChB,KAAC4B,CAAA,CArFW,G,waCId,IAAMW,GAA0B,SAAC9tC,EAAQwY,EAAOG,GAC9C3Y,EAAO4a,iBAAiBzgB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUvb,CAAK,IAC/DxY,EAAO6a,iBAAiB1gB,SAAQ,SAAA8F,GAAK,OAAKA,EAAM8zB,QAAUpb,CAAK,GACjE,EAkGA,SA7F4B,SAAAzH,GAAAV,EAAAu9B,EAAA78B,GAAA,IAAAC,EAAAC,GAAA28B,GAAA,SAAAA,IAAA,OAAA9jC,EAAA,KAAA8jC,GAAA58B,EAAA3F,MAAA,KAAAC,UAAA,CA0FzB,OA1FyBV,EAAAgjC,EAAA,EAAA3gD,IAAA,SAAAG,MAE1B,SAAAsrC,GAAkD,IAAzCrgB,EAAKqgB,EAALrgB,MAAOG,EAAKkgB,EAALlgB,MAAKq1B,EAAAnV,EAAEvJ,OAAAA,OAAM,IAAA0e,GAAQA,EAAE5D,EAAOvR,EAAPuR,QACrCx8B,EAAO9B,MAAM,kCACb,IAAQmiC,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAElB,IAAQ+oC,EAA0BD,EAA1BC,YAAa1D,EAAayD,EAAbzD,SACf2D,EAAmBp4C,QAAQk4C,EAAS1D,UAE1C,GACEnX,GAAgB3H,eACf2H,GAAgBpD,0CACdme,IACAD,EAAYC,iBAkBf,OAhBI3D,IACE7xB,EACF6xB,EAAS4D,SAET5D,EAAS6D,UAGT7D,EAAStJ,gBACTsJ,EAAStJ,iBAAmBgN,GAE5BJ,GAAwBtD,EAAStJ,eAAgB1oB,EAAOG,IAG5Dm1B,GAAwBI,EAAa11B,EAAOG,GAC5Cu1B,EAAYI,gBAAiB,OAC7BL,EAASzF,KAAK,CAAE75C,KAAM,gBAAiBu/C,YAAAA,IAIrCD,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAElBC,IACFA,EAAS5H,qBACT4H,EAAS3H,aAGX,IAAMzuC,EAAU,CACdokB,MAAOA,EACPG,MAAOA,EACPkuB,kBAAmBoH,EAAS75C,QAAQyyC,kBACpCyD,eAAgB4D,EAChB1D,SAAUA,EACVE,cAAeuD,EAASvD,eAGtBpb,IACF2e,EAAS1D,SAAW,IAAI4C,GACxB/4C,EAAQukB,OAAQ,EAChBvkB,EAAQk7B,QAAS,EACjBl7B,EAAQg2C,QAAUA,EAClBh2C,EAAQyyC,mBAAoB,EAC5BzyC,EAAQm2C,SAAW0D,EAAS1D,UAG9B,IAAIJ,GAAmB/1C,GACpB8uC,QACAnuC,MAAK,SAAAiL,GACJ,IAAO2sC,EAA6Ch5B,EAA9BqhB,GAAuBh1B,GAAO,GAAlC,GAMlB,OALI2sC,GACFA,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,qBACxB,IAEKqR,CACT,IACCjL,MAAK,SAAAiL,GACJA,EAAOsuC,gBAAiB,EACxBtuC,EAAOmuC,iBAAmBA,EAC1BF,EAASjH,UAAUhnC,EACrB,IAAE,OACK,SAAAjM,GAEL,GADA6Z,EAAO7Z,MAAM,yBAA0BA,GACnCu7B,EAAQ,CACV,IAAI9+B,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,MAC7BuD,EAAMomB,QAAQ5oB,QAAQ,oBAAsB,IAC9Cf,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,KAAI,WAEnCy9C,EAASzF,KAAK,CAAE75C,KAAM,uBAAwB6B,KAAAA,IAC9Cy9C,EAASzF,KAAK,CAAE75C,KAAM,qBACxB,CACF,GACJ,KAACo/C,CAAA,CA1FyB,CAASh9B,G,waCwErC,SA3EiB,SAAAG,GAAAV,EAAA+9B,EAAAr9B,GAAA,IAAAC,EAAAC,GAAAm9B,GAAA,SAAAA,IAAA,OAAAtkC,EAAA,KAAAskC,GAAAp9B,EAAA3F,MAAA,KAAAC,UAAA,CAwEd,OAxEcV,EAAAwjC,EAAA,EAAAnhD,IAAA,SAAAG,MAEf,SAAOyjB,GAELpD,EAAO9B,MAAM,sBAAuBkF,GACpC,IAAQi9B,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAElB,IAAQ+oC,EAAgBD,EAAhBC,YAGLl9B,EAAIw9B,eACLzY,GAAqBmY,IACpBD,EAASQ,mBAEVR,EAASzF,KAAK,CAAE75C,KAAM,oBAGpBs/C,IAAaA,EAASrtB,gBACxBp1B,KAAKkjD,sCAAsCR,EAAal9B,GAG1D,IAAIkC,EAAa1nB,KAAK2C,SAAS+Z,OAAO8I,EACxC,GAcA,CAAA5jB,IAAA,wCAAAG,MACA,SAAsC2gD,EAAal9B,GACjD,IAAQ2H,EACN3H,EADM2H,MAAOg2B,EACb39B,EADa29B,SAAUC,EACvB59B,EADuB49B,YAAaJ,EACpCx9B,EADoCw9B,aAAcK,EAClD79B,EADkD69B,kBAGpD,GAAKX,EAAL,CAIA,GACES,KACGh2B,IAAUkd,GAAeqY,IAAgBtY,GAAYsY,KACrDv1B,IACEqb,GAASka,IACVA,EAAYI,iBACXE,GACL,CACA,IAAMp6C,EAAU,CACdokB,MAAOsb,GAASoa,GAChBv1B,MAAOA,GAELu1B,EAAYC,mBACd/5C,EAAQukB,OAAQ,EAChBvkB,EAAQk7B,QAAS,GAEnB,IAAIye,GAAuBviD,KAAK2C,SAAS+Z,OAAO9T,EAClD,CAEIukB,IAAUi2B,GAAeC,GAC3B,IAAId,GAAuBviD,KAAK2C,SAAS+Z,OAAO,CAC9CsQ,MAAOsb,GAASoa,GAChBv1B,OAAO,GAxBX,CA2BF,KAAC41B,CAAA,CAxEc,CAASx9B,G,waCJ1B,SANmB,SAAAG,GAAAV,EAAAs+B,EAAA59B,GAAA,IAAAC,EAAAC,GAAA09B,GAAA,SAAAA,IAAA,OAAA7kC,EAAA,KAAA6kC,GAAA39B,EAAA3F,MAAA,KAAAC,UAAA,CAGhB,OAHgBV,EAAA+jC,EAAA,EAAA1hD,IAAA,SAAAG,MACjB,WACE/B,KAAK2C,QAAQkjB,KAAK09B,cACpB,KAACD,CAAA,CAHgB,CAAS/9B,G,waCM5B,SANmB,SAAAG,GAAAV,EAAAw+B,EAAA99B,GAAA,IAAAC,EAAAC,GAAA49B,GAAA,SAAAA,IAAA,OAAA/kC,EAAA,KAAA+kC,GAAA79B,EAAA3F,MAAA,KAAAC,UAAA,CAGhB,OAHgBV,EAAAikC,EAAA,EAAA5hD,IAAA,SAAAG,MACjB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAK49B,SAASj+B,EAAI9W,OACjC,KAAC80C,CAAA,CAHgB,CAASj+B,G,waCY5B,SAZmB,SAAAG,GAAAV,EAAA0+B,EAAAh+B,GAAA,IAAAC,EAAAC,GAAA89B,GAAA,SAAAA,IAAA,OAAAjlC,EAAA,KAAAilC,GAAA/9B,EAAA3F,MAAA,KAAAC,UAAA,CAShB,OATgBV,EAAAmkC,EAAA,EAAA9hD,IAAA,SAAAG,MACjB,SAAOyjB,GACL,IAAKxlB,KAAK2C,QAAQ8/C,SAChB,MAAM,IAAI9oC,MAAM,0BAElB3Z,KAAK2C,QAAQ8/C,SAASj7B,KAAK,CACzBrkB,KAAM,OACNwgD,QAASn+B,EAAIm+B,SAEjB,KAACD,CAAA,CATgB,CAASn+B,G,waCU5B,SATmB,SAAAsB,GAAA7B,EAAA4+B,EAAA/8B,GAAA,IAAAlB,EAAAC,GAAAg+B,GAAA,SAAAA,IAAA,OAAAnlC,EAAA,KAAAmlC,GAAAj+B,EAAA3F,MAAA,KAAAC,UAAA,CAMhB,OANgBV,EAAAqkC,EAAA,EAAAhiD,IAAA,SAAAG,MACjB,SAAOyjB,GAAK,IAAAlD,EAAA,KACVtiB,KAAK2C,QAAQkjB,KACVg+B,cAAc,WACdt6C,MAAK,kBAAA4c,EAAAb,EAAAs+B,EAAA/iD,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAmB,CAAEnf,KAAMqiB,EAAIriB,MAAM,IAAE,OACtC,SAAAoF,GAAK,OAAI6Z,EAAOlC,KAAK3X,EAAM,GACtC,KAACq7C,CAAA,CANgB,CAASp9B,G,waCK5B,SANoB,SAAAd,GAAAV,EAAA8+B,EAAAp+B,GAAA,IAAAC,EAAAC,GAAAk+B,GAAA,SAAAA,IAAA,OAAArlC,EAAA,KAAAqlC,GAAAn+B,EAAA3F,MAAA,KAAAC,UAAA,CAGjB,OAHiBV,EAAAukC,EAAA,EAAAliD,IAAA,SAAAG,MAClB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKk+B,UAAUv+B,EAAI9W,OAClC,KAACo1C,CAAA,CAHiB,CAASv+B,G,waCqB7B,SAdoB,SAAAG,GAAAV,EAAAg/B,EAAAt+B,GAAA,IAAAC,EAAAC,GAAAo+B,GAAA,SAAAA,IAAA,OAAAvlC,EAAA,KAAAulC,GAAAr+B,EAAA3F,MAAA,KAAAC,UAAA,CAWjB,OAXiBV,EAAAykC,EAAA,EAAApiD,IAAA,SAAAG,MAClB,SAAOyjB,GACL,IATcsV,EASdmpB,EAA2BjkD,KAAK2C,QAAxBkjB,EAAIo+B,EAAJp+B,KAAM48B,EAAQwB,EAARxB,SACR9+B,IAVQmX,EAUctV,EAAIsV,KATzB1P,SAAS,KAGX0P,EAFEA,EAAM,KAQ0BtV,EAAI5jB,IAC3CikB,EAAKq+B,eAAe,CAAEvgC,UAAAA,GAAa,WAAU,OAAO,SAAApb,GAClDk6C,EAASzF,KAAK,CACZ75C,KAAM,wBACNX,SAAU,UACV+F,MAAOA,GAEX,GACF,KAACy7C,CAAA,CAXiB,CAASz+B,GCT7B,IAAM8rB,GAAiC,WACrC,IAGE,OADA,IAAIC,aACG,CAET,CAAE,MAAO/oC,GAAQ,CACjB,OAAO,CACT,CARuC,GA4CvC,SAlCkB,WAChB,SAAA47C,IAAc1lC,EAAA,KAAA0lC,GACZnkD,KAAK2mB,UAAY,IAAIqD,IACrBhqB,KAAKof,OAASiyB,GACV,IAAIC,YACJttC,SAASq/B,cAAc,IAC7B,CAyBC,OAzBA9jB,EAAA4kC,EAAA,EAAAviD,IAAA,UAAAG,MAED,SAAQ4nB,GACN,IAAM7hB,EAAK,SAAHulC,GAAA,IAAM+W,EAAM/W,EAAN+W,OAAM,OAAOz6B,EAAGy6B,EAAO,EACrCpkD,KAAKof,OAAOlV,iBAAiB,QAASpC,GACtC9H,KAAK2mB,UAAUsD,IAAIN,EAAI7hB,EACzB,GAAC,CAAAlG,IAAA,WAAAG,MAED,SAAS4nB,GACP,IAAM7hB,EAAK9H,KAAK2mB,UAAUrc,IAAIqf,GAC1B7hB,IACF9H,KAAKof,OAAOjV,oBAAoB,QAASrC,GACzC9H,KAAK2mB,UAAS,OAAQgD,GAE1B,GAAC,CAAA/nB,IAAA,qBAAAG,MAED,WACE,IAAQ4kB,EAAsB3mB,KAAtB2mB,UAAWvH,EAAWpf,KAAXof,OACnBuH,EAAUhY,SAAQ,SAAA7G,GAAE,OAAIsX,EAAOjV,oBAAoB,QAASrC,EAAG,IAC/D6e,EAAU09B,OACZ,GAAC,CAAAziD,IAAA,OAAAG,MAED,SAAKiB,GACH,IAAMgH,EAAQ,IAAIs6C,YAAY,QAAS,CAAEF,OAAQphD,IACjDhD,KAAKof,OAAOiS,cAAcrnB,EAC5B,KAACm6C,CAAA,CA/Be,G,waC0DlB,SAlEe,SAAAI,GAAAv/B,EAAAw/B,EAAAD,GAAA,IAAA5+B,EAAAC,GAAA4+B,GACb,SAAAA,EAAY57C,GAAS,IAAA0Z,EAIE,OAJF7D,EAAA,KAAA+lC,IACnBliC,EAAAqD,EAAA9jB,KAAA,OACK4iD,WAAa,KAClBniC,EAAK1Z,QAAUA,EACf0Z,EAAKoiC,SAAU,EAAMpiC,CACvB,CAyDC,OAzDA/C,EAAAilC,EAAA,EAAA5iD,IAAA,UAAAG,MAED,WAAU,IAAAohB,EAAA,KACAva,EAAY5I,KAAZ4I,QACR5I,KAAK0kD,SAAU,EACf,IAAMD,EAAa,IAAIE,UAAU,GAADpjC,OAC3B3Y,EAAQg8C,SAAQ,gBAAArjC,OAAe3Y,EAAQi8C,aAE5CJ,EAAWK,OAAS,WAClB3hC,EAAKuhC,SAAU,EACfvhC,EAAK65B,KAAK,CAAE75C,KAAM,aACpB,EACAshD,EAAWM,UAAY,SAAA1X,GAAc,IAAXrqC,EAAIqqC,EAAJrqC,KACxBmgB,EAAK65B,KAAK,CAAE75C,KAAM,UAAWwrB,QAAS3rB,GACxC,EACAyhD,EAAW16C,QAAU,WACnBoZ,EAAK65B,KAAK,CAAE75C,KAAM,kBACpB,EACAshD,EAAWO,QAAU,WAEnB7hC,EAAKy5B,SACP,EACA58C,KAAKykD,WAAaA,CACpB,GAAC,CAAA7iD,IAAA,cAAAG,MAED,WACE,IAAQ0iD,EAAezkD,KAAfykD,WACR,QAAIA,GACKA,EAAWlnB,aAAeonB,UAAUM,IAG/C,GAAC,CAAArjD,IAAA,OAAAG,MAED,SAAK4sB,GACH,IAAQ81B,EAAezkD,KAAfykD,WACR,QAAKA,IAGLA,EAAWj9B,KAAKmH,IACT,EACT,GAEA,CAAA/sB,IAAA,UAAAG,MACA,WACE,IAAQ0iD,EAAwBzkD,KAAxBykD,WAAYC,EAAY1kD,KAAZ0kD,QAChBD,IACFzkD,KAAKykD,WAAa,KAClBA,EAAWK,OAAS,KACpBL,EAAWM,UAAY,KACvBN,EAAW16C,QAAU,KACrB06C,EAAWO,QAAU,KACjBP,EAAWlnB,YAAconB,UAAUM,MACrCR,EAAWtZ,QAEbnrC,KAAKg9C,KAAK,CAAE75C,KAAM,eAAgB+hD,SAAUR,KAE9C1kD,KAAKmlD,oBACP,KAACX,CAAA,CA/DY,CAASL,ICDxB,IAAMiB,GAAS,oBAIf,SAFsB,SAAA9jC,GAAI,OAAIA,EAAKrf,QAAQmjD,GAD9B,OAC2C,ECMxD,SARwB,SAAA3kC,GACtB,IACE,OAAOnN,KAAK7Q,MAAM4iD,KAAK5kC,EAAMjb,MAAM,KAAK,IAC1C,CAAE,MAAO+C,GACP,OAAO,CACT,CACF,ECPA,IAAM+8C,GACc,oBAAXC,QAAuD,mBAAtBA,OAAOC,WAgBjD,SAda,WACX,GAAIF,GACF,OAAOC,OAAOC,aAEhB,IAAInjD,EAAQ,EACNojD,EAAQF,OAAOG,gBAAgB,IAAItU,WAAW,KACpD,MAAO,uCAAuCnvC,QAAQ,UAAU,SAAA0jD,GAC9D,IAAMC,EAAOH,EAAMpjD,GAGnB,OAFAA,GAAS,GAEDsjD,EAAQC,EAAQ,IAAOD,EAAO,GAAM5kD,SAAS,GACvD,GACF,E,waCRA,IAkDM8kD,GAAS,SAAAtB,GAAAv/B,EAAA6gC,EAAAtB,GAAA,IA8IbuB,EAnECC,EAhEDC,EAXargC,EAAAC,GAAAigC,GACb,SAAAA,EAAYj9C,GAAS,IAAA0Z,EAOuD,OAPvD7D,EAAA,KAAAonC,GACnBvjC,EAAAqD,EAAA9jB,KAAA,MApD0B,WAAkB,IAAjB+G,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpCgmC,EAAS,GAuBb,GAtBA,CACE,YACA,UACA,cACA,mCACA,oBACAr4B,MAAK,SAAAhsB,GACL,QAAKgH,EAAQhH,KACXqkD,EAASrkD,GACF,EAGX,IACKqkD,GACH,CAAC,aAAc,YAAYr4B,MAAK,SAAAhsB,GAC9B,QAAKgH,EAAQs9C,iBAAiBtkD,KAC5BqkD,EAAS,oBAAH1kC,OAAuB3f,IACtB,EAGX,IAEEqkD,EACF,MAAM,IAAItsC,MAAM,qBAAD4H,OAAsB0kC,GAEzC,CA0BIE,CAAsBv9C,GACtB0Z,EAAK8jC,OAAS,KACd9jC,EAAK+jC,0BAA4B,KACjC/jC,EAAK1Z,QAAUA,EACf0Z,EAAKgkC,gBACLhkC,EAAKikC,yBA7BQ,SAACz+C,EAAI0+C,EAAI3T,GACxB,IAAM3K,EAAQ,GACVhkB,GAAO,EAgBX,OAfW,SAALyF,IAAkB,QAAA88B,EAAAxmC,UAAA3d,OAAT6hB,EAAI,IAAA4D,MAAA0+B,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJviC,EAAIuiC,GAAAzmC,UAAAymC,GACbxiC,EACFgkB,EAAMriC,KAAKse,IAGbD,GAAO,EACPW,YAAW,WAET,GADAX,GAAO,EACHgkB,EAAM5lC,OAAS,EAAG,CACpB,IAAMqkD,EAAWze,EAAMx8B,QACvB0a,QAAQpG,MAAM2J,EAAI,KAAMg9B,EAC1B,CACF,GAAGH,GACHpgC,QAAQpG,MAAMlY,EAAI+qC,EAAK1uB,GACzB,CAEF,CAUoCyiC,CAAStkC,EAAKukC,gBAAiB,IAAG1hC,EAAA7C,IAAQA,CAC5E,CAuNC,OArND/C,EAAAsmC,EAAA,EAAAjkD,IAAA,YAAAG,OAAAikD,EAAA5e,GAAA3wB,KAAAA,MACA,SAAA62B,EAAgB3e,GAAO,IAAA5a,EAAA5Q,EAAAH,EAAA,OAAAyT,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OAGE,GAFjBzG,EAAMT,KAAK7Q,MAAMksB,GACfxrB,EAAe4Q,EAAf5Q,KAAMH,EAAS+Q,EAAT/Q,KACdhD,KAAK8mD,aAAa/yC,GACL,kBAAT5Q,EAAwB,CAAAqqC,EAAAhzB,KAAA,SACG,OAA7Bxa,KAAK+mD,UAAU/jD,EAAKgkD,SAASxZ,EAAAhzB,KAAA,EACvBxa,KAAKqmD,0BAA0BY,eAAejkD,EAAKgK,KAAI,OAC7DhN,KAAKg9C,KAAK,CAAE75C,KAAM,aAAcqqC,EAAAhzB,KAAA,iBACd,iBAATrX,GACTnD,KAAKqmD,0BAA0BY,eAAejkD,EAAKgK,KACnDhN,KAAKg9C,KAAK,CAAE75C,KAAM,aACA,kBAATA,GACTnD,KAAKknD,aAAc,EACnBlnD,KAAK+mD,UAAU,MACf/mD,KAAKg9C,KAAK,CACR75C,KAAM,aACNgkD,OAAQ,SACRtwB,KAAM7zB,EAAKokD,cAEbpnD,KAAKq3C,aACa,oBAATl0C,GACTnD,KAAKknD,aAAc,EACnBlnD,KAAK+mD,UAAU,MACf/mD,KAAKg9C,KAAK,CACR75C,KAAM,aACNgkD,OAAQ,MACRtwB,KAAM7zB,EAAKqkD,YAEbrnD,KAAKq3C,aACa,eAATl0C,EACTnD,KAAKumD,yBAAyBvjD,IAE9BA,EAAKG,KAAOA,EACZnD,KAAKg9C,KAAK,CAAE75C,KAAM,UAAWH,KAAAA,KAC9B,yBAAAwqC,EAAAlxB,OAAA,GAAAgxB,EAAA,UACF,SAAA9kB,GAAA,OAAAw9B,EAAAhmC,MAAA,KAAAC,UAAA,KAAAre,IAAA,gBAAAG,MAED,WACE,IAAQ6G,EAAY5I,KAAZ4I,QACF0+C,EAAMC,GAAgB3+C,EAAQs9C,iBAAiBrB,YACrD,IACU,IAARyC,GACAA,EAAIE,YAAc5+C,EAAQ4+C,WAC1BF,EAAIG,UAAY7+C,EAAQ6+C,UACvBH,EAAII,IAEL,MAAM,IAAI/tC,MAAM,qBAEpB,GAAC,CAAA/X,IAAA,YAAAG,MAED,SAAUqkD,GACRpmD,KAAKomD,OAASA,CAChB,GAAC,CAAAxkD,IAAA,eAAAG,MAED,SAAa4sB,GACX,IAAQ/lB,EAAY5I,KAAZ4I,QAEJ+lB,EAAQzG,OAAStf,EAAQ6+C,SAAW94B,EAAQg5B,KAAO/+C,EAAQ4+C,WAI7DznC,QAAQxX,MAAM,IAAIoR,MAAM,yBAA0BgV,GAEtD,GAAC,CAAA/sB,IAAA,kBAAAG,OAAAgkD,EAAA3e,GAAA3wB,KAAAA,MAED,SAAAw3B,EAAsBjrC,GAAI,IAAAojD,EAAAp5C,EAAA46C,EAAA9wC,EAAA,OAAAL,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,OAEb,GADH4rC,EAAWpmD,KAAXomD,OACAp5C,EAAQhK,EAARgK,IACHo5C,GAAUA,IAAWpjD,EAAKgkD,QAAO,CAAA9Y,EAAA1zB,KAAA,cAC9B,IAAIb,MAAM,mBAAkB,OAEG,OAAvC3Z,KAAKg9C,KAAK,CAAE75C,KAAM,aAAc6J,IAAAA,IAAOkhC,EAAA1zB,KAAA,EACfxa,KAAKqmD,0BAA0BwB,kBACrD76C,GACD,OAFK46C,EAAS1Z,EAAAl0B,KAGE,UAAbhN,EAAI7J,MAAoBykD,IACpB9wC,EAAO,CACX3T,KAAMykD,EAAUzkD,KAChB6J,IAAK86C,GAAcF,EAAU56C,MAE/BhN,KAAK2uB,QAAQ,aAAc,CACzBq4B,QAASZ,EACTp5C,IAAK8J,KAER,wBAAAo3B,EAAA5xB,OAAA,GAAA2xB,EAAA,UACF,SAAAH,GAAA,OAAAiY,EAAA/lC,MAAA,KAAAC,UAAA,KAAAre,IAAA,UAAAG,MAED,WAAqC,IAA7BoB,EAAI8c,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,UAAWjd,EAAIid,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EACxBrX,EAAY5I,KAAZ4I,QACF+lB,EAAUrb,KAAKC,UAAU,CAC7BpQ,KAAAA,EACA4kD,OAAQC,KACR9/B,KAAMtf,EAAQ4+C,UACdG,GAAI/+C,EAAQ6+C,QACZzkD,KAAAA,IAEFhD,KAAKioD,UAAUzgC,KAAKmH,EACtB,GAAC,CAAA/sB,IAAA,UAAAG,MAED,WAAU,IAAAohB,EAAA,KACAva,EAAY5I,KAAZ4I,QACFq/C,EAAY,IAAIzD,GAAU57C,EAAQs9C,kBACxClmD,KAAKioD,UAAYA,EACjBjoD,KAAKknD,aAAc,EACnBlnD,KAAKg9C,KAAK,CAAE75C,KAAM,mBAAoB8kD,UAAAA,IACtCA,EAAUC,SAAQ,SAAAl+C,GAChB,IAAQ7G,EAAS6G,EAAT7G,KACK,cAATA,EACGggB,EAAKkjC,4BACRljC,EAAKkjC,0BACHz9C,EAAQu/C,iCACNv/C,EAAQw/C,yCAEZjlC,EAAK65B,KAAK,CAAE75C,KAAM,gBAEF,YAATA,EACTggB,EAAKklC,UAAUr+C,EAAM2kB,SACH,iBAATxrB,IACJggB,EAAK+jC,aACR/jC,EAAK65B,KAAK,CACR75C,KAAM,aACNgkD,OAAQ,aACRtwB,KAAM7sB,EAAMk7C,SAAW,GAAK,IAIpC,IACA+C,EAAUhG,SACZ,GAEA,CAAArgD,IAAA,OAAAG,OAAA+jD,EAAA1e,GAAA3wB,KAAAA,MACA,SAAA83B,IAAA,IAAA8X,EAAAz9C,EAAAvE,EAAAyS,EAAA,OAAAL,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,OAC4C,GAAlC6rC,EAAuCrmD,KAAvCqmD,0BAA2Bz9C,EAAY5I,KAAZ4I,QAC9By9C,EAA2B,CAAF7X,EAAAh0B,KAAA,cACtB,IAAIb,MAAM,qCAAoC,cAAA60B,EAAAh0B,KAAA,EAE5B6rC,EAA0B96C,iBAAgB,OAA9DlH,EAAWmqC,EAAAx0B,KACXlD,EAAO,CACX3T,KAAMkB,EAAYlB,KAClB6J,IAAK86C,GAAczjD,EAAY2I,MAEjChN,KAAK2uB,QAAQ,aAAc,CACzB3hB,IAAK8J,EACLwxC,aAAc1/C,EAAQ2/C,YACtBC,WAAY5/C,EAAQ4/C,aACnB,wBAAAha,EAAAlyB,OAAA,GAAAiyB,EAAA,UACJ,kBAAAuX,EAAA9lC,MAAA,KAAAC,UAAA,KAAAre,IAAA,SAAAG,MAED,SAAO0mD,GAAW,IAAA3kC,EAAA,KAChB,IAAK9jB,KAAKomD,OACR,MAAM,IAAIzsC,MAAM,8BAElB3Z,KAAK4I,QAAQs9C,iBAAiBrB,WAAa4D,EAC3C,IACEzoD,KAAKsmD,eACP,CAAE,MAAO/9C,GAEP,YADAvI,KAAKg9C,KAAK,CAAE75C,KAAM,aAAcgkD,OAAQ,aAActwB,MAAO,GAE/D,CA+BA72B,KAAKkoD,SA9Be,SAAdQ,EAAcC,GACK,qBAAnBA,EAAUxlD,OACZ2gB,EAAK8kC,SAASF,GAEd5kC,EAAKmkC,UAAUC,QAAO,eAAA7a,EAAAjG,GAAA3wB,KAAAA,MAAC,SAAA+iC,EAAMqP,GAAc,IAAAZ,EAAA5B,EAAAhiD,EAAAyS,EAAA,OAAAL,KAAAA,MAAA,SAAAkjC,GAAA,cAAAA,EAAAt9B,KAAAs9B,EAAAn/B,MAAA,UACb,cAAxBquC,EAAe1lD,KAAoB,CAAAw2C,EAAAn/B,KAAA,SACO,GAApCytC,EAAyCnkC,EAAzCmkC,UAAW5B,EAA8BviC,EAA9BuiC,0BACdviC,EAAKsiC,OAAQ,CAAFzM,EAAAn/B,KAAA,QACM,MAApBytC,EAAUrL,UACJ,IAAIjjC,MAAM,8BAA6B,cAAAggC,EAAAt9B,KAAA,EAAAs9B,EAAAn/B,KAAA,EAIrC6rC,EAA0B96C,iBAAgB,OAD5ClH,EAAWs1C,EAAA3/B,KAEXlD,EAAO,CACX3T,KAAMkB,EAAYlB,KAClB6J,IAAK86C,GAAczjD,EAAY2I,MAEjC8W,EAAK6K,QAAQ,cAAe,CAC1Bq4B,QAASljC,EAAKsiC,OACdp5C,IAAK8J,IACJ6iC,EAAAn/B,KAAA,iBAEiB,MAFjBm/B,EAAAt9B,KAAA,GAAAs9B,EAAA9L,GAAA8L,EAAA,SAEHsO,EAAUrL,UACJ,IAAIjjC,MAAM,uBAAsB,yBAAAggC,EAAAr9B,OAAA,GAAAk9B,EAAA,mBAG3C,gBAAApL,GAAA,OAAAf,EAAArtB,MAAA,KAAAC,UAAA,EAvBqB,IAyB1B,IAEAjgB,KAAKiiD,SACP,GAEA,CAAArgD,IAAA,YAAAG,MACA,WACE,IAAQskD,EAAiDrmD,KAAjDqmD,0BAA2B4B,EAAsBjoD,KAAtBioD,UAAW7B,EAAWpmD,KAAXomD,OAC9CpmD,KAAKomD,OAAS,KACVC,GACFA,EAA0Blb,QAExB8c,IACEA,EAAUa,eAAiB1C,IAC7BpmD,KAAKknD,aAAc,EACnBlnD,KAAK2uB,QAAQ,iBAAkB,CAC7Bq4B,QAASZ,EACTiB,UAAW,IAEbrnD,KAAKg9C,KAAK,CAAE75C,KAAM,aAAcgkD,OAAQ,YAAatwB,KAAM,KAE7D72B,KAAKioD,UAAY,KACjBA,EAAUrL,UAEd,KAACiJ,CAAA,CAhOY,CAAS1B,IAmOxB,UAAiB0B,UAAAA,ICzRjB,IACE,OACA,YACA,aACA,gBACA,kBCkEF,SAvEkB,WAChB,SAAAkD,EAAYp6B,EAAS/L,GAAUnE,EAAA,KAAAsqC,GAC7B,IAAAC,EAAmDr6B,EAA3C4U,IAAAA,OAAG,IAAAylB,EAAG,GAAEA,EAAEC,EAAiCt6B,EAAjCs6B,KAAMC,EAA2Bv6B,EAA3Bu6B,KAAMC,EAAqBx6B,EAArBw6B,KAAMC,EAAez6B,EAAfy6B,KAAMC,EAAS16B,EAAT06B,KAC1CrpD,KAAK4iB,SAAWA,EAChB5iB,KAAKspD,QAAU/lB,EACfvjC,KAAKupD,aAAeN,EACpBjpD,KAAKwpD,aAAeN,EACpBlpD,KAAKypD,aAAeN,EACpBnpD,KAAK0pD,eAAiBN,EACtBppD,KAAK2pD,WAAaN,EAClBrpD,KAAK4pD,gBAAkBrmB,EAAIx9B,QAAQ6c,EACrC,CAyDC,OAzDArD,EAAAwpC,EAAA,EAAAnnD,IAAA,SAAA0I,IAED,WAEE,OAAgC,IADVyd,MAAMG,KAAK,IAAI2hC,IAAI7pD,KAAKspD,UACzBhnD,QAAgBtC,KAAKspD,QAAQ,KAAOtpD,KAAK4iB,QAChE,GAAC,CAAAhhB,IAAA,WAAA0I,IAED,WACE,OAAOtK,KAAKspD,QAAQz7B,SAAS7tB,KAAK4iB,SACpC,GAAC,CAAAhhB,IAAA,cAAA0I,IAED,WACE,OAAOtK,KAAKgjD,cAAgBhjD,KAAK8pD,YAAc9pD,KAAK4iB,QACtD,GAAC,CAAAhhB,IAAA,YAAA0I,IAED,WACE,OAAOtK,KAAKgjD,cAAgBhjD,KAAKspD,QAAQtpD,KAAKupD,aAChD,GAAC,CAAA3nD,IAAA,WAAA0I,IAED,WACE,OAAOtK,KAAKspD,QAAQ17B,MAAK,SAAA2d,GAAM,MAAI,QAAQ/pC,KAAK+pC,EAAO,GACzD,GAAC,CAAA3pC,IAAA,eAAA0I,IAED,WACE,OAAO4U,OAAO6qC,UAAU/pD,KAAKupD,eAAiBvpD,KAAKupD,cAAgB,CACrE,GAAC,CAAA3nD,IAAA,kBAAA0I,IAED,WACE,OAAOC,QAAQvK,KAAKypD,aACtB,GAAC,CAAA7nD,IAAA,oBAAA0I,IAED,WACE,OAAO4U,OAAO6qC,UAAU/pD,KAAK0pD,iBAAmB1pD,KAAK0pD,gBAAkB,CACzE,GAAC,CAAA9nD,IAAA,mBAAA0I,IAED,WACE,OAAOtK,KAAKwpD,aAAa37B,SAAS7tB,KAAK4pD,gBACzC,GAAC,CAAAhoD,IAAA,mBAAA0I,IAED,WACE,OAAOtK,KAAKypD,aAAa57B,SAAS7tB,KAAK4pD,gBACzC,GAAC,CAAAhoD,IAAA,qBAAA0I,IAED,WAAyB,IAAAgY,EAAA,KACvB,OACGtiB,KAAKqjD,mBAEQ,IADdrjD,KAAKypD,aAAa59C,QAAO,SAAA0/B,GAAM,OAAIA,IAAWjpB,EAAKsnC,eAAe,IAC/DtnD,MAEP,GAAC,CAAAV,IAAA,iBAAA0I,IAED,WACE,IAAM0/C,EAAiBhqD,KAAKypD,aAAa1jD,QAAQ/F,KAAK4pD,iBACtD,OAAII,GAAkB,EACbhqD,KAAK2pD,WAAWK,GAElB,IACT,KAACjB,CAAA,CApEe,GC8ElB,SA3E2B,WACzB,SAAAkB,EAAYrnC,GAAUnE,EAAA,KAAAwrC,GACpBjqD,KAAK4iB,SAAWA,EAChB5iB,KAAKkqD,MAAQlqD,KAAKkqD,MAAMhhD,KAAKlJ,MAC7BA,KAAI,QAAWA,KAAI,QAASkJ,KAAKlJ,MACjCA,KAAKiH,QAAUjH,KAAKiH,QAAQiC,KAAKlJ,MACjCA,KAAKmqD,aAAenqD,KAAKmqD,aAAajhD,KAAKlJ,MAC3CA,KAAKoqD,cAAgBpqD,KAAKoqD,cAAclhD,KAAKlJ,KAC/C,CAgEC,OA9DDuf,EAAA0qC,EAAA,EAAAroD,IAAA,QAAAG,MAGA,SAAM4sB,GACJ,OAAO/tB,OAAOmiB,OAAO,CAAE0D,KAAM,OAASkI,EACxC,GAAC,CAAA/sB,IAAA,UAAAG,MAED,SAAQ4sB,GASN,OANE,CACE07B,cAAerqD,KAAKmqD,aACpBG,eAAgBtqD,KAAKoqD,eACrBz7B,EAAQxrB,OAASnD,KAAI,SAGHA,KAAKkqD,MAAMv7B,GACnC,GAAC,CAAA/sB,IAAA,UAAAG,MAED,SAAQ4sB,GAEN,OADAvM,EAAO9B,MAAM,iCAAkCqO,GACxCA,CACT,GAAC,CAAA/sB,IAAA,eAAAG,MAED,SAAa4sB,GACXvM,EAAO9B,MAAM,sCAAuCqO,GAEpD,IAAM47B,EAAS,IAAIxB,GAAap6B,EAAS3uB,KAAK4iB,UAoB9C,MAlBoB,CAClBzf,KAAM,SACNqnD,KAAMD,EAAOE,OACbz9B,MAAOu9B,EAAOG,iBACdv9B,MAAOo9B,EAAOI,iBACdt1C,MAAOk1C,EAAOK,SACdtB,QAASiB,EAAOjB,QAChBnG,SAAUoH,EAAOpH,SACjB2G,UAAWS,EAAOT,UAClB1G,YAAamH,EAAOnH,YACpBJ,aAAcuH,EAAOvH,aACrByG,aAAcc,EAAOd,aACrBoB,eAAgBN,EAAOM,eACvBC,gBAAiBP,EAAOO,gBACxBzH,kBAAmBkH,EAAOlH,kBAC1B0H,mBAAoBR,EAAOQ,mBAI/B,GAAC,CAAAnpD,IAAA,gBAAAG,MAED,SAAc4sB,GAWZ,OAVAvM,EAAO9B,MAAM,uCAAwCqO,GAIjC/tB,OAAOmiB,OAAO,CAChC5f,KAAM,qBACNgG,GAAIwlB,EAAQxlB,GACZkZ,OAAQsM,EAAQq8B,KAIpB,KAACf,CAAA,CAxEwB,GCG3B,IAKMgB,GAAyB,WAE7B,SAAAA,EAAYriD,GAAS6V,EAAA,KAAAwsC,GACnBjrD,KAAKkrD,YAAc,KACnBlrD,KAAKmrD,eAAiB,KACtBnrD,KAAK0iD,YAAc,KACnB1iD,KAAKorD,aAAe,KACpBprD,KAAKqrD,WAAY,EACjBrrD,KAAKsrD,iBAAmB,KACxBtrD,KAAKurD,oBAAsB,KAC3BvrD,KAAK4I,QAAUA,GAAW,CAAC,EAC3B5I,KAAKykD,WAAa77C,EAAQ67C,WAC1BzkD,KAAKwrD,4BACHxrD,KAAKwrD,4BAA4BtiD,KAAKlJ,MACxCA,KAAKyrD,oBACP,CAoDA,IAAAC,EA5BAC,EAnBAC,EAoVC,OApVDrsC,EAAA0rC,EAAA,EAAArpD,IAAA,iBAAAG,OAAA6pD,EAAAxkB,GAAA3wB,KAAAA,MACA,SAAA62B,IAAA,IAAA1kC,EAAAuiD,EAAAU,EAAA7+C,EAAA,OAAAyJ,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OAGoC,OAF1B5R,EAA4B5I,KAA5B4I,QAASuiD,EAAmBnrD,KAAnBmrD,eACjB/oC,EAAO9B,MAAM,6CAA8C1X,GAC3D5I,KAAK0iD,YAAc95C,EAAQ4L,OAAOg5B,EAAAhzB,KAAA,EACd2wC,EAAeryB,YAAYlwB,EAAQkjD,iBAAgB,OAGpE,OAHGD,EAAKre,EAAAxzB,KACXpR,EAAQmjD,aAAahM,OAAOpxC,SAAQ,SAAAq9C,GAClCH,EAAM7+C,IAAMg/C,EAASH,EAAM7+C,IAC7B,IAAGwgC,EAAAhzB,KAAA,EACG2wC,EAAet1B,oBAAoBg2B,GAAM,cAAAre,EAAAhzB,KAAA,GACzCxa,KAAKurD,oBAAmB,QAKuC,OAJ/Dv+C,EAAQm+C,EAAec,iBAAvBj/C,IACNpE,EAAQmjD,aAAaG,QAAQv9C,SAAQ,SAAAq9C,GACnCh/C,EAAMg/C,EAASh/C,EACjB,IACAoV,EAAO9B,MAAM,kDAAmDtT,GAAKwgC,EAAArzB,OAAA,SAC9D,CAAEhX,KAAM,QAAS6J,IAAAA,IAAK,yBAAAwgC,EAAAlxB,OAAA,GAAAgxB,EAAA,UAC9B,kBAAAse,EAAA5rC,MAAA,KAAAC,UAAA,IAED,CAAAre,IAAA,iBAAAG,OAAA4pD,EAAAvkB,GAAA3wB,KAAAA,MAGA,SAAAw3B,EAAqBke,GAAkB,IAAAjB,EAAA,OAAAz0C,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,OAUpC,OATO0wC,EAAgBlrD,KAAhBkrD,YACR9oC,EAAO9B,MACL,6CACA6rC,GAEEA,GAAsBA,EAAmBn/C,MAC3ChN,KAAKykD,WAAW2H,cAAgBD,EAAmBn/C,IAAI6gB,SACrD,4BAEHqgB,EAAA1zB,KAAA,EACKxa,KAAKmrD,eAAer6B,qBACxB,IAAIwE,sBAAsB62B,IAC3B,OACwD,GAAzDnsD,KAAK4I,QAAQyjD,wBAAwBF,GACN,eAA3BjB,EAAY3tB,WAA2B,CAAA2Q,EAAA1zB,KAAA,eAAA0zB,EAAA1zB,KAAA,EACnC,IAAI3R,SAAQ,SAAAC,GAChBoiD,EAAYpG,OAAS,WACnBoG,EAAYpG,OAAS,KACrBh8C,GACF,CACF,IAAE,wBAAAolC,EAAA5xB,OAAA,GAAA2xB,EAAA,UAEL,SAAAzlB,GAAA,OAAAmjC,EAAA3rC,MAAA,KAAAC,UAAA,IAED,CAAAre,IAAA,oBAAAG,OAAA2pD,EAAAtkB,GAAA3wB,KAAAA,MACA,SAAA83B,EAAwB4d,GAAkB,IAAAvjD,EAAAuiD,EAAAmB,EAAAt/C,EAAA,OAAAyJ,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,OAKtC,GAJM5R,EAA4B5I,KAA5B4I,QAASuiD,EAAmBnrD,KAAnBmrD,eACjB/oC,EAAO9B,MACL,gDACA6rC,GAE8B,UAA5BA,EAAmBhpD,KAAgB,CAAAqrC,EAAAh0B,KAAA,gBAAAg0B,EAAAnyB,KAAA,EAAAmyB,EAAAh0B,KAAA,EAE7B2wC,EAAer6B,qBACnB,IAAIwE,sBAAsB62B,IAC3B,cAAA3d,EAAAh0B,KAAA,EACoB2wC,EAAehyB,eAAc,OAG/C,OAHGmzB,EAAM9d,EAAAx0B,KACZpR,EAAQmjD,aAAahM,OAAOpxC,SAAQ,SAAAq9C,GAClCM,EAAOt/C,IAAMg/C,EAASM,EAAOt/C,IAC/B,IAAGwhC,EAAAh0B,KAAA,GACG2wC,EAAet1B,oBAAoBy2B,GAAO,QAS9C,OARFtsD,KAAK4I,QAAQyjD,wBAAwBF,GAC/Bn/C,EAAQm+C,EAAec,iBAAvBj/C,IACNpE,EAAQmjD,aAAaG,QAAQv9C,SAAQ,SAAAq9C,GACnCh/C,EAAMg/C,EAASh/C,EACjB,IACAoV,EAAO9B,MACL,sDACAtT,GACAwhC,EAAAr0B,OAAA,SACK,CAAEhX,KAAM,SAAU6J,IAAAA,IAAK,QAAAwhC,EAAAnyB,KAAA,GAAAmyB,EAAAX,GAAAW,EAAA,SAE9BpsB,EAAO7Z,MAAM,+CAA8CimC,EAAAX,IAAS,QAAAW,EAAAh0B,KAAA,oBAEjC,WAA5B2xC,EAAmBhpD,KAAiB,CAAAqrC,EAAAh0B,KAAA,gBAAAg0B,EAAAh0B,KAAA,GACvC2wC,EAAer6B,qBACnB,IAAIwE,sBAAsB62B,IAC3B,QACDnsD,KAAK4I,QAAQyjD,wBAAwBF,GAAoB,eAAA3d,EAAAr0B,OAAA,SAEpD,MAAI,yBAAAq0B,EAAAlyB,OAAA,GAAAiyB,EAAA,mBACZ,SAAAT,GAAA,OAAA4d,EAAA1rC,MAAA,KAAAC,UAAA,KAAAre,IAAA,QAAAG,MAED,WACEqgB,EAAO9B,MAAM,oCACbqE,aAAa3kB,KAAKsrD,kBACdtrD,KAAKmrD,iBACPnrD,KAAKusD,gBACLvsD,KAAKmrD,eAAehgB,QACpBnrC,KAAKmrD,eAAiB,KAEpBnrD,KAAKkrD,aACL,CAAC,aAAc,QAAQr9B,SAAS7tB,KAAKkrD,YAAY3tB,cAEjDv9B,KAAKkrD,YAAY/f,QACjBnrC,KAAKkrD,YAAc,MAErB9oC,EAAO9B,MACL,+EAIN,GAEA,CAAA1e,IAAA,qBAAAG,MACA,WACE,IAAQ6G,EAAY5I,KAAZ4I,QACF4jD,EAAYxsD,KAAKysD,6BACvBrqC,EAAO9B,MACL,qDACAksC,GAEF,IAAIE,EAAe,KACnB1sD,KAAKurD,oBAAsB,IAAI1iD,SAAQ,SAAAC,GAAO,OAAK4jD,EAAe5jD,CAAO,IACzE,IACE,IAAM0oB,EAAK,IAAIjI,kBAAkBijC,GACjCxsD,KAAKmrD,eAAiB35B,EACtB5oB,EAAQ4L,OAAO8a,YAAY3gB,SAAQ,SAAA8F,GACjC+c,EAAGQ,SAASvd,EAAO7L,EAAQ4L,OAC7B,IACA,IAAMmpB,EAAUnM,EAAGiM,kBAAkB,OAAQ,CAAEkvB,YAAY,EAAM9+C,GAAI,IACrE7N,KAAK4sD,kBAAkBjvB,GACvBnM,EAAGq7B,eAAiB,SAAAxf,GAAmB,IAAhBrhC,EAASqhC,EAATrhC,UAChBA,EAILoW,EAAO9B,MACL,6CACAtU,EAAUA,WALV0gD,GAOJ,EACAl7B,EAAGs7B,0BAA4B,WACA,aAAzBt7B,EAAGu7B,mBACLL,GAEJ,GACyB,IAArB9jD,EAAQokD,SACVx7B,EAAGtnB,iBACD,wBACAlK,KAAKwrD,6BAGPh6B,EAAGy7B,QAAUjtD,KAAKktD,cAAchkD,KAAKlJ,MAEvCA,KAAKsrD,iBAAmBzmC,YACtB,kBAAM6nC,GAAc,GA9KA,IAiLxB,CAAE,MAAOnkD,GACP6Z,EAAO7Z,MACL,wDACAA,EACAvI,KAAKykD,WAAW0I,UAEpB,CACF,GAEA,CAAAvrD,IAAA,gBAAAG,MAIA,SAAAisC,GAAkC,IAAlBv5B,EAAKu5B,EAALv5B,MAAO2c,EAAO4c,EAAP5c,QACbxoB,EAAY5I,KAAZ4I,QAAiBosB,EAAA7M,EACHiJ,EAAO,GAA5BpxB,KAAKorD,aAAYp2B,EAAA,GAClB5S,EAAO9B,MAAM,4CAA6C7L,EAAMlC,MAChEkC,EAAM24C,SAAW,kBAAMxkD,EAAQykD,aAAa54C,EAAM,EAClD7L,EAAQ0kD,aAAattD,KAAKorD,aAC5B,GAAC,CAAAxpD,IAAA,8BAAAG,MAED,WAE4C,cAAxC/B,KAAKmrD,eAAe/sB,iBACnBp+B,KAAKqrD,YAENrrD,KAAKqrD,WAAY,EACjBrrD,KAAK4I,QAAQ0kD,eAEjB,GAAC,CAAA1rD,IAAA,oBAAAG,MAED,SAAkB47B,GAChB39B,KAAKkrD,YAAcvtB,EACnB39B,KAAKykD,WAAW8I,gBAAgB5vB,EAClC,GAEA,CAAA/7B,IAAA,6BAAAG,MAiBA,WACE,IAAQ6G,EAAY5I,KAAZ4I,QACF8xB,EAAa,CAAC,CAAEG,KAAMjyB,EAAQ4kD,eASpC,OARA5kD,EAAQ6kD,aAAa9+C,SAAQ,SAAA++C,GAC3BA,EAAWC,WAAaD,EAAWn8C,SACnCmpB,EAAW70B,KAAK6nD,EAClB,IACkB,CAChBp3B,aAAc,eACdoE,WAAAA,EAGJ,GAAC,CAAA94B,IAAA,iBAAAG,MAED,WACE,OAAO/B,KAAK0iD,WACd,GAAC,CAAA9gD,IAAA,kBAAAG,MAED,WACE,OAAO/B,KAAKorD,YACd,GAAC,CAAAxpD,IAAA,YAAAG,MAED,SAAUkzB,GAAW,IAAA3S,EAAA,KAEnB,OAAO,IAAIzZ,SAAQ,SAACC,EAASC,GAC3B,IAAI0sB,EAAYnT,EAAKsrC,iBACrBtrC,EAAKogC,YAAcztB,EAEnB3S,EAAKurC,iBAAiBp4B,EAAWR,GAEjC,IAAK+V,EAAwC7iB,EAA1B8M,EAAU7F,iBAAgB,GAA9B,GAGVic,EAEyBljB,EAFXmiB,GAA2BrV,GAC1C+U,GAAgB/U,GAChBA,EAAU5F,iBAAgB,GAFf,GAIf,GAAK/M,EAAKwrC,cAAV,CAIA,IAAMj7B,EAAUvQ,EAAK6oC,eAAet5B,aAE9Bk8B,EAAcl7B,EAAQzgB,MAC1B,SAAA6f,GAAM,OAAIA,EAAOxd,OAA+B,UAAtBwd,EAAOxd,MAAMlC,IAAgB,IAEnDy7C,EAAcn7B,EAAQzgB,MAC1B,SAAA6f,GAAM,OAAIA,EAAOxd,OAA+B,UAAtBwd,EAAOxd,MAAMlC,IAAgB,IAEzD1J,QAAQkwB,IAAI,CACVg1B,EAAcA,EAAYE,aAAajjB,GAAc,KACrDgjB,EAAcA,EAAYC,aAAa5iB,GAAc,OAEpD9hC,MAAK,WACJT,EAAQ,CAAEmsB,UAAWA,EAAWm2B,aAAc9oC,EAAK8oC,cACrD,IAAE,MACKriD,EAhBT,MAFED,EAAQ,CAAEmsB,UAAWA,EAAWm2B,aAAc9oC,EAAK8oC,cAmBvD,GACF,GAAC,CAAAxpD,IAAA,mBAAAG,MAED,SAAiB0zB,EAAWR,GACtBj1B,KAAKykD,WAAWyJ,mBAGCz4B,EAClBnG,YACAzjB,QAAO,SAAA4I,GAAK,OAAKwgB,EAAU3F,YAAYzB,SAASpZ,EAAM,IAC5C9F,QAAQk6B,GACvB,GAAC,CAAAjnC,IAAA,cAAAG,MAED,WACE,OAAOwI,QACLvK,KAAKmrD,eAAet5B,aAAazf,MAAK,SAAA6f,GAAM,OAAqB,OAAjBA,EAAOxd,KAAc,IAEzE,GAAC,CAAA7S,IAAA,kBAAAG,MAED,SAAgBosD,GAEd,IACE,IAAMla,EAAQzzC,KAAKisB,IAAI,EAAMjsB,KAAKisB,IAAI0hC,EAAQ,IAAM,GAC9CH,EAAchuD,KAAKmrD,eACtBt5B,aACAzf,MAAK,SAAA6f,GAAM,MAA0B,UAAtBA,EAAOxd,MAAMlC,IAAgB,IACzC7D,EAASs/C,EAAYz1B,gBACtB7pB,EAAO8pB,YACV9pB,EAAO8pB,UAAY,CAAC,CAAC,IAEnB9pB,EAAO8pB,UAAU,GAAGJ,wBAA0B6b,IAChDvlC,EAAO8pB,UAAU,GAAGJ,sBAAwB6b,EAC5C+Z,EAAYv1B,cAAc/pB,GAE9B,CAAE,MAAOnG,GACP6Z,EAAO7Z,MAAM,qDAAsDA,EACrE,CACF,GAEA,CAAA3G,IAAA,iBAAAG,MACA,SAAe2pC,GACb,IACE,IAAMsiB,EAAchuD,KAAKmrD,eACtBt5B,aACAzf,MAAK,SAAA6f,GAAM,MAA0B,UAAtBA,EAAOxd,MAAMlC,IAAgB,IACzC7D,EAASs/C,EAAYz1B,gBACtB7pB,EAAO8pB,YACV9pB,EAAO8pB,UAAY,CAAC,CAAC,IAEnB9pB,EAAO8pB,UAAU,GAAGF,eAAiBoT,IACnCA,EACFh9B,EAAO8pB,UAAU,GAAGF,aAAeoT,EAEnCtlB,QAAQM,eAAehY,EAAO8pB,UAAU,GAAI,gBAE9Cw1B,EAAYv1B,cAAc/pB,GAE9B,CAAE,MAAOnG,GACP6Z,EAAO7Z,MAAM,oDAAqDA,EACpE,CACF,GAEA,CAAA3G,IAAA,gBAAAG,MAGA,WACEqgB,EAAO9B,MAAM,4CACb,IAAI4T,EAAYl0B,KAAKmrD,eAAel6B,aAChCjxB,KAAKmrD,eAAel6B,eACpB,GACJjxB,KAAKmrD,eACFt5B,aACAtQ,OAAO2S,GACPvlB,SAAQ,SAAAy/C,GACHA,EAAI35C,OACNo0B,GAAUulB,EAAI35C,MAElB,GACJ,KAACw2C,CAAA,CAxW4B,GA2W/B,YCnXA,IAAMl2C,GAAiB,MAyNvB,SAlNmB,WACjB,SAAAs5C,EAAYC,EAAW/rC,GAAM9D,EAAA,KAAA4vC,GAC3BruD,KAAK2mB,UAAY,GACjB3mB,KAAKuuD,gBAAkB,GACvBvuD,KAAKkrD,YAAc,KACnBlrD,KAAKmtD,UAAYntD,KAAKwuD,qBAAqBF,EAAW/rC,GACtDviB,KAAK4iB,SAAW5iB,KAAKmtD,UAAU3F,UAC/BxnD,KAAK+C,UAAY,KACjB/C,KAAKyuD,YAAc,IAAIxE,GAAsBjqD,KAAK4iB,UAClD5iB,KAAKosD,eAAgB,CACvB,CAqMC,OArMA7sC,EAAA8uC,EAAA,EAAAzsD,IAAA,uBAAAG,MAED,SAAqBusD,EAAW/rC,GAC9B,GAAuB,SAAnB+rC,EAAUnrD,KACZ,MAAO,CACLqkD,UAAW,MAGf,IAAMkH,EAAmBJ,EAAU1lD,QAkBnC,MAjBkB,CAChB4+C,UAAWkH,EAAiBlH,UAC5BC,QAASiH,EAAiBjH,QAC1Bc,YAAahmC,EAAKvd,KAClBwjD,YAAY,EACZL,iCAAkC,SAAAv/C,GAChC,OAAO,IAAIqiD,GAA0BriD,EACvC,EACAw/C,wCAAyC,CACvCoF,aAAckB,EAAiBlB,aAC/BC,aAAciB,EAAiBjB,cAEjCvH,iBAAkB,CAChBrB,WAAY6J,EAAiB7J,WAC7BD,SAAU8J,EAAiB9J,UAIjC,GAEA,CAAAhjD,IAAA,QAAAG,MAGA,WAAQ,IAAAugB,EAAA,KACN,OAAO,IAAIzZ,SAAQ,SAAAC,GACjB,IAAKwZ,EAAK6qC,UAAU3F,UAClB,MAAM,IAAIntC,UAAU,0BAEtBiI,EAAKvf,UAAY,IAAI4rD,GAAK9I,UAAUvjC,EAAK6qC,WACzCrkD,GACF,GACF,GAEA,CAAAlH,IAAA,eAAAG,MAGA,SAAa6G,GAAS,IAAAua,EAAA,KAiBpB,OAhBAviB,OAAOmiB,OACL/iB,KAAKmtD,UAAU/E,wCACfx/C,GAEEA,EAAQgmD,eACV5uD,KAAKmtD,UAAU3E,YAAc5/C,EAAQgmD,aAAazhC,OAEpDntB,KAAK+C,UAAUmlD,SAAQ,SAAA7a,GAAoB,IAAjBlqC,EAAIkqC,EAAJlqC,KAAMH,EAAIqqC,EAAJrqC,KACjB,eAATG,EAEFggB,EAAKpgB,UAAUlB,OACG,YAATsB,GACTggB,EAAK0rC,cAAc7rD,EAEvB,IACAhD,KAAK+C,UAAUk/C,UACRjiD,KAAK+C,SACd,GAAC,CAAAnB,IAAA,8BAAAG,MAED,SAA4B+sD,GAC1B1sC,EAAO9B,MAAM,8BAA+BwuC,GACvCA,EAASvmD,QACZvI,KAAKmtD,UAAUjH,iBAAiBrB,WAC9BiK,EAASR,UAAU1lD,QAAQi8C,YAE/B7kD,KAAK+C,UAAUk/C,SACjB,GAAC,CAAArgD,IAAA,sBAAAG,MAED,SAAoB+sD,GAClB1sC,EAAO9B,MAAM,sBAAuBwuC,GAC/B9uD,KAAK+C,UAIN+rD,EAASvmD,MACXvI,KAAK+C,UAAU6/C,OAAO,MAGxB5iD,KAAK+C,UAAU6/C,OAAOkM,EAASR,UAAU1lD,QAAQi8C,YAP/CziC,EAAOlC,KAAK,sBAAuB,yBAQvC,GAAC,CAAAte,IAAA,kBAAAG,MAED,SAAgB47B,GAAS,IAAA7Z,EAAA,KACvB9jB,KAAKkrD,YAAcvtB,EACnBvb,EAAO9B,MAAM,iCAAkCqd,GAC/CA,EAAQonB,UAAY,SAAA/6C,GAClB,GAAmB,oBAAfA,EAAMhH,MAAqD,SAAvB26B,EAAQJ,WAAhD,CAIAnb,EAAO9B,MAAM,oCAAqCtW,EAAMhH,MACxD,IAAM2rB,EAAUrb,KAAK7Q,MAAMuH,EAAMhH,MACZ,QAAjB2rB,EAAQxrB,MAGZ2gB,EAAK+qC,cAAclgC,EANnB,MAFEgP,EAAQnW,KAAK,kBASjB,CACF,GAKA,CAAA5lB,IAAA,QAAAG,MACA,WACE,IAAQmpD,EAA2BlrD,KAA3BkrD,YAAanoD,EAAc/C,KAAd+C,UACrB/C,KAAKkrD,YAAc,KACnBlrD,KAAK+C,UAAY,KACbmoD,GAA0C,SAA3BA,EAAY3tB,YAC7B2tB,EAAY/f,QAEVpoC,IACFA,EAAUoiD,qBACVpiD,EAAUs0C,YAEd,GAEA,CAAAz1C,IAAA,YAAAG,MAIA,SAAUJ,GACR3B,KAAKuuD,gBAAgB1oD,KAAKlE,EAC5B,GAAC,CAAAC,IAAA,gBAAAG,MAED,SAAc4sB,GACZ,GAAKogC,GAAUlhC,SAASc,EAAQxrB,MAAhC,CAMA,IAAM6rD,EAAqBhvD,KAAKyuD,YAAYxnD,QAAQ0nB,GACpD3uB,KAAKuuD,gBAAgB5/C,SAAQ,SAAAgb,GAAE,OAAIA,EAAGqlC,EAAmB,GAFzD,MAJE5sC,EAAO9B,MAAM,0CAADiB,OACgCoN,EAAQxrB,KAAI,cAM5D,GAKA,CAAAvB,IAAA,OAAAG,MACA,SAAKyjB,GACH,IAAIxlB,KAAKosD,cAAT,CAIA,IAAQlB,EAAgBlrD,KAAhBkrD,YACR1lC,EAAIwlC,IAAMhrD,KAAKmtD,UAAU3F,UACzB,IAAMxkD,EAAOsQ,KAAKC,UAAUiS,GAC5B,MAAiB,SAAbA,EAAIriB,MAAmBH,EAAKV,QAAUyS,IACxCqN,EAAO7Z,MAAM,oDAAqDid,QAClExlB,KAAKg9C,KAAK,CAAE75C,KAAM,UAAW6B,KAAM,2BAInCkmD,GAC2B,SAA3BA,EAAY3tB,YACZv6B,EAAKV,OAASyS,IAEdqN,EAAO9B,MAAM,kCAAmCtd,QAChDkoD,EAAY1jC,KAAKxkB,SAGnBof,EAAO7Z,MAAM,6BAA8Bid,EAlB3C,CAFExlB,KAAKivD,gBAAgBzpC,EAqBzB,GAEA,CAAA5jB,IAAA,kBAAAG,MACA,SAAgByjB,GACd,IAAQziB,EAAc/C,KAAd+C,UACR,GAAIA,GAAaA,EAAUqjD,OAAQ,CACjC5gC,EAAIwlC,IAAMhrD,KAAKmtD,UAAU3F,UACzBhiC,EAAIwhC,QAAUjkD,EAAUqjD,OACxB,IAAMpjD,EAAOsQ,KAAKC,UAAUiS,GAC5B,GAAiB,SAAbA,EAAIriB,MAAmBH,EAAKV,QAAUyS,GAGxC,OAFAqN,EAAO7Z,MAAM,oDAAqDid,QAClExlB,KAAKg9C,KAAK,CAAE75C,KAAM,UAAW6B,KAAM,0BAGrC,GAAIhC,EAAKV,OAASyS,GAGhB,OAFAqN,EAAO9B,MAAM,2BAA4BkF,QACzCziB,EAAU4rB,QAAQnJ,EAAIriB,KAAMqiB,GAG9BpD,EAAO7Z,MAAM,6BAA8Bid,EAC7C,CACF,GAAC,CAAA5jB,IAAA,UAAAG,MAED,SAAQmtD,GAEN,OADAlvD,KAAK2mB,UAAU9gB,KAAKqpD,GACblvD,IACT,GAAC,CAAA4B,IAAA,OAAAG,MAED,SAAKyjB,GACHxlB,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GAAQ,OAAIA,EAASxxB,EAAI,GAClD,KAAC6oC,CAAA,CA/MgB,G,waCkCnB,SA/BkB,SAAAxnC,GAAA7B,EAAAmqC,EAAAtoC,GAAA,IAAAlB,EAAAC,GAAAupC,GAAA,SAAAA,IAAA,OAAA1wC,EAAA,KAAA0wC,GAAAxpC,EAAA3F,MAAA,KAAAC,UAAA,CA4Bf,OA5BeV,EAAA4vC,EAAA,EAAAvtD,IAAA,SAAAG,MAEhB,SAAOyjB,GAIL,GAHAW,EAAAb,EAAA6pC,EAAAtuD,WAAA,eAAAgB,KAAA,KAAa2jB,GACbxlB,KAAK2C,QAAQysD,OAAS5pC,EAAIm+B,SAEA,IAAtBn+B,EAAIm+B,QAAQ0L,MAAhB,CAKA,IAAAC,EAAkD9pC,EAAIm+B,QAA9CphC,EAAI+sC,EAAJ/sC,KAAMgtC,EAAID,EAAJC,KAAMjB,EAASgB,EAAThB,UAAWkB,EAAKF,EAALE,MAAO5mD,EAAO0mD,EAAP1mD,QAGtC5I,KAAK2C,QAAQ8sD,QAAQF,KAAOA,EAC5BvvD,KAAK2C,QAAQ8sD,QAAQltC,KAAOviB,KAAK2C,QAAQkjB,KAAKlD,kBAC5CJ,EACAA,EAAK1U,GACLygD,EAAU1lD,QAAQ4+C,WAEpBxnD,KAAK2C,QAAQ8sD,QAAQD,MAAQA,EAC7BlR,EAAcz+B,WAAatV,QAAQ3B,EAAQiX,YAEvC7f,KAAK2C,QAAQ+sD,YACfttC,EAAO9B,MAAM,kCAnCQ,SAAC3d,EAAS2rD,EAAW/rC,GAC9C5f,EAAQ8hD,WAAa,IAAI4J,GAAcC,EAAW/rC,GAClD5f,EAAQ+sD,YACL1gC,SAAQ,SAAAxJ,GAAG,OAAI7iB,EAAQ6kB,KAAKhC,EAAI,IAChCkyB,QACAnuC,MAAK,kBAAM5G,EAAQ6kB,KAAK,CAAErkB,KAAM,aAAcwsD,iBAAkB,SAAU,IAAC,OACrE,kBACLhtD,EAAQ6kB,KAAK,CAAErkB,KAAM,aAAcwsD,iBAAkB,mBAAoB,GAE/E,CA6BIC,CAAmB5vD,KAAK2C,QAAS2rD,EAAW/rC,EAlB5C,MAFEH,EAAO9B,MAAM,0BAA2BkF,EAAIm+B,QAqBhD,KAACwL,CAAA,CA5Be,CAAS3oC,G,waCN3B,SARoB,SAAAK,GAAA7B,EAAA6qC,EAAAhpC,GAAA,IAAAlB,EAAAC,GAAAiqC,GAAA,SAAAA,IAAA,OAAApxC,EAAA,KAAAoxC,GAAAlqC,EAAA3F,MAAA,KAAAC,UAAA,CAKjB,OALiBV,EAAAswC,EAAA,EAAAjuD,IAAA,SAAAG,MAClB,WAAS,IAAAugB,EAAA,KACPtiB,KAAK2C,QAAQkjB,KAAKiqC,SAAQ,SAAAP,GACxB,OAAAppC,EAAAb,EAAAuqC,EAAAhvD,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAoB,CAAEnf,KAAM,aAAcosD,KAAAA,GAC5C,GACF,KAACM,CAAA,CALiB,CAASrpC,G,waCS7B,SANqB,SAAAd,GAAAV,EAAA+qC,EAAArqC,GAAA,IAAAC,EAAAC,GAAAmqC,GAAA,SAAAA,IAAA,OAAAtxC,EAAA,KAAAsxC,GAAApqC,EAAA3F,MAAA,KAAAC,UAAA,CAGlB,OAHkBV,EAAAwwC,EAAA,EAAAnuD,IAAA,SAAAG,MACnB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKmqC,WAAWxqC,EAAIyqC,KACnC,KAACF,CAAA,CAHkB,CAASxqC,G,waCc9B,SAbqB,SAAAsB,GAAA7B,EAAAkrC,EAAArpC,GAAA,IAAAlB,EAAAC,GAAAsqC,GAAA,SAAAA,IAAA,OAAAzxC,EAAA,KAAAyxC,GAAAvqC,EAAA3F,MAAA,KAAAC,UAAA,CAUlB,OAVkBV,EAAA2wC,EAAA,EAAAtuD,IAAA,SAAAG,MACnB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKsqC,WAAW3qC,EAAIyqC,KAAMjwD,KAAKowD,QAAQlnD,KAAKlJ,MAC3D,GAAC,CAAA4B,IAAA,UAAAG,MAED,SAAQkf,GACNkF,EAAAb,EAAA4qC,EAAArvD,WAAA,eAAAgB,KAAA,KAAa,CACXsB,KAAM,WACN8sD,KAAMhvC,GAEV,KAACivC,CAAA,CAVkB,CAAS1pC,G,waCgB9B,SApBsB,SAAAK,GAAA7B,EAAAqrC,EAAAxpC,GAAA,IAAAlB,EAAAC,GAAAyqC,GAAA,SAAAA,IAAA,OAAA5xC,EAAA,KAAA4xC,GAAA1qC,EAAA3F,MAAA,KAAAC,UAAA,CAiBnB,OAjBmBV,EAAA8wC,EAAA,EAAAzuD,IAAA,SAAAG,MACpB,SAAOyjB,GAEL,IAAMnD,EAASmD,EAAIwlC,IAAIxlD,MAAM,KAAKkG,QAElC1L,KAAKwlB,IAAMA,EACXxlB,KAAK2C,QAAQkjB,KAAKyqC,QAAQjuC,EAAQriB,KAAKuwD,eAAernD,KAAKlJ,MAC7D,GAAC,CAAA4B,IAAA,iBAAAG,MAED,SAAewgB,GACb,IAAMiR,EAAYhP,KAAK/hB,MAAMzC,KAAKwlB,IAAIgrC,IAAMxwD,KAAKwlB,IAAIirC,YACrDtqC,EAAAb,EAAA+qC,EAAAxvD,WAAA,eAAAgB,KAAA,KAAa,CACXsB,KAAMnD,KAAKwlB,IAAIriB,KACfof,KAAMA,EACNiR,UAAW,IAAIhP,KAAKgP,GACpBmwB,QAAS3jD,KAAKwlB,IAAIm+B,SAEtB,KAAC0M,CAAA,CAjBmB,CAAS7pC,G,waC0F/B,SApFsB,SAAAd,GAAAV,EAAA0rC,EAAAhrC,GAAA,IAAAC,EAAAC,GAAA8qC,GAAA,SAAAA,IAAA,OAAAjyC,EAAA,KAAAiyC,GAAA/qC,EAAA3F,MAAA,KAAAC,UAAA,CAiFnB,OAjFmBV,EAAAmxC,EAAA,EAAA9uD,IAAA,SAAAG,MAEpB,SAAAsrC,GAMG,IAAAsjB,EAAAtjB,EALDrgB,MAAAA,OAAK,IAAA2jC,GAAOA,EAAAC,EAAAvjB,EACZlgB,MAAAA,OAAK,IAAAyjC,GAAOA,EAAAC,EAAAxjB,EACZgO,kBAAAA,OAAiB,IAAAwV,GAAQA,EAAArO,EAAAnV,EACzBvJ,OAAAA,OAAM,IAAA0e,GAAQA,EAAAsO,EAAAzjB,EACduR,QAAAA,OAAO,IAAAkS,EAAG,KAAIA,EAEd1uC,EAAO9B,MAAM,mCAADiB,OACyByL,EAAK,YAAAzL,OAAW4L,EAAK,aAAA5L,OAAYuiB,IAEtE,IAAAmgB,EAAkCjkD,KAAK2C,QAA/B8/C,EAAQwB,EAARxB,SAAUiN,EAAWzL,EAAXyL,YAClB,IAAKjN,EACH,MAAM,IAAI9oC,MAAM,0BAOlB,GALI8oC,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAEtB0D,EAAS75C,QAAQyyC,kBAAoBA,EACjCoH,EAASzD,SAAU,CACrB,IAAM77C,EAAO23C,GAAciW,iCAC3BtO,EAASzD,SAAS5H,qBAClBqL,EAASzD,SAAS3H,YAClBoL,EAASzD,SAAS7C,iBAAiBh5C,EACrC,CAEEs/C,EAASC,cACR9a,GAAgB3F,mCAEjB6G,GAAW2Z,EAASC,aAEtB,IAAM95C,EAAU,CACdokB,MAAOA,EACPG,MAAOA,EACPkuB,kBAAmBoH,EAAS75C,QAAQyyC,kBACpC2D,SAAUyD,EAASzD,SACnBE,cAAeuD,EAASvD,eAU1B,OARIpb,IACF2e,EAAS1D,SAAW,IAAI4C,GACxB/4C,EAAQukB,OAAQ,EAChBvkB,EAAQk7B,QAAS,EACjBl7B,EAAQg2C,QAAUA,EAClBh2C,EAAQyyC,mBAAoB,EAC5BzyC,EAAQm2C,SAAW0D,EAAS1D,UAEvB,IAAIJ,GAAmB/1C,GAC3B8uC,QACAnuC,MAAK,SAAAiL,GACJ,IAAO2sC,EAA6Ch5B,EAA9BqhB,GAAuBh1B,GAAO,GAAlC,GAMlB,OALI2sC,GACFA,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,qBACxB,IAEKqR,CACT,IACCjL,KAAKk5C,EAASjH,WACdjyC,MAAK,kBAAMk5C,EAASj7B,KAAK,CAAErkB,KAAM,aAAcgG,KAAMgkB,GAAS2W,IAAU,IACxEv6B,MAAK,WACAk5C,EAASrtB,iBACXqtB,EAASrtB,eAAiB,KAC1Bs6B,EAAYxB,mBAAoB,EAEpC,IAAE,OACK,SAAA3lD,GAEL,GADA6Z,EAAO7Z,MAAM,mBAAoBA,GAC7Bu7B,EAAQ,CACN2e,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAEtB,IAAI/5C,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,MAC7BuD,EAAMomB,QAAQ5oB,QAAQ,oBAAsB,IAC9Cf,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,KAAI,WAEnCy9C,EAASzF,KAAK,CAAE75C,KAAM,uBAAwB6B,KAAAA,GAChD,CACF,GACJ,KAAC0rD,CAAA,CAjFmB,CAASnrC,G,waCkJ/B,SA/HuB,SAAAG,GAAAV,EAAAgsC,EAAAtrC,GAAA,IAAAC,EAAAC,GAAAorC,GAAA,SAAAA,IAAA,OAAAvyC,EAAA,KAAAuyC,GAAArrC,EAAA3F,MAAA,KAAAC,UAAA,CA4HpB,OA5HoBV,EAAAyxC,EAAA,EAAApvD,IAAA,SAAAG,MAErB,SAAAsrC,GAAgE,IAAAsjB,EAAAtjB,EAAvDrgB,MAAAA,OAAK,IAAA2jC,GAAOA,EAAAC,EAAAvjB,EAAElgB,MAAAA,OAAK,IAAAyjC,GAAOA,EAAApO,EAAAnV,EAAEvJ,OAAAA,OAAM,IAAA0e,GAAQA,EAAE5D,EAAOvR,EAAPuR,QACnDx8B,EAAO9B,MAAM,oCAADiB,OAC0ByL,EAAK,YAAAzL,OAAW4L,EAAK,aAAA5L,OAAYuiB,IAEvE,IAAQ2e,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MA4DtB,OAAI0D,EAASrtB,gBACXuT,GAAY8Z,EAASrtB,eAAgBpI,GACrC4b,GAAY6Z,EAASrtB,eAAgBjI,GACrCs1B,EAASj7B,KAAK,CAAErkB,KAAM,aAAcgG,IAAKgkB,IAClCtkB,QAAQC,WA5DR,IAAID,SAAQ,SAACC,EAASC,GAC3B,GACE6+B,GAAgBpD,0CACfV,EACD,CACA,IAAOuH,EAAmDljB,EAArCs6B,EAASC,YAAYrzB,iBAAgB,GAAzC,GACV2b,EAAmD7iB,EAArCs6B,EAASC,YAAYtzB,iBAAgB,GAAzC,GACjB,KACIjC,GAASgc,GAAmBkC,IACJ,UAA1BA,EAAW9N,YACe,UAA1ByN,EAAWzN,YACV0L,GAAqBoC,IAWtB,OATIoX,EAASzD,UAAYyD,EAASzD,SAAStJ,gBACzC+M,EAASzD,SAAS7xB,EAAQ,QAAU,UACpC4c,GAAe0Y,EAASC,YAAav1B,GACrC2c,GAAa2Y,EAASzD,SAAStJ,eAAgBvoB,IAE/C2c,GAAa2Y,EAASC,YAAav1B,GAErCwb,GAAY8Z,EAASC,YAAa11B,QAClClkB,EAAQ25C,EAASC,YAGrB,CACID,EAASzD,WACXyD,EAASzD,SAAS5H,qBAClBqL,EAASzD,SAAS3H,aAEpB,IAAMzuC,EAAU,CACdokB,MAAOA,EACPG,MAAOA,EACPkuB,kBAAmBoH,EAAS75C,QAAQyyC,kBACpCyD,eAAgB2D,EAASC,YACzB1D,SAAUyD,EAASzD,SACnBE,cAAeuD,EAASvD,eAEtBpb,IACF2e,EAAS1D,SAAW,IAAI4C,GACxB/4C,EAAQk7B,QAAS,EACjBl7B,EAAQukB,OAAQ,EAChBvkB,EAAQg2C,QAAUA,EAClBh2C,EAAQyyC,mBAAoB,EAC5BzyC,EAAQo2C,SAAW,KACnBp2C,EAAQm2C,SAAW0D,EAAS1D,UAE9B,IAAIJ,GAAmB/1C,GACpBqoD,oBAAmB,WAClBxO,EAASzF,KAAK,CAAE75C,KAAM,sBACxB,IACCu0C,QACAnuC,KAAKT,GAAQ,MACPC,EACX,IAYGQ,MAAK,SAAAiL,GACJ,IAAO2sC,EAA6Ch5B,EAA9BqhB,GAAuBh1B,GAAO,GAAlC,GAMlB,OALI2sC,GACFA,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,qBACxB,IAEKqR,CACT,IACCjL,KAAKk5C,EAASjH,WACdjyC,MAAK,SAAAiL,GACA81B,GAA2B91B,GAC7BiuC,EAASyO,YAAY1V,UAAUhnC,GAE/BiuC,EAASj7B,KAAK,CAAErkB,KAAM,aAAcgG,KAAMgkB,GAAS2W,IAEvD,IACA,OACO,SAAArsB,GAYL,GAXA2K,EAAO7Z,MAAMkP,GAEXA,aAAekC,OACf,CACE,mBACA,uBACA,iBACAkU,SAASpW,EAAIzS,OAEfy9C,EAASzF,KAAK,CAAE75C,KAAM,UAAW6B,KAAM,SAAWyS,EAAIzS,OAEpD8+B,EAAQ,CACN2e,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAEtB,IAAI/5C,EAAO,gBAAHuc,OAAmB9J,EAAIzS,MAC3ByS,EAAIkX,QAAQ5oB,QAAQ,oBAAsB,IAC5Cf,EAAO,gBAAHuc,OAAmB9J,EAAIzS,KAAI,WAEjCy9C,EAASzF,KAAK,CAAE75C,KAAM,uBAAwB6B,KAAAA,GAChD,CACF,GAEN,KAACgsD,CAAA,CA5HoB,CAASzrC,G,waC+BhC,SAvCwB,SAAAG,GAAAV,EAAAmsC,EAAAzrC,GAAA,IAAAC,EAAAC,GAAAurC,GAAA,SAAAA,IAAA,OAAA1yC,EAAA,KAAA0yC,GAAAxrC,EAAA3F,MAAA,KAAAC,UAAA,CAoCrB,OApCqBV,EAAA4xC,EAAA,EAAAvvD,IAAA,SAAAG,MAEtB,SAAOyjB,GACL,IAAMhR,EAASo2B,GAAqBplB,EAAIhR,QACxC,IAAKA,EAEH,OADA4N,EAAO7Z,MAAM,4CAA6Cid,EAAIhR,QACvD3L,QAAQE,OAAO,IAAIsR,UAAU,mBAEtC,IAAA4pC,EAAkCjkD,KAAK2C,QAA/B8/C,EAAQwB,EAARxB,SAAUiN,EAAWzL,EAAXyL,YAClB,IAAKjN,EACH,MAAM,IAAI9oC,MAAM,0BAclB,OAZI8oC,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAElB0D,EAASzD,WACXyD,EAASzD,SAAS5H,qBAClBqL,EAASzD,SAAS3H,aAGpBoL,EAAS75C,QAAQokB,MAAQsb,GAAS9zB,GAClCiuC,EAAS75C,QAAQukB,MAAQqb,GAASh0B,GAE3BiuC,EACJjH,UAAUhnC,GACVjL,MAAK,WACJk5C,EAASrtB,eAAiB5gB,EAC1Bk7C,EAAYxB,mBAAoB,EAChCzL,EAASj7B,KAAK,CAAErkB,KAAM,aAAcgG,IAAKq/B,GAASh0B,IACpD,IAAE,OACK,SAAAiD,GACLgrC,EAASrtB,eAAiB,KAC1Bs6B,EAAYxB,mBAAoB,EAChC9rC,EAAO7Z,MAAMkP,EACf,GACJ,KAAC05C,CAAA,CApCqB,CAAS5rC,G,waCIjC,SAnBuB,SAAAG,GAAAV,EAAAosC,EAAA1rC,GAAA,IAAAC,EAAAC,GAAAwrC,GAAA,SAAAA,IAAA,OAAA3yC,EAAA,KAAA2yC,GAAAzrC,EAAA3F,MAAA,KAAAC,UAAA,CAgBpB,OAhBoBV,EAAA6xC,EAAA,EAAAxvD,IAAA,SAAAG,MACrB,SAAAsrC,GAAuB,IAAdhgB,EAAUggB,EAAVhgB,WACPjL,EAAO9B,MAAM,4BAA6B+M,GAC1C,IAAQo1B,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAElB,IAAIglC,GAAmB,CACrB3xB,MAAOy1B,EAASC,YAAYtzB,iBAAiB,GAAGmZ,QAChDpb,MAAO,CAAEE,WAAYA,GACrByxB,eAAgB2D,EAASC,YACzBxD,cAAeuD,EAASvD,gBAEvBxH,QACAnuC,KAAKk5C,EAASjH,WAAU,MAClBp5B,EAAO7Z,MAClB,KAAC6oD,CAAA,CAhBoB,CAAS7rC,G,waCchC,SAhBwB,SAAAsB,GAAA7B,EAAAqsC,EAAAxqC,GAAA,IAAAlB,EAAAC,GAAAyrC,GAAA,SAAAA,IAAA,OAAA5yC,EAAA,KAAA4yC,GAAA1rC,EAAA3F,MAAA,KAAAC,UAAA,CAarB,OAbqBV,EAAA8xC,EAAA,EAAAzvD,IAAA,SAAAG,MACtB,SAAOyjB,GACL,IACEriB,EAEEqiB,EAFFriB,KACWkjD,EACT7gC,EADF8rC,QAAWjL,0BAEP3D,EAAc2D,EAA0BuH,iBACxCxC,EAAe/E,EAA0BkL,kBAC/CprC,EAAAb,EAAA+rC,EAAAxwD,WAAA,eAAAgB,KAAA,KAAa,CACXsB,KAAAA,EACAu/C,YAAAA,EACA0I,aAAAA,GAEJ,KAACiG,CAAA,CAbqB,CAAS7qC,G,waCMjC,SANwB,SAAAK,GAAA7B,EAAAwsC,EAAA3qC,GAAA,IAAAlB,EAAAC,GAAA4rC,GAAA,SAAAA,IAAA,OAAA/yC,EAAA,KAAA+yC,GAAA7rC,EAAA3F,MAAA,KAAAC,UAAA,CAGrB,OAHqBV,EAAAiyC,EAAA,EAAA5vD,IAAA,SAAAG,MACtB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAK4rC,cAAcjsC,EAClC,KAACgsC,CAAA,CAHqB,CAAShrC,G,waC4BjC,SAxBwB,SAAAd,GAAAV,EAAA0sC,EAAAhsC,GAAA,IAAAC,EAAAC,GAAA8rC,GACtB,SAAAA,EAAY/uD,GAAS,IAAA2f,EAEoB,OAFpB7D,EAAA,KAAAizC,IACnBpvC,EAAAqD,EAAA9jB,KAAA,KAAMc,IACD2tD,QAAUhuC,EAAKguC,QAAQpnD,KAAIic,EAAA7C,IAAOA,CACzC,CAiBC,OAjBA/C,EAAAmyC,EAAA,EAAA9vD,IAAA,UAAAG,MAED,SAAQ8L,GAAI,IAAAsV,EAAA,KACV,OAAO,IAAIta,SAAQ,SAAAC,GACjBqa,EAAKxgB,QAAQkjB,KAAKyqC,QAAQziD,EAAI/E,EAChC,GACF,GAAC,CAAAlH,IAAA,SAAAG,MAED,SAAOyjB,GAAK,IAAA1B,EAAA,KACV9jB,KAAKswD,QAAQ9qC,EAAInD,QAAQ9Y,MACvB,SAAAgZ,GACEuB,EAAKnhB,QAAQ6kB,KAAK,CAAErkB,KAAM,iBAAkBof,KAAMA,EAAMpZ,GAAIqc,EAAIrc,IAClE,IACA,SAAAZ,GACE6Z,EAAO7Z,MAAM,6BAA8BA,EAC7C,GAEJ,KAACmpD,CAAA,CArBqB,CAASnsC,G,waCMjC,SAVyB,SAAAsB,GAAA7B,EAAA2sC,EAAA9qC,GAAA,IAAAlB,EAAAC,GAAA+rC,GAAA,SAAAA,IAAA,OAAAlzC,EAAA,KAAAkzC,GAAAhsC,EAAA3F,MAAA,KAAAC,UAAA,CAOtB,OAPsBV,EAAAoyC,EAAA,EAAA/vD,IAAA,SAAAG,MACvB,SAAOyjB,GACL,IAAAy+B,EAA2BjkD,KAAK2C,QAAxBkjB,EAAIo+B,EAAJp+B,KAAM48B,EAAQwB,EAARxB,SAEd58B,EACG+rC,eAAepsC,GAAI,OACb,SAAAjd,GAAK,OAAIk6C,EAASzF,KAAK,CAAE75C,KAAM,kBAAmBoF,MAAOA,GAAQ,GAC5E,KAACopD,CAAA,CAPsB,CAASnrC,G,waCyElC,SAvDwB,SAAAd,GAAAV,EAAA6sC,EAAAnsC,GAAA,IAAAC,EAAAC,GAAAisC,GAAA,SAAAA,IAAA,OAAApzC,EAAA,KAAAozC,GAAAlsC,EAAA3F,MAAA,KAAAC,UAAA,CAoDrB,OApDqBV,EAAAsyC,EAAA,EAAAjwD,IAAA,SAAAG,MACtB,SAAAsrC,GAAyD,IAAhDrgB,EAAKqgB,EAALrgB,MAAKw1B,EAAAnV,EAAEvJ,OAAAA,OAAM,IAAA0e,GAAQA,EAAE3D,EAAYxR,EAAZwR,aAAcD,EAAOvR,EAAPuR,QACpC6D,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAAS1D,UACX0D,EAAS1D,SAASnC,UAEpB6F,EAAS1D,SAAW,IAAI4C,GAcxB,IAAIhD,GAAmB,CACrB3xB,MAAOA,EACPG,OAAO,EACP2W,OAAQA,EACR8a,QAASA,EACTC,aAAcA,EACdC,eAAgB2D,EAASC,YACzB3D,SAAU0D,EAAS1D,SACnBE,gBAAgB,EAChBC,cAAeuD,EAASvD,gBAEvBxH,QACAnuC,MAAK,SAAAiL,GAGJ,IAAIs9C,EAAU,SACP3Q,EAAkDh5B,EAAnCohB,GAA4B/0B,GAAO,GAAvC,GAClB,GAAI2sC,EAAa,CACfA,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,mBACxB,IACA,IAAMwjC,EA1Da,SAAAwa,GAC3B,GAAIA,GAAkD,mBAA5BA,EAAY3qB,YAA4B,CAChE,IAAMkU,EAAWyW,EAAY3qB,cAC7B,GACEpQ,QAAQpG,MAAMpf,OAAOC,UAAUC,eAAgB4pC,EAAU,CACvD,mBAGF,OAAOA,EAAS/D,cAEpB,CACA,MAAO,EACT,CA8CiCorB,CAAqB5Q,GACxCxa,IACFmrB,EAAU,UAAHvwC,OAAaolB,GAExB,CACA8b,EAASzF,KAAK,CAAE75C,KAAM,mBAAoBqR,OAAAA,EAAQs9C,QAAAA,GACpD,IAAE,OAvCY,SAAAvpD,GAEd,GADA6Z,EAAO7Z,MAAM,qBAAsBA,GAC/Bu7B,EAAQ,CACV,IAAI9+B,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,MAC7BuD,EAAMomB,QAAQ5oB,QAAQ,oBAAsB,IAC9Cf,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,KAAI,WAEnCy9C,EAASzF,KAAK,CAAE75C,KAAM,gBAAiB6B,KAAAA,GACzC,CACAy9C,EAASzF,KAAK,CAAE75C,KAAM,mBACxB,GA+BF,KAAC0uD,CAAA,CApDqB,CAAStsC,G,waCmCjC,SAnD0B,SAAAG,GAAAV,EAAAgtC,EAAAtsC,GAAA,IAyBxBusC,EAzBwBtsC,EAAAC,GAAAosC,GAAA,SAAAA,IAAA,OAAAvzC,EAAA,KAAAuzC,GAAArsC,EAAA3F,MAAA,KAAAC,UAAA,CAgDvB,OAhDuBV,EAAAyyC,EAAA,EAAApwD,IAAA,cAAAG,MACxB,WAAc,IAAAugB,EAAA,KACJmgC,EAAaziD,KAAK2C,QAAlB8/C,SAUR,IAAI9D,GAAmB,CACrB3xB,MAAOy1B,EAASC,YAAYtzB,iBAAiB,GAAGmZ,QAChDpb,OAAO,EACP+xB,cAAeuD,EAASvD,gBAEvBxH,QACAnuC,MAAK,SAAA0tC,GACJ,IAAMziC,EAASiuC,EAASyP,YAAYC,aAAalb,GACjD,OAAO30B,EAAK5F,OAAO,CAAElI,OAAAA,GACvB,IAAE,OAjBY,SAAAjM,GACd6Z,EAAO7Z,MAAM,uBAAwBA,GAChCA,EAAMvD,KAAKmkB,MAAM,2BACpBs5B,EAASzF,KAAK,CAAE75C,KAAM,gBAAiB6B,KAAM,SAAFuc,OAAWhZ,EAAMvD,QAE9Dy9C,EAASzF,KAAK,CAAE75C,KAAM,mBACxB,GAaF,GAEA,CAAAvB,IAAA,SAAAG,OAAAkwD,EAAA7qB,GAAA3wB,KAAAA,MACA,SAAA62B,EAAAD,GAAA,IAAA+kB,EAAA59C,EAAA69C,EAAAP,EAAArP,EAAA6P,EAAA,OAAA77C,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OACkB,GADlB43C,EAAA/kB,EAAe74B,OAAAA,OAAM,IAAA49C,EAAG,KAAIA,EAAAC,EAAAhlB,EAAEykB,QAAAA,OAAO,IAAAO,EAAG,GAAEA,EAChC5P,EAAaziD,KAAK2C,QAAlB8/C,SACO,CAAFjV,EAAAhzB,KAAA,cACL,IAAIb,MAAM,0BAAyB,OAK1C,GAHG8oC,EAASzD,WACXyD,EAASzD,SAAS5H,qBAClBqL,EAASzD,SAAS3H,cAEhBoL,EAASyP,aAAgBzP,EAASyP,YAAYK,cAAa,CAAA/kB,EAAAhzB,KAAA,QAC7Dxa,KAAKwyD,cAAchlB,EAAAhzB,KAAA,gBAMlB,OAJG83C,EAAqB99C,GAAUiuC,EAASC,YACxCD,EAASyO,aAAezO,EAASyO,YAAY18C,SAE/C89C,EAAqB7P,EAASyO,YAAY18C,QAC3Cg5B,EAAAhzB,KAAA,GACKioC,EAASjH,UAAU8W,GAAmB,QAC5C7P,EAASj7B,KAAK,CAAErkB,KAAM,gBAAiBgG,IAAI,IAC3Cs5C,EAASj7B,KAAK,CAAErkB,KAAM,mBAAoBgG,IAAI,IAC9Cs5C,EAASzF,KAAK,CAAE75C,KAAM,uBAAwB2uD,QAAAA,IAAW,yBAAAtkB,EAAAlxB,OAAA,GAAAgxB,EAAA,UAE5D,SAAA9kB,GAAA,OAAAypC,EAAAjyC,MAAA,KAAAC,UAAA,MAAA+xC,CAAA,CAhDuB,CAASzsC,G,waC6BnC,SA/ByB,SAAAG,GAAAV,EAAAytC,EAAA/sC,GAAA,IAAAC,EAAAC,GAAA6sC,GAAA,SAAAA,IAAA,OAAAh0C,EAAA,KAAAg0C,GAAA9sC,EAAA3F,MAAA,KAAAC,UAAA,CA4BtB,OA5BsBV,EAAAkzC,EAAA,EAAA7wD,IAAA,SAAAG,MAEvB,WACE,IAAQ0gD,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAASyO,cACPzO,EAASyO,YAAYlS,WACvByD,EAASyO,YAAYlS,SAAS5H,qBAC9BqL,EAASyO,YAAYlS,SAAS3H,YAC9BoL,EAASyO,YAAYlS,SAAW,MAElCyD,EAASyO,YAAY50C,OACrBmmC,EAASyO,YAAc,MAErBzO,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAElB0D,EAASyP,cACXzP,EAASyP,YAAYtV,UACrB6F,EAASyP,YAAc,MAEzBzP,EAASj7B,KAAK,CAAErkB,KAAM,mBAAoBgG,IAAI,IAC9Cs5C,EAASj7B,KAAK,CAAErkB,KAAM,gBAAiBgG,IAAI,IAC3Cs5C,EAASzF,KAAK,CAAE75C,KAAM,uBACtBs/C,EAASQ,mBAAoB,CAC/B,KAACwP,CAAA,CA5BsB,CAASltC,G,waCQlC,SARyB,SAAAsB,GAAA7B,EAAA0tC,EAAA7rC,GAAA,IAAAlB,EAAAC,GAAA8sC,GAAA,SAAAA,IAAA,OAAAj0C,EAAA,KAAAi0C,GAAA/sC,EAAA3F,MAAA,KAAAC,UAAA,CAKtB,OALsBV,EAAAmzC,EAAA,EAAA9wD,IAAA,SAAAG,MACvB,SAAOyjB,GAAK,IAAAlD,EAAA,KACVtiB,KAAK2C,QAAQkjB,KACV8sC,oBACAppD,MAAK,kBAAA4c,EAAAb,EAAAotC,EAAA7xD,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAmB,CAAEnf,KAAMqiB,EAAIriB,MAAM,GAC/C,KAACuvD,CAAA,CALsB,CAASlsC,G,waCMlC,SAN0B,SAAAd,GAAAV,EAAA4tC,EAAAltC,GAAA,IAAAC,EAAAC,GAAAgtC,GAAA,SAAAA,IAAA,OAAAn0C,EAAA,KAAAm0C,GAAAjtC,EAAA3F,MAAA,KAAAC,UAAA,CAGvB,OAHuBV,EAAAqzC,EAAA,EAAAhxD,IAAA,SAAAG,MACxB,WACE/B,KAAK2C,QAAQkjB,KAAKgtC,iBACpB,KAACD,CAAA,CAHuB,CAASrtC,G,waC6BnC,SAvB2B,SAAAsB,GAAA7B,EAAA8tC,EAAAjsC,GAAA,IAAAlB,EAAAC,GAAAktC,GAAA,SAAAA,IAAA,OAAAr0C,EAAA,KAAAq0C,GAAAntC,EAAA3F,MAAA,KAAAC,UAAA,CAoBxB,OApBwBV,EAAAuzC,EAAA,EAAAlxD,IAAA,SAAAG,MACzB,SAAOyjB,GAAK,IAAAlD,EAAA,KACV,OAAO,IAAI9B,EAAOgF,EAAI9F,IAAK8F,EAAI/E,OAAOsyC,YACpC,CAAE/tD,KAAMwgB,EAAIxgB,KAAMqe,MAAOmC,EAAInC,MAAOE,OAAQiC,EAAIjC,SAChD,SAAAtC,GACE,IAAKA,EAAS+xC,WAAY,CACxB,IAAIC,EAAWhyC,EAASiyC,OASxB,OARIjyC,EAAS1Y,OAAoC,qBAA3B0Y,EAAS1Y,MAAMomB,UACnCskC,GAAW,QAEb9sC,EAAAb,EAAAwtC,EAAAjyD,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAa,CACXnf,KAAM,QACNwgD,QAAS,4BACTuP,OAAQD,GAGZ,CACA9sC,EAAAb,EAAAwtC,EAAAjyD,WAAA,SAAAyhB,GAAAzgB,KAAAygB,EAAa,CAAEnf,KAAM,aAAcsd,MAAOQ,EAAS+xC,YACrD,GAEJ,KAACF,CAAA,CApBwB,CAAStsC,G,waCApC,SAN6B,SAAAd,GAAAV,EAAAmuC,EAAAztC,GAAA,IAAAC,EAAAC,GAAAutC,GAAA,SAAAA,IAAA,OAAA10C,EAAA,KAAA00C,GAAAxtC,EAAA3F,MAAA,KAAAC,UAAA,CAG1B,OAH0BV,EAAA4zC,EAAA,EAAAvxD,IAAA,SAAAG,MAC3B,WACE/B,KAAK2C,QAAQ8sD,QAAQ7S,SACvB,KAACuW,CAAA,CAH0B,CAAS5tC,G,waCyDtC,SAlDgC,SAAAG,GAAAV,EAAAouC,EAAA1tC,GAAA,IAAAC,EAAAC,GAAAwtC,GAC9B,SAAAA,EAAYzwD,GAAS,IAAA2f,EAEoB,OAFpB7D,EAAA,KAAA20C,IACnB9wC,EAAAqD,EAAA9jB,KAAA,KAAMc,IACD2tD,QAAUhuC,EAAKguC,QAAQpnD,KAAIic,EAAA7C,IAAOA,CACzC,CA2CC,OA3CA/C,EAAA6zC,EAAA,EAAAxxD,IAAA,UAAAG,MAED,SAAQ8L,GAAI,IAAAsV,EAAA,KACV,OAAO,IAAIta,SAAQ,SAACC,EAASC,GAC3B,GAAKoa,EAAKxgB,QAAQkjB,KAIlB,IACE1C,EAAKxgB,QAAQkjB,KAAKyqC,QAAQziD,EAAI/E,EAChC,CAAE,MAAOP,GACPQ,EAAOR,EACT,MAPEQ,EAAO,IAAI4Q,MAAM,kBAQrB,GACF,GAAC,CAAA/X,IAAA,SAAAG,MAED,SAAOyjB,GAAK,IAAA1B,EAAA,MACT0B,EAAI6tC,KAAO,IAAI1kD,SAAQ,SAAC4T,EAAM6P,EAAKihC,GAClC,IAAMxlD,EAAK0U,EAAKyoC,IACRpoC,EAAakB,EAAKnhB,QAAQ+sD,YAA1B9sC,SAEF0wC,EAAU/oD,QAAQ8oD,EAAIjhD,MAAK,SAAAmhD,GAAQ,OAAIA,EAASvI,MAAQpoC,CAAQ,KAEtEkB,EAAKwsC,QAAQziD,GACVtE,MAAK,SAAAkZ,GACJqB,EAAKnhB,QAAQ6kB,KAAK,CAChBrkB,KAAM,WACNof,KAAME,EACN6wC,QAASA,GAEb,IAAE,OACK,SAAA/qD,GAAK,OAAI6Z,EAAO7Z,MAAMA,EAAM,GACvC,KACCid,EAAIguC,KAAO,IAAI7kD,SAAQ,SAAA4T,GACtB,IAAM1U,EAAK0U,EAEXuB,EAAKwsC,QAAQziD,GACVtE,MAAK,SAAAkZ,GACJqB,EAAKnhB,QAAQ6kB,KAAK,CAAErkB,KAAM,cAAekf,OAAQxU,EAAI0U,KAAME,GAC7D,IAAE,OACK,SAAAla,GAAK,OAAI6Z,EAAO7Z,MAAMA,EAAM,GACvC,IACAvI,KAAK2C,QAAQ6kB,KAAK,CAAErkB,KAAM,kBAAmBswD,QAASjuC,EAAInQ,OAAS,IACrE,KAAC+9C,CAAA,CA/C6B,CAAS7tC,GCTzC,IAAMmuC,GAAgB,SAAAC,GAAM,OAAIz0C,OAAOlZ,WAAW2tD,GAAQjtD,QAAQ,GAAG,EAUrE,SARc,SAACmpB,EAAOE,EAAQtD,GAC5B,IAAMwnB,EAAQzzC,KAAKgsB,IAAIC,EAAIoD,MAAQA,EAAOpD,EAAIsD,OAASA,GAIvD,MAAO,CAAEF,MAHO6jC,GAAc7jC,EAAQokB,GAGblkB,OAFT2jC,GAAc3jC,EAASkkB,GAGzC,ECCA,YAAgBhwB,EAAMC,EAAMgoB,GAC1B,IAAI9nB,EACJ,OAAO,WACL,IAAIzhB,EAAU3C,KACZmkB,EAAOlE,UAKL2zC,EAAU1nB,IAAc9nB,EAC5BO,aAAaP,GACbA,EAAUS,YANE,WACVT,EAAU,KACL8nB,GAAWjoB,EAAKjE,MAAMrd,EAASwhB,EACtC,GAG4BD,GACxB0vC,GAAS3vC,EAAKjE,MAAMrd,EAASwhB,EACnC,CACD,ECRD,IACM0vC,GAAe,IADT,GAENC,GAAe,CAAEjkC,MAAO,IAAKE,OAAQ,KACrCgkC,GAAgB,CAAElkC,MAAO,IAAKE,OAAQ,KACtCikC,GAAe,CAAEnkC,MAAO,IAAKE,OAAQ,KACrCkkC,GAAc,CAAEpkC,MAAO,EAAGE,OAAQ,GAElCmkC,GACwC,mBAArCn0D,OAAOmxC,0BAEVijB,GAAe,CACnB39B,YAAa,iBAAO,CAAE3G,MAAO,EAAGE,OAAQ,EAAG,EAC3C7lB,iBAAkB,kBAAM,IAAI,GAGxB+1B,GAAc2H,GAAgB3H,cAS9Bm0B,GAAoB,SAAA5/C,GACxB,IAAOC,EAAgC0T,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GACZ,IAAK5a,EACH,OAAO,KAET,GAAIy/C,GAGF,OADkB,IAAIhjB,0BAA0Bz8B,GAC/BojC,SAASC,YAE5B,IAAAuc,EAA0B5/C,EAAM+hB,cAAxB3G,EAAKwkC,EAALxkC,MAAOE,EAAMskC,EAANtkC,OACT5C,EAAQnpB,SAASq/B,cAAc,SAcrC,OAbAlW,EAAM4qB,aAAc,EACpB5qB,EAAM6qB,OAAQ,EACd7qB,EAAM0C,MAAQA,EACd1C,EAAM4C,OAASA,EACf5C,EAAM8qB,UAAYzjC,EAClBC,EAAMvK,iBAAiB,WAAW,WAChCijB,EAAM8qB,UAAY,IACpB,IACA9qB,EACGkrB,OAAM,OACA,SAAA9vC,GAAK,OACV6Z,EAAOlC,KAAK,0BAA2B3X,EAAOA,EAAMomB,QAAQ,IAEzDxB,CACT,EA6CMmnC,GAAW,WAEf,SAAAA,EAAY9sB,EAAQhzB,GAAQiK,EAAA,KAAA61C,GAC1Bt0D,KAAKwnC,OAASA,EACdxnC,KAAKwU,OAASA,EACdxU,KAAKu0D,OAAS,KACdv0D,KAAK8jC,OAAS,KACd9jC,KAAKu3C,YAAc,KACnBv3C,KAAK2C,QAAU3C,KAAKwnC,OAAOtB,WAAW,KAAM,CAC1CriC,OAAO,EACPyrC,gBAAgB,IAElBtvC,KAAKw0D,KAAO,EACZx0D,KAAKy0D,QAAUV,GACf/zD,KAAK00D,iBAAkB,EAEvB10D,KAAK20D,KAAO30D,KAAK20D,KAAKzrD,KAAKlJ,MAC3BA,KAAK03C,MAAQ13C,KAAK03C,MAAMxuC,KAAKlJ,MAC7BA,KAAKsc,KAAOtc,KAAKsc,KAAKpT,KAAKlJ,MAC3BA,KAAKgvB,QAAUhvB,KAAKgvB,QAAQ9lB,KAAKlJ,MACjCA,KAAK40D,SAAW50D,KAAK40D,SAAS1rD,KAAKlJ,MACnCA,KAAKw7C,UAAYx7C,KAAKw7C,UAAUtyC,KAAKlJ,MACrCA,KAAK60D,UAAY70D,KAAK60D,UAAU3rD,KAAKlJ,MACrCA,KAAK80D,UAAY90D,KAAK80D,UAAU5rD,KAAKlJ,MACrCA,KAAK+0D,sBAAwB/0D,KAAK+0D,sBAAsB7rD,KAAKlJ,MAE7DA,KAAKg1D,YAAcC,GAASj1D,KAAK20D,KAAMd,GACzC,CA+GA,IAAAqB,EAqGC,OAnND31C,EAAA+0C,EAAA,EAAA1yD,IAAA,UAAAG,MAEA,SAAQ6e,GACN5gB,KAAK4gB,cAAgBA,CACvB,GAAC,CAAAhf,IAAA,WAAAG,MAED,SAASozD,GACPn1D,KAAKm1D,eAAiBA,CACxB,GAEA,CAAAvzD,IAAA,QAAAG,MACA,WACE,IAzDoBqzD,EAyDb7d,EAA2CpvB,EAA5B6hB,GAAgBhqC,KAAKwU,QAAO,GAAhC,GAClBxU,KAAKu3C,YAAcA,EACftX,KA3DgBm1B,EA4DFp1D,MAzDdq1D,aAAe,CAAEhmC,eAAgB,iBAAM,EAAE,GAC/C+lC,EAAMvW,aAAe,CAAExvB,eAAgB,iBAAM,EAAE,GAyD3CrvB,KAAK60D,UAAU,CAAES,WAAY,QAASC,SAAU,UAAY,UAE5Dv1D,KAAK60D,UAAU,CAAES,WAAY,QAASC,SAAU,UAAY,UAC5Dv1D,KAAKw7C,UAAUx7C,KAAKwU,SAEtBxU,KAAK20D,MACP,GAAC,CAAA/yD,IAAA,OAAAG,MAED,WACM/B,KAAKwU,SACPs0B,GAAW9oC,KAAKwU,QAChBxU,KAAKwU,OAAS,KACdxU,KAAKu0D,OAAS,KACdv0D,KAAK8jC,OAAS,KACd9jC,KAAK6+C,aAAe,KACpB7+C,KAAKq1D,aAAe,KACpBr1D,KAAKu3C,YAAc,KAEvB,GAEA,CAAA31C,IAAA,YAAAG,MACA,SAAUkzB,GACRj1B,KAAKwU,OAASygB,EACdj1B,KAAKq1D,aAAe,IAAI7kC,YACtB4Z,GAAYnV,GACRyU,GAAazU,GACbwU,GAAgBxU,IAEtBj1B,KAAK6+C,aAAe,IAAIruB,YACtB+Y,GAA4BvpC,KAAKwU,SAEnC,IAAMghD,EArF0B,SAAAhhD,GAClC,GAAIA,GAAUA,EAAO6a,iBAAiB/sB,OAAS,EAAG,CAChD,IAAOmS,EAAgC0T,EAAvB3T,EAAO6a,iBAAgB,GAA3B,GACZ,GAAI,WAAY5a,EACd,OAAOA,EAAM+yB,MAEjB,CACA,OAAO,IACT,CA6E2BiuB,CAA4Bz1D,KAAKq1D,cACpDG,GACFx1D,KAAK00D,iBAAkB,EACvB10D,KAAKu0D,OAASiB,IAEdx1D,KAAK00D,iBAAkB,EACvB10D,KAAKu0D,OAASH,GAAkBp0D,KAAKq1D,eAEvCr1D,KAAK8jC,OAASswB,GAAkBp0D,KAAK6+C,cACrC7+C,KAAK+0D,wBACL/0D,KAAK01D,cAAe,CACtB,GAAC,CAAA9zD,IAAA,YAAAG,MAED,SAAU4zD,EAAUrrC,GAClBtqB,KAAK41D,eAAiBD,GAAY31D,KAAK41D,eACvC51D,KAAK61D,kBAAoBvrC,GAAQtqB,KAAK61D,kBACtC71D,KAAK01D,cAAe,CACtB,GAAC,CAAA9zD,IAAA,wBAAAG,MAED,WAGE,IA3Icqd,EAAQmsB,EAClBuqB,EACAC,EAEAlmC,EAAOE,EACTygB,EACAJ,EAqIqE4lB,EAAA7tC,EAAlCnoB,KAAK6+C,aAAaxvB,iBAAgB,MACjE4mC,QADY,IAAAD,EAAG7B,GAAY6B,GACQx/B,cACnC0/B,GA7IQ92C,EA6Iapf,KAAKwnC,OA5I5BsuB,GADkBvqB,EA6IkB0qB,GA5ITpmC,MAAQ0b,EAAOxb,OAC1CgmC,EAAoB32C,EAAOyQ,MAAQzQ,EAAO2Q,OAE1CF,EAAkBzQ,EAAlByQ,MAAOE,EAAW3Q,EAAX2Q,OACTygB,EAAI,EACJJ,EAAI,EAIJ0lB,EAAoBC,IACtBlmC,EAAQ0b,EAAO1b,OAASE,EAASwb,EAAOxb,QACxCygB,GAAKpxB,EAAOyQ,MAAQA,GAAS,GAI3BimC,EAAoBC,IACtBhmC,EAASwb,EAAOxb,QAAUF,EAAQ0b,EAAO1b,OACzCugB,GAAKhxB,EAAO2Q,OAASA,GAAU,GAG1B,CAAEygB,EAAGA,EAAGJ,EAAGA,EAAGvgB,MAAOA,EAAOE,OAAQA,IAyH8BomC,EAAAhuC,EAAlCnoB,KAAKq1D,aAAahmC,iBAAgB,MACjE+mC,QADY,IAAAD,EAAGhC,GAAYgC,GACO3/B,cAExCx2B,KAAKy0D,QAAU,CACb4B,MAAOvC,GACPwC,OAAQvC,GACRwC,MAAOvC,GACPwC,KAAMvC,IACNj0D,KAAK61D,mBAEP,IAAMY,EAAYC,GAChBN,EAAoBvmC,MACpBumC,EAAoBrmC,OACpB/vB,KAAKy0D,SAGPz0D,KAAK22D,MAAQ,CACX7yB,OAAQ,CAAEjU,MAAOqmC,EAAUrmC,MAAOE,OAAQmmC,EAAUnmC,QACpDwkC,OAAQ,CAAE1kC,MAAO4mC,EAAU5mC,MAAOE,OAAQ0mC,EAAU1mC,SAGtD,IAAM6mC,EAAc,CAClBpmB,EACqC,UAAnCxwC,KAAK41D,eAAeN,WAChBt1D,KAAKwnC,OAAO3X,MAAQ7vB,KAAK22D,MAAMpC,OAAO1kC,MACtC,EACNugB,EACmC,WAAjCpwC,KAAK41D,eAAeL,SAChBv1D,KAAKwnC,OAAOzX,OAAS/vB,KAAK22D,MAAMpC,OAAOxkC,OACvC,GAER/vB,KAAK62D,UAAY,CACf/yB,OAAQ,CAAE0M,EAAG0lB,EAAU1lB,EAAGJ,EAAG8lB,EAAU9lB,GACvCmkB,OAAQ,CAAE/jB,EAAGomB,EAAYpmB,EAAGJ,EAAGwmB,EAAYxmB,GAG/C,GAEA,CAAAxuC,IAAA,OAAAG,OAAAmzD,EAAA9tB,GAAA3wB,KAAAA,MACA,SAAA62B,IAAA,IAAAO,EAAAipB,EAAApyD,EAAAqyD,EAAAC,EAAA9d,EAAA,OAAAziC,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,UAAAgzB,EAAAnxB,KAAA,EAESrc,KAAKwU,QAAWxU,KAAKwU,OAAOurC,OAAM,CAAAvS,EAAAhzB,KAAA,eAAAgzB,EAAArzB,OAAA,iBAcX,GAT5Bna,KAAK+0D,wBAGD/0D,KAAKm1D,gBAAkBn1D,KAAK01D,eAC9B11D,KAAKm1D,iBACLn1D,KAAK01D,cAAe,GAIhB7nB,EAAKopB,YAAYxyC,OACnBzkB,KAAK8jC,OAAQ,CAAF0J,EAAAhzB,KAAA,SACgB,GAAzBs8C,EAAc92D,KAAK8jC,SAErBowB,IAEAl0D,KAAK8jC,kBAAkBozB,6BAA2B,CAAA1pB,EAAAhzB,KAAA,gBAAAgzB,EAAAhzB,KAAA,GAE7Bxa,KAAK8jC,OAAOiV,OAAM,QAAjCr0C,EAAM8oC,EAAAxzB,KACZ88C,EAAcpyD,EAAO3C,MAAM,QAE7B/B,KAAK80D,UACHgC,EACA92D,KAAK62D,UAAU/yB,OACf9jC,KAAK22D,MAAM7yB,QACX,GACA,GACA,QAEyB,GAAzBizB,EAAc/2D,KAAKu0D,SAErBL,IAEAl0D,KAAKu0D,kBAAkB2C,6BAA2B,CAAA1pB,EAAAhzB,KAAA,gBAAAgzB,EAAAhzB,KAAA,GAE7Bxa,KAAKu0D,OAAOxb,OAAM,QAAjCr0C,EAAM8oC,EAAAxzB,KACZ+8C,EAAcryD,EAAO3C,MAAM,QAE7B/B,KAAK80D,UACHiC,EACA/2D,KAAK62D,UAAUtC,OACfv0D,KAAK22D,MAAMpC,OACXv0D,KAAK00D,iBACL,IAEIxb,EAAK+d,YAAYxyC,OACdopB,GAAMgmB,IACbzxC,EAAOlC,KAAK,yBAADqB,OAA0B23B,EAAKrL,EAAE,QAI9C,IACM7tC,KAAKu3C,aACPv3C,KAAKu3C,YAAY5M,cAErB,CAAE,MAAOpiC,GACP6Z,EAAOlC,KAAK,yCAADqB,OAA0ChZ,EAAMomB,SAC7D,CAGA3uB,KAAKg1D,cAAcxnB,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,SAEnBprB,EAAO7Z,MAAKilC,EAAAK,IACZ7tC,KAAK4gB,cAAa4sB,EAAAK,IAAQ,yBAAAL,EAAAlxB,OAAA,GAAAgxB,EAAA,mBAE7B,kBAAA4nB,EAAAl1C,MAAA,KAAAC,UAAA,IAGD,CAAAre,IAAA,YAAAG,MACA,SAAUorB,EAAOjE,EAAKoB,EAAMoqC,EAAiBzqB,GAG3C,IAAQtnC,EAAoB3C,KAApB2C,QAAS6kC,EAAWxnC,KAAXwnC,OACjB,GACGra,IACCunC,KACAvnC,aAAiB8V,mBACf9V,EAAM8qB,WAAc9qB,EAAM8qB,UAAU8H,QAStC9V,IAAmByqB,GACrB/xD,EAAQw0D,UAAU,EAAG,EAAG3vB,EAAO3X,MAAO2X,EAAOzX,QAG/CptB,EAAQ4sC,UAAUpiB,EAAOjE,EAAIsnB,EAAGtnB,EAAIknB,EAAG9lB,EAAKuF,MAAOvF,EAAKyF,QACpDmkC,IAAiD,mBAAhB/mC,EAAMge,OACzChe,EAAMge,YAnBR,CAME,IAAMisB,EAAUz0D,EAAQ00D,gBAAgB,EAAG,GAC3C10D,EAAQ+tC,aAAa0mB,EAAS,EAAG,EAEnC,CAYF,KAAC9C,CAAA,CA/Oc,GAkPjB,Y,waCvVgD,IAE1CgD,GAAe,SAAA5xC,GAAAV,EAAAsyC,EAAA5xC,GAAA,IAAAC,EAAAC,GAAA0xC,GAAA,SAAAA,IAAA,OAAA74C,EAAA,KAAA64C,GAAA3xC,EAAA3F,MAAA,KAAAC,UAAA,CAuElB,OAvEkBV,EAAA+3C,EAAA,EAAA11D,IAAA,SAAAG,MACnB,SAAAsrC,GASG,IARDrgB,EAAKqgB,EAALrgB,MACAG,EAAKkgB,EAALlgB,MACAqa,EAAM6F,EAAN7F,OAAMgb,EAAAnV,EACNvJ,OAAAA,OAAM,IAAA0e,GAAQA,EACd5D,EAAOvR,EAAPuR,QACAgW,EAAQvnB,EAARunB,SAAQ2C,EAAAlqB,EACRmqB,aAAAA,OAAY,IAAAD,GAAQA,EAAAlF,EAAAhlB,EACpBykB,QAAAA,OAAO,IAAAO,EAAG,QAAOA,EAET5P,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAMlB,IAAM89C,EAAU3c,GAAciW,iCACxB/R,EAAW,IAAIvJ,GAAuB,eAC5CuJ,EAAS7C,iBAAiBsb,GAE1B,IAAMzoC,EAAU,SAAAzmB,GACd6Z,EAAO7Z,MAAM,kBAAmBA,IAC3Bk6C,EAASyO,aAAelS,GAC3BA,EAAS3H,aAEN9uC,EAAMvD,KAAKmkB,MAAM,2BAA6B2a,GACjD2e,EAASzF,KAAK,CAAE75C,KAAM,gBAAiB6B,KAAM,SAAFuc,OAAWhZ,EAAMvD,QAE9Dy9C,EAASzF,KAAK,CAAE75C,KAAM,mBACxB,EAEA,IAAIw7C,GAAmB,CACrB3xB,MAAOA,EACPG,MAAOA,EACPkuB,kBAAmBoH,EAAS75C,QAAQyyC,kBACpCvX,OAAQA,EACR8a,QAASA,EACTpX,OAAQA,EACRsX,eAAgB2D,EAASC,YACzB1D,SAAUA,EACVE,cAAeuD,EAASvD,gBAEvBxH,QACAnuC,MAAK,SAAAiL,GAGJ,IAAO2sC,EAAkDh5B,EAAnCohB,GAA4B/0B,GAAO,GAAvC,GAYlB,OAXI2sC,GACFA,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,oBACtB0lC,GAAUsY,EACZ,IAEFsB,EAASyO,YAAc,IAAIoD,GAAY9sB,EAAQhzB,GAC/CiuC,EAASyO,YAAYlS,SAAWA,EAChCyD,EAASyO,YAAYliC,QAAQA,GAC7ByzB,EAASyO,YAAY0D,SAASA,GAC9BnS,EAASyO,YAAYxZ,QACdljC,CACT,IACCjL,MAAK,SAAAiL,GACAgjD,EACF/U,EAASzF,KAAK,CAAE75C,KAAM,mBAAoBqR,OAAAA,EAAQs9C,QAAAA,IAElDrP,EAASzF,KAAK,CAAE75C,KAAM,gBAAiBmvD,mBAAoB99C,GAE/D,IAAE,MACKwa,EACX,KAACsoC,CAAA,CAvEkB,CAAS/xC,GA0ExBmyC,GAAgB,SAAA1xC,GAAAhB,EAAA0yC,EAAA1xC,GAAA,IAAAC,EAAAL,GAAA8xC,GAAA,SAAAA,IAAA,OAAAj5C,EAAA,KAAAi5C,GAAAzxC,EAAAjG,MAAA,KAAAC,UAAA,CAWnB,OAXmBV,EAAAm4C,EAAA,EAAA91D,IAAA,SAAAG,MACpB,SAAAisC,GAA2B,IAAlB2nB,EAAQ3nB,EAAR2nB,SAAUrrC,EAAI0jB,EAAJ1jB,KACTm4B,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAElB,IACE8oC,EAASyO,YAAY2D,UAAUc,EAAUrrC,EAC3C,CAAE,MAAO/hB,GACP6Z,EAAO7Z,MAAMA,EACf,CACF,KAACmvD,CAAA,CAXmB,CAASnyC,GCjFzBoyC,GAC4D,mBAAzD10B,iBAAiBpiC,UAAU+2D,0BAC9B33B,GAAc2H,GAAgB3H,cAiSpC,SA/RiB,WAEf,SAAA43B,EAAAxqB,GAQG,IAPD7F,EAAM6F,EAAN7F,OACAyoB,EAAI5iB,EAAJ4iB,KACA6H,EAAOzqB,EAAPyqB,QACAC,EAAU1qB,EAAV0qB,WACAC,EAAY3qB,EAAZ2qB,aACAC,EAAK5qB,EAAL4qB,MACAC,EAAa7qB,EAAb6qB,cAAaz5C,EAAA,KAAAo5C,GAEb73D,KAAKirC,GAAK,KACVjrC,KAAK4hD,MAAQ,KACb5hD,KAAKm4D,SAAW,KAChBn4D,KAAKo4D,MAAQ,KACbp4D,KAAKwnC,OAASA,EACdxnC,KAAK86B,IAAM0R,IAAI2B,gBAAgB8hB,GAC/BjwD,KAAK6yC,IAAMrL,EAAOtB,WAAW,MAC7BlmC,KAAKmtB,MAAQnpB,SAASq/B,cAAc,SACpCrjC,KAAK2B,SAAW,CAAEm2D,QAAAA,EAASC,WAAAA,EAAYC,aAAAA,EAAcC,MAAAA,EAAOC,cAAAA,GAC5Dl4D,KAAK4gB,cAAgB,KACrB5gB,KAAKq4D,oBAAsBr4D,KAAKs4D,eAAepvD,KAAKlJ,MACpDA,KAAKu4D,sBAAwBv4D,KAAKw4D,iBAAiBtvD,KAAKlJ,MACxDA,KAAKy4D,WAAY,EACjBz4D,KAAK04D,iBAAkB,EACvB14D,KAAK6hD,cAAgB,KACrB7hD,KAAKi3C,gBAAkB,KACvBj3C,KAAK24D,YAAc,KACnB34D,KAAK44D,gBAAkB,KACvB54D,KAAK64D,WACP,CA8PC,OA9PAt5C,EAAAs4C,EAAA,EAAAj2D,IAAA,iBAAAG,MAED,WACE/B,KAAK6yC,IAAItD,UAAUvvC,KAAKmtB,MAAO,EAAG,GAEhCntB,KAAKo4D,MADHT,GACW33D,KAAKmtB,MAAMyqC,0BACtB53D,KAAKq4D,qBAGMxyB,sBAAsB7lC,KAAKq4D,oBAE5C,GAEA,CAAAz2D,IAAA,YAAAG,MACA,WAAY,IAAAugB,EAAA,KACF6K,EAAUntB,KAAVmtB,MACRA,EAAM4qB,aAAc,EACpB5qB,EAAM2rC,SAAWvuD,QAAQ01B,IACzB9S,EAAMmW,QAAU,GAChBnW,EAAM4rC,UAAY/4D,KAAKg5D,YAAY9vD,KAAKlJ,MACxCmtB,EAAM8rC,QAAUj5D,KAAKk5D,aAAahwD,KAAKlJ,MACvCmtB,EAAMgsC,SAAWn5D,KAAKo5D,cAAclwD,KAAKlJ,MACzCmtB,EAAMksC,aAAer5D,KAAKs5D,kBAAkBpwD,KAAKlJ,MACjDmtB,EAAMirB,aAAep4C,KAAKu5D,aAAarwD,KAAKlJ,MAC5CmtB,EAAMpjB,QAAU/J,KAAKw5D,aAAatwD,KAAKlJ,MACvCmtB,EAAM6yB,QAAUhgD,KAAKy5D,WAAWvwD,KAAKlJ,MACrCA,KAAK24D,YAAc9zC,YAAW,kBAAMvC,EAAKk3C,cAAc,GAAE,KACzDrsC,EAAMoW,IAAMvjC,KAAK86B,GACnB,GAEA,CAAAl5B,IAAA,eAAAG,MACA,WACE,IAAQorB,EAAkBntB,KAAlBmtB,MAAOqa,EAAWxnC,KAAXwnC,OACf7iB,aAAa3kB,KAAK24D,aAClB34D,KAAK2B,SAASo2D,WAAW5qC,EAAMusC,UAC/BlyB,EAAO3X,MAAQ1C,EAAMwsC,WACrBnyB,EAAOzX,OAAS5C,EAAMysC,YACtB55D,KAAKirC,GAAK,IAAKlrC,OAAO27B,cAAgB37B,OAAO47B,oBAC7C37B,KAAKm4D,SAAWn4D,KAAKirC,GAAG4uB,aACxB75D,KAAKirC,GAAG6uB,yBAAyB3sC,GAAO80B,QAAQjiD,KAAKm4D,UACrDn4D,KAAKm4D,SAASlW,QAAQjiD,KAAKirC,GAAG8uB,aAC1BpC,KACF33D,KAAKo4D,MAAQjrC,EAAMyqC,0BAA0B53D,KAAKq4D,sBAEpDr4D,KAAK2B,SAASu2D,cAAcl4D,KAAKg6D,cAAc9wD,KAAKlJ,OACpD,IACEA,KAAK6yC,IAAItD,UAAUpiB,EAAO,EAAG,EAC/B,CAAE,MAAO5kB,GAIP,YAHIvI,KAAK4gB,eACP5gB,KAAK4gB,cAAcrY,GAGvB,CACAvI,KAAK2B,SAASm2D,UACV3qC,EAAM2rC,UACRj0C,YAAW,WACTsI,EAAM2sB,QACN3sB,EAAM8sC,YAAc,CACtB,GAEJ,GAAC,CAAAr4D,IAAA,gBAAAG,MAED,SAAcoB,EAAMpB,GAClB,MAAa,SAAToB,EACKnD,KAAKk6D,eACM,UAAT/2D,EACFnD,KAAKm6D,iBACM,SAATh3D,EACTnD,KAAKo6D,aAAar4D,GACA,WAAToB,GACTnD,KAAKq6D,eAAet4D,GAEf8G,QAAQC,UACjB,GAAC,CAAAlH,IAAA,eAAAG,MAED,WACE,IAAQorB,EAAUntB,KAAVmtB,MACR,OAAIA,EAAMgpB,SAAWn2C,KAAKy4D,UACjBtrC,EAAMkrB,OAAO9uC,MAClB,kBAAM4jB,EAAMgpB,MAAM,IAClB,kBAAMhpB,EAAMgpB,MAAM,IAGfttC,QAAQC,QAAQqkB,EAAMgpB,OAC/B,GAAC,CAAAv0C,IAAA,gBAAAG,MAED,WACE,IAAQorB,EAAUntB,KAAVmtB,MAIR,OAHKA,EAAMgpB,QAAUn2C,KAAKy4D,WACxBtrC,EAAM2sB,QAEDjxC,QAAQC,QAAQqkB,EAAMgpB,OAC/B,GAAC,CAAAv0C,IAAA,eAAAG,MAED,SAAau4D,GACX,IAAQntC,EAAUntB,KAAVmtB,MACRntB,KAAK04D,iBAAkB,EACnB4B,GAAQntC,EAAMusC,SAChBvsC,EAAM8sC,YAAc9sC,EAAMusC,SAAW,GAErCvsC,EAAM8sC,YAAcK,EAEtBt6D,KAAK04D,iBAAkB,CACzB,GAAC,CAAA92D,IAAA,iBAAAG,MAED,SAAew4D,GACTv6D,KAAKm4D,WACPn4D,KAAKm4D,SAASqC,KAAKz4D,MAAQw4D,EAE/B,GAAC,CAAA34D,IAAA,cAAAG,MAED,WACE/B,KAAKy4D,WAAY,EACZd,KACH33D,KAAKo4D,MAAQvyB,sBAAsB7lC,KAAKq4D,sBAEtCr4D,KAAK44D,kBACPxsB,qBAAqBpsC,KAAK44D,iBAC1B54D,KAAK44D,gBAAkB,KAE3B,GAAC,CAAAh3D,IAAA,eAAAG,MAED,WAEE/B,KAAKy4D,WAAY,GACZd,IAAqB33D,KAAKo4D,OAC7BhsB,qBAAqBpsC,KAAKo4D,MAE9B,GAAC,CAAAx2D,IAAA,gBAAAG,MAED,WACO41D,IAAsB33D,KAAKy4D,WAC9Bz4D,KAAK6yC,IAAItD,UAAUvvC,KAAKmtB,MAAO,EAAG,EAEtC,GAAC,CAAAvrB,IAAA,oBAAAG,MAED,WACO/B,KAAK04D,iBACR14D,KAAK2B,SAASq2D,aAAah4D,KAAKmtB,MAAM8sC,YAE1C,GAAC,CAAAr4D,IAAA,eAAAG,MAED,WACE,IAAQorB,EAAUntB,KAAVmtB,MACF5kB,EACJ4kB,GAASA,EAAM5kB,MAAQ4kB,EAAM5kB,MAAQ,IAAI8R,UAAU,sBACrD+H,EAAO7Z,MAAM,qBAAsBA,GAC/BvI,KAAK4gB,eACP5gB,KAAK4gB,cAAcrY,EAEvB,GAAC,CAAA3G,IAAA,aAAAG,MAED,WACE/B,KAAK2B,SAASs2D,OAChB,GAAC,CAAAr2D,IAAA,mBAAAG,MAED,WACE/B,KAAK6yC,IAAItD,UAAUvvC,KAAKmtB,MAAO,EAAG,GAClCntB,KAAK44D,gBAAkB/yB,sBAAsB7lC,KAAKu4D,sBACpD,GAEA,CAAA32D,IAAA,eAAAG,MACA,SAAak1C,GACX,IACOwjB,EAAkDtyC,EADpCnoB,KAAKwnC,OAAOC,cAAc,IACNpY,iBAAgB,GAAjC,GAEnBorC,EAAkBjzB,SACrBizB,EAAkBt3D,KAAO,eACzBs3D,EAAkBjzB,OAASxnC,KAAKwnC,QAElC,IAAMmO,EAAY,IAAInlB,YAAY,CAACiqC,IAcnC,OAbAz6D,KAAK4hD,MAAQ5hD,KAAKirC,GAAGC,+BACrBlrC,KAAKm4D,SAASlW,QAAQjiD,KAAK4hD,OAC3B5hD,KAAKirC,GAAG+W,wBAAwB/K,GAAiBgL,QAAQjiD,KAAK4hD,OAC9D5hD,KAAK4hD,MAAMptC,OACR4a,iBACAzgB,SAAQ,SAAA8F,GAAK,OAAIkhC,EAAU3jB,SAASvd,EAAM,IAC7CzU,KAAKi3C,gBAAkBA,EACvBj3C,KAAK6hD,cAAgB,IAAIrxB,YACvBymB,EAAgB7nB,iBAAiB7N,OAAOk5C,IAErCz6D,KAAKy4D,YACRz4D,KAAK44D,gBAAkB/yB,sBAAsB7lC,KAAKu4D,wBAE7C5iB,CACT,GAAC,CAAA/zC,IAAA,cAAAG,MAED,WACE,OAAOwI,QAAQvK,KAAK6hD,cACtB,GAAC,CAAAjgD,IAAA,mBAAAG,MAED,WACE,OAAO/B,KAAK6hD,aACd,GAAC,CAAAjgD,IAAA,UAAAG,MAED,SAAQJ,GACN3B,KAAK4gB,cAAgBjf,CACvB,GAEA,CAAAC,IAAA,UAAAG,MACA,WAAU,IAAAohB,EAAA,KACAgK,EAAUntB,KAAVmtB,MACRxI,aAAa3kB,KAAK24D,aACd34D,KAAK86B,MACP0R,IAAImH,gBAAgB3zC,KAAK86B,KACzB96B,KAAK86B,IAAM,MAET96B,KAAKo4D,QACHT,GACFxqC,EAAMutC,yBAAyB16D,KAAKo4D,OAEpChsB,qBAAqBpsC,KAAKo4D,OAE5Bp4D,KAAKo4D,MAAQ,MAEXp4D,KAAK44D,kBACPxsB,qBAAqBpsC,KAAK44D,iBAC1B54D,KAAK44D,gBAAkB,MAErB54D,KAAKi3C,kBACPnO,GAAW9oC,KAAKi3C,iBAChBj3C,KAAKi3C,gBAAkB,MAErBj3C,KAAK6hD,gBACP/Y,GAAW9oC,KAAK6hD,eAChB7hD,KAAK6hD,cAAgB,MAEnB7hD,KAAK4hD,QACP9Y,GAAW9oC,KAAK4hD,MAAMptC,QACtBxU,KAAK4hD,MAAQ,MAEX5hD,KAAKirC,KACPjrC,KAAKm4D,SAASwC,aACd36D,KAAKirC,GAAGE,QAAQ5hC,MAAK,WACnB4Z,EAAK8nB,GAAK,KACV9nB,EAAKg1C,SAAW,IAClB,KAEEhrC,IACFA,EAAM2sB,QACN3sB,EAAM4rC,UAAY,KAClB5rC,EAAM8rC,QAAU,KAChB9rC,EAAMksC,aAAe,KACrBlsC,EAAMirB,aAAe,KACrBjrB,EAAMgsC,SAAW,KACjBhsC,EAAMpjB,QAAU,KAChBojB,EAAM6yB,QAAU,KAChBhgD,KAAKmtB,MAAQ,MAEfntB,KAAK2B,SAAW,KAChB3B,KAAK4gB,cAAgB,KACrB5gB,KAAK6yC,IAAM,KACX7yC,KAAKwnC,OAAS,KACdxnC,KAAKq4D,oBAAsB,IAC7B,KAACR,CAAA,CA5Rc,G,waCN2B,IAEtC+C,GAAe,SAAAl1C,GAAAV,EAAA41C,EAAAl1C,GAAA,IAAAC,EAAAC,GAAAg1C,GAAA,SAAAA,IAAA,OAAAn8C,EAAA,KAAAm8C,GAAAj1C,EAAA3F,MAAA,KAAAC,UAAA,CAsBlB,OAtBkBV,EAAAq7C,EAAA,EAAAh5D,IAAA,SAAAG,MACnB,SAAO4sB,GACL,IAAQ8zB,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAElB,IAAMqV,EAAU,SAAAzmB,GACd6Z,EAAO7Z,MAAM,kBAAmBA,GAChC,IAAMvD,EACJuD,IAAUA,aAAiBsyD,YAActyD,aAAiBgnB,cACtD,mBACA,kBACNkzB,EAASzF,KAAK,CAAE75C,KAAM,UAAW6B,KAAMA,IACvCy9C,EAASzF,KAAK,CAAE75C,KAAM,mBACxB,EAEA,IACEs/C,EAASyP,YAAc,IAAI2F,GAAYlpC,GACvC8zB,EAASyP,YAAYljC,QAAQA,EAC/B,CAAE,MAAOzmB,GACPymB,EAAQzmB,EACV,CACF,KAACqyD,CAAA,CAtBkB,CAASr1C,G,waCI9B,SANsB,SAAAG,GAAAV,EAAA81C,EAAAp1C,GAAA,IAAAC,EAAAC,GAAAk1C,GAAA,SAAAA,IAAA,OAAAr8C,EAAA,KAAAq8C,GAAAn1C,EAAA3F,MAAA,KAAAC,UAAA,CAGnB,OAHmBV,EAAAu7C,EAAA,EAAAl5D,IAAA,SAAAG,MACpB,WACE/B,KAAK2C,QAAQkjB,KAAKk1C,aACpB,KAACD,CAAA,CAHmB,CAASv1C,G,waCM/B,SAN2B,SAAAG,GAAAV,EAAAg2C,EAAAt1C,GAAA,IAAAC,EAAAC,GAAAo1C,GAAA,SAAAA,IAAA,OAAAv8C,EAAA,KAAAu8C,GAAAr1C,EAAA3F,MAAA,KAAAC,UAAA,CAGxB,OAHwBV,EAAAy7C,EAAA,EAAAp5D,IAAA,SAAAG,MACzB,WACE/B,KAAK2C,QAAQkjB,KAAKo1C,kBACpB,KAACD,CAAA,CAHwB,CAASz1C,G,waCMpC,SANmB,SAAAG,GAAAV,EAAAk2C,EAAAx1C,GAAA,IAAAC,EAAAC,GAAAs1C,GAAA,SAAAA,IAAA,OAAAz8C,EAAA,KAAAy8C,GAAAv1C,EAAA3F,MAAA,KAAAC,UAAA,CAGhB,OAHgBV,EAAA27C,EAAA,EAAAt5D,IAAA,SAAAG,MACjB,SAAOyjB,GACLxlB,KAAK2C,QAAQkjB,KAAKs1C,SAAS31C,EAAInD,OACjC,KAAC64C,CAAA,CAHgB,CAAS31C,G,waCuB5B,SAvB4B,SAAAG,GAAAV,EAAAo2C,EAAA11C,GAAA,IAAAC,EAAAC,GAAAw1C,GAAA,SAAAA,IAAA,OAAA38C,EAAA,KAAA28C,GAAAz1C,EAAA3F,MAAA,KAAAC,UAAA,CAoBzB,OApByBV,EAAA67C,EAAA,EAAAx5D,IAAA,SAAAG,MAE1B,SAAOyjB,GACL,IAAQi9B,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAASzD,WACO,YAAdx5B,EAAI9L,OACN+oC,EAASzD,SAAS6D,UACdJ,EAASyO,aAAezO,EAASyO,YAAYlS,UAC/CyD,EAASyO,YAAYlS,SAAS6D,WAET,WAAdr9B,EAAI9L,QACb+oC,EAASzD,SAAS4D,SACdH,EAASyO,aAAezO,EAASyO,YAAYlS,UAC/CyD,EAASyO,YAAYlS,SAAS4D,UAItC,KAACwY,CAAA,CApByB,CAAS71C,G,waCIrC,IAAM81C,GAAyB,SAAA/J,GACzBA,EAAQvS,WACVuS,EAAQvS,SAASnC,UACjB0U,EAAQvS,SAAW,KAEvB,EAEMuc,GAAqB,SAAA/yD,GACzB,IAAIvD,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,MAIjC,OAHIuD,EAAMomB,QAAQ5oB,QAAQ,oBAAsB,IAC9Cf,EAAO,gBAAHuc,OAAmBhZ,EAAMvD,KAAI,WAE5BA,CACT,EAiDA,SA/C4B,SAAA0gB,GAAAV,EAAAu2C,EAAA71C,GAAA,IAC1BusC,EAD0BtsC,EAAAC,GAAA21C,GAAA,SAAAA,IAAA,OAAA98C,EAAA,KAAA88C,GAAA51C,EAAA3F,MAAA,KAAAC,UAAA,CA4CzB,OA5CyBV,EAAAg8C,EAAA,EAAA35D,IAAA,SAAAG,OAC1BkwD,EAAA7qB,GAAA3wB,KAAAA,MACA,SAAA62B,EAAAD,GAAA,IAAAuR,EAAAC,EAAA4D,EAAA+Y,EAAA5yD,EAAA4L,EAAAinD,EAAAC,EAAAva,EAAA,OAAA1qC,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OAEkB,GAFHokC,EAAOvR,EAAPuR,QACTC,EAAe,KACX4D,EAAaziD,KAAK2C,QAAlB8/C,SACO,CAAFjV,EAAAhzB,KAAA,cACL,IAAIb,MAAM,0BAAyB,OAGqB,OAHrB6zB,EAAAnxB,KAAA,EAGnCm/C,EAAqB,IAAI7c,GAAmB,CAAEC,QAAAA,IAAUpR,EAAAhzB,KAAA,EACzCghD,EAAmB9rC,kBAAiB,OAAzDmvB,EAAYrR,EAAAxzB,KAAAwzB,EAAAhzB,KAAG,GAAH,cAGwD,OAHxDgzB,EAAAnxB,KAAG,GAAHmxB,EAAAK,GAAAL,EAAA,SAEZprB,EAAO7Z,MAAM,yBAAwBilC,EAAAK,IACrC4U,EAASzF,KAAK,CAAE75C,KAAM,UAAW6B,KAAMs2D,GAAkB9tB,EAAAK,MAAWL,EAAArzB,OAAA,kBAYrE,OATDkhD,GAAuB5Y,GACvBA,EAAS1D,SAAW,IAAI4C,GAClB/4C,EAAU,CACdokB,MAAOy1B,EAASC,YAAYtzB,iBAAiB,GAAGmZ,QAChDpb,OAAO,EACP2W,QAAQ,EACR8a,QAAAA,EACAG,SAAU0D,EAAS1D,SACnBF,aAAAA,GACDrR,EAAAnxB,KAAA,GAAAmxB,EAAAhzB,KAAA,GAEsB,IAAImkC,GAAmB/1C,GAAS8uC,QAAO,QAAtDljC,EAAMg5B,EAAAxzB,KAAAyhD,EACUjyB,GAAuBh1B,GAAOknD,EAAAvzC,EAAAszC,EAAA,IAA7Cta,EAAWua,EAAA,KAEhBva,EAAYj3C,iBAAiB,SAAS,WACpCu4C,EAASzF,KAAK,CAAE75C,KAAM,qBACxB,IAEFs/C,EAASjH,UAAUhnC,GAAQg5B,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAA0L,GAAA1L,EAAA,UAE3BprB,EAAO7Z,MAAM,yBAAwBilC,EAAA0L,IACrCmiB,GAAuB5Y,GACvBA,EAASzF,KAAK,CACZ75C,KAAM,uBACN6B,KAAMs2D,GAAkB9tB,EAAA0L,MAE1BuJ,EAASzF,KAAK,CAAE75C,KAAM,uBAAwB,yBAAAqqC,EAAAlxB,OAAA,GAAAgxB,EAAA,2BAEjD,SAAA9kB,GAAA,OAAAypC,EAAAjyC,MAAA,KAAAC,UAAA,MAAAs7C,CAAA,CA5CyB,CAASh2C,G,waCLrC,SAd6B,SAAAG,GAAAV,EAAA22C,EAAAj2C,GAAA,IAAAC,EAAAC,GAAA+1C,GAAA,SAAAA,IAAA,OAAAl9C,EAAA,KAAAk9C,GAAAh2C,EAAA3F,MAAA,KAAAC,UAAA,CAW1B,OAX0BV,EAAAo8C,EAAA,EAAA/5D,IAAA,SAAAG,MAC3B,WACE,IAAQ0gD,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAAS1D,WACX0D,EAAS1D,SAASnC,UAClB6F,EAAS1D,SAAW,MAEtB0D,EAASzF,KAAK,CAAE75C,KAAM,sBACxB,KAACw4D,CAAA,CAX0B,CAASp2C,GCAtC,IAAM0a,GAAc2H,GAAgB3H,cAoGpC,SAlGmB,WACjB,SAAA27B,IAAcn9C,EAAA,KAAAm9C,GACZ57D,KAAK67D,eAAiB,KACtB77D,KAAK87D,eAAiB,KACtB97D,KAAKgrC,WAAa,KAClBhrC,KAAKqrC,WAAa,KAClBrrC,KAAK+7D,WAAa,KAClB/7D,KAAKg8D,WAAa,KAClBh8D,KAAKi8D,gBAAkBj8D,KAAKk8D,WAAWhzD,KAAKlJ,MAC5CA,KAAKm8D,gBAAkBn8D,KAAKy5D,WAAWvwD,KAAKlJ,MAC5CA,KAAK2mB,UAAY,EACnB,CAoFC,OApFApH,EAAAq8C,EAAA,EAAAh6D,IAAA,gBAAAG,MAED,SAAc0S,IACPwrB,IAAexrB,GAA8B,UAArBA,EAAM8oB,aACjCv9B,KAAK67D,eAAiBpnD,EAE1B,GAAC,CAAA7S,IAAA,gBAAAG,MAED,SAAc0S,IACPwrB,IAAexrB,GAA8B,UAArBA,EAAM8oB,aACjCv9B,KAAK87D,eAAiBrnD,EAE1B,GAAC,CAAA7S,IAAA,kBAAAG,MAED,WACE/B,KAAKo8D,cACDp8D,KAAK67D,iBACP77D,KAAKgrC,WAAahrC,KAAK67D,eACvB77D,KAAK67D,eAAiB,KACtB77D,KAAKgrC,WAAW9gC,iBAAiB,QAASlK,KAAKi8D,kBAE7Cj8D,KAAK87D,iBACP97D,KAAKqrC,WAAarrC,KAAK87D,eACvB97D,KAAK87D,eAAiB,KACtB97D,KAAKqrC,WAAWnhC,iBAAiB,QAASlK,KAAKm8D,iBAEnD,GAAC,CAAAv6D,IAAA,oBAAAG,MAED,WACE/B,KAAK67D,eAAiB,KACtB77D,KAAK87D,eAAiB,IACxB,GAAC,CAAAl6D,IAAA,aAAAG,MAED,WAAa,IAAAugB,EAAA,KACX,GAAItiB,KAAKg8D,WAGP,OAFAr3C,aAAa3kB,KAAKg8D,iBAClBh8D,KAAKg9C,KAAK,CAAE75C,KAAM,sBAGpBnD,KAAK+7D,WAAal3C,YAAW,WACvBvC,EAAK05C,YACPr3C,aAAarC,EAAK05C,YAClB15C,EAAK06B,KAAK,CAAE75C,KAAM,uBAElBmf,EAAK06B,KAAK,CAAE75C,KAAM,sBAEtB,GAAG,IACL,GAAC,CAAAvB,IAAA,aAAAG,MAED,WAAa,IAAAohB,EAAA,KACXnjB,KAAKg8D,WAAan3C,YAAW,WACtB1B,EAAK44C,YACR54C,EAAK65B,KAAK,CAAE75C,KAAM,sBAEtB,GAAG,IACL,GAAC,CAAAvB,IAAA,UAAAG,MAED,SAAQJ,GACN3B,KAAK2mB,UAAU9gB,KAAKlE,EACtB,GAAC,CAAAC,IAAA,OAAAG,MAED,SAAKyjB,GACHxlB,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GAAQ,OAAIA,EAASxxB,EAAI,GAClD,GAAC,CAAA5jB,IAAA,cAAAG,MAED,WACE4iB,aAAa3kB,KAAK+7D,YAClBp3C,aAAa3kB,KAAKg8D,YACdh8D,KAAKgrC,aACPhrC,KAAKgrC,WAAW7gC,oBAAoB,QAASnK,KAAKi8D,iBAClDj8D,KAAKgrC,WAAa,MAEhBhrC,KAAKqrC,aACPrrC,KAAKqrC,WAAWlhC,oBAAoB,QAASnK,KAAKm8D,iBAClDn8D,KAAKqrC,WAAa,MAEpBrrC,KAAK+7D,WAAa,KAClB/7D,KAAKg8D,WAAa,IACpB,GAAC,CAAAp6D,IAAA,UAAAG,MAED,WACE/B,KAAK2mB,UAAUrkB,OAAS,EACxBtC,KAAKygD,oBACLzgD,KAAKo8D,aACP,KAACR,CAAA,CA/FgB,GCoNnB,SA/MY,WACV,SAAAS,EAAY/K,GAAS7yC,EAAA,KAAA49C,GACnBr8D,KAAKmtB,MAAQ,KACbntB,KAAKwU,OAAS,KACdxU,KAAKigD,aAAe,KACpBjgD,KAAKg/C,SAAW,KAChBh/C,KAAKk/C,cAAgB,KACrBl/C,KAAKsxD,QAAUA,EACftxD,KAAKs8D,UAAW,EAChBt8D,KAAKu8D,WAAa,IACpB,CA6LC,IAAAC,EAvCDC,EAhDAC,EAdCC,EAnDDC,EAnCAC,EAgMC,OAhMDt9C,EAAA88C,EAAA,EAAAz6D,IAAA,QAAAG,OAAA86D,EAAAz1B,GAAA3wB,KAAAA,MACA,SAAA62B,IAAA,IAAAgkB,EAAAhvC,EAAA,YAAA7L,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OACiB,GAAP82C,EAAYtxD,KAAZsxD,QACH1pB,GAAgBhB,mBAAoB,CAAF4G,EAAAhzB,KAAA,QACiB,OAAtD82C,EAAQtU,KAAK,CAAE75C,KAAM,gCAAiCqqC,EAAArzB,OAAA,iBAQhC,OARgCqzB,EAAAnxB,KAAA,EAItDrc,KAAKu8D,WAAa13C,YAChB,kBAAMvC,EAAK0M,QAAQ,IAAIrV,MAAM,uBAAuB,GACpD,KAEF3Z,KAAK88D,iBAAiBtvB,EAAAhzB,KAAA,EAChBxa,KAAK+8D,kBAAiB,cAAAvvB,EAAAhzB,KAAA,GACtBxa,KAAKg9D,aAAY,QACvBr4C,aAAa3kB,KAAKu8D,YAClBv8D,KAAKs8D,UAAW,EAChBhL,EAAQtU,KAAK,CAAE75C,KAAM,UAAW48C,QAAQ,IAAQvS,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,SAEhDxtC,KAAKgvB,QAAOwe,EAAAK,IAAQ,yBAAAL,EAAAlxB,OAAA,GAAAgxB,EAAA,mBAEvB,kBAAAuvB,EAAA78C,MAAA,KAAAC,UAAA,KAAAre,IAAA,UAAAG,MAED,SAAQwG,GACN,IAAQ+oD,EAAYtxD,KAAZsxD,QACR3sC,aAAa3kB,KAAKu8D,YAClBn6C,EAAO7Z,MAAM,eAAgBA,GACzB+oD,GACFA,EAAQtU,KAAK,CAAE75C,KAAM,kBACrBmuD,EAAQtU,KAAK,CAAE75C,KAAM,kBAErBnD,KAAKsc,MAET,GAEA,CAAA1a,IAAA,eAAAG,OAAA66D,EAAAx1B,GAAA3wB,KAAAA,MACA,SAAAw3B,IAAA,IAAA9gB,EAAA3Y,EAAAyrC,EAAAjB,EAAAE,EAAA/7B,EAAA,YAAA1M,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,UACOxa,KAAKs8D,SAAU,CAAFpuB,EAAA1zB,KAAA,eAAA0zB,EAAA/zB,OAAA,iBASe,OANzBgT,EAAyDntB,KAAzDmtB,MAAO3Y,EAAkDxU,KAAlDwU,OAAQyrC,EAA0CjgD,KAA1CigD,aAAcjB,EAA4Bh/C,KAA5Bg/C,SAAUE,EAAkBl/C,KAAlBk/C,cAC/Cl/C,KAAKu8D,WAAa13C,YAChB,kBAAM1B,EAAK6L,QAAQ,IAAIrV,MAAM,uBAAuB,GACpD,KACAu0B,EAAA7xB,KAAA,EAEA8Q,EAAM8qB,UAAYgI,EAAa/R,EAAA1zB,KAAA,EACzB2S,EAAMkrB,OAAM,OAajB,OAZG6G,IACFA,EAActC,UACd58C,KAAKk/C,cAAgB,MAEnBF,IACFA,EAAS5H,qBACT4H,EAAS3H,YACTr3C,KAAKg/C,SAAW,MAEdxqC,IACFs0B,GAAWt0B,GACXxU,KAAKwU,OAAS,MACf05B,EAAA1zB,KAAA,GACKxa,KAAKg9D,aAAY,QACvBr4C,aAAa3kB,KAAKu8D,YAAYruB,EAAA1zB,KAAA,iBAAA0zB,EAAA7xB,KAAA,GAAA6xB,EAAAL,GAAAK,EAAA,SAE9BluC,KAAKgvB,QAAOkf,EAAAL,IAAQ,yBAAAK,EAAA5xB,OAAA,GAAA2xB,EAAA,mBAEvB,kBAAA2uB,EAAA58C,MAAA,KAAAC,UAAA,IAED,CAAAre,IAAA,iBAAAG,MACA,WACE,IAAQ8d,EAAey+B,EAAfz+B,WACF2nB,EAASxjC,SAASq/B,cAAc,UAChCwP,EAAMrL,EAAOtB,WAAW,KAAM,CAAEriC,OAAO,IAC7C2jC,EAAO3X,MAAQ,IACf2X,EAAOzX,OAASlQ,EAAa,IAAM,IACnCgzB,EAAIzM,UAAY,UAChByM,EAAIxM,SAAS,EAAG,EAAGmB,EAAO3X,MAAO2X,EAAOzX,QAExC,IAAMjP,EAAO,IAAIm8C,OACfp9C,EACI,yHACA,0HAENgzB,EAAIzM,UAAY,UAChByM,EAAIqqB,KAAKp8C,GACT9gB,KAAKigD,aAAezY,EAAOC,eAC7B,GAAC,CAAA7lC,IAAA,kBAAAG,OAAA46D,EAAAv1B,GAAA3wB,KAAAA,MAED,SAAA83B,IAAA,IAAAphB,EAAArJ,EAAA,YAAArN,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,OAOsC,OAN9B2S,EAAQnpB,SAASq/B,cAAc,SACrCrjC,KAAKmtB,MAAQA,EACbA,EAAM6qB,OAAQ,EACd7qB,EAAM4qB,aAAc,EACpB5qB,EAAMgwC,wBAA0B,kBAAMr5C,EAAKs5C,WAAW,EACtDjwC,EAAM8rC,QAAU,SAAA5rB,GAAA,IAAGjuB,EAAMiuB,EAANjuB,OAAM,OAAO0E,EAAKo1C,aAAa95C,EAAO,EACzD+N,EAAM8qB,UAAYj4C,KAAKigD,aAAazR,EAAAh0B,KAAA,EAC9B2S,EAAMkrB,OAAM,cAAA7J,EAAAh0B,KAAA,GACZ2S,EAAMkwC,0BAAyB,yBAAA7uB,EAAAlyB,OAAA,GAAAiyB,EAAA,UACtC,kBAAAouB,EAAA38C,MAAA,KAAAC,UAAA,IAED,CAAAre,IAAA,aAAAG,OAAA26D,EAAAt1B,GAAA3wB,KAAAA,MACA,SAAA+iC,IAAA,IAAA6B,EAAAl4C,EAAAyF,EAAAmxC,EAAA,YAAAtjC,KAAAA,MAAA,SAAAkjC,GAAA,cAAAA,EAAAt9B,KAAAs9B,EAAAn/B,MAAA,OAgBG,OAfO6gC,EAAsBr7C,KAAKsxD,QAAQ1oD,QAAnCyyC,qBAEAl4C,EAAO23C,GAAciW,iCAC3B/wD,KAAKg/C,SAAW,IAAIvJ,GAAuB,UAC3Cz1C,KAAKg/C,SAAS7C,iBAAiBh5C,IAEjCnD,KAAKk/C,cAAgB,IAAI0c,GACzB57D,KAAKk/C,cAAcgJ,SAAQ,SAAAl+C,GAAK,OAAI+vC,EAAKujB,cAActzD,EAAM,IAEvDpB,EAAU,CACdokB,OAAO,EACPG,OAAO,EACPkuB,kBAAmBA,EACnB2D,SAAUh/C,KAAKg/C,SACfE,cAAel/C,KAAKk/C,eACrBvF,EAAAn/B,KAAA,EACmB,IAAImkC,GAAmB/1C,GAAS8uC,QAAO,OACxB,OADnC13C,KAAKwU,OAAMmlC,EAAA3/B,KACXha,KAAKmtB,MAAM8qB,UAAYj4C,KAAKwU,OAAOmlC,EAAAn/B,KAAA,GAC7Bxa,KAAKmtB,MAAMkrB,OAAM,yBAAAsB,EAAAr9B,OAAA,GAAAk9B,EAAA,UACxB,kBAAAkjB,EAAA18C,MAAA,KAAAC,UAAA,KAAAre,IAAA,YAAAG,MAED,WACM/B,KAAKsxD,QACPtxD,KAAKsxD,QAAQtU,KAAK,CAAE75C,KAAM,iBAE1BnD,KAAKsc,MAET,GAAC,CAAA1a,IAAA,eAAAG,MAED,SAAaorB,GAEXtI,YAAW,kBAAMsI,EAAMkrB,OAAM,OAAO,WAAO,GAAE,GAC/C,GAAC,CAAAz2C,IAAA,gBAAAG,MAED,SAAAisC,GAAoBA,EAAJ7qC,KACLioB,SAAS,YAChBzG,aAAa3kB,KAAKu8D,YACdv8D,KAAKsxD,SACPtxD,KAAKsxD,QAAQtU,KAAK,CAAE75C,KAAM,gCAC1BnD,KAAKsxD,QAAQtU,KAAK,CAAE75C,KAAM,kBAE1BnD,KAAKsc,OAGX,GAEA,CAAA1a,IAAA,OAAAG,OAAA06D,EAAAr1B,GAAA3wB,KAAAA,MACA,SAAAujC,IAAA,IAAA7sB,EAAA3Y,EAAAyrC,EAAAjB,EAAAE,EAAA,OAAAzoC,KAAAA,MAAA,SAAAwjC,GAAA,cAAAA,EAAA59B,KAAA49B,EAAAz/B,MAAA,OAEgC,GADtB2S,EAAyDntB,KAAzDmtB,MAAO3Y,EAAkDxU,KAAlDwU,OAAQyrC,EAA0CjgD,KAA1CigD,aAAcjB,EAA4Bh/C,KAA5Bg/C,SAAUE,EAAkBl/C,KAAlBk/C,cAC/Cv6B,aAAa3kB,KAAKu8D,aACdpvC,EAAO,CAAF8sB,EAAAz/B,KAAA,SAE8B,GADrC2S,EAAM8rC,QAAU,KAChB9rC,EAAMgwC,wBAA0B,KAC5Bn5D,SAASu5D,0BAA4BpwC,EAAK,CAAA8sB,EAAAz/B,KAAA,gBAAAy/B,EAAA59B,KAAA,EAAA49B,EAAAz/B,KAAA,EAEpCxW,SAASw5D,uBAAsB,OAAAvjB,EAAAz/B,KAAA,iBAAAy/B,EAAA59B,KAAA,GAAA49B,EAAApM,GAAAoM,EAAA,iBAIzC9sB,EAAM8qB,UAAY,KAClBj4C,KAAKmtB,MAAQ,KAAK,QAEhB+xB,IACFA,EAActC,UACd58C,KAAKk/C,cAAgB,MAEnBF,IACFA,EAAS5H,qBACT4H,EAAS3H,YACTr3C,KAAKg/C,SAAW,MAEdxqC,IACFs0B,GAAWt0B,GACXxU,KAAKwU,OAAS,MAEZyrC,IACFnX,GAAWmX,GACXjgD,KAAKigD,aAAe,MAElBjgD,KAAKs8D,WACHt8D,KAAKsxD,SACPtxD,KAAKsxD,QAAQtU,KAAK,CAAE75C,KAAM,UAAW48C,QAAQ,IAE/C//C,KAAKs8D,UAAW,GACjB,yBAAAriB,EAAA39B,OAAA,GAAA09B,EAAA,mBACF,kBAAAyiB,EAAAz8C,MAAA,KAAAC,UAAA,KAAAre,IAAA,UAAAG,OAAAy6D,EAAAp1B,GAAA3wB,KAAAA,MAED,SAAAgnD,IAAA,OAAAhnD,KAAAA,MAAA,SAAAinD,GAAA,cAAAA,EAAArhD,KAAAqhD,EAAAljD,MAAA,cAAAkjD,EAAAljD,KAAA,EACQxa,KAAKsc,OAAM,OACjBtc,KAAKsxD,QAAU,KAAK,wBAAAoM,EAAAphD,OAAA,GAAAmhD,EAAA,UACrB,kBAAAjB,EAAAx8C,MAAA,KAAAC,UAAA,MAAAo8C,CAAA,CA5MS,G,waCRsB,IAE5BsB,GAAgB,SAAAj4C,GAAAV,EAAA24C,EAAAj4C,GAAA,IAAAC,EAAAC,GAAA+3C,GAAA,SAAAA,IAAA,OAAAl/C,EAAA,KAAAk/C,GAAAh4C,EAAA3F,MAAA,KAAAC,UAAA,CAYnB,OAZmBV,EAAAo+C,EAAA,EAAA/7D,IAAA,SAAAG,MACpB,WACE,IAAQ0gD,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAASmb,OACXnb,EAASzF,KAAK,CAAE75C,KAAM,UAAW48C,OAAQ0C,EAASmb,OAAOtB,YAG3D7Z,EAASmb,OAAS,IAAIvB,GAAO5Z,GAC7BA,EAASmb,OAAOlmB,QAClB,KAACimB,CAAA,CAZmB,CAASp4C,GAezBs4C,GAAe,SAAA73C,GAAAhB,EAAA64C,EAAA73C,GAAA,IAAAC,EAAAL,GAAAi4C,GAAA,SAAAA,IAAA,OAAAp/C,EAAA,KAAAo/C,GAAA53C,EAAAjG,MAAA,KAAAC,UAAA,CAYlB,OAZkBV,EAAAs+C,EAAA,EAAAj8D,IAAA,SAAAG,MACnB,WACE,IAAQ0gD,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEb8oC,EAASmb,QAIdnb,EAASmb,OAAOhhB,UAChB6F,EAASmb,OAAS,MAJhBnb,EAASzF,KAAK,CAAE75C,KAAM,UAAW48C,QAAQ,GAK7C,KAAC8d,CAAA,CAZkB,CAASt4C,GAexBu4C,GAAiB,SAAAC,GAAA/4C,EAAA84C,EAAAC,GAAA,IAAAC,EAAAp4C,GAAAk4C,GAAA,SAAAA,IAAA,OAAAr/C,EAAA,KAAAq/C,GAAAE,EAAAh+C,MAAA,KAAAC,UAAA,CASpB,OAToBV,EAAAu+C,EAAA,EAAAl8D,IAAA,SAAAG,MACrB,WACE,IAAQ0gD,EAAaziD,KAAK2C,QAAlB8/C,SACR,IAAKA,EACH,MAAM,IAAI9oC,MAAM,0BAEd8oC,EAASmb,QACXnb,EAASmb,OAAOK,cAEpB,KAACH,CAAA,CAToB,CAASv4C,G,waC3BoB,IAE9C24C,GAAmB,SAAAr3C,GAAA7B,EAAAk5C,EAAAr3C,GAAA,IACvBorC,EADuBtsC,EAAAC,GAAAs4C,GAAA,SAAAA,IAAA,OAAAz/C,EAAA,KAAAy/C,GAAAv4C,EAAA3F,MAAA,KAAAC,UAAA,CA4BtB,OA5BsBV,EAAA2+C,EAAA,EAAAt8D,IAAA,SAAAG,OACvBkwD,EAAA7qB,GAAA3wB,KAAAA,MACA,SAAA62B,EAAa9nB,GAAG,IAAAi9B,EAAAz1B,EAAAG,EAAAoM,EAAA4kC,EAAA1pD,EAAAiZ,EAAA2mC,EAAAvmC,EAAA+sB,EAAAujB,EAAA,OAAA3nD,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OAIgC,OAHtCioC,EAAaziD,KAAK2C,QAAlB8/C,SAAQjV,EAAAnxB,KAAA,EAER2Q,EAAQsb,GAASma,EAASC,aAC1Bv1B,EAAQqb,GAASia,EAASC,aAAYlV,EAAAhzB,KAAA,EACtC,IAAIw2C,GAAkBhxD,KAAK2C,SAAS+Z,OAAO,CAAEsQ,MAAAA,EAAOG,MAAAA,IAAQ,OACd,MAA9CoM,EAASkpB,EAASC,YAAYtzB,mBACtBmK,EAAOj3B,OAAS,GAAC,CAAAkrC,EAAAhzB,KAAA,SACjB,OADiB2jD,EAAAh2C,EACboR,EAAM,GAAf9kB,EAAK0pD,EAAA,GAAA3wB,EAAAhzB,KAAA,GACUsgC,GAAcwF,oBAAmB,QAAjD5yB,EAAO8f,EAAAxzB,KAAAq6C,EACQ5/C,EAAM+hB,cAAnB1I,EAAQumC,EAARvmC,SACF+sB,EAAQntB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAaA,CAAQ,IAC5D8Z,GAAgB3F,qCACbm8B,EAAmBtrB,GAAahL,KAAK,qBAC1B9a,MAAQ,CAAEc,SAAU,CAAEvB,MAAOuB,IAC9CglB,GAAajL,MAAM,mBAAoBu2B,GACvCtrB,GAAajL,MAAM,UAAW/Z,IAE5B+sB,IACFr1B,EAAI64C,eAAiBxjB,EAAM91C,OAC5B,QAAAyoC,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,SAGHprB,EAAO7Z,MAAM,sBAAqBilC,EAAAK,IAAS,QAE7C1nB,EAAAb,EAAA44C,EAAAr9D,WAAA,eAAAgB,KAAA,KAAa2jB,GAAK,yBAAAgoB,EAAAlxB,OAAA,GAAAgxB,EAAA,mBACnB,SAAA9kB,GAAA,OAAAypC,EAAAjyC,MAAA,KAAAC,UAAA,MAAAi+C,CAAA,CA5BsB,CAAS13C,GA+B5B83C,GAAmB,SAAAl3C,GAAApC,EAAAs5C,EAAAl3C,GAAA,IAAAm3C,EAAAt4C,EAAAL,GAAA04C,GAAA,SAAAA,IAAA,OAAA7/C,EAAA,KAAA6/C,GAAAr4C,EAAAjG,MAAA,KAAAC,UAAA,CAUtB,OAVsBV,EAAA++C,EAAA,EAAA18D,IAAA,SAAAG,OAAAw8D,EAAAn3B,GAAA3wB,KAAAA,MACvB,SAAAw3B,EAAazoB,GAAG,IAAAi9B,EAAAz1B,EAAA,OAAAvW,KAAAA,MAAA,SAAAy3B,GAAA,cAAAA,EAAA7xB,KAAA6xB,EAAA1zB,MAAA,OAGgC,OAFtCioC,EAAaziD,KAAK2C,QAAlB8/C,SAAQvU,EAAA7xB,KAAA,EAER2Q,EAAQsb,GAASma,EAASC,aAAYxU,EAAA1zB,KAAA,EACtC,IAAIw2C,GAAkBhxD,KAAK2C,SAAS+Z,OAAO,CAAEsQ,MAAAA,EAAOG,OAAO,IAAQ,OAAA+gB,EAAA1zB,KAAA,gBAAA0zB,EAAA7xB,KAAA,EAAA6xB,EAAAL,GAAAK,EAAA,SAEzE9rB,EAAO7Z,MAAM,sBAAqB2lC,EAAAL,IAAS,QAE7C1nB,EAAAb,EAAAg5C,EAAAz9D,WAAA,eAAAgB,KAAA,KAAa2jB,GAAK,yBAAA0oB,EAAA5xB,OAAA,GAAA2xB,EAAA,kBACnB,SAAAH,GAAA,OAAAywB,EAAAv+C,MAAA,KAAAC,UAAA,MAAAq+C,CAAA,CAVsB,CAAS93C,GAa5Bg4C,GAAkB,SAAAC,GAAAz5C,EAAAw5C,EAAAC,GAAA,IACtBC,EADsBV,EAAAp4C,GAAA44C,GAAA,SAAAA,IAAA,OAAA//C,EAAA,KAAA+/C,GAAAR,EAAAh+C,MAAA,KAAAC,UAAA,CA2BrB,OA3BqBV,EAAAi/C,EAAA,EAAA58D,IAAA,SAAAG,OACtB28D,EAAAt3B,GAAA3wB,KAAAA,MACA,SAAA83B,EAAa/oB,GAAG,IAAAi9B,EAAAz1B,EAAAuM,EAAAolC,EAAAlqD,EAAAiZ,EAAAkxC,EAAA9wC,EAAA+sB,EAAAujB,EAAA,OAAA3nD,KAAAA,MAAA,SAAA+3B,GAAA,cAAAA,EAAAnyB,KAAAmyB,EAAAh0B,MAAA,OAGgC,OAFtCioC,EAAaziD,KAAK2C,QAAlB8/C,SAAQjU,EAAAnyB,KAAA,EAER2Q,EAAQsb,GAASma,EAASC,aAAYlU,EAAAh0B,KAAA,EACtC,IAAIw2C,GAAkBhxD,KAAK2C,SAAS+Z,OAAO,CAAEsQ,MAAAA,EAAOG,OAAO,IAAQ,OACrB,MAA9CoM,EAASkpB,EAASC,YAAYtzB,mBACtBmK,EAAOj3B,OAAS,GAAC,CAAAksC,EAAAh0B,KAAA,SACjB,OADiBmkD,EAAAx2C,EACboR,EAAM,GAAf9kB,EAAKkqD,EAAA,GAAAnwB,EAAAh0B,KAAA,GACUsgC,GAAcwF,oBAAmB,QAAjD5yB,EAAO8gB,EAAAx0B,KAAA4kD,EACQnqD,EAAM+hB,cAAnB1I,EAAQ8wC,EAAR9wC,SACF+sB,EAAQntB,EAAQtb,MAAK,SAAAurC,GAAM,OAAIA,EAAO7vB,WAAaA,CAAQ,IAC5D8Z,GAAgB3F,qCACbm8B,EAAmBtrB,GAAahL,KAAK,qBAC1B9a,MAAQ,CAAEc,SAAU,CAAEvB,MAAOuB,IAC9CglB,GAAajL,MAAM,mBAAoBu2B,GACvCtrB,GAAajL,MAAM,UAAW/Z,IAE5B+sB,IACFr1B,EAAI64C,eAAiBxjB,EAAM91C,OAC5B,QAAAypC,EAAAh0B,KAAA,iBAAAg0B,EAAAnyB,KAAA,GAAAmyB,EAAAX,GAAAW,EAAA,SAGHpsB,EAAO7Z,MAAM,qBAAoBimC,EAAAX,IAAS,QAE5C1nB,EAAAb,EAAAk5C,EAAA39D,WAAA,eAAAgB,KAAA,KAAa2jB,GAAK,yBAAAgpB,EAAAlyB,OAAA,GAAAiyB,EAAA,mBACnB,SAAAH,GAAA,OAAAswB,EAAA1+C,MAAA,KAAAC,UAAA,MAAAu+C,CAAA,CA3BqB,CAASh4C,GCgB3Bq4C,GAAY,WAChB,SAAAA,IAAcpgD,EAAA,KAAAogD,GACZ7+D,KAAK2mB,UAAY,GACjB3mB,KAAKyvD,QAAU,KACfzvD,KAAKyiD,SAAW,KAChBziD,KAAK8+D,SAAW,KAChB9+D,KAAK0vD,YAAc,KACnB1vD,KAAKunB,cAAgB,KAErBvnB,KAAKwnB,KAAOxnB,KAAKwnB,KAAKte,KAAKlJ,KAC7B,CA+MA,OA7MAuf,EAAAs/C,EAAA,EAAAj9D,IAAA,UAAAG,MACA,WACM/B,KAAK8+D,UACP9+D,KAAK8+D,SAASliB,UAEZ58C,KAAK0vD,aACP1vD,KAAK0vD,YAAYvkB,QAEfnrC,KAAKunB,eACPvnB,KAAKunB,cAAc4jB,QAEjBnrC,KAAKyiD,WACHziD,KAAKyiD,SAASzD,WAChBh/C,KAAKyiD,SAASzD,SAAS5H,qBACvBp3C,KAAKyiD,SAASzD,SAAS3H,YACvBr3C,KAAKyiD,SAASzD,SAASpC,WAEzB58C,KAAKyiD,SAASsc,OAEhB/+D,KAAK6lB,KAAO,KACZ7lB,KAAKyiD,SAAW,KAChBziD,KAAK8+D,SAAW,KAChB9+D,KAAK0vD,YAAc,KACnB1vD,KAAKunB,cAAgB,IACvB,GACA,CAAA3lB,IAAA,aAAA0I,IAcA,WACE,OAAO,IACT,EAAC2f,IAdD,SAAe+0C,GACTh/D,KAAK0vD,YACPttC,EAAO7Z,MACL,iHAKJvI,KAAK0vD,YAAcsP,EACnBh/D,KAAK0vD,YAAYrH,UAAUroD,KAAKwnB,MAClC,GAAC,CAAA5lB,IAAA,eAAA0I,IAkBD,WACE,OAAO,IACT,EAAC2f,IAdD,SAAiB+0C,GACXh/D,KAAKunB,cACPnF,EAAO7Z,MACL,2HAKJvI,KAAKunB,cAAgBy3C,EACrBh/D,KAAKunB,cAAc8gC,UAAUroD,KAAKwnB,MACpC,GAAC,CAAA5lB,IAAA,UAAA0I,IAkBD,WACE,OAAOtK,KAAK8+D,QACd,EAAC70C,IAdD,SAAYg1C,GACNj/D,KAAK8+D,SACP18C,EAAO7Z,MACL,8GAKJvI,KAAK8+D,SAAWG,EAChBj/D,KAAK8+D,SAAS5W,QAAQloD,KAAKwnB,MAC7B,GAAC,CAAA5lB,IAAA,UAAA0I,IAkBD,WACE,OAAO,IACT,EAAC2f,IAdD,SAAYi1C,GACNl/D,KAAKyiD,SACPrgC,EAAO7Z,MACL,8GAKJvI,KAAKyiD,SAAWyc,EAChBl/D,KAAKyiD,SAASyF,QAAQloD,KAAKwnB,MAC7B,GAAC,CAAA5lB,IAAA,MAAA0I,IAUD,WACE,OAAO,IACT,EAAC2f,IAND,SAAQvK,GACN1f,KAAK6lB,KAAOnG,CACd,GAAC,CAAA9d,IAAA,SAAA0I,IAUD,WACE,OAAO,IACT,EAAC2f,IAND,SAAWjnB,GACThD,KAAKm/D,QAAUn8D,CACjB,GAAC,CAAApB,IAAA,SAAA0I,IAUD,WACE,OAAO,IACT,EAEA2f,IARA,SAAWm1C,GACTp/D,KAAKyvD,QAAU2P,CACjB,GAAC,CAAAx9D,IAAA,YAAAG,MASD,SAAUJ,GACRygB,EAAO9B,MAAM,2BACbtgB,KAAK2mB,UAAU9gB,KAAKlE,EACtB,GAEA,CAAAC,IAAA,iBAAAG,MAGA,SAAeJ,GACb3B,KAAK2mB,UAAY3mB,KAAK2mB,UAAU9a,QAAO,SAAAmrC,GAAQ,OAAIA,IAAar1C,CAAQ,GAC1E,GAKA,CAAAC,IAAA,OAAAG,MACA,SAAKyjB,GACEA,EAAI65C,UACPj9C,EAAO9B,MAAM,qBAAsBkF,GAErC,IAAK,CACH85C,KAAM53C,EACN63C,KAAMlP,GACN5c,OAAQ4d,GACR9G,OAAQxH,GACRyc,SAAUlc,GACVmc,UAAW/b,GACXgc,UAAWlc,GACXmc,WAAY7b,GACZ8b,WAAY/P,GACZgQ,WAAYC,GACZC,WAAYD,GACZE,WAAY5M,GACZ6M,YAAa/P,GACbgQ,YAAanQ,GACboQ,aAAc74C,EACd84C,cAAepP,GACfqP,eAAgBlP,GAChBmP,cAAelP,GACfmP,cAAex6C,EACfy6C,gBAAiB94C,EACjB+4C,eAAgBh7C,EAChBi7C,aAAchQ,GACdiQ,eAAgBnP,GAChBoP,qBAAsBC,GACtBC,gBAAiBpO,GACjBqO,gBAAiBpP,GACjBqP,gBAAiBvO,GACjBwO,iBAAkBjP,GAClBkP,gBAAiB/5C,EACjBg6C,iBAAkBv6C,EAClBw6C,kBAAmBxO,GACnByO,mBAAoBvO,GACpBwO,mBAAoB5P,GACpB6P,YAAajK,GACbkK,aAAc9J,GACd+J,aAAc3G,GACd4G,kBAAmB1G,GACnB2G,UAAWzG,GACX0G,oBAAqBzO,GACrB0O,YAAajH,GACbkH,oBAAqBvG,GACrBwG,kBAAmBpG,GACnBqG,UAAWpe,GACXqe,WAAYje,GACZke,2BAA4B9G,GAC5B+G,mBAAoBjE,GACpBkE,mBAAoB9D,GACpB+D,kBAAmB7D,GACnB8D,cAAe3E,GACf4E,aAAc1E,GACd2E,eAAgB1E,GAEhB2E,cAAe/6C,EACf4iC,eAAgB5iC,EAChBg7C,eAAgBh7C,EAChBi7C,kBAAmBj7C,EACnBk7C,kBAAmBl7C,EACnBm7C,mBAAoBn7C,EAEpBo7C,UAAWr7C,EACXs7C,WAAYt7C,EACZu7C,cAAev7C,EACfw7C,eAAgBx7C,EAChBy7C,eAAgBz7C,GAChBjC,EAAIriB,OAASqjB,GAAaxmB,MAAM0c,OAAO8I,EAC3C,KACAq5C,CAAA,CAzNgB,GA4NlB,YC1RA,IAAMsE,GAAiB,SAAAn2D,GACrB,OAAOA,EAAI/K,QAAQ,MAAO,YAC5B,EAMMmhE,GAAuB,SAAAp2D,GAE3B,IAAMq2D,EAAWr2D,EAAIxH,MAAM,QACrB89D,EAAWD,EAAS9kB,WAAU,SAAAnzC,GAAI,OAAIA,EAAKm4D,WAAW,KAAK,IAC7DC,EAAW,EAmBf,OAlBI57B,GAAgB9H,WAElBujC,EAAShxC,OAAOixC,EAAWE,EAAU,EAAG,iBACxCA,IACI57B,GAAgBzC,+BAClBk+B,EAAShxC,OAAOixC,EAAWE,EAAU,EAAG,gCACxCA,MAGA57B,GAAgB9G,kBAClBuiC,EAAShxC,OACPixC,EAAWE,EACX,EACA,4BACA,8BACA,2BAGGH,EAASt8D,KAAK,OACvB,EAGM08D,GAAY,SAAAz2D,GAChB,IAAM02D,EAAS97B,GAAgBnB,YACzBk9B,EAAa32D,EAAImc,MAAM,yBAC7B,GAAIw6C,EAAY,CACd,IAAMC,EAAa,IAAIh/D,OAAO,WAAD2c,OAAYoiD,EAAW,GAAE,UAAU,KAC1DE,EAAY72D,EAAImc,MAAMy6C,GAC5B,GAAIC,EAAW,CACb,IAAMj7D,EAAU,CAAC,EACjBi7D,EAAU,GAAGr+D,MAAM,KAAKmJ,SAAQ,SAAAiM,GAC9B,IAAqCkpD,EAAA37C,EAAhBvN,EAAMpV,MAAM,KAAI,GAA9B5D,EAAGkiE,EAAA,GAAE/hE,EAAK+hE,EAAA,GACjBl7D,EAAQhH,GAAOG,CACjB,IACA6G,EAAgB,OAAI86D,EAAS,IAAM,IAEnC,IAAMh/D,EAAS9D,OAAOmjE,QAAQn7D,GAC3BuC,KAAI,SAAAkiC,GAAA,IAAAW,EAAA7lB,EAAAklB,EAAA,GAAEzrC,EAAGosC,EAAA,GAAEjsC,EAAKisC,EAAA,YAAAzsB,OAAS3f,EAAG,KAAA2f,OAAIxf,EAAK,IACrCgF,KAAK,KACR,OAAOiG,EAAI/K,QAAQ2hE,EAAY,UAAFriD,OAAYoiD,EAAW,GAAE,KAAApiD,OAAI7c,GAC5D,CACF,CACA,OAAOsI,CACT,EAEMggD,GAAW,SAAAhgD,GACf,IAAMgC,EAAQhC,EAAIxH,MAAM,QACpBw+D,GAAO,EAUX,OATAh1D,EAAML,SAAQ,SAACvD,EAAM64D,GACf74D,EAAKm4D,WAAW,YAAcn4D,EAAKm4D,WAAW,WAChDS,GAAO,EACE54D,EAAKm4D,WAAW,iBACzBS,GAAO,EACW,eAAT54D,GAAyB44D,IAClCh1D,EAAMi1D,GAAO,aAEjB,IACOj1D,EAAMjI,KAAK,OACpB,EAEMm9D,GAAe,SAAAt7D,GACnB,IAAMu7D,EAAY,CAChBpkB,OAAQ,CAAC0jB,IACTvX,QAAS,CAACiX,GAAgBC,KAK5B,OAHyB,IAArBx6D,EAAQokD,UACVmX,EAAUpkB,OAAOl6C,KAAKmnD,IAEjBmX,CACT,ECqaA,SA3euB,WAErB,SAAAC,EAAY3f,EAAY4f,GAAsB,IAAdz7D,EAAOqX,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAC,EAACxB,EAAA,KAAA2lD,GAC1CpkE,KAAK4I,QAAUA,EACf5I,KAAK4I,QAAQ07D,eAAiB1jE,OAAOmiB,OACnC,CAAC,EACD/iB,KAAKukE,sBACL,CAAEhpC,qBAAsBv7B,KAAK4I,QAAQoyC,MAEvCh7C,KAAKwkE,UAAW,EAChBxkE,KAAK2mB,UAAY,GACjB3mB,KAAKykE,YAAa,EAClBzkE,KAAKykD,WAAaA,EAClBzkD,KAAKqkE,OAASA,EACdrkE,KAAK0kE,WAAa,KAClB1kE,KAAK2kE,cAAgB,EACrB3kE,KAAK4kE,iBAAmB,EACxB5kE,KAAK6kE,eAAgB,EACrB7kE,KAAK8kE,WAAY,EACjB9kE,KAAK+kE,eAAgB,EACrB/kE,KAAKglE,YAAc,KACnBhlE,KAAKilE,gBAAkB,KAEvBjlE,KAAK++D,IAAM/+D,KAAK++D,IAAI71D,KAAKlJ,MACzBA,KAAKg9C,KAAOh9C,KAAKg9C,KAAK9zC,KAAKlJ,MAC3BA,KAAKw7C,UAAYx7C,KAAKw7C,UAAUtyC,KAAKlJ,MACrCA,KAAKklE,WAAallE,KAAKklE,WAAWh8D,KAAKlJ,MACvCA,KAAKmlE,YAAcnlE,KAAKmlE,YAAYj8D,KAAKlJ,MACzCA,KAAKolE,aAAeplE,KAAKolE,aAAal8D,KAAKlJ,MAC3CA,KAAKstD,aAAettD,KAAKstD,aAAapkD,KAAKlJ,MAC3CA,KAAKqtD,aAAertD,KAAKqtD,aAAankD,KAAKlJ,MAC3CA,KAAKqlE,eAAiBrlE,KAAKqlE,eAAen8D,KAAKlJ,MAC/CA,KAAKslE,gBAAkBtlE,KAAKslE,gBAAgBp8D,KAAKlJ,MACjDA,KAAKulE,iBAAmBvlE,KAAKulE,iBAAiBr8D,KAAKlJ,MACnDA,KAAKqsD,wBAA0BrsD,KAAKqsD,wBAAwBnjD,KAAKlJ,KACnE,CAoLA,IAAAwlE,EAiRC,OApcDjmD,EAAA6kD,EAAA,EAAAxiE,IAAA,iBAAA0I,IAEA,WACE,OAAItK,KAAK0kE,YAAc1kE,KAAK0kE,WAAWre,0BAC9BrmD,KAAK0kE,WAAWre,0BAA0B8E,eAE5C,IACT,GAAC,CAAAvpD,IAAA,cAAA0I,IAED,WACE,OAAItK,KAAK0kE,YAAc1kE,KAAK0kE,WAAWre,0BAC9BrmD,KAAK0kE,WAAWre,0BAA0B3D,YAE5C,IACT,GAAC,CAAA9gD,IAAA,eAAA0I,IAED,WACE,OAAItK,KAAK0kE,YAAc1kE,KAAK0kE,WAAWre,0BAC9BrmD,KAAK0kE,WAAWre,0BAA0B+E,aAE5C,IACT,GAAC,CAAAxpD,IAAA,wBAAA0I,IAED,WACE,MAAO,CAAE6wB,qBAAqB,EAAMI,qBAAqB,EAC3D,GAEA,CAAA35B,IAAA,QAAAG,MAGA,WACM/B,KAAK4I,QAAQ4L,OACfxU,KAAKylE,sBAGPzlE,KAAK0lE,oBACL1lE,KAAK2lE,wBACL,IAAIhnB,GAAmB3+C,KAAK4I,SACzB8uC,QACAnuC,KAAKvJ,KAAKmlE,aAAY,MAChBnlE,KAAKolE,cAChB,GAAC,CAAAxjE,IAAA,qBAAAG,MAED,WACE,IAAM8oC,GAAarC,GAASxoC,KAAK4I,QAAQ4L,SAAWxU,KAAK4I,QAAQoyC,IAC3DxmC,EAASo2B,GAAqB5qC,KAAK4I,QAAQ4L,OAAQq2B,GACpDr2B,GAILxU,KAAKo1B,eAAiB5gB,EACtBxU,KAAK4I,QAAQokB,MAAQsb,GAAS9zB,GAC9BxU,KAAK4I,QAAQukB,MAAQqb,GAASh0B,GAC9BxU,KAAKmlE,YAAYnlE,KAAKo1B,iBANpBp1B,KAAKolE,aAAa,CAAEpgE,KAAM,kBAO9B,GAAC,CAAApD,IAAA,wBAAAG,MAED,WACE,IAAMoB,EAAO23C,GAAciW,iCAC3B/wD,KAAKg/C,SAAW,IAAIvJ,GACpBz1C,KAAKg/C,SAAS7C,iBAAiBh5C,GAC/BnD,KAAK4I,QAAQo2C,SAAWh/C,KAAKg/C,QAC/B,GAAC,CAAAp9C,IAAA,oBAAAG,MAED,WAAoB,IAAAugB,EAAA,KAClBtiB,KAAKk/C,cAAgB,IAAI0c,GACzB57D,KAAKk/C,cAAcgJ,SAAQ,SAAA1iC,GAAG,OAAIlD,EAAK06B,KAAKx3B,EAAI,IAChDxlB,KAAK4I,QAAQs2C,cAAgBl/C,KAAKk/C,aACpC,GAAC,CAAAt9C,IAAA,sBAAAG,MAED,SAAoByS,GAClB,IAAQ5L,EAAY5I,KAAZ4I,QAIR,OAHyB,IAArBA,EAAQokD,WACVpkD,EAAQ07D,eAAiB,CAAC,GAErB,CACL9vD,OAAQA,EACRw4C,SAAUpkD,EAAQokD,SAClBjB,aAAcmY,GAAa,CACzBlX,SAAUpkD,EAAQokD,WAEpBvI,WAAYzkD,KAAKykD,WACjB6I,aAActtD,KAAKstD,aACnBD,aAAcrtD,KAAKqtD,aACnBiX,eAAgB17D,EAAQ07D,eACxBjY,wBAAyBrsD,KAAKqsD,wBAC9BuC,aAAc,CAAE5hC,MAAOpkB,EAAQokB,MAAOG,MAAOvkB,EAAQukB,OAEzD,GAKA,CAAAvrB,IAAA,cAAAG,MACA,SAAYyS,GAAQ,IAAA2O,EAAA,KAClBnjB,KAAK8kE,WAAY,EACjB9kE,KAAK6kE,eAAgB,EACrB7kE,KAAK+kE,eAAgB,EACrB,IAAMn8D,EAAU5I,KAAK4lE,oBAAoBpxD,GACzCxU,KAAK0kE,WAAa1kE,KAAKykD,WAAWohB,aAAaj9D,GAC/C5I,KAAK8lE,SAAStxD,GACdxU,KAAK0kE,WAAWxc,SAAQ,SAAAl+C,GACH,aAAfA,EAAM7G,KACRggB,EAAK4iD,oBACmB,YAAf/7D,EAAM7G,MACfwhB,aAAaxB,EAAK6hD,aAClBrgD,aAAaxB,EAAK8hD,iBAClB9hD,EAAK2hD,WAAY,EACjB3hD,EAAK0hD,eAAgB,EACrB1hD,EAAK4hD,eAAgB,GACG,eAAf/6D,EAAM7G,MACfggB,EAAK6iD,kBAAkBh8D,EAAMm9C,OAAQn9C,EAAM6sB,KAE/C,IACI72B,KAAKo1B,iBACPp1B,KAAKykD,WAAWyJ,mBAAoB,GAGlCnuD,QACFA,OAAOmK,iBACL09B,GAAgB3H,cAAgB,WAAa,eAC7CjgC,KAAKklE,WAGX,GAEA,CAAAtjE,IAAA,MAAAG,MAGA,WACE/B,KAAK2mB,UAAY,GACjB3mB,KAAKklE,aACLllE,KAAKwkE,UAAW,EAChBxkE,KAAK0kE,WAAa,KAClB1kE,KAAKykD,WAAa,IACpB,GAEA,CAAA7iD,IAAA,aAAAG,MAIA,WACEqgB,EAAO9B,MAAM,iCACbqE,aAAa3kB,KAAKglE,aAClBrgD,aAAa3kB,KAAKilE,iBACdjlE,KAAK0kE,aACP1kE,KAAK0kE,WAAWvf,qBAChBnlD,KAAKulE,oBAEHvlE,KAAKykD,YACPzkD,KAAKykD,WAAWtZ,QAEdnrC,KAAKk/C,eACPl/C,KAAKk/C,cAActC,SAEvB,GAGA,CAAAh7C,IAAA,mBAAAG,MAMA,WACEqgB,EAAO9B,MAAM,uCACb,IACEtgB,KAAK0kE,WAAWrtB,WAClB,CAAE,MAAO9uC,GACP6Z,EAAO7Z,MAAMA,EACf,CACF,GASA,CAAA3G,IAAA,YAAAG,OAAAyjE,EAAAp+B,GAAA3wB,KAAAA,MACA,SAAA62B,EAAgBrY,GAAS,IAAAoxB,EAAAj1B,EAAA,OAAA3a,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,UAClBxa,KAAK0kE,WAAY,CAAFl3B,EAAAhzB,KAAA,eAAAgzB,EAAArzB,OAAA,SACX,MAAI,OAGsB,OAHtBqzB,EAAAnxB,KAAA,EAGHgqC,EAA8BrmD,KAAK0kE,WAAnCre,0BAAyB7Y,EAAAhzB,KAAA,EACX6rC,EAA0B7K,UAAUvmB,GAAU,OAejE,OAfG7D,EAAOoc,EAAAxzB,KACbha,KAAKijD,mBAAoB,EACrBjjD,KAAK++C,UAAY/+C,KAAK++C,SAASgB,SACjC3uB,EAAQ6D,UAAYj1B,KAAK++C,SAASknB,mBAClC5f,EAA0B3D,YAActxB,EAAQ6D,WAE9Cj1B,KAAKkyD,aAAelyD,KAAKkyD,YAAYK,gBACvCnhC,EAAQ6D,UAAYj1B,KAAKkyD,YAAY+T,mBACrC5f,EAA0B3D,YAActxB,EAAQ6D,WAElDj1B,KAAK8lE,SAAS10C,EAAQ6D,WACtBj1B,KAAKg9C,KAAK,CACR75C,KAAM,gBACNu/C,YAAatxB,EAAQ6D,UACrBzgB,OAAQ4c,EAAQg6B,eACf5d,EAAArzB,OAAA,SACIiX,EAAQ6D,WAAS,QAOrB,OAPqBuY,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,SAExBprB,EAAO7Z,MAAM,+BAA8BilC,EAAAK,IAC3C7tC,KAAKg9C,KAAK,CACR75C,KAAM,gBACNu/C,YAAa1iD,KAAK0iD,YAClBluC,OAAQxU,KAAKorD,eACZ5d,EAAArzB,OAAA,SACIna,KAAK0iD,aAAW,yBAAAlV,EAAAlxB,OAAA,GAAAgxB,EAAA,mBAE1B,SAAA9kB,GAAA,OAAAg9C,EAAAxlD,MAAA,KAAAC,UAAA,IAED,CAAAre,IAAA,WAAAG,MAIA,SAASyS,GAAQ,IAAAsP,EAAA,KACXtP,GACFA,EAAO8a,YAAY3gB,SAAQ,SAAA8F,GACzBA,EAAM24C,SAAW,kBACftpC,EAAKk5B,KAAK,CAAE75C,KAAM,sBAAuBsR,MAAOA,GAAQ,CAC5D,GAEJ,GAEA,CAAA7S,IAAA,aAAAG,MAGA,SAAWmkE,GACTlmE,KAAKkmE,QAAUA,CACjB,GAEA,CAAAtkE,IAAA,eAAAG,MAGA,SAAaqpD,GACPprD,KAAKkmE,SACPlmE,KAAKkmE,QAAQC,QAAQnmE,KAAKmrD,gBAEvBnrD,KAAKwkE,WACRxkE,KAAKg9C,KAAK,CAAE75C,KAAM,SAAUmuD,QAAStxD,KAAK0kE,aAC1C1kE,KAAKwkE,UAAW,GAEdpZ,GACFprD,KAAKg9C,KAAK,CAAE75C,KAAM,gBAAiBqR,OAAQ42C,GAE/C,GAAC,CAAAxpD,IAAA,eAAAG,MAED,SAAa0S,GACXzU,KAAKg9C,KAAK,CAAE75C,KAAM,gBAAiBsR,MAAOA,GAC5C,GAAC,CAAA7S,IAAA,0BAAAG,MAED,SAAwBqkE,GACtBhkD,EAAO9B,MAAM,6CAA8C8lD,EAAWp5D,KACtE,IAAIq5D,GAAM,EAGJC,EADWF,EAAWp5D,IAAIxH,MAAM,QACb4M,MAAK,SAAAhH,GAAI,OAAIA,EAAKm4D,WAAW,aAAa,IAE/D+C,IACFD,EAAMC,EAAQz4C,SAAS,OAGzB7tB,KAAKg9C,KAAK,CAAE75C,KAAM,4BAA6Bi5C,OAAQ,CAAEiqB,IAAKA,IAChE,GAEA,CAAAzkE,IAAA,oBAAAG,MAIA,WACE/B,KAAKwnB,KAAK,CAAErkB,KAAM,aAAcgG,IAAKnJ,KAAK4I,QAAQukB,OACpD,GAKA,CAAAvrB,IAAA,oBAAAG,MACA,SAAkBolD,EAAQtwB,GAAM,IAAAkjB,EAAA,KAI9B,GAHA33B,EAAO9B,MAAM,iCAAkC6mC,EAAQtwB,GACvDlS,aAAa3kB,KAAKglE,aAClBrgD,aAAa3kB,KAAKilE,iBACF,QAAX9d,GAA6B,MAATtwB,GAA4B,cAAXswB,EACxCnnD,KAAKumE,kBACA,GAAe,eAAXpf,EACT,IAAc,IAAVtwB,EAAa,CACf,GAAI72B,KAAK6kE,cAKP,OAJA7kE,KAAK6kE,eAAgB,OACrB7kE,KAAKqkE,OAAOvU,SAAQ,SAAA9sD,GAAI,OACtB+2C,EAAK0K,WAAW+hB,4BAA4BxjE,EAAK,IAG9C,GAAIhD,KAAK+kE,eAAiB/kE,KAAKykD,WAYpC,OAXAzkD,KAAK+kE,eAAgB,EACrB/kE,KAAKilE,gBAAkBpgD,YAAW,WAChCk1B,EAAKsqB,OAAOvU,SAAQ,SAAA9sD,GACd+2C,EAAK0K,YACP1K,EAAK0K,WAAWgiB,oBAAoBzjE,EAExC,GACF,GAAG,UACHhD,KAAKglE,YAAcngD,YAAW,WAC5Bk1B,EAAKqrB,aAAa,CAAEpgE,KAAM,KAC5B,GAAG,OAGLhF,KAAKolE,aAAa,CAAEpgE,KAAM,KAC5B,KAAO,CACL,GAAIhF,KAAK8kE,WAAa9kE,KAAKykD,WAYzB,OAXAzkD,KAAK8kE,WAAY,EACjB9kE,KAAK6kE,eAAgB,EACrB7kE,KAAKqkE,OAAOvU,SAAQ,SAAA9sD,GACd+2C,EAAK0K,YACP1K,EAAK0K,WAAWgiB,oBAAoBzjE,EAExC,SACAhD,KAAKglE,YAAcngD,YACjB,kBAAMk1B,EAAKqrB,aAAa,CAAEpgE,KAAM,KAAM,GACtC,MAIJhF,KAAKolE,aAAa,CAAEpgE,KAAM,KAC5B,MAEAhF,KAAKolE,aAAa,CAAEpgE,KAAM6xB,IAEvB72B,KAAKykE,YACRzkE,KAAKg9C,KAAK,CAAE75C,KAAM,uBAEtB,GAEA,CAAAvB,IAAA,aAAAG,MAGA,WACE/B,KAAKg9C,KAAK,CAAE75C,KAAM,OAAQgkD,OAAQ,OACpC,GAEA,CAAAvlD,IAAA,eAAAG,MAGA,SAAaolD,GACX/kC,EAAOlC,KAAK,oCAAqCinC,GACjDxiC,aAAa3kB,KAAKglE,aAClBrgD,aAAa3kB,KAAKilE,iBAClB,IAAIrjE,EAAM,SAKV,GAJIulD,GAAUA,EAAOniD,OACnBpD,EAAMulD,EAAOniD,OAGXhF,KAAKslE,gBAAgB1jE,GAAzB,CAIA,IAAMoD,EACJ,CACE0hE,cAAe,UACfC,gBAAiB,aACjBx4C,qBAAsB,UACtBH,sBAAuB,aACvB44C,iBAAkB,eAClB,IAAK,iBACL,IAAK,oBACL,IAAK,oBACL,IAAK,YACL,IAAK,iBACL,IAAK,kBACLhlE,IAAQ,iBAEZ5B,KAAKg9C,KAAK,CACR75C,KAAM,QACN6B,KAAMA,EACN6xB,KAAM72B,KAAK6mE,cAAcjlE,EAAKoD,IApBhC,CAsBF,GAAC,CAAApD,IAAA,gBAAAG,MAED,SAAcH,EAAKoD,GACjB,MACE,CACE,aACA,UACA,eACA,iBACA,iBACA,mBACA6oB,SAAS7oB,GAEJ,GAEF9D,OAAOU,EAChB,GAEA,CAAAA,IAAA,kBAAAG,MAIA,SAAgB+kE,GAAS,IAAA7pB,EAAA,KACvB76B,EAAO9B,MAAM,uCAAwCwmD,GAErD,IAAMC,EAAW,CACf,IAAK,CACHC,UAAW,kBAAM/pB,EAAK0nB,cAAgB1nB,EAAK2nB,gBAAgB,EAC3DqC,OAAQ,kBAAMhqB,EAAKooB,gBAAgB,IAErCyB,GAEF,OAAI9mE,KAAK2kE,eAAiB3kE,KAAK4kE,kBAC7B5kE,KAAKykE,YAAa,GACX,GAGFl6D,QAAQw8D,GAAYA,EAASC,aAAeD,EAASE,SAC9D,GAEA,CAAArlE,IAAA,iBAAAG,MAGA,WAAiB,IAAAm7C,EAAA,KAUf,OATA96B,EAAO9B,MAAM,sCAAuCtgB,KAAK2kE,eACzD3kE,KAAKykE,YAAa,EAClBzkE,KAAK2kE,eAAiB,EAEtB9/C,YAAW,WACTq4B,EAAKgoB,aACLhoB,EAAKxF,OACP,GAAG,MAEI,CACT,GAEA,CAAA91C,IAAA,UAAAG,MAGA,SAAQJ,GACN3B,KAAK2mB,UAAU9gB,KAAKlE,EACtB,GAEA,CAAAC,IAAA,OAAAG,MAGA,SAAKyjB,GACHxlB,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GAAQ,OAAIA,EAASxxB,EAAI,GAClD,GAEA,CAAA5jB,IAAA,OAAAG,MAGA,SAAKyjB,GACH,OAAOxlB,KAAKykD,WAAWj9B,KAAKhC,EAC9B,KAAC4+C,CAAA,CAxeoB,G,whCChBvB,IAAM8C,GAAS,CACbC,cAAe,EACfC,IAAK,EACLC,GAAI,EACJC,KAAM,GAkDFC,GAAa,SAACC,EAAS5sD,GACvB4sD,EAAQllE,OAAS,EACnBklE,EAAQ3hE,KAAKjF,OAAOmiB,OAAO,CAAC,EAAGnI,IAGjCha,OAAOmiB,OA3BqB,SAAAykD,GAG5B,IAFA,IAAK9iE,EAALyjB,EAAeq/C,EAAO,GAAX,GACHllE,EAAWklE,EAAXllE,OACCD,EAAQ,EAAGA,EAAQC,EAAQD,IAC9BmlE,EAAQnlE,GAAOi4D,KAAO51D,EAAO41D,OAC/B51D,EAAS8iE,EAAQnlE,IAGrB,OAAOqC,CACT,CAkBgB+iE,CAAsBD,GAAU5sD,EAChD,EAGM8sD,GAAoB,SAAAF,GACxB,IAW2BG,EAXnBrlE,EAAWklE,EAAXllE,OACFoC,EAAS,CACbkjE,OAAQ,EACRC,WAAY,EACZC,cAAe,EACfC,KAAM,EACNC,YAAa,EACbC,YAAa,EACbzmD,OAAQ0lD,GAAOI,MAEXY,EA/BsB,SAAAV,GAG5B,IAFA,IAAK9iE,EAALyjB,EAAeq/C,EAAO,GAAX,GACHllE,EAAWklE,EAAXllE,OACCD,EAAQ,EAAGA,EAAQC,EAAQD,IAC9BmlE,EAAQnlE,GAAOi4D,KAAO51D,EAAO41D,OAC/B51D,EAAS8iE,EAAQnlE,IAGrB,OAAOqC,CACT,CAsBiByjE,CAAsBX,GAASY,EAAAC,GAC1Bb,GAAO,IAA3B,IAAAY,EAAA11C,MAAAi1C,EAAAS,EAAAtqD,KAAAlE,MAA6B,KAAlBgB,EAAK+sD,EAAA5lE,MACd2C,EAAOkjE,QAAUhtD,EAAMgtD,OACvBljE,EAAOmjE,YAAcjtD,EAAMitD,WAC3BnjE,EAAOojE,eAAiBltD,EAAMktD,cAC9BpjE,EAAOqjE,MAAQntD,EAAMmtD,KACrBrjE,EAAOsjE,aAAeptD,EAAMotD,YAC5BtjE,EAAOujE,aAAertD,EAAMqtD,WAC9B,CAAC,OAAAxwD,GAAA2wD,EAAAphE,EAAAyQ,EAAA,SAAA2wD,EAAAx3C,GAAA,CAeD,OAdAlsB,EAAOkjE,OAA2B,OAAlBM,EAAON,OAAkB,KAAOljE,EAAOkjE,OAAStlE,EAChEoC,EAAOmjE,WACiB,OAAtBK,EAAOL,WAAsB,KAAOnjE,EAAOmjE,WAAavlE,EAC1DoC,EAAOojE,cACoB,OAAzBI,EAAOJ,cAAyB,KAAOpjE,EAAOojE,cAAgBxlE,EAChEoC,EAAOqjE,KAAuB,OAAhBG,EAAOH,KAAgB,KAAOrjE,EAAOqjE,KAAOzlE,EAC1DoC,EAAOsjE,aAAe1lE,EACtBoC,EAAOujE,aAAe3lE,EACtBoC,EAAO8c,OApFe,WAKnB,IAJH8mD,EAAcroD,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,EACjB2nD,EAAM3nD,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,EACT6nD,EAAa7nD,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,EAChBsoD,EAAQtoD,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,EAEX,OACE6nD,EAAgB,GAChBQ,EAAiB,IACjBV,EAAS,IACTW,EAAW,GAEJrB,GAAOE,IAGdU,EAAgB,IAChBQ,EAAiB,IACjBV,EAAS,IACTW,EAAW,GAEJrB,GAAOG,GAETH,GAAOI,IAChB,CA6DkBkB,CACd9jE,EAAOmjE,WACPnjE,EAAOkjE,OACPljE,EAAOojE,cACPpjE,EAAOqjE,MAEFrjE,CACT,EAEM+jE,GAAoB,WACxB,SAAAA,IAAchqD,EAAA,KAAAgqD,GACZzoE,KAAKmrD,eAAiB,KACtBnrD,KAAKo4D,MAAQ,KACbp4D,KAAK2mB,UAAY,GACjB3mB,KAAKwnE,QAAU,GACfxnE,KAAK4a,MAAQ,CACXgtD,OAAQ,EACRC,WAAY,EACZC,cAAe,EACfC,KAAM,EACNzN,KAAM,EACN0N,YAAa,EACbC,YAAa,GAEfjoE,KAAK0oE,SAAW,CACdpO,KAAM,KACNqO,UAAW,KACXC,cAAe,KACf57C,MAAO,CACL67C,IAAK,CACHC,YAAa,KACbC,YAAa,KACbJ,UAAW,MAEbK,GAAI,CACFC,gBAAiB,OAGrB97C,MAAO,CACL07C,IAAK,CACHC,YAAa,KACbC,YAAa,KACbJ,UAAW,KACXO,UAAW,MAEbF,GAAI,CACFJ,cAAe,QAIrB5oE,KAAKmpE,gBAAkBnpE,KAAKopE,WAAWlgE,KAAKlJ,KAC9C,CAMA,IAAAqpE,EAyIC,OA/IA9pD,EAAAkpD,EAAA,EAAA7mE,IAAA,OAAAG,MAED,SAAKopD,GACHnrD,KAAKmrD,eAAiBA,CACxB,GAEA,CAAAvpD,IAAA,aAAAG,OAAAsnE,EAAAjiC,GAAA3wB,KAAAA,MACA,SAAA62B,IAAA,IAAA6d,EAAAvwC,EAAA8tD,EAAAlB,EAAAt8C,EAAAzG,EAAA6kD,EAAAC,EAAA,OAAA9yD,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,OACkD,OAAxC2wC,EAA6CnrD,KAA7CmrD,eAAgBvwC,EAA6B5a,KAA7B4a,MAAO8tD,EAAsB1oE,KAAtB0oE,SAAUlB,EAAYxnE,KAAZwnE,QAAOh6B,EAAAhzB,KAAA,EAC5B2wC,EAAen4B,WAAU,OAAvC9H,EAAKsiB,EAAAxzB,KACLyK,EAAMD,KAAKC,MACb6kD,EAA4B,KAChC1oE,OAAO6N,KAAKmM,GAAOjM,SAAQ,SAAA/M,GACzBgZ,EAAMhZ,GAAO,CACf,IACAgZ,EAAMgtD,OAAS,KACfhtD,EAAMitD,WAAa,KACnBjtD,EAAMktD,cAAgB,KACtBltD,EAAMmtD,KAAO,KACbntD,EAAM0/C,KAAO71C,EAGbyG,EAAMvc,SAAQ,SAAA2kB,GACZ,GAAoB,gBAAhBA,EAAOnwB,KAAwB,CACjC,IAAMoP,EAAO+gB,EAAO/gB,MAAQ+gB,EAAOk2C,UACnC,GAAId,EAASpO,KAAM,CACjB,IAAMmP,GAAQhlD,EAAMikD,EAASpO,MAAQ,IAC/BoP,EAAWlpE,KAAKisB,IACpB6G,EAAOs1C,cAAgBF,EAASn2D,GAAK,GAAIq2D,cACzC,GAEFhuD,EAAMqtD,aAA2B,EAAXyB,EAAgBD,CACxC,CACAf,EAASn2D,GAAK,GAAIq2D,cAAgBt1C,EAAOs1C,aAC3C,MAAO,GAAoB,iBAAhBt1C,EAAOnwB,KAAyB,CACzC,IAAMoP,EAAO+gB,EAAO/gB,MAAQ+gB,EAAOk2C,UACnC,GAAId,EAASpO,KAAM,CACjB,IAAMmP,GAAQhlD,EAAMikD,EAASpO,MAAQ,IAC/BtgD,EAAOsZ,EAAOq1C,UAAYD,EAASn2D,GAAMs2D,IAAIF,UACnD/tD,EAAMotD,aAAuB,EAAPhuD,EAAYyvD,CACpC,CACAf,EAASn2D,GAAMs2D,IAAIF,UAAYr1C,EAAOq1C,SACxC,MAAO,GAAoB,uBAAhBr1C,EAAOnwB,KAA+B,CAC/C,IAAMoP,EAAO+gB,EAAO/gB,MAAQ+gB,EAAOk2C,UACnC,GAAId,EAASn2D,GAAO,CAClB,IAAM+Y,EAAWJ,EAAM5gB,IAAIgpB,EAAOq2C,SAC5BC,OAAyC,IAAzBt2C,EAAOw0C,cACvB+B,OAAqC,IAAlBv2C,EAAOs0C,OAC1BkC,OAA8C,IAAvBx2C,EAAOy1C,YAC9BgB,OAA6C,IAAvBz+C,EAAS49C,UACrC,GAAIR,EAASpO,KAAM,CACjB,IAAM0P,EAAO12C,EAAOy1C,YAAcL,EAASn2D,GAAMs2D,IAAIE,YAC/CkB,EACJ3+C,EAASw9C,YAAcJ,EAASn2D,GAAMs2D,IAAIC,YACtCR,EAAiB2B,EAAU,EAAID,EAAOC,EAAU,EAUtD,GATArvD,EAAMgtD,OAASiC,EACXrpE,KAAKisB,IAAI7R,EAAMgtD,OAAQqC,EAAU,EAAI32C,EAAOs0C,OAAS,GACrD,KACJhtD,EAAMitD,WAAaiC,EACftpE,KAAKisB,IAAI7R,EAAMitD,WAAYS,GAC3B,KACJ1tD,EAAMktD,cAAgB8B,EAClBppE,KAAKisB,IAAI7R,EAAMktD,cAAex0C,EAAOw0C,eACrC,KACS,UAATv1D,EAAkB,CACpB,IAAMw1D,EAAOz8C,EAAS49C,UAAYR,EAASn2D,GAAMs2D,IAAIK,UAC/CX,EAAW0B,EAAU,EAAIlC,EAAOkC,EAAU,EAChDrvD,EAAMmtD,KAAOgC,EAAevpE,KAAKisB,IAAI7R,EAAMmtD,KAAMQ,GAAY,IAC/D,CACF,CACa,UAATh2D,IACFm2D,EAASn2D,GAAMs2D,IAAIK,UAAY59C,EAAS49C,WAE1CR,EAASn2D,GAAMs2D,IAAIC,YAAcx9C,EAASw9C,YAC1CJ,EAASn2D,GAAMs2D,IAAIE,YAAcz1C,EAAOy1C,WAC1C,CACF,KACkB,mBAAhBz1C,EAAOnwB,MACU,cAAjBmwB,EAAO5Z,OACP,yBAA0B4Z,IAE1Bg2C,EAA4Bh2C,EAAO42C,qBAEvC,IAC4B,OAAxBtvD,EAAMktD,eAAwD,OAA9BwB,IAClC1uD,EAAMktD,cAAgBwB,GAExB/B,GAAWC,EAAS5sD,GACd2uD,EAAU7B,GAAkBF,IACT,IAArB1kE,UAAUqnE,SACZZ,EAAQ/nD,OAAS0lD,GAAOE,KAGxB,CAAC,eAAgB,SAAU,UAAUv5C,SACnCs9B,EAAeptB,sBAGjBwrC,EAAQ/nD,OAAS0lD,GAAOC,eAE1BnnE,KAAKg9C,KAAKusB,GACVb,EAASpO,KAAO71C,EAAI,yBAAA+oB,EAAAlxB,OAAA,GAAAgxB,EAAA,UACrB,kBAAA+7B,EAAArpD,MAAA,KAAAC,UAAA,KAAAre,IAAA,uBAAAG,MAED,WACE,OAAO2lE,GAAkB1nE,KAAKwnE,QAChC,GAAC,CAAA5lE,IAAA,WAAAG,MAED,SAASi1C,GACP,IAAQrwB,EAAqB3mB,KAArB2mB,UAAWyxC,EAAUp4D,KAAVo4D,MACM,IAArBzxC,EAAUrkB,QAA0B,OAAV81D,IAC5Bp4D,KAAKo4D,MAAQrxC,YAAY/mB,KAAKmpE,gBAAiB,KAC/CnpE,KAAKmrD,eAAejhD,iBAClB,2BACAlK,KAAKmpE,iBAEPppE,OAAOmK,iBAAiB,UAAWlK,KAAKmpE,kBAE1CxiD,EAAU9gB,KAAKmxC,EACjB,GAAC,CAAAp1C,IAAA,OAAAG,MAED,SAAKqoE,GACHpqE,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GACrB,IACEA,EAASozB,EACX,CAAE,MAAO3yD,GACP2K,EAAO7Z,MAAM,6BAA8BkP,EAC7C,CACF,GACF,GAAC,CAAA7V,IAAA,UAAAG,MAED,WACEmlB,cAAclnB,KAAKo4D,OACnBr4D,OAAOoK,oBAAoB,UAAWnK,KAAKmpE,iBACvCnpE,KAAKmrD,iBACPnrD,KAAKmrD,eAAehhD,oBAClB,2BACAnK,KAAKmpE,iBAEPnpE,KAAKmrD,eAAiB,MAExBnrD,KAAKo4D,MAAQ,KACbp4D,KAAKwnE,QAAQllE,OAAS,EACtBtC,KAAK2mB,UAAUrkB,OAAS,CAC1B,KAACmmE,CAAA,CAzLuB,GA4L1BA,GAAqBvB,OAASA,GAE9B,YCrLA,SAxGuB,WACrB,SAAAmD,IAAc5rD,EAAA,KAAA4rD,GACZrqE,KAAKwxB,GAAK,KACVxxB,KAAKoqE,WAAa,IAAI3B,GACtBzoE,KAAK2mB,UAAY,GACjB3mB,KAAKsqE,gBAAkB,KACvBtqE,KAAKuqE,aAAe,UACpBvqE,KAAKwqE,UAAYxqE,KAAKwqE,UAAUthE,KAAKlJ,MACrCA,KAAKyqE,qBAAuBzqE,KAAKyqE,qBAAqBvhE,KAAKlJ,MAC3DA,KAAKwrD,4BACHxrD,KAAKwrD,4BAA4BtiD,KAAKlJ,MACxCA,KAAK0qE,mBACP,CAyFA,OAzFCnrD,EAAA8qD,EAAA,EAAAzoE,IAAA,oBAAAG,MAED,WACEhC,OAAOmK,iBAAiB,UAAWlK,KAAKwqE,UAC1C,GAAC,CAAA5oE,IAAA,YAAAG,MAED,WACE/B,KAAKg9C,KAAK,CAAE75C,KAAM,WACpB,GAAC,CAAAvB,IAAA,UAAAG,MAED,SAAQopD,GACFnrD,KAAKwxB,KAGTxxB,KAAKwxB,GAAK25B,EACVnrD,KAAKwxB,GAAGm5C,2BAA6B3qE,KAAKyqE,qBAC1CzqE,KAAKwxB,GAAGo5C,wBAA0B5qE,KAAKwrD,4BACvCxrD,KAAKoqE,WAAWS,KAAK1f,GACrBnrD,KAAKg9C,KAAK,CAAE75C,KAAM,mBAAoBinE,WAAYpqE,KAAKoqE,aACzD,GAAC,CAAAxoE,IAAA,UAAAG,MAED,WACE,IAAQyvB,EAAmBxxB,KAAnBwxB,GAAI44C,EAAepqE,KAAfoqE,WACZzlD,aAAa3kB,KAAKsqE,iBACdF,IACFA,EAAWxtB,UACX58C,KAAKoqE,WAAa,MAEhB54C,IACFA,EAAGo5C,wBAA0B,KAC7Bp5C,EAAGm5C,2BAA6B,KAChC3qE,KAAKwxB,GAAK,MAEZzxB,OAAOoK,oBAAoB,UAAWnK,KAAKwqE,UAC7C,GAAC,CAAA5oE,IAAA,UAAAG,MAED,SAAQi1C,GACNh3C,KAAK2mB,UAAU9gB,KAAKmxC,EACtB,GAAC,CAAAp1C,IAAA,OAAAG,MAED,SAAKyjB,GACHxlB,KAAK2mB,UAAUhY,SAAQ,SAAAqoC,GAAQ,OAAIA,EAASxxB,EAAI,GAClD,GAAC,CAAA5jB,IAAA,8BAAAG,MAED,SAA4BiI,GACtBA,EAAM8gE,eACR1oD,EAAOlC,KACL,0BACAlW,EAAM8gE,cAAc1sC,gBAG1B,GAEA,CAAAx8B,IAAA,uBAAAG,MACA,SAAqBiI,GAAO,IAAAsY,EAAA,KAE1B,GAAKtY,EAAM8gE,cAAX,CAIA,IAA4BC,EAAoB/gE,EAAM8gE,cAA9C/sC,mBAEgB,iBAApBgtC,IACF/qE,KAAKg9C,KAAK,CAAE75C,KAAM,UAAW6B,KAAM,qBAKnC2f,aAAa3kB,KAAKsqE,iBAClBtqE,KAAKsqE,gBAAkBvqE,OAAO8kB,YAAW,WACnCvC,EAAKkP,IAAqC,cAA/BlP,EAAKkP,GAAGuM,oBACrBzb,EAAK06B,KAAK,CAAE75C,KAAM,QAAS6B,KAAM,aAAc6xB,KAAM,cAEzD,GAAG,MAGmB,WAApBk0C,GACF/qE,KAAKg9C,KAAK,CAAE75C,KAAM,QAAS6B,KAAM,aAAc6xB,KAAM,gBAI/B,iBAAtB72B,KAAKuqE,cACL,CAAC,YAAa,aAAa18C,SAASk9C,IAEpC/qE,KAAKg9C,KAAK,CAAE75C,KAAM,gBAAiB6B,KAAM,qBAG3ChF,KAAKuqE,aAAeQ,CA7BpB,CA8BF,KACAV,CAAA,CArGqB,GCPvB,IAAIW,GAAW,CACbC,OAAQprE,KAAKkgB,QACb4kC,UAAW9kD,KAAK8kD,WAGdsmB,GAAS,CACX,GAAA5qD,IAAO6qD,GACDlrE,KAAKuoC,UACP2iC,EAASrlE,KAAK2e,KAAKC,OACnBumD,GAASC,OAAO5qD,IAAI,mBAAoB6qD,GAE5C,GAGF,MAAMzmD,GAAM,KAAM,IAAKD,MAAM2mD,UAEvBC,GAAe9Q,IAAS71C,KAAQ61C,GAAQ,IAE9C,MAAM,GACJ,WAAA3+C,CAAY8oC,GACVzkD,KAAKqrE,oBAAsBrrE,KAAKqrE,oBAAoBniE,KAAKlJ,MACzDA,KAAKykD,WAAaA,EAClBzkD,KAAKsrE,kBAAoB,CAC3B,CACA,KAAA5zB,GACO13C,KAAKurE,cACRvrE,KAAKwrE,UAAY/mD,YACVzkB,KAAKyrE,UACZzrE,KAAK0rE,eACLxhE,iBAAiB,mBAAoBlK,KAAKqrE,qBAC1CJ,GAAO5qD,IAAI,gDAAgDrgB,KAAK2b,YAAYgwD,oBAEhF,CACA,IAAArvD,GACMtc,KAAKurE,cACPvrE,KAAKyrE,UAAYhnD,KACjBzkB,KAAK4rE,cACLzhE,oBAAoB,mBAAoBnK,KAAKqrE,qBAC7CJ,GAAO5qD,IAAI,6BAEf,CACA,SAAAkrD,GACE,OAAOvrE,KAAKwrE,YAAcxrE,KAAKyrE,SACjC,CACA,UAAAI,GACE7rE,KAAK8rE,SAAWrnD,IAClB,CACA,aAAAsnD,GACE/rE,KAAKsrE,kBAAoB,EACzBtrE,KAAK6rE,oBACE7rE,KAAKgsE,eACZf,GAAO5qD,IAAI,qCACb,CACA,gBAAA4rD,GACEjsE,KAAKgsE,eAAiBvnD,KACtBwmD,GAAO5qD,IAAI,wCACb,CACA,YAAAqrD,GACE1rE,KAAK4rE,cACL5rE,KAAKksE,MACP,CACA,WAAAN,GACEjnD,aAAa3kB,KAAKmsE,YACpB,CACA,IAAAD,GACElsE,KAAKmsE,YAActnD,YAAW,KAC5B7kB,KAAKosE,mBACLpsE,KAAKksE,MACN,GAAGlsE,KAAKqsE,kBACX,CACA,eAAAA,GACE,MAAOV,eAAgBA,EAAgBW,wBAAyBA,GAA2BtsE,KAAK2b,YAIhG,OAAwB,IAAjBgwD,EAHSnrE,KAAKC,IAAI,EAAI6rE,EAAyB9rE,KAAKgsB,IAAIxsB,KAAKsrE,kBAAmB,MAG9C,GAFI,IAA3BtrE,KAAKsrE,kBAA0B,EAAIgB,GAC1B9rE,KAAKqK,SAElC,CACA,gBAAAuhE,GACMpsE,KAAKusE,sBACPtB,GAAO5qD,IAAI,oEAAoErgB,KAAKsrE,mCAAmCF,GAAaprE,KAAKwsE,qCAAqCxsE,KAAK2b,YAAYgwD,oBAC/L3rE,KAAKsrE,oBACDtrE,KAAKysE,uBACPxB,GAAO5qD,IAAI,+EAA+E+qD,GAAaprE,KAAKgsE,sBAE5Gf,GAAO5qD,IAAI,+BACXrgB,KAAKykD,WAAWioB,UAGtB,CACA,eAAIF,GACF,OAAOxsE,KAAK8rE,SAAW9rE,KAAK8rE,SAAW9rE,KAAKwrE,SAC9C,CACA,iBAAAe,GACE,OAAOnB,GAAaprE,KAAKwsE,aAAexsE,KAAK2b,YAAYgwD,cAC3D,CACA,oBAAAc,GACE,OAAOzsE,KAAKgsE,gBAAkBZ,GAAaprE,KAAKgsE,gBAAkBhsE,KAAK2b,YAAYgwD,cACrF,CACA,mBAAAN,GACmC,YAA7BrnE,SAASsoC,iBACXznB,YAAW,MACL7kB,KAAKusE,qBAAwBvsE,KAAKykD,WAAWkoB,WAC/C1B,GAAO5qD,IAAI,uFAAuFrc,SAASsoC,mBAC3GtsC,KAAKykD,WAAWioB,SAEnB,GAAG,IAER,EAGF,GAAkBf,eAAiB,EAEnC,GAAkBW,wBAA0B,IAE5C,IAAIM,GAAW,CACbC,cAAe,CACbC,QAAS,UACTnS,WAAY,aACZoS,KAAM,OACNC,aAAc,uBACdC,UAAW,uBAEbC,mBAAoB,CAClBC,aAAc,eACdC,gBAAiB,kBACjBC,eAAgB,kBAElBC,mBAAoB,SACpBC,UAAW,CAAE,sBAAuB,4BAGtC,MAAOV,cAAeA,GAAeU,UAAWA,IAAaX,GAEvDY,GAAqBD,GAAUlsE,MAAM,EAAGksE,GAAUjrE,OAAS,GAE3DyD,GAAU,GAAGA,QAEnB,MAAM0nE,GACJ,WAAA9xD,CAAY+xD,GACV1tE,KAAK0tC,KAAO1tC,KAAK0tC,KAAKxkC,KAAKlJ,MAC3BA,KAAK0tE,SAAWA,EAChB1tE,KAAK2tE,cAAgB3tE,KAAK0tE,SAASC,cACnC3tE,KAAKkmE,QAAU,IAAI,GAAkBlmE,MACrCA,KAAK4tE,cAAe,CACtB,CACA,IAAApmD,CAAKxkB,GACH,QAAIhD,KAAK2sE,WACP3sE,KAAK6tE,UAAUrmD,KAAKlU,KAAKC,UAAUvQ,KAC5B,EAIX,CACA,IAAA0qC,GACE,OAAI1tC,KAAKs8D,YACP2O,GAAO5qD,IAAI,uDAAuDrgB,KAAK8tE,eAChE,IAEP7C,GAAO5qD,IAAI,uCAAuCrgB,KAAK8tE,6BAA6BP,MAChFvtE,KAAK6tE,WACP7tE,KAAK+tE,yBAEP/tE,KAAK6tE,UAAY,IAAI7C,GAASrmB,UAAU3kD,KAAK0tE,SAAS5yC,IAAKyyC,IAC3DvtE,KAAKguE,uBACLhuE,KAAKkmE,QAAQxuB,SACN,EAEX,CACA,KAAAvM,EAAO8iC,eAAgBA,GAAkB,CACvCA,gBAAgB,IAKhB,GAHKA,GACHjuE,KAAKkmE,QAAQ5pD,OAEXtc,KAAK2sE,SACP,OAAO3sE,KAAK6tE,UAAU1iC,OAE1B,CACA,MAAAuhC,GAEE,GADAzB,GAAO5qD,IAAI,yCAAyCrgB,KAAK8tE,eACrD9tE,KAAKs8D,WAUP,OAAOt8D,KAAK0tC,OATZ,IACE,OAAO1tC,KAAKmrC,OACd,CAAE,MAAO5iC,GACP0iE,GAAO5qD,IAAI,6BAA8B9X,EAC3C,CAAE,QACA0iE,GAAO5qD,IAAI,0BAA0BrgB,KAAK2b,YAAYuyD,iBACtDrpD,WAAW7kB,KAAK0tC,KAAM1tC,KAAK2b,YAAYuyD,YACzC,CAIJ,CACA,WAAAC,GACE,GAAInuE,KAAK6tE,UACP,OAAO7tE,KAAK6tE,UAAU1hE,QAE1B,CACA,MAAAwgE,GACE,OAAO3sE,KAAKouE,QAAQ,OACtB,CACA,QAAA9R,GACE,OAAOt8D,KAAKouE,QAAQ,OAAQ,aAC9B,CACA,mBAAAC,GACE,OAAOtoE,GAAQlE,KAAK2rE,GAAoBxtE,KAAKmuE,gBAAkB,CACjE,CACA,OAAAC,IAAWE,GACT,OAAOvoE,GAAQlE,KAAKysE,EAAQtuE,KAAK8tE,aAAe,CAClD,CACA,QAAAA,GACE,GAAI9tE,KAAK6tE,UACP,IAAK,IAAIn0D,KAASsxD,GAASrmB,UACzB,GAAIqmB,GAASrmB,UAAUjrC,KAAW1Z,KAAK6tE,UAAUtwC,WAC/C,OAAO7jB,EAAMtN,cAInB,OAAO,IACT,CACA,oBAAA4hE,GACE,IAAK,IAAI/jE,KAAajK,KAAKuuE,OAAQ,CACjC,MAAMC,EAAUxuE,KAAKuuE,OAAOtkE,GAAWf,KAAKlJ,MAC5CA,KAAK6tE,UAAU,KAAK5jE,KAAeukE,CACrC,CACF,CACA,sBAAAT,GACE,IAAK,IAAI9jE,KAAajK,KAAKuuE,OACzBvuE,KAAK6tE,UAAU,KAAK5jE,KAAe,WAAY,CAEnD,EAGFwjE,GAAWS,YAAc,IAEzBT,GAAW5sE,UAAU0tE,OAAS,CAC5B,OAAA5/C,CAAQ3kB,GACN,IAAKhK,KAAKquE,sBACR,OAEF,MAAOI,WAAYA,EAAY9/C,QAASA,EAASw4B,OAAQA,EAAQunB,UAAWA,EAAWvrE,KAAMA,GAAQmQ,KAAK7Q,MAAMuH,EAAMhH,MACtH,OAAQG,GACP,KAAK0pE,GAAcC,QAElB,OADA9sE,KAAKkmE,QAAQ6F,gBACN/rE,KAAK2tE,cAAcgB,SAE3B,KAAK9B,GAAclS,WAElB,OADAsQ,GAAO5qD,IAAI,0BAA0B8mC,KAC9BnnD,KAAKmrC,MAAM,CAChB8iC,eAAgBS,IAGnB,KAAK7B,GAAcE,KAClB,OAAO/sE,KAAKkmE,QAAQ2F,aAErB,KAAKgB,GAAcG,aAElB,OADAhtE,KAAK2tE,cAAciB,oBAAoBH,GAChCzuE,KAAK2tE,cAAckB,OAAOJ,EAAY,aAE9C,KAAK5B,GAAcI,UAClB,OAAOjtE,KAAK2tE,cAAc5kE,OAAO0lE,GAElC,QACC,OAAOzuE,KAAK2tE,cAAckB,OAAOJ,EAAY,WAAY9/C,GAE7D,EACA,IAAA+e,GAGE,GAFAu9B,GAAO5qD,IAAI,kCAAkCrgB,KAAKmuE,8BAClDnuE,KAAK4tE,cAAe,GACf5tE,KAAKquE,sBAER,OADApD,GAAO5qD,IAAI,gEACJrgB,KAAKmrC,MAAM,CAChB8iC,gBAAgB,GAGtB,EACA,KAAA9iC,CAAMnhC,GAEJ,GADAihE,GAAO5qD,IAAI,4BACPrgB,KAAK4tE,aAKT,OAFA5tE,KAAK4tE,cAAe,EACpB5tE,KAAKkmE,QAAQ+F,mBACNjsE,KAAK2tE,cAAcmB,UAAU,eAAgB,CAClDC,qBAAsB/uE,KAAKkmE,QAAQqF,aAEvC,EACA,KAAAhjE,GACE0iE,GAAO5qD,IAAI,0BACb,GAaF,MAAM2uD,GACJ,WAAArzD,CAAY+xD,EAAUh/D,EAAS,CAAC,EAAGugE,GACjCjvE,KAAK0tE,SAAWA,EAChB1tE,KAAKyuE,WAAan7D,KAAKC,UAAU7E,GAbtB,SAAShN,EAAQwtE,GAC9B,GAAkB,MAAdA,EACF,IAAK,IAAIttE,KAAOstE,EAAY,CAC1B,MAAMntE,EAAQmtE,EAAWttE,GACzBF,EAAOE,GAAOG,CAChB,CAGJ,CAMIotE,CAAOnvE,KAAMivE,EACf,CACA,OAAAG,CAAQnI,EAAQjkE,EAAO,CAAC,GAEtB,OADAA,EAAKikE,OAASA,EACPjnE,KAAKwnB,KAAKxkB,EACnB,CACA,IAAAwkB,CAAKxkB,GACH,OAAOhD,KAAK0tE,SAASlmD,KAAK,CACxB6nD,QAAS,UACTZ,WAAYzuE,KAAKyuE,WACjBzrE,KAAMsQ,KAAKC,UAAUvQ,IAEzB,CACA,WAAAssE,GACE,OAAOtvE,KAAK0tE,SAASC,cAAc7gC,OAAO9sC,KAC5C,EAGF,MAAMuvE,GACJ,WAAA5zD,CAAYgyD,GACV3tE,KAAK2tE,cAAgBA,EACrB3tE,KAAKwvE,qBAAuB,EAC9B,CACA,SAAAC,CAAUC,IACgD,GAApD1vE,KAAKwvE,qBAAqBzpE,QAAQ2pE,IACpCzE,GAAO5qD,IAAI,sCAAsCqvD,EAAajB,cAC9DzuE,KAAKwvE,qBAAqB3pE,KAAK6pE,IAE/BzE,GAAO5qD,IAAI,8CAA8CqvD,EAAajB,cAExEzuE,KAAK2vE,mBACP,CACA,MAAAC,CAAOF,GACLzE,GAAO5qD,IAAI,oCAAoCqvD,EAAajB,cAC5DzuE,KAAKwvE,qBAAuBxvE,KAAKwvE,qBAAqB3jE,QAAQ6mB,GAAKA,IAAMg9C,GAC3E,CACA,iBAAAC,GACE3vE,KAAK6vE,mBACL7vE,KAAK8vE,kBACP,CACA,gBAAAD,GACElrD,aAAa3kB,KAAK+vE,aACpB,CACA,gBAAAD,GACE9vE,KAAK+vE,aAAelrD,YAAW,KACzB7kB,KAAK2tE,eAAyD,mBAAjC3tE,KAAK2tE,cAAcqC,WAClDhwE,KAAKwvE,qBAAqBrkE,KAAKukE,IAC7BzE,GAAO5qD,IAAI,uCAAuCqvD,EAAajB,cAC/DzuE,KAAK2tE,cAAcqC,UAAUN,EAC9B,GAEJ,GAAG,IACN,EAGF,MAAMO,GACJ,WAAAt0D,CAAY+xD,GACV1tE,KAAK0tE,SAAWA,EAChB1tE,KAAKkwE,UAAY,IAAIX,GAAsBvvE,MAC3CA,KAAK2tE,cAAgB,EACvB,CACA,MAAA11D,CAAOk4D,EAAalB,GAClB,MACMvgE,EAA4B,iBADlByhE,IACuC,CACrDxyC,QAFcwyC,GAIVT,EAAe,IAAIV,GAAahvE,KAAK0tE,SAAUh/D,EAAQugE,GAC7D,OAAOjvE,KAAKqzD,IAAIqc,EAClB,CACA,GAAArc,CAAIqc,GAKF,OAJA1vE,KAAK2tE,cAAc9nE,KAAK6pE,GACxB1vE,KAAK0tE,SAAS0C,yBACdpwE,KAAK6uE,OAAOa,EAAc,eAC1B1vE,KAAKgwE,UAAUN,GACRA,CACT,CACA,MAAA5iC,CAAO4iC,GAKL,OAJA1vE,KAAK4vE,OAAOF,GACP1vE,KAAKqwE,QAAQX,EAAajB,YAAYnsE,QACzCtC,KAAKswE,YAAYZ,EAAc,eAE1BA,CACT,CACA,MAAA3mE,CAAO0lE,GACL,OAAOzuE,KAAKqwE,QAAQ5B,GAAYtjE,KAAKukE,IACnC1vE,KAAK4vE,OAAOF,GACZ1vE,KAAK6uE,OAAOa,EAAc,YACnBA,IAEX,CACA,MAAAE,CAAOF,GAGL,OAFA1vE,KAAKkwE,UAAUN,OAAOF,GACtB1vE,KAAK2tE,cAAgB3tE,KAAK2tE,cAAc9hE,QAAQ6mB,GAAKA,IAAMg9C,IACpDA,CACT,CACA,OAAAW,CAAQ5B,GACN,OAAOzuE,KAAK2tE,cAAc9hE,QAAQ6mB,GAAKA,EAAE+7C,aAAeA,GAC1D,CACA,MAAAE,GACE,OAAO3uE,KAAK2tE,cAAcxiE,KAAKukE,GAAgB1vE,KAAKgwE,UAAUN,IAChE,CACA,SAAAZ,CAAUyB,KAAiBpsD,GACzB,OAAOnkB,KAAK2tE,cAAcxiE,KAAKukE,GAAgB1vE,KAAK6uE,OAAOa,EAAca,KAAiBpsD,IAC5F,CACA,MAAA0qD,CAAOa,EAAca,KAAiBpsD,GACpC,IAAIwpD,EAMJ,OAJEA,EAD0B,iBAAjB+B,EACO1vE,KAAKqwE,QAAQX,GAEb,CAAEA,GAEb/B,EAAcxiE,KAAKukE,GAAsD,mBAA/BA,EAAaa,GAA+Bb,EAAaa,MAAiBpsD,QAAQrX,GACrI,CACA,SAAAkjE,CAAUN,GACJ1vE,KAAKswE,YAAYZ,EAAc,cACjC1vE,KAAKkwE,UAAUT,UAAUC,EAE7B,CACA,mBAAAd,CAAoBH,GAClBxD,GAAO5qD,IAAI,0BAA0BouD,KACrCzuE,KAAKqwE,QAAQ5B,GAAYtjE,KAAKukE,GAAgB1vE,KAAKkwE,UAAUN,OAAOF,IACtE,CACA,WAAAY,CAAYZ,EAAcL,GACxB,MAAOZ,WAAYA,GAAciB,EACjC,OAAO1vE,KAAK0tE,SAASlmD,KAAK,CACxB6nD,QAASA,EACTZ,WAAYA,GAEhB,EAGF,MAAM+B,GACJ,WAAA70D,CAAYmf,GACV96B,KAAKywE,KAAO31C,EACZ96B,KAAK2tE,cAAgB,IAAIsC,GAAcjwE,MACvCA,KAAKykD,WAAa,IAAIgpB,GAAWztE,KACnC,CACA,OAAI86B,GACF,OAoBJ,SAA4BA,GACP,mBAARA,IACTA,EAAMA,KAER,GAAIA,IAAQ,UAAUt5B,KAAKs5B,GAAM,CAC/B,MAAM7c,EAAIja,SAASq/B,cAAc,KAIjC,OAHAplB,EAAEyuB,KAAO5R,EACT7c,EAAEyuB,KAAOzuB,EAAEyuB,KACXzuB,EAAE9R,SAAW8R,EAAE9R,SAASlK,QAAQ,OAAQ,MACjCgc,EAAEyuB,IACX,CACE,OAAO5R,CAEX,CAjCW41C,CAAmB1wE,KAAKywE,KACjC,CACA,IAAAjpD,CAAKxkB,GACH,OAAOhD,KAAKykD,WAAWj9B,KAAKxkB,EAC9B,CACA,OAAAi/C,GACE,OAAOjiD,KAAKykD,WAAW/W,MACzB,CACA,UAAAitB,GACE,OAAO36D,KAAKykD,WAAWtZ,MAAM,CAC3B8iC,gBAAgB,GAEpB,CACA,sBAAAmC,GACE,IAAKpwE,KAAKykD,WAAW6X,WACnB,OAAOt8D,KAAKykD,WAAW/W,MAE3B,EAkBF,SAASijC,GAAe71C,EAIxB,SAAmB91B,GACjB,MAAM2D,EAAU3E,SAASipC,KAAK2jC,cAAc,2BAA2B5rE,OACvE,GAAI2D,EACF,OAAOA,EAAQkoE,aAAa,UAEhC,CAT8BC,CAAU,QAAUlE,GAASU,oBACzD,OAAO,IAAIkD,GAAS11C,EACtB,CC/XA,SA5F2B,WACzB,SAAAi2C,EAAYhjE,GAAK0Q,EAAA,KAAAsyD,GACf/wE,KAAKsN,SAAW,CAAC,EACjBtN,KAAKgxE,iBAAmBhxE,KAAKixE,sBAE7BjxE,KAAKkxE,WAAalxE,KAAKkxE,WAAWhoE,KAAKlJ,MACvCA,KAAKmxE,WAAanxE,KAAKmxE,WAAWjoE,KAAKlJ,MACvCA,KAAKoxE,YAAcpxE,KAAKoxE,YAAYloE,KAAKlJ,MACzCA,KAAK6lE,aAAe7lE,KAAK6lE,aAAa38D,KAAKlJ,MAC3CA,KAAKqxE,eAAiBrxE,KAAKqxE,eAAenoE,KAAKlJ,MAE/CA,KAAKsxE,MAAQX,GAAe5iE,EAC9B,CA6EC,OA7EAwR,EAAAwxD,EAAA,EAAAnvE,IAAA,eAAAG,MAED,WACE/B,KAAKsN,SAASikE,YAAcvxE,KAAKsxE,MAAM3D,cAAc11D,OACnD,CAAE0lB,QAAS,eACX,CACE0tB,UAAWrrD,KAAKoxE,YAChB1H,SAAU1pE,KAAKkxE,WACftD,aAAc5tE,KAAKqxE,iBAGvBrxE,KAAKsN,SAASkkE,YAAcxxE,KAAKsxE,MAAM3D,cAAc11D,OACnD,CAAE0lB,QAAS,eACX,CAAE+rC,SAAU1pE,KAAKkxE,YAErB,GAAC,CAAAtvE,IAAA,cAAAG,MAED,WACM/B,KAAKyxE,qBACPzxE,KAAK0xE,kBAEPtvD,EAAO9B,MAAM,qCACf,GAAC,CAAA1e,IAAA,kBAAAG,MAED,WACE/B,KAAKgxE,iBAAiB,CAAE7tE,KAAM,aAChC,GAAC,CAAAvB,IAAA,aAAAG,MAED,SAAWyjB,GACTpD,EAAO9B,MAAM,oCAAqCkF,GAClDA,EAAIiB,KAAO,cACXzmB,KAAKgxE,iBAAiBxrD,EACxB,GAAC,CAAA5jB,IAAA,iBAAAG,MAED,WACEqgB,EAAO9B,MAAM,yCACbtgB,KAAKyxE,oBAAsBjtD,KAAKC,MAChCzkB,KAAKgxE,iBAAiB,CAAE7tE,KAAM,cAChC,GAAC,CAAAvB,IAAA,YAAAG,MAED,SAAUivE,GACwB,mBAArBA,IAGXhxE,KAAKgxE,iBAAmBA,EAC1B,GAAC,CAAApvE,IAAA,aAAAG,MAED,WACE/B,KAAKgxE,iBAAmBhxE,KAAKixE,qBAC/B,GAAC,CAAArvE,IAAA,wBAAAG,MAED,SAAsByjB,GACpBpD,EAAO9B,MAAM,iDAAkDkF,EACjE,GAEA,CAAA5jB,IAAA,OAAAG,MAGA,SAAAsrC,GAAiD,IAAAskC,EAAAtkC,EAA1C1P,QAAAA,OAAO,IAAAg0C,EAAG,cAAaA,EAAAC,EAAAvkC,EAAElqC,KAAAA,OAAI,IAAAyuE,EAAG,OAAMA,EACrClC,EAAe1vE,KAAKsN,SAASqwB,GAE9B+xC,EAQLA,EAAaN,QAAQjsE,GAPnBif,EAAOlC,KACL,sDACAyd,EAMN,GAAC,CAAA/7B,IAAA,QAAAG,MAED,WACE/B,KAAKsxE,MAAM3W,aACX36D,KAAKmxE,aACLnxE,KAAKsN,SAAW,CAAC,EACjBtN,KAAKsxE,MAAQ,IACf,KAACP,CAAA,CAzFwB,GCO3B,IAAMc,GAAe,SAACzS,EAAQ59C,GAAM,OAClC49C,EAAO0S,KAAKC,aAAavqD,KAAK,CAC5BrkB,KAAM,aACNwsD,iBAAkBnuC,GAClB,EA0FEwwD,GAAoB,SAAA5S,GACxB,IAAQ0S,EAAS1S,EAAT0S,KACRD,GAAazS,EAAQ,cAErB0S,EAAKC,aAAa3S,OAASA,EAE3B0S,EAAKzN,OAAOr1C,SAAQ,kBAClB8iD,EAAKC,aAAavqD,KAAK,CAAErkB,KAAM,UAAW6B,KAAM,gBAAiB,IAInE8sE,EAAKzN,OAAOvU,SAAQ,SAAA9sD,GAClB,GAAIA,EAAKuF,MAGP,OAFA6Z,EAAOlC,KAAK,4BAA6Bld,EAAKuF,YAC9CspE,GAAazS,EAAQ,iBAGvByS,GAAazS,EAAQ,iBAErB0S,EAAKG,aAAe,IAAIlB,GAAsB/tE,EAAKwsD,MAAM0iB,WACzDJ,EAAKC,aAAaE,aAAeH,EAAKG,aACtCH,EAAKG,aAAapM,eAElBiM,EAAKC,aAAa7L,QAAU,IAAImE,GAChCyH,EAAKC,aAAaryD,IAAMoyD,EAAKzN,OAhHX,SAAAjF,GACpBA,EAAO0S,KAAKK,cAAgBprD,aAAY,WACtCq4C,EAAO0S,KAAKG,aAAazqD,KAAK,CAAErkB,KAAM,cACxC,GAAG,IACL,CA6GIgvE,CAAc/S,GAxGM,SAAAA,GACtB,IAAIgT,EAAU,EACdhT,EAAO0S,KAAKO,wBAA0BtrD,aAAY,WAChD,IAAQ+qD,EAAS1S,EAAT0S,KACR,OAAgB,MAAZM,GACFhwD,EAAO9B,MACL,wEAEF4G,cAAc4qD,EAAKO,0BAIjBP,EAAKC,aAAariB,aACpBttC,EAAO9B,MACL,oEAEF4G,cAAc4qD,EAAKO,+BAIrBP,EAAKzN,OAAOvU,SAAQ,SAAA9sD,GAClB,IAAmB,IAAfA,EAAKqsD,MAGP,OAFAjtC,EAAO9B,MAAM,4CACbwxD,EAAKC,aAAavqD,KAAK,CAAErkB,KAAM,aAAcwgD,QAAS3gD,IAGxDof,EAAO9B,MAAM,0CAA2C8xD,GACxDA,GAAW,CACb,GACF,GAAG,IACL,CA2EIE,CAAgBlT,EAClB,GACF,EAGMmT,GAAW,WAEf,SAAAA,IAAc9zD,EAAA,KAAA8zD,GAIZvyE,KAAKmiC,OAASA,EACdniC,KAAK8xE,KAAO,CAAEC,aAAc,IAAIlT,IAChC7+D,KAAKuvD,KAAO,CAAC,EACbvvD,KAAKuiB,KAAO,CAAC,EACbviB,KAAKwvD,MAAQ,CAAC,EACdxvD,KAAK4I,QAAUA,CACjB,CAiGC,OA9FD2W,EAAAgzD,EAAA,EAAA3wE,IAAA,UAAAG,MAGA,SAAQi1C,GACkB,mBAAbA,EASXh3C,KAAK8xE,KAAKC,aAAaS,UAAUx7B,GAR/B50B,EAAO7Z,MACL,qGAC+CiO,EACtCwgC,GACP,IAKR,GAEA,CAAAp1C,IAAA,WAAAG,MAGA,SAASi1C,GACPh3C,KAAK8xE,KAAKC,aAAaU,eAAez7B,EACxC,GAEA,CAAAp1C,IAAA,UAAAG,MAGA,SAAQ0e,GACN2B,EAAO9B,MAAM,kBAAmBG,GAChCzgB,KAAK8xE,KAAKzN,OAAS,IAAI7jD,EAAOxgB,KAAKmiC,OAAOziB,IAAKe,GAC/CuxD,GAAkBhyE,KACpB,GAEA,CAAA4B,IAAA,OAAAG,MAGA,SAAK6sD,GACHxsC,EAAO9B,MAAM,eAAgBsuC,GA9Gb,SAACwQ,EAAQxQ,GAC3B,IAAQkjB,EAAS1S,EAAT0S,KACR,GAAKA,EAAKC,aAAariB,YAAvB,CASA,IAAM4B,EAAU,IAAI8S,GAClB0N,EAAKC,aAAariB,YAClBoiB,EAAKzN,OACLzV,GAEF0C,EAAQohB,WAAWZ,EAAKC,aAAa7L,SACrC4L,EAAKC,aAAazgB,QAAUA,EAE5BA,EAAQ5Z,QAnCe,SAAA0nB,GACvB,IAAQ0S,EAAS1S,EAAT0S,KACAa,EAAeb,EAAKC,aAAa5S,QAAjCwT,WACJA,GACFb,EAAKC,aAAavqD,KAAK,CACrBrkB,KAAM,oBACNwvE,WAAYA,GAGlB,CA2BEC,CAAiBxT,GACjBl4C,cAAc4qD,EAAKK,eACnB/S,EAAO9N,QAAUA,CAbjB,MANElvC,EAAO7Z,MACL,mIAmBN,CAwFIsqE,CAAY7yE,KAAM4uD,EACpB,GAEA,CAAAhtD,IAAA,QAAAG,MAGA,SAAM0e,GAAoD,IAAA6B,EAAA,KAA7CssC,EAAY3uC,UAAA3d,OAAA,QAAAwK,IAAAmT,UAAA,GAAAA,UAAA,GAAG,CAAE+M,OAAO,EAAMG,OAAO,GAChD/K,EAAO9B,MAAM,iBAQbtgB,KAAKkoD,SAPiB,SAAhB4qB,EAAgB9oE,GACW,UAA3BA,EAAM2lD,mBAGVrtC,EAAKsmC,SAASkqB,GACdxwD,EAAKvb,KAAK6nD,GACZ,IAEA5uD,KAAKiiD,QAAQxhC,EACf,GAEA,CAAA7e,IAAA,UAAAG,MAGA,WACE,IAAQ+vE,EAAS9xE,KAAT8xE,KACR1vD,EAAO9B,MAAM,mBACb4G,cAAc4qD,EAAKK,eACnBjrD,cAAc4qD,EAAKO,yBACnBP,EAAKC,aAAan1B,UAClBk1B,EAAKC,aAAe,IAAIlT,EAC1B,GAEA,CAAAj9D,IAAA,OAAAG,MAGA,SAAKyjB,GAEH,OADAA,EAAIiB,KAAO,SACJzmB,KAAK8xE,KAAKC,aAAavqD,KAAKhC,EACrC,GAEA,CAAA5jB,IAAA,gBAAAG,MAIA,SAAcyjB,GAAK,IAAArC,EAAA,KAKjB,OAJKnjB,KAAK+yE,iBACR/yE,KAAK+yE,eAAiBC,GAAS,SAAArkD,GAAO,OAAIxL,EAAKqE,KAAKmH,EAAQ,GAAE,MAGzD3uB,KAAK+yE,eAAevtD,EAC7B,GAEA,CAAA5jB,IAAA,iBAAAG,MAGA,WAEE,OAAO,IAAIwwE,CACb,KAACA,CAAA,CA7Gc,GAmHjB,SAFiB,IAAIA,GCvPN,SAASU,GAAmBrrD,GACzC,OCJa,SAA4BA,GACzC,GAAIG,MAAMK,QAAQR,GAAM,OAAO,EAAiBA,EAClD,CDES,CAAkBA,IELZ,SAA0B3L,GACvC,GAAsB,oBAAXjF,QAAmD,MAAzBiF,EAAKjF,OAAOE,WAA2C,MAAtB+E,EAAK,cAAuB,OAAO8L,MAAMG,KAAKjM,EACtH,CFGmC,CAAgB2L,IAAQ,EAA2BA,IGLvE,WACb,MAAM,IAAIvN,UAAU,uIACtB,CHG8F,EAC9F,CIkDA,SAtDc,WACZ,SAAA64D,EAAYC,GAAS10D,EAAA,KAAAy0D,GACnBlzE,KAAKmzE,QAAUA,CACjB,CAgDC,OAhDA5zD,EAAA2zD,EAAA,EAAAtxE,IAAA,SAAAG,MAED,SAAOqxE,GACL,OAAOpzE,KAAK0I,QAAQ,GAAD6Y,OAAIvhB,KAAKmzE,QAAO,cAAA5xD,OAAa6xD,IAAS7pE,MACvD,SAAA8jC,GAAO,OAAAA,EAAJrqC,IAAe,GAEtB,GAAC,CAAApB,IAAA,SAAAG,MAED,WACE,OAAO/B,KAAK0I,QAAQ,GAAD6Y,OAAIvhB,KAAKmzE,QAAO,YAAW5pE,MAAK,SAAAykC,GAAO,OAAAA,EAAJhrC,IAAe,GACvE,GAAC,CAAApB,IAAA,WAAAG,MAED,WAAW,IAAAugB,EAAA,KACT,OAAOtiB,KAAK0I,QAAQ,GAAD6Y,OAAIvhB,KAAKmzE,QAAO,sBAAqB5pE,MAAK,SAAA+kC,GAAA,IAAGtrC,EAAIsrC,EAAJtrC,KAAI,OAClEsf,EAAK+wD,QAAQ9pE,MAAK,SAAA+pE,GAAS,SAAA/xD,OAAA0xD,GAAQjwE,GAAIiwE,GAAKK,GAAS,GAAE,GAE3D,GAAC,CAAA1xE,IAAA,QAAAG,MAED,WACE,OAAO/B,KAAK0I,QAAQ,GAAD6Y,OAAIvhB,KAAKmzE,QAAO,WAAU5pE,MAAK,SAAAgqE,GAAO,OAAAA,EAAJvwE,IAAe,GACtE,GAAC,CAAApB,IAAA,iBAAAG,MAED,SAAeqxE,GAAO,IAAAjwD,EAAA,KACpB,OAAO,IAAIta,SAAQ,SAACoW,EAAKu0D,GACvBrwD,EAAKswD,OAAOL,GACT7pE,MAAK,SAAAvG,GACJ,OAAK+kB,MAAMK,QAAQplB,GAGZA,EAAK6I,QAAO,SAAAqnC,GAAG,OAAIA,EAAIwgC,OAAOC,aAAaC,UAAY,GAAK,IAF1D,EAGX,IACCrqE,MAAK,SAAAsqE,GACJ,GAA0B,IAAtBA,EAAWvxE,OACb,MAAM,IAAI+X,UAAU,iBAEtB4E,EAAI40D,EAAWrzE,KAAKszE,MAAMtzE,KAAKqK,SAAWgpE,EAAWvxE,SACvD,IAAE,MACKkxE,EACX,GACF,GAAC,CAAA5xE,IAAA,UAAAG,MAED,SAAQ+4B,GACN,OAAO/Z,MAAM,IAAIC,QAAQ8Z,IACtBvxB,MAAK,SAAA0X,GAAQ,OAAIA,EAASI,MAAM,IAAC,OAC3B,SAAA9Y,GAEL,OADA6Z,EAAOlC,KAAK,WAAY4a,EAAKvyB,GACtB,CAAEvF,KAAM,GACjB,GACJ,KAACkwE,CAAA,CAnDW,G,whCC0Md,SAlMgB,WAEd,SAAAa,IAAct1D,EAAA,KAAAs1D,GACZ/zE,KAAKg0E,MAAQ,EACbh0E,KAAKi0E,QAAU,EACfj0E,KAAKk0E,gBAAkB,EACvBl0E,KAAKm0E,gBAAkB,EACvBn0E,KAAKyU,MAAQ,KACbzU,KAAK2C,QAAU,KACf3C,KAAKurC,OAAS,KACdvrC,KAAKo0E,SAAW,KAChBp0E,KAAKq0E,QAAU,KACfr0E,KAAKg3C,SAAW,GAChBh3C,KAAKo4D,MAAQ,KACbp4D,KAAKs0E,WAAa,KAClBt0E,KAAKu0E,kBAAoBv0E,KAAKw0E,aAAatrE,KAAKlJ,MAChDA,KAAKy0E,WAAY,EACjBz0E,KAAK6qE,MACP,CA6KC,OA3KDtrD,EAAAw0D,EAAA,EAAAnyE,IAAA,OAAAG,MAIA,WACE,IAAM25B,EAAe37B,OAAO27B,cAAgB37B,OAAO47B,wBACvB,IAAjBD,GASX17B,KAAK2C,QAAU,IAAI+4B,EAEnB17B,KAAK2C,QAAQ+xE,cAAgB,SAAArnC,GAAgB,IAAbjuB,EAAMiuB,EAANjuB,OACT,cAAjBA,EAAO1F,OACT0I,EAAO7Z,MAAM,kCAAmC6W,EAAO1F,MAE3D,GAdE0I,EAAO7Z,MACL,oMAcN,GAKA,CAAA3G,IAAA,kBAAAG,MACA,SAAgByS,GAAQ,IAAA8N,EAAA,KACtB,IAAKtiB,KAAK2C,QACR,OAAO3C,KAET,IAAKwU,GAAUA,EAAO4a,iBAAiB9sB,OAAS,EAG9C,OAFAtC,KAAKy0E,WAAY,EACjBz0E,KAAKw0E,eACEx0E,KAEToiB,EAAO9B,MAAM,8BAA+B9L,GAAQ,IACdmgE,EAAAxsD,EAAvB3T,EAAO4a,iBAAgB,GACtC,GADCpvB,KAAKyU,MAAKkgE,EAAA,GACmB,SAA1B30E,KAAKyU,MAAM8oB,WAGb,OAFAv9B,KAAKy0E,WAAY,EACjBz0E,KAAKw0E,eACEx0E,KAETA,KAAKyU,MAAMvK,iBAAiB,QAASlK,KAAKu0E,mBAC1Cv0E,KAAKurC,OAASvrC,KAAK2C,QAAQq/C,wBAAwBxtC,GACnD,IAAM4/D,EAAWp0E,KAAK2C,QAAQiyE,iBAY9B,OAXAR,EAASS,QAAU,IACnBT,EAASU,aAAe,IACxBV,EAASW,YAAc,EACvBX,EAASY,sBAAwB,GACjCh1E,KAAKurC,OAAO0W,QAAQmyB,GACpBp0E,KAAKo0E,SAAWA,EAChBp0E,KAAKq0E,QAAU,IAAIjjC,WAAWgjC,EAASa,oBAClCj1E,KAAKk1E,SAAWl1E,KAAKg3C,SAAS10C,OAAS,IAC1CtC,KAAKk1E,SAAU,EACfl1E,KAAKo4D,MAAQrxC,aAAY,kBAAMzE,EAAK6yD,SAAS,GApF5B,MAsFZn1E,IACT,GAUA,CAAA4B,IAAA,UAAAG,MACA,WAAU,IAAAohB,EAAA,KACAixD,EAA6Bp0E,KAA7Bo0E,SAAUC,EAAmBr0E,KAAnBq0E,QAASL,EAAUh0E,KAAVg0E,MAC3B,GAAKI,EAAL,CAGAA,EAASgB,qBAAqBf,GAC9B,IAC4B1M,EADxB0N,EAAY,EAAEjN,EAAAC,GACGgM,GAAO,IAA5B,IAAAjM,EAAA11C,MAAAi1C,EAAAS,EAAAtqD,KAAAlE,MAA8B,CAC5By7D,GADe1N,EAAA5lE,KAEjB,CAAC,OAAA0V,GAAA2wD,EAAAphE,EAAAyQ,EAAA,SAAA2wD,EAAAx3C,GAAA,CACD,IAAM0kD,EAAgBD,EAAYhB,EAAQ/xE,OACpC2xE,EAAUzzE,KAAKgsB,IAAIhsB,KAAK+0E,MAAuB,IAAhBD,EAAuB,KAAM,KAalE,GAVc,IAAVtB,GAA2B,IAAZC,GAA0C,KAAzBj0E,KAAKm0E,kBACvCn0E,KAAKk0E,kBACDl0E,KAAKk0E,gBAAkB,KAAOl0E,KAAKs0E,aACrCt0E,KAAKs0E,WAAazvD,YAAW,WAC3B1B,EAAK65B,KAAK,CAAEw4B,QAAS,6BACrBryD,EAAKsyD,qBACP,GAAG,OAIHzB,IAAUC,EAGRj0E,KAAKk0E,gBAAkB,GACzBl0E,KAAKy1E,sBAEMj1E,KAAKk1E,IAAI1B,EAAQC,IAClB,IACVj0E,KAAKg0E,MAAQC,EACbj0E,KAAKg9C,KAAK,CAAEj7C,MAAOkyE,KAGnBj0E,KAAKm0E,gBAAkB,IACzBn0E,KAAKm0E,iBAjCP,CAmCF,GAAC,CAAAvyE,IAAA,sBAAAG,MAED,WACE4iB,aAAa3kB,KAAKs0E,YAClBt0E,KAAKs0E,WAAa,KAClBt0E,KAAKk0E,gBAAkB,CACzB,GAKA,CAAAtyE,IAAA,OAAAG,MACA,WACE/B,KAAK21E,YACD31E,KAAKyU,QACPzU,KAAKyU,MAAMtK,oBAAoB,QAASnK,KAAKu0E,mBAC7Cv0E,KAAKyU,MAAQ,MAEXzU,KAAKo0E,WACPp0E,KAAKo0E,SAASzZ,aACd36D,KAAKo0E,SAAW,MAEdp0E,KAAKurC,SACPvrC,KAAKurC,OAAOovB,aACZ36D,KAAKurC,OAAS,MAEhBvrC,KAAKq0E,QAAU,KACXr0E,KAAK2C,SAAW3C,KAAK2C,QAAQ2Z,MAA+B,WAAvBtc,KAAK2C,QAAQ+W,QACpD1Z,KAAK2C,QAAQ+xE,cAAgB,KAC7B10E,KAAK2C,QAAQwoC,QACbnrC,KAAK2C,QAAU,KAEnB,GAAC,CAAAf,IAAA,WAAAG,MAED,SAASi1C,GAAU,IAAAlzB,EAAA,KACjB9jB,KAAKg3C,SAASnxC,KAAKmxC,GACfh3C,KAAKy0E,UACPz0E,KAAKw0E,gBAGFx0E,KAAKk1E,SAAWl1E,KAAK2C,SAAW3C,KAAKyU,QACxCzU,KAAKk1E,SAAU,EACfl1E,KAAKo4D,MAAQrxC,aAAY,kBAAMjD,EAAKqxD,SAAS,GAnL5B,KAqLrB,GAAC,CAAAvzE,IAAA,YAAAG,MAED,WACE4iB,aAAa3kB,KAAKs0E,YAClBt0E,KAAKg3C,SAAS10C,OAAS,EACnBtC,KAAKk1E,UACPhuD,cAAclnB,KAAKo4D,OACnBp4D,KAAKk1E,SAAU,EAEnB,GAAC,CAAAtzE,IAAA,eAAAG,MAED,WACE/B,KAAKg9C,KAAK,CAAEz0C,MAAO,0BACnBvI,KAAKsc,MACP,GAAC,CAAA1a,IAAA,OAAAG,MAED,SAAK4sB,GACH3uB,KAAKg3C,SAASroC,SAAQ,SAAA7G,GAAE,OAAIA,EAAG6mB,EAAQ,GACzC,KAAColD,CAAA,CA/La,GC8EhB,SAjF2B,WACzB,SAAA6B,IAAcn3D,EAAA,KAAAm3D,GACZ51E,KAAK61E,UAAY,GACjB71E,KAAK8+D,SAAW,KAChB9+D,KAAK81E,UAAW,EAChB91E,KAAK0Z,MAAQ,IACf,CAkCA,IAAAmjD,EAsCC,OAxEAt9C,EAAAq2D,EAAA,EAAAh0E,IAAA,WAAAG,MAED,SAASi1C,GACiB,mBAAbA,GACTh3C,KAAK61E,UAAUhwE,KAAKmxC,EAExB,GAAC,CAAAp1C,IAAA,YAAAG,MAED,SAAUi1C,GACgB,mBAAbA,EACTh3C,KAAK61E,UAAY71E,KAAK61E,UAAUhqE,QAAO,SAAA/D,GAAE,OAAIA,IAAOkvC,CAAQ,IAE5Dh3C,KAAK61E,UAAUvzE,OAAS,CAE5B,GAAC,CAAAV,IAAA,QAAAG,MAED,SAAMg0E,GAGJ,IAAQr8D,EAAUq8D,EAAQA,EAAQzzE,OAAS,GAAnCoX,MACJA,IAAU1Z,KAAK0Z,QAGnB1Z,KAAK0Z,MAAQA,EACb0I,EAAO9B,MAAM,8BAA+B5G,GAC5C1Z,KAAK61E,UAAUlnE,SAAQ,SAAA7G,GACrB,IACEA,EAAG4R,EACL,CAAE,MAAOnR,GACP6Z,EAAO7Z,MAAM,8BAA+BA,EAC9C,CACF,IACF,GAEA,CAAA3G,IAAA,QAAAG,OAAA86D,EAAAz1B,GAAA3wB,KAAAA,MACA,SAAA62B,IAAA,OAAA72B,KAAAA,MAAA,SAAA+2B,GAAA,cAAAA,EAAAnxB,KAAAmxB,EAAAhzB,MAAA,WACqD,IAA/CotB,GAAgBf,2BAAoC,CAAA2G,EAAAhzB,KAAA,QACC,OAAvD4H,EAAO7Z,MAAM,0CAA0CilC,EAAArzB,OAAA,iBAStD,GATsDqzB,EAAAnxB,KAAA,EAIlDrc,KAAK8+D,WAER9+D,KAAK8+D,SAAW,IAAIh4B,iBAAiB9mC,KAAKg2E,MAAM9sE,KAAKlJ,MAAO,CAC1Di2E,WArDS,KAwDRj2E,KAAK81E,SAAU,CAAFtoC,EAAAhzB,KAAA,eAAAgzB,EAAAhzB,KAAA,EACVxa,KAAK8+D,SAASqH,QAAQ,OAAM,OAClCnmE,KAAK81E,UAAW,EAAK,OAEJ,OAAf91E,KAAK0Z,OACP1Z,KAAKg2E,MAAM,CAAC,CAAEt8D,MAAO,aAEvB0I,EAAO9B,MAAM,gCAAgCktB,EAAAhzB,KAAA,iBAAAgzB,EAAAnxB,KAAA,GAAAmxB,EAAAK,GAAAL,EAAA,SAE7CprB,EAAO7Z,MAAM,+BAA8BilC,EAAAK,IAAS,yBAAAL,EAAAlxB,OAAA,GAAAgxB,EAAA,mBAEvD,kBAAAuvB,EAAA78C,MAAA,KAAAC,UAAA,KAAAre,IAAA,OAAAG,MAED,WACM/B,KAAK8+D,UAAY9+D,KAAK81E,WACxB91E,KAAK8+D,SAASnE,aACd36D,KAAK81E,UAAW,EAEpB,GAAC,CAAAl0E,IAAA,UAAAG,MAED,WACE/B,KAAKsc,OACLtc,KAAK21E,YACL31E,KAAK0Z,MAAQ,KACb1Z,KAAK8+D,SAAW,IAClB,KAAC8W,CAAA,CA9EwB,GC6B3B,K","sources":["webpack://eyeson/webpack/universalModuleDefinition","webpack://eyeson/./node_modules/platform/platform.js","webpack://eyeson/./node_modules/screenfull/dist/screenfull.js","webpack://eyeson/./node_modules/sdp/sdp.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/regenerator/index.js","webpack://eyeson/webpack/bootstrap","webpack://eyeson/webpack/runtime/compat get default export","webpack://eyeson/webpack/runtime/define property getters","webpack://eyeson/webpack/runtime/global","webpack://eyeson/webpack/runtime/hasOwnProperty shorthand","webpack://eyeson/webpack/runtime/make namespace object","webpack://eyeson/webpack/runtime/node module decorator","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://eyeson/./src/config.js","webpack://eyeson/./src/options.js","webpack://eyeson/./src/Logger.js","webpack://eyeson/./src/ComApi.js","webpack://eyeson/./src/utils/throttle.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://eyeson/./src/events/BaseEvent.js","webpack://eyeson/./src/events/PlaybackEvents.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://eyeson/./src/events/PublicEvent.js","webpack://eyeson/./src/events/AnnotationEvents.js","webpack://eyeson/./src/events/StfuEvent.js","webpack://eyeson/./src/events/IgnoreEvent.js","webpack://eyeson/./src/events/ForwardEvent.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/utils.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/safari/safari_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/common_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_core.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_factory.js","webpack://eyeson/./src/FullscreenHelper.js","webpack://eyeson/./src/FeatureDetector.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://eyeson/./src/NinjaStream.js","webpack://eyeson/./src/LocalStorage.js","webpack://eyeson/./src/utils/immediate.js","webpack://eyeson/./src/utils/StreamHelpers.js","webpack://eyeson/./src/utils/throttledAnimationFrame.js","webpack://eyeson/./src/utils/importScript.js","webpack://eyeson/./src/utils/cacheStorage.js","webpack://eyeson/./src/utils/canvasBlur.js","webpack://eyeson/./src/VirtualBackgroundMixer.js","webpack://eyeson/./src/DeviceManager.js","webpack://eyeson/./src/MediaStreamBuilder.js","webpack://eyeson/./src/MicMixer.js","webpack://eyeson/./src/events/ChangeLocalStreamEvent.js","webpack://eyeson/./src/events/PodiumEvent.js","webpack://eyeson/./src/events/SnapshotEvent.js","webpack://eyeson/./src/events/SetLayerEvent.js","webpack://eyeson/./src/events/SendChatEvent.js","webpack://eyeson/./src/events/StopRtmpEvent.js","webpack://eyeson/./src/events/SetLayoutEvent.js","webpack://eyeson/./src/events/StartRtmpEvent.js","webpack://eyeson/./src/sepp/eventEmitter.js","webpack://eyeson/./src/sepp/Transport.js","webpack://eyeson/./src/sepp/crlfNormalize.js","webpack://eyeson/./src/sepp/parseJwtPayload.js","webpack://eyeson/./src/sepp/uuid.js","webpack://eyeson/./src/sepp/SEPP.js","webpack://eyeson/./src/SigMessageWhitelist.js","webpack://eyeson/./src/PodiumFacade.js","webpack://eyeson/./src/SigMessageTransformer.js","webpack://eyeson/./src/SessionDescriptionHandler.js","webpack://eyeson/./src/SigConnection.js","webpack://eyeson/./src/events/RoomReceivedEvent.js","webpack://eyeson/./src/events/FetchRoomEvent.js","webpack://eyeson/./src/events/DeleteFileEvent.js","webpack://eyeson/./src/events/UploadFileEvent.js","webpack://eyeson/./src/events/ReceiveChatEvent.js","webpack://eyeson/./src/events/StartStreamEvent.js","webpack://eyeson/./src/events/ChangeStreamEvent.js","webpack://eyeson/./src/events/ReplaceStreamEvent.js","webpack://eyeson/./src/events/ToggleCameraEvent.js","webpack://eyeson/./src/events/AcceptSessionEvent.js","webpack://eyeson/./src/events/StopRecordingEvent.js","webpack://eyeson/./src/events/VoiceActivityEvent.js","webpack://eyeson/./src/events/StartRecordingEvent.js","webpack://eyeson/./src/events/ScreenCaptureEvent.js","webpack://eyeson/./src/events/StartPresentingEvent.js","webpack://eyeson/./src/events/StopPresentingEvent.js","webpack://eyeson/./src/events/StopBroadcastsEvent.js","webpack://eyeson/./src/events/ClearFrontLayerEvent.js","webpack://eyeson/./src/events/RequestGuestUserEvent.js","webpack://eyeson/./src/events/SessionTerminationEvent.js","webpack://eyeson/./src/events/ParticipantListUpdateEvent.js","webpack://eyeson/./src/utils/scale.js","webpack://eyeson/./src/utils/debounce.js","webpack://eyeson/./src/CanvasMixer.js","webpack://eyeson/./src/events/MixerEvents.js","webpack://eyeson/./src/VideoPlayer.js","webpack://eyeson/./src/events/MediaEvents.js","webpack://eyeson/./src/events/LockMeetingEvent.js","webpack://eyeson/./src/events/TerminateMeetingEvent.js","webpack://eyeson/./src/events/KickUserEvent.js","webpack://eyeson/./src/events/VirtualBackgroundEvent.js","webpack://eyeson/./src/events/ScreenVideoChangeEvent.js","webpack://eyeson/./src/events/ScreenVideoStoppedEvent.js","webpack://eyeson/./src/DeviceMonitor.js","webpack://eyeson/./src/PipCam.js","webpack://eyeson/./src/events/PipCamEvents.js","webpack://eyeson/./src/events/DeviceEndEvents.js","webpack://eyeson/./src/EventHandler.js","webpack://eyeson/./src/SDPModifiers.js","webpack://eyeson/./src/ConferenceSession.js","webpack://eyeson/./src/utils/ConnectionStatistics.js","webpack://eyeson/./src/ConnectionMonitor.js","webpack://eyeson/./node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js","webpack://eyeson/./src/ActionCableConnection.js","webpack://eyeson/./src/eyeson.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://eyeson/./src/utils/GiphyApi.js","webpack://eyeson/./src/SoundMeter.js","webpack://eyeson/./src/SystemPressureMonitor.js","webpack://eyeson/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"eyeson\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"eyeson\"] = factory();\n\telse\n\t\troot[\"eyeson\"] = factory();\n})(self, () => {\nreturn ","/*!\n * Platform.js v1.3.6\n * Copyright 2014-2020 Benjamin Tan\n * Copyright 2011-2013 John-David Dalton\n * Available under MIT license\n */\n;(function() {\n 'use strict';\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used as a reference to the global object. */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Backup possible global object. */\n var oldRoot = root;\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n root = freeGlobal;\n }\n\n /**\n * Used as the maximum length of an array-like object.\n * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n * for more details.\n */\n var maxSafeInteger = Math.pow(2, 53) - 1;\n\n /** Regular expression to detect Opera. */\n var reOpera = /\\bOpera/;\n\n /** Possible global object. */\n var thisBinding = this;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check for own properties of an object. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to resolve the internal `[[Class]]` of values. */\n var toString = objectProto.toString;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Capitalizes a string value.\n *\n * @private\n * @param {string} string The string to capitalize.\n * @returns {string} The capitalized string.\n */\n function capitalize(string) {\n string = String(string);\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n /**\n * A utility function to clean up the OS name.\n *\n * @private\n * @param {string} os The OS name to clean up.\n * @param {string} [pattern] A `RegExp` pattern matching the OS name.\n * @param {string} [label] A label for the OS.\n */\n function cleanupOS(os, pattern, label) {\n // Platform tokens are defined at:\n // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n var data = {\n '10.0': '10',\n '6.4': '10 Technical Preview',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': 'Server 2008 R2 / 7',\n '6.0': 'Server 2008 / Vista',\n '5.2': 'Server 2003 / XP 64-bit',\n '5.1': 'XP',\n '5.01': '2000 SP1',\n '5.0': '2000',\n '4.0': 'NT',\n '4.90': 'ME'\n };\n // Detect Windows version from platform tokens.\n if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) &&\n (data = data[/[\\d.]+$/.exec(os)])) {\n os = 'Windows ' + data;\n }\n // Correct character case and cleanup string.\n os = String(os);\n\n if (pattern && label) {\n os = os.replace(RegExp(pattern, 'i'), label);\n }\n\n os = format(\n os.replace(/ ce$/i, ' CE')\n .replace(/\\bhpw/i, 'web')\n .replace(/\\bMacintosh\\b/, 'Mac OS')\n .replace(/_PowerPC\\b/i, ' OS')\n .replace(/\\b(OS X) [^ \\d]+/i, '$1')\n .replace(/\\bMac (OS X)\\b/, '$1')\n .replace(/\\/(\\d)/, ' $1')\n .replace(/_/g, '.')\n .replace(/(?: BePC|[ .]*fc[ \\d.]+)$/i, '')\n .replace(/\\bx86\\.64\\b/gi, 'x86_64')\n .replace(/\\b(Windows Phone) OS\\b/, '$1')\n .replace(/\\b(Chrome OS \\w+) [\\d.]+\\b/, '$1')\n .split(' on ')[0]\n );\n\n return os;\n }\n\n /**\n * An iteration utility for arrays and objects.\n *\n * @private\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} callback The function called per iteration.\n */\n function each(object, callback) {\n var index = -1,\n length = object ? object.length : 0;\n\n if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) {\n while (++index < length) {\n callback(object[index], index, object);\n }\n } else {\n forOwn(object, callback);\n }\n }\n\n /**\n * Trim and conditionally capitalize string values.\n *\n * @private\n * @param {string} string The string to format.\n * @returns {string} The formatted string.\n */\n function format(string) {\n string = trim(string);\n return /^(?:webOS|i(?:OS|P))/.test(string)\n ? string\n : capitalize(string);\n }\n\n /**\n * Iterates over an object's own properties, executing the `callback` for each.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} callback The function executed per own property.\n */\n function forOwn(object, callback) {\n for (var key in object) {\n if (hasOwnProperty.call(object, key)) {\n callback(object[key], key, object);\n }\n }\n }\n\n /**\n * Gets the internal `[[Class]]` of a value.\n *\n * @private\n * @param {*} value The value.\n * @returns {string} The `[[Class]]`.\n */\n function getClassOf(value) {\n return value == null\n ? capitalize(value)\n : toString.call(value).slice(8, -1);\n }\n\n /**\n * Host objects can return type values that are different from their actual\n * data type. The objects we are concerned with usually return non-primitive\n * types of \"object\", \"function\", or \"unknown\".\n *\n * @private\n * @param {*} object The owner of the property.\n * @param {string} property The property to check.\n * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.\n */\n function isHostType(object, property) {\n var type = object != null ? typeof object[property] : 'number';\n return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n (type == 'object' ? !!object[property] : true);\n }\n\n /**\n * Prepares a string for use in a `RegExp` by making hyphens and spaces optional.\n *\n * @private\n * @param {string} string The string to qualify.\n * @returns {string} The qualified string.\n */\n function qualify(string) {\n return String(string).replace(/([ -])(?!$)/g, '$1?');\n }\n\n /**\n * A bare-bones `Array#reduce` like utility function.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function called per iteration.\n * @returns {*} The accumulated result.\n */\n function reduce(array, callback) {\n var accumulator = null;\n each(array, function(value, index) {\n accumulator = callback(accumulator, value, index, array);\n });\n return accumulator;\n }\n\n /**\n * Removes leading and trailing whitespace from a string.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} The trimmed string.\n */\n function trim(string) {\n return String(string).replace(/^ +| +$/g, '');\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a new platform object.\n *\n * @memberOf platform\n * @param {Object|string} [ua=navigator.userAgent] The user agent string or\n * context object.\n * @returns {Object} A platform object.\n */\n function parse(ua) {\n\n /** The environment context object. */\n var context = root;\n\n /** Used to flag when a custom context is provided. */\n var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String';\n\n // Juggle arguments.\n if (isCustomContext) {\n context = ua;\n ua = null;\n }\n\n /** Browser navigator object. */\n var nav = context.navigator || {};\n\n /** Browser user agent string. */\n var userAgent = nav.userAgent || '';\n\n ua || (ua = userAgent);\n\n /** Used to flag when `thisBinding` is the [ModuleScope]. */\n var isModuleScope = isCustomContext || thisBinding == oldRoot;\n\n /** Used to detect if browser is like Chrome. */\n var likeChrome = isCustomContext\n ? !!nav.likeChrome\n : /\\bChrome\\b/.test(ua) && !/internal|\\n/i.test(toString.toString());\n\n /** Internal `[[Class]]` value shortcuts. */\n var objectClass = 'Object',\n airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject',\n enviroClass = isCustomContext ? objectClass : 'Environment',\n javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java),\n phantomClass = isCustomContext ? objectClass : 'RuntimeObject';\n\n /** Detect Java environments. */\n var java = /\\bJava/.test(javaClass) && context.java;\n\n /** Detect Rhino. */\n var rhino = java && getClassOf(context.environment) == enviroClass;\n\n /** A character to represent alpha. */\n var alpha = java ? 'a' : '\\u03b1';\n\n /** A character to represent beta. */\n var beta = java ? 'b' : '\\u03b2';\n\n /** Browser document object. */\n var doc = context.document || {};\n\n /**\n * Detect Opera browser (Presto-based).\n * http://www.howtocreate.co.uk/operaStuff/operaObject.html\n * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini\n */\n var opera = context.operamini || context.opera;\n\n /** Opera `[[Class]]`. */\n var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera))\n ? operaClass\n : (opera = null);\n\n /*------------------------------------------------------------------------*/\n\n /** Temporary variable used over the script's lifetime. */\n var data;\n\n /** The CPU architecture. */\n var arch = ua;\n\n /** Platform description array. */\n var description = [];\n\n /** Platform alpha/beta indicator. */\n var prerelease = null;\n\n /** A flag to indicate that environment features should be used to resolve the platform. */\n var useFeatures = ua == userAgent;\n\n /** The browser/environment version. */\n var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();\n\n /** A flag to indicate if the OS ends with \"/ Version\" */\n var isSpecialCasedOS;\n\n /* Detectable layout engines (order is important). */\n var layout = getLayout([\n { 'label': 'EdgeHTML', 'pattern': 'Edge' },\n 'Trident',\n { 'label': 'WebKit', 'pattern': 'AppleWebKit' },\n 'iCab',\n 'Presto',\n 'NetFront',\n 'Tasman',\n 'KHTML',\n 'Gecko'\n ]);\n\n /* Detectable browser names (order is important). */\n var name = getName([\n 'Adobe AIR',\n 'Arora',\n 'Avant Browser',\n 'Breach',\n 'Camino',\n 'Electron',\n 'Epiphany',\n 'Fennec',\n 'Flock',\n 'Galeon',\n 'GreenBrowser',\n 'iCab',\n 'Iceweasel',\n 'K-Meleon',\n 'Konqueror',\n 'Lunascape',\n 'Maxthon',\n { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' },\n 'Midori',\n 'Nook Browser',\n 'PaleMoon',\n 'PhantomJS',\n 'Raven',\n 'Rekonq',\n 'RockMelt',\n { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' },\n 'SeaMonkey',\n { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Sleipnir',\n 'SlimBrowser',\n { 'label': 'SRWare Iron', 'pattern': 'Iron' },\n 'Sunrise',\n 'Swiftfox',\n 'Vivaldi',\n 'Waterfox',\n 'WebPositive',\n { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' },\n { 'label': 'UC Browser', 'pattern': 'UCBrowser' },\n 'Opera Mini',\n { 'label': 'Opera Mini', 'pattern': 'OPiOS' },\n 'Opera',\n { 'label': 'Opera', 'pattern': 'OPR' },\n 'Chromium',\n 'Chrome',\n { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' },\n { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },\n { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },\n { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' },\n { 'label': 'IE', 'pattern': 'IEMobile' },\n { 'label': 'IE', 'pattern': 'MSIE' },\n 'Safari'\n ]);\n\n /* Detectable products (order is important). */\n var product = getProduct([\n { 'label': 'BlackBerry', 'pattern': 'BB10' },\n 'BlackBerry',\n { 'label': 'Galaxy S', 'pattern': 'GT-I9000' },\n { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },\n { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' },\n { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' },\n { 'label': 'Galaxy S5', 'pattern': 'SM-G900' },\n { 'label': 'Galaxy S6', 'pattern': 'SM-G920' },\n { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' },\n { 'label': 'Galaxy S7', 'pattern': 'SM-G930' },\n { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' },\n 'Google TV',\n 'Lumia',\n 'iPad',\n 'iPod',\n 'iPhone',\n 'Kindle',\n { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Nexus',\n 'Nook',\n 'PlayBook',\n 'PlayStation Vita',\n 'PlayStation',\n 'TouchPad',\n 'Transformer',\n { 'label': 'Wii U', 'pattern': 'WiiU' },\n 'Wii',\n 'Xbox One',\n { 'label': 'Xbox 360', 'pattern': 'Xbox' },\n 'Xoom'\n ]);\n\n /* Detectable manufacturers. */\n var manufacturer = getManufacturer({\n 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },\n 'Alcatel': {},\n 'Archos': {},\n 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },\n 'Asus': { 'Transformer': 1 },\n 'Barnes & Noble': { 'Nook': 1 },\n 'BlackBerry': { 'PlayBook': 1 },\n 'Google': { 'Google TV': 1, 'Nexus': 1 },\n 'HP': { 'TouchPad': 1 },\n 'HTC': {},\n 'Huawei': {},\n 'Lenovo': {},\n 'LG': {},\n 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 },\n 'Motorola': { 'Xoom': 1 },\n 'Nintendo': { 'Wii U': 1, 'Wii': 1 },\n 'Nokia': { 'Lumia': 1 },\n 'Oppo': {},\n 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 },\n 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 },\n 'Xiaomi': { 'Mi': 1, 'Redmi': 1 }\n });\n\n /* Detectable operating systems (order is important). */\n var os = getOS([\n 'Windows Phone',\n 'KaiOS',\n 'Android',\n 'CentOS',\n { 'label': 'Chrome OS', 'pattern': 'CrOS' },\n 'Debian',\n { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' },\n 'Fedora',\n 'FreeBSD',\n 'Gentoo',\n 'Haiku',\n 'Kubuntu',\n 'Linux Mint',\n 'OpenBSD',\n 'Red Hat',\n 'SuSE',\n 'Ubuntu',\n 'Xubuntu',\n 'Cygwin',\n 'Symbian OS',\n 'hpwOS',\n 'webOS ',\n 'webOS',\n 'Tablet OS',\n 'Tizen',\n 'Linux',\n 'Mac OS X',\n 'Macintosh',\n 'Mac',\n 'Windows 98;',\n 'Windows '\n ]);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Picks the layout engine from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected layout engine.\n */\n function getLayout(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the manufacturer from an array of guesses.\n *\n * @private\n * @param {Array} guesses An object of guesses.\n * @returns {null|string} The detected manufacturer.\n */\n function getManufacturer(guesses) {\n return reduce(guesses, function(result, value, key) {\n // Lookup the manufacturer by product or scan the UA for the manufacturer.\n return result || (\n value[product] ||\n value[/^[a-z]+(?: +[a-z]+\\b)*/i.exec(product)] ||\n RegExp('\\\\b' + qualify(key) + '(?:\\\\b|\\\\w*\\\\d)', 'i').exec(ua)\n ) && key;\n });\n }\n\n /**\n * Picks the browser name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected browser name.\n */\n function getName(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the OS name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected OS name.\n */\n function getOS(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + '(?:/[\\\\d.]+|[ \\\\w.]*)', 'i').exec(ua)\n )) {\n result = cleanupOS(result, pattern, guess.label || guess);\n }\n return result;\n });\n }\n\n /**\n * Picks the product name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected product name.\n */\n function getProduct(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + ' *\\\\d+[.\\\\w_]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + ' *\\\\w+-[\\\\w]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\\\d+|[^ ();-]*)', 'i').exec(ua)\n )) {\n // Split by forward slash and append product version if needed.\n if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\\d.]+/.test(result[0])) {\n result[0] += ' ' + result[1];\n }\n // Correct character case and cleanup string.\n guess = guess.label || guess;\n result = format(result[0]\n .replace(RegExp(pattern, 'i'), guess)\n .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')\n .replace(RegExp('(' + guess + ')[-_.]?(\\\\w)', 'i'), '$1 $2'));\n }\n return result;\n });\n }\n\n /**\n * Resolves the version using an array of UA patterns.\n *\n * @private\n * @param {Array} patterns An array of UA patterns.\n * @returns {null|string} The detected version.\n */\n function getVersion(patterns) {\n return reduce(patterns, function(result, pattern) {\n return result || (RegExp(pattern +\n '(?:-[\\\\d.]+/|(?: for [\\\\w-]+)?[ /-])([\\\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;\n });\n }\n\n /**\n * Returns `platform.description` when the platform object is coerced to a string.\n *\n * @name toString\n * @memberOf platform\n * @returns {string} Returns `platform.description` if available, else an empty string.\n */\n function toStringPlatform() {\n return this.description || '';\n }\n\n /*------------------------------------------------------------------------*/\n\n // Convert layout to an array so we can add extra details.\n layout && (layout = [layout]);\n\n // Detect Android products.\n // Browsers on Android devices typically provide their product IDS after \"Android;\"\n // up to \"Build\" or \") AppleWebKit\".\n // Example:\n // \"Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36\n // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36\"\n if (/\\bAndroid\\b/.test(os) && !product &&\n (data = /\\bAndroid[^;]*;(.*?)(?:Build|\\) AppleWebKit)\\b/i.exec(ua))) {\n product = trim(data[1])\n // Replace any language codes (eg. \"en-US\").\n .replace(/^[a-z]{2}-[a-z]{2};\\s*/i, '')\n || null;\n }\n // Detect product names that contain their manufacturer's name.\n if (manufacturer && !product) {\n product = getProduct([manufacturer]);\n } else if (manufacturer && product) {\n product = product\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\\\s]', 'i'), manufacturer + ' ')\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\\\w)', 'i'), manufacturer + ' $2');\n }\n // Clean up Google TV.\n if ((data = /\\bGoogle TV\\b/.exec(product))) {\n product = data[0];\n }\n // Detect simulators.\n if (/\\bSimulator\\b/i.test(ua)) {\n product = (product ? product + ' ' : '') + 'Simulator';\n }\n // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.\n if (name == 'Opera Mini' && /\\bOPiOS\\b/.test(ua)) {\n description.push('running in Turbo/Uncompressed mode');\n }\n // Detect IE Mobile 11.\n if (name == 'IE' && /\\blike iPhone OS\\b/.test(ua)) {\n data = parse(ua.replace(/like iPhone OS/, ''));\n manufacturer = data.manufacturer;\n product = data.product;\n }\n // Detect iOS.\n else if (/^iP/.test(product)) {\n name || (name = 'Safari');\n os = 'iOS' + ((data = / OS ([\\d_]+)/i.exec(ua))\n ? ' ' + data[1].replace(/_/g, '.')\n : '');\n }\n // Detect Kubuntu.\n else if (name == 'Konqueror' && /^Linux\\b/i.test(os)) {\n os = 'Kubuntu';\n }\n // Detect Android browsers.\n else if ((manufacturer && manufacturer != 'Google' &&\n ((/Chrome/.test(name) && !/\\bMobile Safari\\b/i.test(ua)) || /\\bVita\\b/.test(product))) ||\n (/\\bAndroid\\b/.test(os) && /^Chrome/.test(name) && /\\bVersion\\//i.test(ua))) {\n name = 'Android Browser';\n os = /\\bAndroid\\b/.test(os) ? os : 'Android';\n }\n // Detect Silk desktop/accelerated modes.\n else if (name == 'Silk') {\n if (!/\\bMobi/i.test(ua)) {\n os = 'Android';\n description.unshift('desktop mode');\n }\n if (/Accelerated *= *true/i.test(ua)) {\n description.unshift('accelerated');\n }\n }\n // Detect UC Browser speed mode.\n else if (name == 'UC Browser' && /\\bUCWEB\\b/.test(ua)) {\n description.push('speed mode');\n }\n // Detect PaleMoon identifying as Firefox.\n else if (name == 'PaleMoon' && (data = /\\bFirefox\\/([\\d.]+)\\b/.exec(ua))) {\n description.push('identifying as Firefox ' + data[1]);\n }\n // Detect Firefox OS and products running Firefox.\n else if (name == 'Firefox' && (data = /\\b(Mobile|Tablet|TV)\\b/i.exec(ua))) {\n os || (os = 'Firefox OS');\n product || (product = data[1]);\n }\n // Detect false positives for Firefox/Safari.\n else if (!name || (data = !/\\bMinefield\\b/i.test(ua) && /\\b(?:Firefox|Safari)\\b/.exec(name))) {\n // Escape the `/` for Firefox 1.\n if (name && !product && /[\\/,]|^[^(]+?\\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {\n // Clear name of false positives.\n name = null;\n }\n // Reassign a generic name.\n if ((data = product || manufacturer || os) &&\n (product || manufacturer || /\\b(?:Android|Symbian OS|Tablet OS|webOS)\\b/.test(os))) {\n name = /[a-z]+(?: Hat)?/i.exec(/\\bAndroid\\b/.test(os) ? os : data) + ' Browser';\n }\n }\n // Add Chrome version to description for Electron.\n else if (name == 'Electron' && (data = (/\\bChrome\\/([\\d.]+)\\b/.exec(ua) || 0)[1])) {\n description.push('Chromium ' + data);\n }\n // Detect non-Opera (Presto-based) versions (order is important).\n if (!version) {\n version = getVersion([\n '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\\\d.]+$)|UCBrowser|YaBrowser)',\n 'Version',\n qualify(name),\n '(?:Firefox|Minefield|NetFront)'\n ]);\n }\n // Detect stubborn layout engines.\n if ((data =\n layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' ||\n /\\bOpera\\b/.test(name) && (/\\bOPR\\b/.test(ua) ? 'Blink' : 'Presto') ||\n /\\b(?:Midori|Nook|Safari)\\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' ||\n !layout && /\\bMSIE\\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') ||\n layout == 'WebKit' && /\\bPlayStation\\b(?! Vita\\b)/i.test(name) && 'NetFront'\n )) {\n layout = [data];\n }\n // Detect Windows Phone 7 desktop mode.\n if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\\d+)/i.exec(ua) || 0)[1])) {\n name += ' Mobile';\n os = 'Windows Phone ' + (/\\+$/.test(data) ? data : data + '.x');\n description.unshift('desktop mode');\n }\n // Detect Windows Phone 8.x desktop mode.\n else if (/\\bWPDesktop\\b/i.test(ua)) {\n name = 'IE Mobile';\n os = 'Windows Phone 8.x';\n description.unshift('desktop mode');\n version || (version = (/\\brv:([\\d.]+)/.exec(ua) || 0)[1]);\n }\n // Detect IE 11 identifying as other browsers.\n else if (name != 'IE' && layout == 'Trident' && (data = /\\brv:([\\d.]+)/.exec(ua))) {\n if (name) {\n description.push('identifying as ' + name + (version ? ' ' + version : ''));\n }\n name = 'IE';\n version = data[1];\n }\n // Leverage environment features.\n if (useFeatures) {\n // Detect server-side environments.\n // Rhino has a global function while others have a global object.\n if (isHostType(context, 'global')) {\n if (java) {\n data = java.lang.System;\n arch = data.getProperty('os.arch');\n os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');\n }\n if (rhino) {\n try {\n version = context.require('ringo/engine').version.join('.');\n name = 'RingoJS';\n } catch(e) {\n if ((data = context.system) && data.global.system == context.system) {\n name = 'Narwhal';\n os || (os = data[0].os || null);\n }\n }\n if (!name) {\n name = 'Rhino';\n }\n }\n else if (\n typeof context.process == 'object' && !context.process.browser &&\n (data = context.process)\n ) {\n if (typeof data.versions == 'object') {\n if (typeof data.versions.electron == 'string') {\n description.push('Node ' + data.versions.node);\n name = 'Electron';\n version = data.versions.electron;\n } else if (typeof data.versions.nw == 'string') {\n description.push('Chromium ' + version, 'Node ' + data.versions.node);\n name = 'NW.js';\n version = data.versions.nw;\n }\n }\n if (!name) {\n name = 'Node.js';\n arch = data.arch;\n os = data.platform;\n version = /[\\d.]+/.exec(data.version);\n version = version ? version[0] : null;\n }\n }\n }\n // Detect Adobe AIR.\n else if (getClassOf((data = context.runtime)) == airRuntimeClass) {\n name = 'Adobe AIR';\n os = data.flash.system.Capabilities.os;\n }\n // Detect PhantomJS.\n else if (getClassOf((data = context.phantom)) == phantomClass) {\n name = 'PhantomJS';\n version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);\n }\n // Detect IE compatibility modes.\n else if (typeof doc.documentMode == 'number' && (data = /\\bTrident\\/(\\d+)/i.exec(ua))) {\n // We're in compatibility mode when the Trident version + 4 doesn't\n // equal the document mode.\n version = [version, doc.documentMode];\n if ((data = +data[1] + 4) != version[1]) {\n description.push('IE ' + version[1] + ' mode');\n layout && (layout[1] = '');\n version[1] = data;\n }\n version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];\n }\n // Detect IE 11 masking as other browsers.\n else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\\b/.test(name)) {\n description.push('masking as ' + name + ' ' + version);\n name = 'IE';\n version = '11.0';\n layout = ['Trident'];\n os = 'Windows';\n }\n os = os && format(os);\n }\n // Detect prerelease phases.\n if (version && (data =\n /(?:[ab]|dp|pre|[ab]\\d+pre)(?:\\d+\\+?)?$/i.exec(version) ||\n /(?:alpha|beta)(?: ?\\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||\n /\\bMinefield\\b/i.test(ua) && 'a'\n )) {\n prerelease = /b/i.test(data) ? 'beta' : 'alpha';\n version = version.replace(RegExp(data + '\\\\+?$'), '') +\n (prerelease == 'beta' ? beta : alpha) + (/\\d+\\+?/.exec(data) || '');\n }\n // Detect Firefox Mobile.\n if (name == 'Fennec' || name == 'Firefox' && /\\b(?:Android|Firefox OS|KaiOS)\\b/.test(os)) {\n name = 'Firefox Mobile';\n }\n // Obscure Maxthon's unreliable version.\n else if (name == 'Maxthon' && version) {\n version = version.replace(/\\.[\\d.]+/, '.x');\n }\n // Detect Xbox 360 and Xbox One.\n else if (/\\bXbox\\b/i.test(product)) {\n if (product == 'Xbox 360') {\n os = null;\n }\n if (product == 'Xbox 360' && /\\bIEMobile\\b/.test(ua)) {\n description.unshift('mobile mode');\n }\n }\n // Add mobile postfix.\n else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) &&\n (os == 'Windows CE' || /Mobi/i.test(ua))) {\n name += ' Mobile';\n }\n // Detect IE platform preview.\n else if (name == 'IE' && useFeatures) {\n try {\n if (context.external === null) {\n description.unshift('platform preview');\n }\n } catch(e) {\n description.unshift('embedded');\n }\n }\n // Detect BlackBerry OS version.\n // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp\n else if ((/\\bBlackBerry\\b/.test(product) || /\\bBB10\\b/.test(ua)) && (data =\n (RegExp(product.replace(/ +/g, ' *') + '/([.\\\\d]+)', 'i').exec(ua) || 0)[1] ||\n version\n )) {\n data = [data, /BB10/.test(ua)];\n os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0];\n version = null;\n }\n // Detect Opera identifying/masking itself as another browser.\n // http://www.opera.com/support/kb/view/843/\n else if (this != forOwn && product != 'Wii' && (\n (useFeatures && opera) ||\n (/Opera/.test(name) && /\\b(?:MSIE|Firefox)\\b/i.test(ua)) ||\n (name == 'Firefox' && /\\bOS X (?:\\d+\\.){2,}/.test(os)) ||\n (name == 'IE' && (\n (os && !/^Win/.test(os) && version > 5.5) ||\n /\\bWindows XP\\b/.test(os) && version > 8 ||\n version == 8 && !/\\bTrident\\b/.test(ua)\n ))\n ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) {\n // When \"identifying\", the UA contains both Opera and the other browser's name.\n data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');\n if (reOpera.test(name)) {\n if (/\\bIE\\b/.test(data) && os == 'Mac OS') {\n os = null;\n }\n data = 'identify' + data;\n }\n // When \"masking\", the UA contains only the other browser's name.\n else {\n data = 'mask' + data;\n if (operaClass) {\n name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));\n } else {\n name = 'Opera';\n }\n if (/\\bIE\\b/.test(data)) {\n os = null;\n }\n if (!useFeatures) {\n version = null;\n }\n }\n layout = ['Presto'];\n description.push(data);\n }\n // Detect WebKit Nightly and approximate Chrome/Safari versions.\n if ((data = (/\\bAppleWebKit\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n // Correct build number for numeric comparison.\n // (e.g. \"532.5\" becomes \"532.05\")\n data = [parseFloat(data.replace(/\\.(\\d)$/, '.0$1')), data];\n // Nightly builds are postfixed with a \"+\".\n if (name == 'Safari' && data[1].slice(-1) == '+') {\n name = 'WebKit Nightly';\n prerelease = 'alpha';\n version = data[1].slice(0, -1);\n }\n // Clear incorrect browser versions.\n else if (version == data[1] ||\n version == (data[2] = (/\\bSafari\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n version = null;\n }\n // Use the full Chrome version when available.\n data[1] = (/\\b(?:Headless)?Chrome\\/([\\d.]+)/i.exec(ua) || 0)[1];\n // Detect Blink layout engine.\n if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') {\n layout = ['Blink'];\n }\n // Detect JavaScriptCore.\n // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi\n if (!useFeatures || (!likeChrome && !data[1])) {\n layout && (layout[1] = 'like Safari');\n data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12');\n } else {\n layout && (layout[1] = 'like Chrome');\n data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28');\n }\n // Add the postfix of \".x\" or \"+\" for approximate versions.\n layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'));\n // Obscure version for some Safari 1-2 releases.\n if (name == 'Safari' && (!version || parseInt(version) > 45)) {\n version = data;\n } else if (name == 'Chrome' && /\\bHeadlessChrome/i.test(ua)) {\n description.unshift('headless');\n }\n }\n // Detect Opera desktop modes.\n if (name == 'Opera' && (data = /\\bzbov|zvav$/.exec(os))) {\n name += ' ';\n description.unshift('desktop mode');\n if (data == 'zvav') {\n name += 'Mini';\n version = null;\n } else {\n name += 'Mobile';\n }\n os = os.replace(RegExp(' *' + data + '$'), '');\n }\n // Detect Chrome desktop mode.\n else if (name == 'Safari' && /\\bChrome\\b/.exec(layout && layout[1])) {\n description.unshift('desktop mode');\n name = 'Chrome Mobile';\n version = null;\n\n if (/\\bOS X\\b/.test(os)) {\n manufacturer = 'Apple';\n os = 'iOS 4.3+';\n } else {\n os = null;\n }\n }\n // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number.\n else if (/\\bSRWare Iron\\b/.test(name) && !version) {\n version = getVersion('Chrome');\n }\n // Strip incorrect OS versions.\n if (version && version.indexOf((data = /[\\d.]+$/.exec(os))) == 0 &&\n ua.indexOf('/' + data + '-') > -1) {\n os = trim(os.replace(data, ''));\n }\n // Ensure OS does not include the browser name.\n if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) {\n os = os.replace(RegExp(' *' + qualify(name) + ' *'), '');\n }\n // Add layout engine.\n if (layout && !/\\b(?:Avant|Nook)\\b/.test(name) && (\n /Browser|Lunascape|Maxthon/.test(name) ||\n name != 'Safari' && /^iOS/.test(os) && /\\bSafari\\b/.test(layout[1]) ||\n /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) {\n // Don't add layout details to description if they are falsey.\n (data = layout[layout.length - 1]) && description.push(data);\n }\n // Combine contextual information.\n if (description.length) {\n description = ['(' + description.join('; ') + ')'];\n }\n // Append manufacturer to description.\n if (manufacturer && product && product.indexOf(manufacturer) < 0) {\n description.push('on ' + manufacturer);\n }\n // Append product to description.\n if (product) {\n description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product);\n }\n // Parse the OS into an object.\n if (os) {\n data = / ([\\d.+]+)$/.exec(os);\n isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/';\n os = {\n 'architecture': 32,\n 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os,\n 'version': data ? data[1] : null,\n 'toString': function() {\n var version = this.version;\n return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');\n }\n };\n }\n // Add browser/OS architecture.\n if ((data = /\\b(?:AMD|IA|Win|WOW|x86_|x)64\\b/i.exec(arch)) && !/\\bi686\\b/i.test(arch)) {\n if (os) {\n os.architecture = 64;\n os.family = os.family.replace(RegExp(' *' + data), '');\n }\n if (\n name && (/\\bWOW64\\b/i.test(ua) ||\n (useFeatures && /\\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\\bWin64; x64\\b/i.test(ua)))\n ) {\n description.unshift('32-bit');\n }\n }\n // Chrome 39 and above on OS X is always 64-bit.\n else if (\n os && /^OS X/.test(os.family) &&\n name == 'Chrome' && parseFloat(version) >= 39\n ) {\n os.architecture = 64;\n }\n\n ua || (ua = null);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The platform object.\n *\n * @name platform\n * @type Object\n */\n var platform = {};\n\n /**\n * The platform description.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.description = ua;\n\n /**\n * The name of the browser's layout engine.\n *\n * The list of common layout engines include:\n * \"Blink\", \"EdgeHTML\", \"Gecko\", \"Trident\" and \"WebKit\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.layout = layout && layout[0];\n\n /**\n * The name of the product's manufacturer.\n *\n * The list of manufacturers include:\n * \"Apple\", \"Archos\", \"Amazon\", \"Asus\", \"Barnes & Noble\", \"BlackBerry\",\n * \"Google\", \"HP\", \"HTC\", \"LG\", \"Microsoft\", \"Motorola\", \"Nintendo\",\n * \"Nokia\", \"Samsung\" and \"Sony\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.manufacturer = manufacturer;\n\n /**\n * The name of the browser/environment.\n *\n * The list of common browser names include:\n * \"Chrome\", \"Electron\", \"Firefox\", \"Firefox for iOS\", \"IE\",\n * \"Microsoft Edge\", \"PhantomJS\", \"Safari\", \"SeaMonkey\", \"Silk\",\n * \"Opera Mini\" and \"Opera\"\n *\n * Mobile versions of some browsers have \"Mobile\" appended to their name:\n * eg. \"Chrome Mobile\", \"Firefox Mobile\", \"IE Mobile\" and \"Opera Mobile\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.name = name;\n\n /**\n * The alpha/beta release indicator.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.prerelease = prerelease;\n\n /**\n * The name of the product hosting the browser.\n *\n * The list of common products include:\n *\n * \"BlackBerry\", \"Galaxy S4\", \"Lumia\", \"iPad\", \"iPod\", \"iPhone\", \"Kindle\",\n * \"Kindle Fire\", \"Nexus\", \"Nook\", \"PlayBook\", \"TouchPad\" and \"Transformer\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.product = product;\n\n /**\n * The browser's user agent string.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.ua = ua;\n\n /**\n * The browser/environment version.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.version = name && version;\n\n /**\n * The name of the operating system.\n *\n * @memberOf platform\n * @type Object\n */\n platform.os = os || {\n\n /**\n * The CPU architecture the OS is built for.\n *\n * @memberOf platform.os\n * @type number|null\n */\n 'architecture': null,\n\n /**\n * The family of the OS.\n *\n * Common values include:\n * \"Windows\", \"Windows Server 2008 R2 / 7\", \"Windows Server 2008 / Vista\",\n * \"Windows XP\", \"OS X\", \"Linux\", \"Ubuntu\", \"Debian\", \"Fedora\", \"Red Hat\",\n * \"SuSE\", \"Android\", \"iOS\" and \"Windows Phone\"\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'family': null,\n\n /**\n * The version of the OS.\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'version': null,\n\n /**\n * Returns the OS string.\n *\n * @memberOf platform.os\n * @returns {string} The OS string.\n */\n 'toString': function() { return 'null'; }\n };\n\n platform.parse = parse;\n platform.toString = toStringPlatform;\n\n if (platform.version) {\n description.unshift(version);\n }\n if (platform.name) {\n description.unshift(name);\n }\n if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) {\n description.push(product ? '(' + os + ')' : 'on ' + os);\n }\n if (description.length) {\n platform.description = description.join(' ');\n }\n return platform;\n }\n\n /*--------------------------------------------------------------------------*/\n\n // Export platform.\n var platform = parse();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose platform on the global object to prevent errors when platform is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n root.platform = platform;\n\n // Define as an anonymous module so platform can be aliased through path mapping.\n define(function() {\n return platform;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for CommonJS support.\n forOwn(platform, function(value, key) {\n freeExports[key] = value;\n });\n }\n else {\n // Export to the global object.\n root.platform = platform;\n }\n}.call(this));\n","/*!\n* screenfull\n* v5.2.0 - 2021-11-03\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrÑ–bute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return {\n value: void 0,\n done: !0\n };\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable || \"\" === iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n throw new TypeError(_typeof(iterable) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) keys.push(key);\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(obj);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default {\n api: 'https://api.eyeson.team',\n allowSafariSFU: true,\n screencapture: true\n};\n","export default {\n widescreen: false\n};\n","/*eslint no-console: 0*/\n\n/**\n * eyeson Logger implement debug|info|warn|error methods.\n **/\nexport default (function () {\n return {\n error: function (...args) {\n return console.error(...args);\n },\n warn: function (...args) {\n return console.warn(...args);\n },\n info: function (...args) {\n return console.log(...args);\n },\n debug: function (...args) {\n if (!console.debug) {\n return null;\n }\n return console.debug(...args);\n }\n };\n})();\n","/* eslint max-lines: off */\nimport Logger from './Logger.js';\n\n/**\n * eyeson Communications Api\n **/\nclass ComApi {\n constructor(uri, token) {\n this.uri = uri;\n this.token = token.replace(/\\W+/g, '');\n this.cache = { users: [] };\n this.errorCallback = null;\n this._handleError = this._handleError.bind(this);\n }\n\n _request(path, options = {}) {\n return fetch(new Request(this.uri + path), options).then(response => {\n const contentType = response.headers.get('content-type');\n\n if (\n contentType &&\n contentType.indexOf('application/json') !== -1 &&\n response.ok\n ) {\n return response.json();\n }\n\n // not json - e.g. broadcast stop\n if (response.ok) {\n return response.text();\n }\n\n throw new Error(`ComApiError: ${response.status}`);\n });\n }\n\n /**\n * NOTE: slightly adjusted from:\n * https://gist.github.com/ghinda/8442a57f22099bdb2e34\n **/\n /* eslint-disable */\n _objectToFormData(obj, form, namespace) {\n let fd = form || new FormData();\n let formKey = null;\n\n for (let property in obj) {\n if (!obj.hasOwnProperty(property)) {\n return;\n }\n if (namespace) {\n // adjusted, skip \"int props\" for layout api\n let prop = isNaN(parseInt(property)) ? property : '';\n formKey = namespace + '[' + prop + ']';\n } else {\n formKey = property;\n }\n // if the property is an object, but not a File, use recursivity.\n if (\n typeof obj[property] === 'object' &&\n !(obj[property] instanceof File)\n ) {\n this._objectToFormData(obj[property], fd, property);\n } else {\n // if it's a string or a File object\n fd.append(formKey, obj[property]);\n }\n }\n\n return fd;\n }\n /* eslint-enable */\n\n _post(path, data) {\n return this._request(path, {\n method: 'POST',\n body: this._objectToFormData(data)\n });\n }\n\n _put(path, data) {\n const formData = new FormData();\n /* eslint-disable guard-for-in */\n for (const key in data) {\n formData.append(key, data[key]);\n }\n /* eslint-enable */\n return this._request(path, {\n method: 'PUT',\n body: formData\n });\n }\n\n _handleError(error) {\n Logger.error('ComApi::handleError', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return false;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n /**\n * Fetch room details including the user and credentials from com-api.\n **/\n getRoom(callback) {\n return this._request(`/rooms/${this.token}`)\n .then(callback)\n .catch(error => {\n return callback ? callback({ error: error }) : { error: error };\n });\n }\n\n /**\n * Terminate meeting immediately for all users\n **/\n terminateMeeting() {\n return this._request(`/rooms/${this.token}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Retrieve user information. Will use cache on multiple requests.\n **/\n getUser(userId, callback) {\n const user = this.cache.users.find(cachedUser => cachedUser.id === userId);\n\n if (user) {\n callback(user);\n return null;\n }\n\n return this._request(`/rooms/${this.token}/users/${userId}`)\n .then(apiUser => {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n let extendedUser = this.addUserAttributes(apiUser, userId, userId);\n users.push(extendedUser);\n this.cache.users = users;\n callback(extendedUser);\n })\n .catch(this._handleError);\n }\n\n addUserAttributes(user, userId, clientId) {\n let largeAvatarUrl = user.avatar;\n\n try {\n largeAvatarUrl = `${user.avatar}?size=large`;\n } catch (error) {\n Logger.warn('ComApi::addUserAttributes missing', user);\n }\n\n return Object.assign(user, {\n id: userId,\n apiId: user.id,\n clientId: clientId,\n // sipId will be removed in future (2023)!\n sipId: clientId,\n largeAvatar: largeAvatarUrl\n });\n }\n\n /**\n * Remove user from current meeting.\n **/\n kickUser(userId) {\n return this._request(`/rooms/${this.token}/users/${userId}`, {\n method: 'DELETE'\n })\n .then(() => {\n const user = this.cache.users.find(\n cachedUser => cachedUser.id === userId\n );\n if (user) {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n this.cache.users = users;\n }\n })\n .catch(this._handleError);\n }\n\n /**\n * Request a guest user from api.\n **/\n /* eslint-disable camelcase */\n requestUser(user, callback) {\n return this._post(`/guests/${this.token}`, {\n name: user.name,\n email: user.email,\n custom_fields: {\n locale: user.locale || 'en'\n }\n })\n .then(callback)\n .catch(error => callback({ error: error }));\n }\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n startBroadcast(data, platform) {\n return this._post(`/rooms/${this.token}/broadcasts`, {\n platform: platform,\n player_url: data.playerUrl || '',\n stream_url: data.streamUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n publishBroadcast(data, platform) {\n return this._put(`/rooms/${this.token}/broadcasts/${platform}`, {\n player_url: data.playerUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Stop a broadcast from a platform.\n **/\n stopBroadcast(platform) {\n return this._request(`/rooms/${this.token}/broadcasts/${platform}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Stop all broadcasts.\n **/\n stopAllBroadcasts() {\n return this._request(`/rooms/${this.token}/broadcasts`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Start a recording.\n **/\n startRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'POST'\n });\n }\n\n /**\n * Stop a recording\n **/\n stopRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Set layout\n * params object either as { layout: 'auto' } or { users: [ id1, id2 ...] }\n **/\n setLayout(params) {\n return this._post(`/rooms/${this.token}/layout`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Set layer\n *\n * params object: {\n * insert: {\n * icon: user['avatar'],\n * title: \"#{user['name']}:\",\n * content: question.truncate(280)\n * }\n * }\n *\n **/\n setLayer(params) {\n return this._post(`/rooms/${this.token}/layers`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Clear front most layer\n **/\n clearFrontLayer() {\n return this._request(`/rooms/${this.token}/layers/1`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Take a snapshot of the current podium\n **/\n takeSnapshot() {\n return this._request(`/rooms/${this.token}/snapshot`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n\n getSnapshot(snapshotId, callback) {\n return this._request(`/rooms/${this.token}/snapshots/${snapshotId}`)\n .then(callback)\n .catch(error => {\n if (callback) {\n callback({ error });\n return;\n }\n this._handleError(error);\n });\n }\n\n /**\n * Start a playback\n **/\n startPlayback(playback) {\n return this._post(`/rooms/${this.token}/playbacks`, {\n playback: playback\n }).catch(this._handleError);\n }\n\n /**\n * Stop a playback identified by play_id\n **/\n stopPlayback(playback) {\n return this._request(`/rooms/${this.token}/playbacks/${playback.play_id}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Lock meeting to freeze current participants\n */\n lockMeeting() {\n return this._request(`/rooms/${this.token}/lock`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n}\n\nexport default ComApi;\n","/* eslint-disable */\n/**\n * Creates and returns a new, throttled version of the passed function, that,\n * when invoked repeatedly, will only actually call the original function at most\n * once per every wait milliseconds. Useful for rate-limiting events that occur\n * faster than you can keep up with.\n *\n * By default, throttle will execute the function as soon as you call it for the\n * first time, and, if you call it again any number of times during the wait\n * period, as soon as that period is over. If you'd like to disable the\n * leading-edge call, pass {leading: false}, and if you'd like to disable the\n * execution on the trailing-edge, pass {trailing: false}.\n *\n * @see http://underscorejs.org/#throttle\n **/\nexport default (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n};\n/* eslint-enable */\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import Logger from './../Logger.js';\n\nclass BaseEvent {\n constructor(context) {\n this.context = context;\n }\n\n handle(msg) {\n Logger.error('BaseEvent::handle is not implemented', msg);\n }\n}\n\nexport default BaseEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StartPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.startPlayback(msg.playback);\n }\n}\n\nclass StopPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.stopPlayback(msg.playback);\n }\n}\n\nexport { StartPlaybackEvent, StopPlaybackEvent };\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import BaseEvent from './BaseEvent.js';\n\nclass PublicEvent extends BaseEvent {\n handle(msg) {\n if (msg._src === 'client') {\n return;\n }\n\n Reflect.deleteProperty(msg, '_src');\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default PublicEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartAnnotationEvent extends PublicEvent {\n handle() {\n this.context.annotationLoop = window.setInterval(() => {\n this.context._api.createAnnotation(\n response => {\n return super.handle({ type: 'annotation', annotation: response });\n },\n () => {\n window.clearInterval(this.context.annotationLoop);\n }\n );\n }, 1000);\n }\n}\n\nclass StopAnnotationEvent extends PublicEvent {\n handle() {\n window.clearInterval(this.context.annotationLoop);\n this.context._api.stopAnnotation();\n }\n}\n\nexport { StartAnnotationEvent, StopAnnotationEvent };\n","import PublicEvent from './PublicEvent.js';\n\nclass StfuEvent extends PublicEvent {\n handle() {\n this.context._rtConnection.send({ type: 'stfu' });\n }\n}\n\nexport default StfuEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass IgnoreEvent extends BaseEvent {\n handle() {\n // do nothing.\n }\n}\n\nexport default IgnoreEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ForwardEvent extends BaseEvent {\n handle(msg) {\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default ForwardEvent;\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator ||\n !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const 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 const 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 let 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(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 const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\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 if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = 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.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 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'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/*\n * Copyright (c) 2017 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/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","/*\n * Copyright (c) 2016 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 */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","import screenfull from 'screenfull';\n\nclass FullscreenHelper {\n constructor() {\n this.onChange = this.onChange.bind(this);\n this.hasSupport = Boolean(screenfull.isEnabled);\n }\n\n toggle() {\n return this.isFullscreen() ? screenfull.exit() : screenfull.request();\n }\n\n canFullscreen() {\n return this.hasSupport;\n }\n\n isFullscreen() {\n return this.hasSupport && screenfull.isFullscreen;\n }\n\n onChange(callback) {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.on('change', () => callback(this.isFullscreen()));\n }\n\n off() {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.off('change');\n }\n}\n\nexport default FullscreenHelper;\n","/* eslint-disable max-lines */\nimport config from './config.js';\nimport Logger from './Logger.js';\nimport adapter from 'webrtc-adapter';\nimport platform from 'platform';\nimport FullscreenHelper from './FullscreenHelper.js';\n\nlet _canvasBlurSupport = null;\n\n/**\n * Feature Detector.\n **/\nexport default {\n environment: function () {\n return {\n canMix: this.canMix(),\n canPip: this.hasPipSupport(),\n canSFU: this.canSFU(),\n isPhone: this.isPhone(),\n inIframe: this.inIframe(),\n isIOSDevice: this.isIOSDevice(),\n canUseEyeson: this.canUseEyeson(),\n canFullscreen: this.canFullscreen(),\n hasMobileDevice: this.hasMobileDevice(),\n canToggleCamera: this.canToggleCamera(),\n canPresentFiles: this.canPresentFiles(),\n canScreenCapture: this.canScreenCapture(),\n canAdjustSettings: this.canAdjustDeviceSettings(),\n canStreamLocalMedia: this.canStreamLocalMedia(),\n isExperimentalBrowser: this.isExperimentalBrowser()\n };\n },\n\n platform: () => platform,\n\n /**\n * Test if browser should be able to use eyeson.\n * canDataChannel includes hasPeerConnection check\n **/\n canUseEyeson: function () {\n return (\n !this.isWebView() &&\n this.hasGetUserMedia() &&\n this.canDataChannel() &&\n this.isMinimumRequiredBrowser()\n );\n },\n\n hasGetUserMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices\n );\n },\n\n hasGetDisplayMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getDisplayMedia' in navigator.mediaDevices\n );\n },\n\n hasPeerConnection: function () {\n return 'RTCPeerConnection' in window;\n },\n\n hasCaptureStream: function () {\n return (\n 'captureStream' in HTMLMediaElement.prototype ||\n 'mozCaptureStream' in HTMLMediaElement.prototype\n );\n },\n\n hasCanvasCaptureSupport: function () {\n return (\n 'CanvasCaptureMediaStream' in window ||\n 'CanvasCaptureMediaStreamTrack' in window\n );\n },\n\n hasSenders: function () {\n return 'RTCRtpSender' in window;\n },\n\n /**\n * 07 Aug 2019 - Safari doesn't seem to fire the event properly.\n **/\n hasTrackOnUnmute: function () {\n if (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n ) {\n return false;\n }\n return 'onunmute' in MediaStreamTrack.prototype;\n },\n\n /**\n * https://caniuse.com/#feat=webp\n **/\n hasWebpSupport: function () {\n if (this.isChrome()) {\n return adapter.browserDetails.version >= 70;\n }\n if (this.isFF()) {\n return adapter.browserDetails.version >= 65;\n }\n\n return false;\n },\n /**\n * Test if user agent supports changing of audio output.\n **/\n canChangeAudioOutput: function () {\n if (!document) {\n return true;\n }\n return 'setSinkId' in HTMLMediaElement.prototype;\n },\n\n /**\n * Test if user agent supports changing the microphone.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeMicrophone: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports different microphones on multiple simultanious\n * getUserMedia streams.\n * Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038 (fixed since v101)\n **/\n canMultipleDifferentMicrophones: function () {\n return !(this.isFF() && this.browserVersion() < 101);\n },\n\n /**\n * Test if user agent supports remembering devices.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeCamera: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports screen capture feature.\n * on mobile hasGetDisplayMedia() is true, but still doesn't work:\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#Browser_compatibility\n * and https://caniuse.com/#feat=mdn-api_mediadevices_getdisplaymedia\n **/\n canScreenCapture: function () {\n if (\n !config.screencapture ||\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n this.hasMobileDevice()\n ) {\n return false;\n }\n return this.hasGetDisplayMedia() || (this.isFF() && this.hasGetUserMedia());\n },\n\n canPresentFiles: function () {\n if (\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n (this.isFF() && adapter.browserDetails.version <= 60) ||\n this.isIPhone() ||\n (this.isIOSDevice() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser())\n ) {\n return false;\n }\n return true;\n },\n\n canStreamLocalMedia: function () {\n const audioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof audioContext !== 'function') {\n return false;\n }\n const proto = audioContext.prototype;\n const acMethods = [\n 'createGain',\n 'createMediaStreamSource',\n 'createMediaElementSource',\n 'createMediaStreamDestination'\n ].every(method => typeof proto[method] === 'function');\n return acMethods && this.hasCanvasCaptureSupport();\n },\n\n /**\n * Unfortunately we had issues with higher resolution constraints on\n * Safari (iOS and Mac).\n **/\n requiresLowerConstraints: function () {\n return (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n );\n },\n\n browserName: function () {\n let name = adapter.browserDetails.browser.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n return name;\n },\n\n browserVersion: function () {\n if (adapter.browserDetails.browser === 'safari') {\n return adapter.extractVersion(navigator.userAgent, /Version\\/(\\d+)\\./, 1);\n }\n return adapter.browserDetails.version;\n },\n\n isEdge: function () {\n return adapter.browserDetails.browser === 'edge';\n },\n\n isFF: function () {\n return adapter.browserDetails.browser === 'firefox';\n },\n\n isChrome: function () {\n return adapter.browserDetails.browser === 'chrome';\n },\n\n isSafari: function () {\n return adapter.browserDetails.browser === 'safari';\n },\n\n isMinimumRequiredBrowser: function () {\n if (this.isChrome()) {\n return this.isMinimumRequiredChrome();\n }\n if (this.isFF()) {\n return this.isMinimumRequiredFF();\n }\n if (this.isSafari()) {\n return this.isMinimumRequiredSafari();\n }\n return false;\n },\n\n /**\n * 2021-01-18 Edge is not supported anymore due to PeerConnection\n * and other issues\n **/\n isMinimumRequiredEdge: function () {\n return false;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Firefox_version_history\n * A customer is on WinXP (hello 2019) and FF seems\n * to be locked at 52 with an extended support version on that OS.\n * May god have mercy on those poor souls.\n **/\n isMinimumRequiredFF: function () {\n if (!this.isFF()) {\n return false;\n }\n return adapter.browserDetails.version >= 52;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Google_Chrome_version_history\n **/\n isMinimumRequiredChrome: function () {\n if (!this.isChrome()) {\n return false;\n }\n return adapter.browserDetails.version >= 70;\n },\n\n isMinimumRequiredSafari: function () {\n if (!this.isSafari()) {\n return false;\n }\n return this.browserVersion() >= 10 || this.isWorkingIOSBrowser();\n },\n\n isWorkingIOSBrowser: function () {\n // EdgiOS, FxiOS, CriOS\n const iOSBrowser = / [a-zA-Z]+iOS\\//.test(navigator.userAgent);\n const operaTouch = navigator.userAgent.indexOf(' OPT/') > -1;\n return (iOSBrowser || operaTouch) && this.hasGetUserMedia();\n },\n\n isExperimentalBrowser: function () {\n return ['safari', 'edge'].includes(adapter.browserDetails.browser);\n },\n\n /**\n * Unfortunately Safari on iOS pauses the local camera during PIP,\n * and afterwards the remote video is frozen.\n **/\n hasPipSupport: function () {\n if (!document) {\n return true;\n }\n\n return Boolean(\n 'webkitSupportsPresentationMode' in HTMLVideoElement.prototype ||\n ('pictureInPictureEnabled' in document &&\n document.pictureInPictureEnabled)\n );\n },\n\n /**\n * Detect non-working pip in iOS webview\n **/\n iOSPipCheck: function () {\n return new Promise(resolve => {\n const support = this.hasPipSupport();\n if (!support || !this.isIOSDevice()) {\n resolve(support);\n return;\n }\n const video = document.createElement('video');\n video.preload = 'none';\n video.src = 'about:blank';\n video.onsuspend = () => {\n const wkEnabled =\n video.webkitSupportsPresentationMode('picture-in-picture');\n resolve(wkEnabled);\n };\n });\n },\n\n /**\n * Check user agent if it is an Android device.\n **/\n isAndroidDevice: function () {\n return Boolean(navigator.userAgent.match(/Android/i));\n },\n\n /**\n * Check user agent if it is an iOS device.\n * This check includes detection of \"Desktop mode\" on mobile devices\n **/\n isIOSDevice: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !window.MSStream\n );\n },\n\n /**\n * Check user agent if it is an iPhone.\n * This check includes detection of \"Desktop mode\" on iPhone.\n * To distinguish between iPad and iPhone in \"Desktio mode\",\n * we have to additionally check for aspect ratio\n **/\n isIPhone: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPhone/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' &&\n navigator.maxTouchPoints > 1 &&\n window.screen.height / window.screen.width >= 1.5)) &&\n !window.MSStream\n );\n },\n\n /**\n * As a solution for mobile sites, our Android engineers recommend to\n * specifically detect “mobile†in the User-Agent string as well as\n * “android.â€\n *\n * https://webmasters.googleblog.com/2011/03/mo-better-to-also-detect-mobile-user.html\n **/\n isAndroidPhone: function () {\n const isAndroid = /(android)/i.test(navigator.userAgent);\n const isMobile = /(mobile)/i.test(navigator.userAgent);\n return isAndroid && isMobile;\n },\n\n isMacOS: function () {\n if (typeof navigator.userAgentData !== 'undefined') {\n return navigator.userAgentData.platform === 'macOS';\n }\n return navigator.platform.indexOf('Mac') === 0;\n },\n\n /**\n * Is the app running inside an iFrame.\n * https://stackoverflow.com/a/326076/980524\n **/\n inIframe: function () {\n try {\n return window.self !== window.top;\n } catch (error) {\n return true;\n }\n },\n\n /**\n * Phone vs. tablet\n **/\n isPhone: function () {\n return this.isIPhone() || this.isAndroidPhone();\n },\n\n /**\n * ...\n **/\n hasMobileDevice: function () {\n return this.isIOSDevice() || this.isAndroidDevice();\n },\n\n /**\n * Is the app running on a touch device.\n * https://stackoverflow.com/a/4819886/980524\n * Note: touch device, might be a laptop with a touch display or those\n * dell tablets we have laying around here.\n **/\n isTouchDevice: function () {\n return Boolean('ontouchstart' in window || navigator.maxTouchPoints);\n },\n\n /**\n * iOS doesn't propagate tap events to react when we have display tooltips.\n * This results in annoying \"double taps\" from the user.\n * But the tooltips aren't designed for touch devices anyway.\n **/\n canDisplayTooltips: function () {\n return !this.isIOSDevice() && !this.isTestSuite();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canAdjustDeviceSettings: function () {\n return !this.isIOSDevice();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canToggleCamera: function () {\n return true;\n },\n\n /**\n * iPad file presentation has issues add cam to canvas\n **/\n canDrawCamera: function () {\n return !this.isIOSDevice();\n },\n\n canMix: function () {\n return (\n this.isChrome() &&\n this.canScreenCapture() &&\n this.hasCanvasCaptureSupport()\n );\n },\n\n /**\n * Browsers don't behave the same way when setting the .enabled property of\n * a MediaSTreamTrack to false.\n * In Chrome (as of May 2019) the activity indicator stays active even if\n * the track is disabled (enabled: false).\n * https://bugs.chromium.org/p/webrtc/issues/detail?id=5942\n * While in Firefox the indicator is turned off.\n */\n stopsDeviceActivityIndicatorOnDisable: function () {\n if (this.isFF()) {\n return true;\n }\n return false;\n },\n\n /**\n * Edge doesn't have this property and raises an error when trying to\n * access it.\n **/\n supportsBlurOnSVG: function () {\n return (\n typeof SVGElement !== 'undefined' &&\n typeof SVGElement.prototype.blur !== 'undefined'\n );\n },\n\n /**\n * Chrome will throw a SecurityException when trying to read the\n * `localStorage` property.\n **/\n hasLocalStorage: function () {\n try {\n const hasLocalStorage =\n typeof window.localStorage === 'object' && window.localStorage !== null;\n window.localStorage.setItem('eyeson.test', 'test');\n const canGet = window.localStorage.getItem('eyeson.test') === 'test';\n return hasLocalStorage && canGet;\n } catch (error) {\n Logger.debug('FeatureDetector::hasLocalStorage:', error.message);\n return false;\n }\n },\n\n canFullscreen: function () {\n return new FullscreenHelper().canFullscreen();\n },\n\n isFullscreen: function () {\n return new FullscreenHelper().isFullscreen();\n },\n\n /**\n * Check for SFU-mode support\n * VP8 codec required, in Safari available since v12.1\n **/\n canSFU: function () {\n let safariWithoutVP8 = false;\n if (this.isSafari()) {\n if (!config.allowSafariSFU) {\n return false;\n }\n if (this.isWorkingIOSBrowser()) {\n return true;\n }\n const uAVersion = navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/);\n if (uAVersion && uAVersion.length > 1) {\n safariWithoutVP8 =\n Number(uAVersion[1]) < 12 ||\n (Number(uAVersion[1]) === 12 && Number(uAVersion[2]) < 1);\n }\n }\n return !safariWithoutVP8 && !this.isTestSuite();\n },\n\n canDataChannel: function () {\n return (\n this.hasPeerConnection() &&\n typeof RTCPeerConnection.prototype.createDataChannel === 'function' &&\n 'RTCDataChannel' in window\n );\n },\n\n /**\n * SDP SSRC updates for SFU mode switch\n * Safari has a bug of broken mediastream when all ssrc's change\n **/\n disallowAudioSyncSrcChange: function () {\n return this.isSafari() && this.canSFU();\n },\n\n canShare: function () {\n return Boolean(navigator.share);\n },\n\n /**\n * https://developer.chrome.com/multidevice/user-agent#webview_user_agent\n *\n * If you’re attempting to differentiate between the WebView and Chrome for\n * Android, you should look for the presence of the Version/_X.X_ string in\n * the WebView user-agent string.\n *\n * In the newer versions of WebView, you can differentiate the WebView by\n * looking for the wv field as highlighted below\n **/\n isWebView: function () {\n return /Version\\/|wv/i.test(navigator.userAgent) && this.isAndroidDevice();\n },\n\n /* eslint-disable no-process-env */\n /* global process */\n isTestSuite: function () {\n return (\n process.env.NODE_ENV === 'test' ||\n adapter.browserDetails.browser === 'test-suite'\n );\n },\n /* eslint-enable no-process-env */\n\n /**\n * mobile Safari is not able to display canvas stream in video\n * https://stackoverflow.com/a/63948310\n */\n canVirtualBackground: function () {\n return (\n !this.isIOSDevice() &&\n Boolean(window.WebAssembly) &&\n typeof WebAssembly.validate === 'function' &&\n (typeof WebAssembly.instantiateStreaming === 'function' ||\n typeof WebAssembly.instantiate === 'function') &&\n Boolean(window.CanvasRenderingContext2D) &&\n typeof window.ImageData === 'function' &&\n typeof window.requestAnimationFrame === 'function'\n );\n },\n\n // eslint-disable-next-line max-statements\n canvasBlurSupport: function () {\n if (_canvasBlurSupport !== null) {\n return _canvasBlurSupport;\n }\n const filterSupport =\n window.CanvasRenderingContext2D &&\n 'filter' in CanvasRenderingContext2D.prototype;\n if (!filterSupport) {\n _canvasBlurSupport = false;\n return _canvasBlurSupport;\n }\n let canvas1 = document.createElement('canvas');\n let canvas2 = document.createElement('canvas');\n canvas1.width = 10;\n canvas1.height = 10;\n canvas2.width = 10;\n canvas2.height = 10;\n let ctx1 = canvas1.getContext('2d');\n let ctx2 = canvas2.getContext('2d');\n ctx1.filter = 'blur(5px)';\n ctx1.fillStyle = '#000000';\n ctx1.fillRect(3, 3, 4, 4);\n ctx2.fillStyle = '#000000';\n ctx2.fillRect(3, 3, 4, 4);\n let data1 = ctx1.getImageData(5, 5, 1, 1);\n let data2 = ctx2.getImageData(5, 5, 1, 1);\n _canvasBlurSupport = data1.data[3] !== data2.data[3];\n return _canvasBlurSupport;\n },\n\n /**\n * We've noticed many issues with Safari and stereo on desktop and mobile.\n * Even weired ones like https://developer.apple.com/forums/thread/672037.\n * On Android issues occur when output device is changed, especially buetooth\n * devices are difficult.\n */\n canStereo: function () {\n return !(this.isSafari() || this.isAndroidDevice());\n },\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/displaySurface\n canChooseDisplaySurface: function () {\n return (\n this.hasGetDisplayMedia() &&\n navigator.mediaDevices.getSupportedConstraints().displaySurface\n );\n },\n\n hasPipCamSupport: function () {\n return this.isChrome() && this.hasPipSupport();\n },\n\n canMonitorSystemPressure: function () {\n /* eslint-disable no-undef */\n return (\n typeof window.PressureObserver === 'function' &&\n Array.isArray(PressureObserver.supportedSources) &&\n PressureObserver.supportedSources.includes('cpu')\n );\n /* eslint-enable no-undef */\n }\n};\n/* eslint-enable max-lines */\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","/**\n * Ninja Stream\n **/\nclass NinjaStream {\n constructor() {\n this._stream = this.createStream();\n }\n\n get stream() {\n return this._stream;\n }\n\n /**\n * Create a dummy stream from a canvas element.\n **/\n // eslint-disable-next-line max-statements\n createStream() {\n const width = 0;\n const height = 0;\n let canvas = Object.assign(document.createElement('canvas'), {\n width,\n height\n });\n canvas.id = 'eyeson-ninja-stream';\n canvas.getContext('2d').fillRect(0, 0, width, height);\n let stream = canvas.captureStream();\n let [track] = stream.getVideoTracks();\n // adjust FF to identify NinjaStream track\n if (\n window.CanvasCaptureMediaStream &&\n stream instanceof window.CanvasCaptureMediaStream\n ) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n }\n return stream;\n }\n}\n\nexport default NinjaStream;\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\n\n/**\n * Wrapper around localStorage API in order to prefix keys to be stored and\n * offer default values on demand. If no localStorage is provided by\n * the user-agent, we use a temporary fallbackStorage.\n **/\nexport default (function () {\n const prefix = 'eyeson.';\n const fallbackStorage = {};\n const hasLocalStorage = FeatureDetector.hasLocalStorage();\n\n return {\n store: function (key, value) {\n if (!hasLocalStorage) {\n fallbackStorage[key] = value;\n return true;\n }\n try {\n window.localStorage.setItem(prefix + key, JSON.stringify(value));\n } catch (error) {\n Logger.error('LocalStorage::store', error);\n return false;\n }\n return true;\n },\n // eslint-disable-next-line max-statements\n load: function (key, defaultValueParam) {\n let defaultValue = defaultValueParam;\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n defaultValue = Object.assign({}, defaultValue);\n }\n if (!hasLocalStorage) {\n return fallbackStorage[key] || defaultValue;\n }\n let storedValue = window.localStorage.getItem(prefix + key);\n if (!storedValue) {\n return defaultValue;\n }\n try {\n return JSON.parse(storedValue);\n } catch (error) {\n Logger.error('LocalStorage::load', key, error);\n return defaultValue;\n }\n }\n };\n})();\n","// https://github.com/YuzuJS/setImmediate/blob/modern-browsers-only/setImmediate.js\nconst immediate = (() => {\n const stack = [];\n const target = '*';\n const messageName = 'com.eyeson.immediate';\n const handleMessage = event => {\n if (event.source === window && event.data === messageName) {\n event.stopPropagation();\n const fn = stack.shift();\n if (fn) {\n fn();\n }\n }\n };\n window.addEventListener('message', handleMessage);\n return fn => {\n stack.push(fn);\n window.postMessage(messageName, target);\n };\n})();\n\nexport default immediate;\n","/* eslint-disable max-lines */\nimport FeatureDetector from '../FeatureDetector.js';\nimport Logger from '../Logger';\n\nconst CanvasMedia =\n window.CanvasCaptureMediaStream || window.CanvasCaptureMediaStreamTrack;\n\nexport const hasAudio = stream => {\n return Boolean(\n stream &&\n stream.getAudioTracks().length > 0 &&\n stream.getAudioTracks()[0].enabled\n );\n};\n\nexport const hasVideo = stream => {\n return Boolean(\n stream &&\n stream.getVideoTracks().length > 0 &&\n stream.getVideoTracks()[0].enabled\n );\n};\n\nexport const disableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = false));\n }\n return stream;\n};\n\nexport const enableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = true));\n }\n return stream;\n};\n\nexport const toggleAudio = (stream, enabled) => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\nexport const toggleVideo = (stream, enabled) => {\n if (stream) {\n stream.getVideoTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\n// In order to be \"informed\" about track ending in compose_canvas where we\n// create offscreen/hidden video elements and need to clean them up afterwards,\n// we need to dispatch 'stopped' ourselves. The 'ended' event is not emitted\n// after stopping the track, as one might expect see:\n// https://stackoverflow.com/q/55953038/980524\nexport const stopTrack = track => {\n track.stop();\n return track.dispatchEvent(new Event('stopped'));\n};\n\nexport const stopStream = stream => {\n if (stream) {\n stream.getTracks().forEach(stopTrack);\n }\n};\n\nconst isScreenTrack = track => {\n return (\n /screen|monitor|window|web-contents-media-stream/i.test(track.label) ||\n track.type === 'screen-track' ||\n track.type === 'screen-video-track'\n );\n};\n\nconst isScreenPresentationTrack = track => {\n return isScreenTrack(track) && track.type !== 'screen-video-track';\n};\n\nexport const isScreenAsVideoTrack = track => {\n return isScreenTrack(track) && track.type === 'screen-video-track';\n};\n\nconst isCanvasTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id !== 'eyeson-ninja-stream' &&\n track.canvas.id !== 'eyeson-vbg-stream'\n );\n};\n\nexport const isNinjaStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-ninja-stream'\n );\n};\n\nexport const isVbgStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-vbg-stream'\n );\n};\n\nconst isCameraTrack = track => {\n return (\n !isCanvasTrack(track) && !isScreenTrack(track) && !isVbgStreamTrack(track)\n );\n};\n\nexport const getScreenTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenTrack);\n};\n\nexport const getScreenPresentationTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenPresentationTrack);\n};\n\nexport const getScreenAsVideoTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenAsVideoTrack);\n};\n\nexport const getCameraTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCameraTrack);\n};\n\nexport const getVbgTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isVbgStreamTrack);\n};\n\nexport const stopCamera = stream => {\n getCameraTracks(stream).forEach(stopTrack);\n};\n\nexport const disableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = false));\n return stream;\n};\n\nexport const enableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = true));\n return stream;\n};\n\nexport const toggleCamera = (stream, enabled) => {\n getCameraTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const toggleVbgTrack = (stream, enabled) => {\n getVbgTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const getCanvasTracks = stream => {\n // current FF implementation\n if (stream instanceof CanvasMedia) {\n return stream.getVideoTracks();\n }\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCanvasTrack);\n};\n\nexport const isScreenStream = stream => {\n return hasVideo(stream) && stream.getVideoTracks().some(isScreenTrack);\n};\n\nexport const isScreenPresentationStream = stream => {\n return (\n hasVideo(stream) && stream.getVideoTracks().some(isScreenPresentationTrack)\n );\n};\n\nexport const isCanvasStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n\n return stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isVBGStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n return hasVideo(stream) && stream.getVideoTracks().some(isVbgStreamTrack);\n};\n\nexport const isCameraStream = stream => {\n return (\n hasVideo(stream) &&\n !isScreenStream(stream) &&\n !isCanvasStream(stream) &&\n !isVBGStream(stream)\n );\n};\n\nexport const isCanvasPresentationStream = stream => {\n if (!stream) {\n return false;\n }\n return isCanvasStream(stream) && stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isPresentationStream = stream => {\n return isScreenPresentationStream(stream) || isCanvasStream(stream);\n};\n\nexport const hasCameraVideo = stream => {\n return getCameraTracks(stream).some(track => track.enabled);\n};\n\nexport const getFacingMode = stream => {\n const tracks = getCameraTracks(stream);\n if (tracks.length > 0) {\n const [track] = tracks;\n if (typeof track.getSettings === 'function') {\n const settings = track.getSettings();\n if (settings && 'facingMode' in settings) {\n return settings.facingMode;\n }\n }\n }\n return null;\n};\n\n// try to make FF's captureStream handling track based.\nexport const captureStream = canvas => {\n // NOTE: getContext is needed for firefox, otherwise we get an exception:\n // NS_ERROR_NOT_INITIALIZED when calling .captureStream on the canvas.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1257440\n canvas.getContext('2d');\n\n // 0 param is fps, but since that doesn't work cross browser, we use 0\n // and request frames manually.\n const stream = canvas.captureStream(20);\n const [track] = stream.getVideoTracks();\n if (!('requestFrame' in track)) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n track.requestFrame = () => stream.requestFrame();\n }\n\n return stream;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeAudioTrack = () => {\n try {\n const ac = new (window.AudioContext || window.webkitAudioContext)();\n const { stream } = ac.createMediaStreamDestination();\n const [track] = stream.getAudioTracks();\n track.type = 'fake-audio';\n track.enabled = false;\n stopStream(stream);\n ac.close();\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeAudioTrack Unable to create audio track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeVideoTrack = () => {\n try {\n const canvas = document.createElement('canvas');\n // Firefox needs some kind of kickass\n canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height);\n const stream = canvas.captureStream();\n const [track] = stream.getVideoTracks();\n track.type = 'fake-video';\n track.enabled = false;\n stopStream(stream);\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeVideoTrack Unable to create video track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nexport const createExternalStream = (stream, audioOnly = false) => {\n if (\n stream &&\n stream instanceof MediaStream &&\n stream.getTracks().length > 0\n ) {\n const aTrack = stream\n .getAudioTracks()\n .find(track => track.readyState === 'live');\n const vTrack = stream\n .getVideoTracks()\n .find(track => track.readyState === 'live');\n const audioTrack = aTrack || createFakeAudioTrack();\n const videoTrack = vTrack || createFakeVideoTrack();\n const tracks = [];\n if (audioTrack) {\n tracks.push(audioTrack);\n }\n if (videoTrack && !audioOnly) {\n tracks.push(videoTrack);\n }\n return new MediaStream(tracks);\n }\n return false;\n};\n","import immediate from './immediate.js';\n\nconst throttledAnimationFrame = (fn, fps) => {\n let raf = null;\n let focus = true;\n let abort = false;\n let animationFrameThen = 0;\n const frameRate = 1000 / fps;\n const throttledRAF = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n raf = requestAnimationFrame(throttledRAF);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n fn();\n };\n const throttledImmediate = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n immediate(throttledImmediate);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n if (!abort) {\n fn();\n }\n };\n const result = {\n requestAnimationFrame: () => {\n if (focus) {\n raf = requestAnimationFrame(throttledRAF);\n } else {\n if (abort) {\n abort = false;\n }\n immediate(throttledImmediate);\n }\n },\n cancelAnimationFrame: () => {\n abort = true;\n if (raf) {\n cancelAnimationFrame(raf);\n raf = null;\n }\n }\n };\n document.addEventListener('visibilitychange', () => {\n focus = document.visibilityState === 'visible';\n if (!focus && raf) {\n result.cancelAnimationFrame();\n result.requestAnimationFrame();\n }\n });\n return result;\n};\n\nexport default throttledAnimationFrame;\n","/**\n * importScript\n * lazy-load script files, promise-based\n */\nconst importScript = (url, integrity = null) => {\n return new Promise((resolve, reject) => {\n const src = new URL(url, location.href);\n const script = document.createElement('script');\n script.async = true;\n script.onload = () => {\n if (script.parentNode) {\n script.remove();\n }\n resolve(script);\n };\n script.onerror = () => {\n if (script.parentNode) {\n script.remove();\n }\n reject(new Error('Unable to initiate script ' + url));\n };\n if (integrity) {\n script.integrity = integrity.algo + '-' + integrity.hash;\n }\n script.src = src;\n document.head.append(script);\n });\n};\n\nexport default importScript;\n","const cacheStorageSupport = typeof window.CacheStorage === 'function';\n\nconst storeBlobURL = async (blobURL, path) => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const response = await fetch(blobURL);\n const blob = await response.blob();\n const cache = await caches.open('store');\n await cache.put(path, new Response(blob));\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nconst loadBlobURL = async path => {\n if (cacheStorageSupport) {\n try {\n const cache = await caches.open('store');\n const response = await cache.match(path);\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n return false;\n};\n\nconst deleteBlob = async path => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const cache = await caches.open('store');\n await cache.delete(path);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nexport default {\n storeBlobURL,\n loadBlobURL,\n deleteBlob\n};\n","/* eslint-disable max-statements */\n/* eslint-disable no-bitwise */\n/* eslint-disable id-length */\n// https://github.com/davidenke/context-filter-polyfill/blob/master/src/filters/blur.filter.ts\n\nconst _mulTable = [\n 1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107,\n 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221,\n 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103,\n 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119,\n 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151,\n 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13,\n 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75,\n 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229,\n 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183,\n 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37,\n 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61,\n 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207,\n 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178,\n 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153,\n 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133,\n 66, 131, 65, 129, 1\n];\nconst _shgTable = [\n 0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18,\n 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20,\n 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21,\n 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20,\n 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22,\n 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18,\n 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22,\n 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24,\n 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24,\n 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22,\n 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23,\n 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25,\n 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25,\n 22, 25, 25, 25, 24, 25, 24, 25, 18\n];\n\nconst canvasBlur = () => {\n let _canvas = null;\n let _ctx = null;\n let _previous = false;\n let _r = null;\n let _g = null;\n let _b = null;\n let _vmin = null;\n let _vmax = null;\n\n const run = (imageBitmap, radius = 0) => {\n if (_previous && _canvas) {\n _previous = false;\n return _canvas;\n }\n _previous = true;\n const amount = parseFloat(radius);\n\n const { width, height } = imageBitmap;\n if (!_canvas) {\n _canvas = document.createElement('canvas');\n _ctx = _canvas.getContext('2d', { alpha: false, desynchronized: true });\n _canvas.width = width;\n _canvas.height = height;\n }\n _ctx.drawImage(imageBitmap, 0, 0);\n const imageData = _ctx.getImageData(0, 0, width, height);\n const { data } = imageData;\n\n // http://www.quasimondo.com/BoxBlurForCanvas/FastBlur.js\n const wm = width - 1;\n const hm = height - 1;\n const rad1 = amount + 1;\n\n const mulSum = _mulTable[amount];\n const shgSum = _shgTable[amount];\n\n if (!_r) {\n _r = new Uint32Array(data.length / 4);\n _g = new Uint32Array(data.length / 4);\n _b = new Uint32Array(data.length / 4);\n\n _vmin = new Uint32Array(width);\n _vmax = new Uint32Array(width);\n }\n\n let iterations = 2;\n let p = 0;\n let p1 = 0;\n let p2 = 0;\n\n while (iterations-- > 0) {\n let yw = 0;\n let yi = 0;\n\n for (let y = 0; y < height; y++) {\n let rsum = data[yw] * rad1;\n let gsum = data[yw + 1] * rad1;\n let bsum = data[yw + 2] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n p = yw + ((i > wm ? wm : i) << 2);\n rsum += data[p++];\n gsum += data[p++];\n bsum += data[p++];\n }\n\n for (let x = 0; x < width; x++) {\n _r[yi] = rsum;\n _g[yi] = gsum;\n _b[yi] = bsum;\n\n if (y === 0) {\n _vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n _vmax[x] = (p = x - amount) > 0 ? p << 2 : 0;\n }\n\n p1 = yw + _vmin[x];\n p2 = yw + _vmax[x];\n\n rsum += data[p1++] - data[p2++];\n gsum += data[p1++] - data[p2++];\n bsum += data[p1++] - data[p2++];\n\n yi++;\n }\n yw += width << 2;\n }\n\n for (let x = 0; x < width; x++) {\n let yp = x;\n let rsum = _r[yp] * rad1;\n let gsum = _g[yp] * rad1;\n let bsum = _b[yp] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n yp += i > hm ? 0 : width;\n rsum += _r[yp];\n gsum += _g[yp];\n bsum += _b[yp];\n }\n\n yi = x << 2;\n\n for (let y = 0; y < height; y++) {\n data[yi] = (rsum * mulSum) >>> shgSum;\n data[yi + 1] = (gsum * mulSum) >>> shgSum;\n data[yi + 2] = (bsum * mulSum) >>> shgSum;\n\n if (x === 0) {\n _vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n _vmax[y] = (p = y - amount) > 0 ? p * width : 0;\n }\n\n p1 = x + _vmin[y];\n p2 = x + _vmax[y];\n\n rsum += _r[p1] - _r[p2];\n gsum += _g[p1] - _g[p2];\n bsum += _b[p1] - _b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n _ctx.putImageData(imageData, 0, 0);\n\n return _canvas;\n };\n\n const reset = () => {\n _canvas = null;\n _ctx = null;\n _previous = false;\n _r = null;\n _g = null;\n _b = null;\n _vmin = null;\n _vmax = null;\n };\n\n return { run, reset };\n};\n\nexport default canvasBlur;\n","/* eslint-disable max-lines */\n/* eslint-disable max-statements */\nimport FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport LocalStorage from './LocalStorage.js';\nimport throttledAnimationFrame from './utils/throttledAnimationFrame.js';\nimport importScript from './utils/importScript.js';\nimport { stopStream, stopTrack, getVbgTracks } from './utils/StreamHelpers.js';\nimport cacheStorage from './utils/cacheStorage.js';\nimport canvasBlur from './utils/canvasBlur.js';\n\nwindow.exports = window.exports || {};\n\nconst OffscreenCanvasSupport =\n typeof window.OffscreenCanvas === 'function' &&\n (() => {\n try {\n new OffscreenCanvas(1, 1).getContext('2d');\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n })();\nconst OffscreenCanvasBlurSupport =\n OffscreenCanvasSupport &&\n Boolean(window.OffscreenCanvasRenderingContext2D) &&\n 'filter' in OffscreenCanvasRenderingContext2D.prototype;\nconst ImageBitmapSupport = typeof window.createImageBitmap === 'function';\nconst TrackProcessorSupport =\n typeof window.MediaStreamTrackProcessor === 'function';\nconst SIMDSupport =\n window.WebAssembly &&\n WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7,\n 0, 65, 0, 253, 15, 26, 11\n ])\n );\nconst EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nconst _max = Math.max;\n\nconst _frameRate = 20;\nconst _stateChange = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\nconst _segmentationModel = {\n id: 'selfie_landscape',\n name: 'selfie_segmentation_landscape',\n width: 256,\n height: 144,\n pixelCount: 36864\n};\n\nlet _tflite = null;\nlet _tfliteReady = false;\nlet _tfliteLoading = false;\nlet _inputMemoryOffset = null;\nlet _outputMemoryOffset = null;\n\nlet _localImageFile = null;\nlet _localImageFileBackup = null;\n\nconst initiateTFLite = async () => {\n if (_tflite) {\n return;\n }\n _tfliteLoading = true;\n _stateChange.dispatchEvent(new Event('change'));\n const loading = await Promise.all([\n SIMDSupport\n ? importScript('vendor/tflite/tflite-simd.js')\n : importScript('vendor/tflite/tflite.js'),\n fetch(`vendor/tflite/models/${_segmentationModel.name}.tflite`)\n ]);\n _tflite = await window.exports[\n SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule'\n ]();\n const model = await loading[1].arrayBuffer();\n const modelBufferOffset = _tflite._getModelBufferMemoryOffset();\n _tflite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);\n _tflite._loadModel(model.byteLength);\n _inputMemoryOffset = _tflite._getInputMemoryOffset() / 4;\n _outputMemoryOffset = _tflite._getOutputMemoryOffset() / 4;\n _tfliteLoading = false;\n _tfliteReady = true;\n _stateChange.dispatchEvent(new Event('change'));\n};\n\nconst createOffscreenCanvas = (width, height, options = {}, type) => {\n const result = {\n canvas: null,\n ctx: null\n };\n const extra = type === 'blur' && OffscreenCanvasBlurSupport;\n if (OffscreenCanvasSupport && extra) {\n result.canvas = new OffscreenCanvas(width, height);\n result.ctx = result.canvas.getContext('2d', options);\n return result;\n }\n result.canvas = document.createElement('canvas');\n result.canvas.width = width;\n result.canvas.height = height;\n result.ctx = result.canvas.getContext(\n '2d',\n Object.assign({ desynchronized: true }, options)\n );\n return result;\n};\n\n(async () => {\n const virtualBackgroundType = LocalStorage.load('virtualBackgroundType');\n if (virtualBackgroundType === 'image:blob') {\n const url = await cacheStorage.loadBlobURL('/virtualBackgroundLocalImage');\n if (url) {\n _localImageFile = url;\n }\n }\n})();\n\nconst loadImage = (url, instance) => {\n return new Promise(resolve => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(true);\n }\n if (url === 'blob' && !_localImageFile) {\n resolve(null);\n return;\n }\n const img = new Image();\n img.onerror = () => resolve(null);\n img.onload = () => resolve(img);\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url === 'blob' && _localImageFile ? _localImageFile : url;\n }).then(img => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(false);\n }\n return img;\n });\n};\n\nconst checkImageLoad = url => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = () => reject(new TypeError('Invalid image file'));\n img.onload = () => resolve();\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url;\n });\n};\n\nconst loadImageFile = (() => {\n let input = null;\n return callbackFN => {\n if (!input) {\n input = Object.assign(document.createElement('input'), {\n type: 'file',\n accept: 'image/*'\n });\n }\n input.onchange = ({ target: { files } }) => {\n if (files.length > 0) {\n const url = URL.createObjectURL(files[0]);\n checkImageLoad(url).then(() => {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = url;\n callbackFN();\n }, callbackFN);\n }\n input.onchange = null;\n input.value = '';\n };\n input.click();\n };\n})();\n\nconst createImageCanvas = (image, width, height) => {\n const hRatio = width / image.width;\n const vRatio = height / image.height;\n const ratio = _max(hRatio, vRatio);\n const imgWidth = image.width * ratio;\n const imgHeight = image.height * ratio;\n const centerShiftX = (width - imgWidth) / 2;\n const centerShiftY = (height - imgHeight) / 2;\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n canvas.ctx.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n centerShiftX,\n centerShiftY,\n imgWidth,\n imgHeight\n );\n return canvas.canvas;\n};\n\nconst createGeneraliCanvas = (image, width, height) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(image, 15, 15);\n return canvas.canvas;\n};\n\nconst createGradientCanvas = (width, height, options) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n const gradient = ctx.createLinearGradient(\n options.startX,\n options.startY,\n options.endX,\n options.endY\n );\n gradient.addColorStop(0, options.color1);\n gradient.addColorStop(1, options.color2);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n return canvas.canvas;\n};\n\nconst createBlurCanvas = (instance, width, height, blur) => {\n const length = blur * 2;\n const fullLength = length * 2;\n const bigWidth = width + fullLength;\n const bigHeight = height + fullLength;\n instance.blurCanvas = createOffscreenCanvas(\n bigWidth,\n bigHeight,\n {\n alpha: false\n },\n 'blur'\n );\n instance.imageCanvas = createOffscreenCanvas(bigWidth, bigHeight, {\n alpha: false\n });\n instance.blurCanvas.ctx.filter = `blur(${blur}px)`;\n};\n\nconst _allowedTypesCheck =\n /^(off|eyeson|generali:.*|color:.+|image:.+|blur:\\d+)/;\n\nconst setState = () => {\n if (_tfliteReady) {\n return 'ready';\n }\n if (_tfliteLoading) {\n return 'initialize';\n }\n return '';\n};\n\nclass VirtualBackgroundMixer {\n constructor(name = 'global') {\n Logger.info('VirtualBackgroundMixer::constructor', name);\n this.name = name;\n this.canvas = null;\n this.ctx = null;\n this.originalStream = null;\n this.outStream = null;\n this.video = null;\n this.reader = null;\n this.size = { width: 0, height: 0 };\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.playPromise = null;\n this.abort = false;\n this.paused = false;\n this.raf = throttledAnimationFrame(this.drawVideo.bind(this), 20);\n this.backgroundOld = null;\n this.backgroundType = null;\n this.backgroundValue = null;\n this.blurInit = false;\n this.blurCanvas = null;\n this.canvasBlur = canvasBlur();\n this.imageCanvas = null;\n this.state = setState();\n this.loadingListener = [];\n this.handleStateChange = () => {\n const state = setState();\n this.state = state;\n this.emitLoading(state === 'initialize');\n };\n _stateChange.addEventListener('change', this.handleStateChange);\n }\n\n static isTypeAllowed(type) {\n return _allowedTypesCheck.test(type);\n }\n\n static async checkExternalImage(type) {\n if (/^image:([\\w]+:)?\\/\\//i.test(type)) {\n const url = type.substring(6);\n await checkImageLoad(url);\n }\n }\n\n static loadLocalImage(callbackFN) {\n loadImageFile(callbackFN);\n }\n\n static getImageBlobOrFallback(isBlobAvailable = true) {\n if (_localImageFile && isBlobAvailable) {\n return 'image:blob';\n }\n return 'blur:8';\n }\n\n storeLocalImageFile() {\n if (_localImageFile) {\n _localImageFileBackup = _localImageFile;\n }\n }\n\n resetLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = _localImageFileBackup;\n _localImageFileBackup = null;\n }\n }\n\n saveLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFileBackup);\n }\n _localImageFileBackup = null;\n }\n }\n\n updateCache(type) {\n if (type === 'image:blob') {\n if (_localImageFile) {\n cacheStorage.storeBlobURL(\n _localImageFile,\n '/virtualBackgroundLocalImage'\n );\n }\n } else {\n cacheStorage.deleteBlob('/virtualBackgroundLocalImage');\n }\n }\n\n onLoading(listener) {\n this.loadingListener.push(listener);\n }\n\n offLoading(listener) {\n this.loadingListener = this.loadingListener.filter(fn => fn !== listener);\n }\n\n emitLoading(loading) {\n this.loadingListener.forEach(listener => listener(loading));\n }\n\n initiateStream(userMediaStream) {\n Logger.info('VirtualBackgroundMixer::initiate', this.name);\n initiateTFLite();\n const videoTracks = userMediaStream.getVideoTracks();\n if (videoTracks.length === 0) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'missing track'\n );\n return userMediaStream;\n }\n const [videoTrack] = videoTracks;\n const trackSettings = videoTrack.getSettings();\n if (\n videoTrack.readyState !== 'live' ||\n !trackSettings.width ||\n !trackSettings.height\n ) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n '0 width or height, or not ready',\n videoTrack.readyState,\n trackSettings.width,\n trackSettings.height\n );\n return userMediaStream;\n }\n if (this.originalStream) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'existing originalStream!',\n this.originalStream.id,\n userMediaStream.id\n );\n if (this.originalStream.id !== userMediaStream.id) {\n this.stopOriginalStream();\n }\n this.terminate();\n }\n this.originalStream = userMediaStream;\n this.canvas = document.createElement('canvas');\n this.canvas.id = 'eyeson-vbg-stream';\n this.ctx = this.canvas.getContext('2d', { desynchronized: true });\n this.ctx.imageSmoothingEnabled = false;\n this.size.width = trackSettings.width;\n this.size.height = trackSettings.height;\n this.canvas.width = trackSettings.width;\n this.canvas.height = trackSettings.height;\n const canvasStream = this.canvas.captureStream(_frameRate);\n const [canvasTrack] = canvasStream.getVideoTracks();\n if (!canvasTrack.canvas) {\n canvasTrack.type = 'canvas-track';\n canvasTrack.canvas = this.canvas;\n }\n const settings = {};\n if (typeof canvasTrack.getSettings === 'function') {\n Object.assign(settings, canvasTrack.getSettings());\n }\n Object.assign(settings, trackSettings);\n canvasTrack.getSettings = () => settings;\n canvasTrack.srcLabel = videoTrack.label;\n canvasTrack.srcDeviceId = trackSettings.deviceId;\n this.outStream = new MediaStream([canvasTrack]);\n userMediaStream\n .getAudioTracks()\n .forEach(track => this.outStream.addTrack(track));\n this.start();\n return this.outStream;\n }\n\n start() {\n Logger.info('VirtualBackgroundMixer::start', this.name);\n let canvas = null;\n let video = null;\n const { width, height } = this.size;\n if (!width || !height) {\n Logger.warn(\n 'VirtualBackgroundMixer::start 0 width or height',\n this.name,\n width,\n height\n );\n return;\n }\n if (TrackProcessorSupport) {\n try {\n const [track] = this.originalStream.getVideoTracks();\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n this.reader = processor.readable.getReader();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!this.reader) {\n video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = this.originalStream;\n this.video = video;\n }\n this.segmentationMask = new ImageData(\n _segmentationModel.width,\n _segmentationModel.height\n );\n canvas = createOffscreenCanvas(\n _segmentationModel.width,\n _segmentationModel.height,\n { willReadFrequently: true }\n );\n this.segmentationMaskCanvas = canvas.canvas;\n this.segmentationMaskCtx = canvas.ctx;\n this.segmentationMaskCtx.imageSmoothingEnabled = false;\n if (video && !ImageBitmapSupport) {\n canvas = createOffscreenCanvas(width, height);\n this.videoCanvas = canvas.canvas;\n this.videoCtx = canvas.ctx;\n }\n this.abort = false;\n this.paused = false;\n this.blurInit = false;\n this.canvasBlur.reset();\n this.initBackground();\n if (this.reader) {\n Logger.info(\n 'VirtualBackgroundMixer::start::videoTrackProcessor',\n this.name\n );\n this.raf.requestAnimationFrame();\n } else {\n video.onloadeddata = () => {\n Logger.info(\n 'VirtualBackgroundMixer::start::video.loadeddata',\n this.name\n );\n this.raf.requestAnimationFrame();\n };\n this.playPromise = video.play();\n this.playPromise.catch(error => {\n Logger.error(\n 'VirtualBackgroundMixer::start::video.play',\n this.name,\n error\n );\n });\n }\n }\n\n // eslint-disable-next-line complexity\n async drawVideo() {\n let frame = null;\n if (this.abort) {\n return;\n }\n const {\n ctx,\n size,\n paused,\n segmentationMask,\n segmentationMaskCtx,\n segmentationMaskCanvas\n } = this;\n if (this.reader) {\n try {\n const { value } = await this.reader.read();\n if (value) {\n value.width = value.displayWidth;\n value.height = value.displayHeight;\n frame = value;\n }\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!_tfliteReady || paused) {\n ctx.drawImage(frame || this.video, 0, 0);\n } else {\n if (!frame) {\n if (ImageBitmapSupport) {\n try {\n frame = await createImageBitmap(this.video);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n } else {\n this.videoCtx.drawImage(this.video, 0, 0);\n frame = this.videoCanvas;\n }\n }\n if (this.abort) {\n return;\n }\n if (frame && frame.width > 0 && frame.height > 0) {\n segmentationMaskCtx.drawImage(\n frame,\n 0,\n 0,\n frame.width,\n frame.height,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const imageData = segmentationMaskCtx.getImageData(\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const { data } = imageData;\n const heap = _tflite.HEAPF32;\n const maskData = segmentationMask.data;\n const { pixelCount } = _segmentationModel;\n for (\n let heapIndex = 0, imgIndex = 0, index = 0, indexId = 0;\n index < pixelCount;\n index++\n ) {\n indexId = index * 3;\n heapIndex = _inputMemoryOffset + indexId;\n imgIndex = index * 4;\n heap[heapIndex] = data[imgIndex] / 255;\n heap[heapIndex + 1] = data[imgIndex + 1] / 255;\n heap[heapIndex + 2] = data[imgIndex + 2] / 255;\n }\n _tflite._runInference();\n for (\n let index = 0, indexOut = 0, person = 0.0;\n index < pixelCount;\n index++\n ) {\n person = heap[_outputMemoryOffset + index];\n // Sets only the alpha component of each pixel\n indexOut = index * 4;\n maskData[indexOut + 3] = 255 * person;\n }\n segmentationMaskCtx.putImageData(segmentationMask, 0, 0);\n ctx.globalCompositeOperation = 'copy';\n ctx.filter = 'blur(2px)';\n ctx.drawImage(\n segmentationMaskCanvas,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height,\n 0,\n 0,\n size.width,\n size.height\n );\n ctx.globalCompositeOperation = 'source-in';\n ctx.filter = 'none';\n ctx.drawImage(frame, 0, 0);\n if (this.backgroundType) {\n this.drawBackground(frame);\n }\n }\n }\n if (!paused && this.paused) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n if (frame && typeof frame.close === 'function') {\n frame.close();\n }\n if (!this.abort) {\n this.raf.requestAnimationFrame();\n }\n }\n\n suspend() {\n const { ctx } = this;\n this.paused = true;\n if (ctx) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n }\n\n resume() {\n this.paused = false;\n }\n\n drawBackground(frame) {\n const {\n backgroundType,\n ctx,\n blurCanvas,\n imageCanvas,\n backgroundValue,\n size\n } = this;\n if (!backgroundType || !ctx) {\n return;\n }\n ctx.globalCompositeOperation = 'destination-over';\n if (backgroundType === 'blur') {\n if (FeatureDetector.canvasBlurSupport()) {\n const length = Number(backgroundValue) * 2;\n const fullLength = length * 2;\n if (!this.blurInit) {\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n 0,\n 0,\n size.width + fullLength,\n size.height + fullLength\n );\n this.blurInit = true;\n }\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n length,\n length,\n size.width,\n size.height\n );\n blurCanvas.ctx.drawImage(imageCanvas.canvas, 0, 0);\n ctx.drawImage(\n blurCanvas.canvas,\n length,\n length,\n size.width,\n size.height,\n 0,\n 0,\n size.width,\n size.height\n );\n } else {\n const blurred = this.canvasBlur.run(frame, backgroundValue);\n ctx.drawImage(blurred, 0, 0);\n }\n } else if (backgroundType === 'color') {\n ctx.fillStyle = backgroundValue;\n ctx.fillRect(0, 0, size.width, size.height);\n } else if (imageCanvas) {\n ctx.drawImage(imageCanvas, 0, 0);\n } else {\n ctx.drawImage(frame, 0, 0);\n }\n }\n\n async initBackground() {\n const { backgroundType, backgroundValue } = this;\n const { width, height } = this.size;\n let done = false;\n if (!width || !height) {\n return;\n }\n if (backgroundType === 'eyeson') {\n this.imageCanvas = createGradientCanvas(width, height, {\n startX: 0,\n startY: 0,\n endX: width,\n endY: 50,\n color1: '#ff7676',\n color2: '#9e206c'\n });\n done = true;\n } else if (backgroundType === 'generali') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createGeneraliCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'image') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createImageCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'blur') {\n this.blurInit = false;\n createBlurCanvas(this, width, height, Number(backgroundValue));\n this.canvasBlur.reset();\n done = true;\n } else {\n this.imageCanvas = null;\n done = true;\n }\n if (done) {\n this.backgroundOld = {\n type: backgroundType,\n value: backgroundValue\n };\n }\n }\n\n setBackgroundFallback() {\n const { backgroundOld } = this;\n if (backgroundOld) {\n this.backgroundType = backgroundOld.type;\n this.backgroundValue = backgroundOld.value;\n } else {\n if (!this.imageCanvas) {\n const { width, height } = this.size;\n this.blurInit = false;\n createBlurCanvas(this, width, height, 8);\n }\n this.backgroundType = 'blur';\n this.backgroundValue = '8';\n }\n }\n\n changeBackground(type) {\n Logger.info('VirtualBackgroundMixer::changeBackground', this.name, type);\n if (typeof type !== 'string') {\n return;\n }\n const colon = type.indexOf(':');\n if (colon === -1) {\n this.backgroundType = type === 'off' ? null : type;\n this.backgroundValue = null;\n } else {\n this.backgroundType = type.substring(0, colon);\n this.backgroundValue = type.substring(colon + 1);\n }\n if (!this.abort) {\n this.initBackground();\n }\n }\n\n stop() {\n Logger.info('VirtualBackgroundMixer::stop', this.name);\n this.abort = true;\n if (this.raf) {\n this.raf.cancelAnimationFrame();\n }\n if (this.video) {\n const { video, playPromise } = this;\n if (playPromise && video) {\n playPromise.then(() => video.pause());\n }\n this.video.onloadeddata = null;\n this.video = null;\n this.playPromise = null;\n }\n if (this.reader) {\n this.reader = null;\n }\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.backgroundOld = null;\n this.imageCanvas = null;\n this.blurCanvas = null;\n this.canvasBlur.reset();\n }\n\n stopOriginalStream() {\n Logger.info(\n 'VirtualBackgroundMixer::stopOriginalStream',\n this.name,\n this.originalStream\n );\n this.stop();\n stopStream(this.originalStream);\n }\n\n terminate() {\n Logger.info('VirtualBackgroundMixer::terminate', this.name);\n this.stop();\n if (this.outStream) {\n getVbgTracks(this.outStream).forEach(track => {\n stopTrack(track);\n Logger.info(\n 'VirtualBackgroundMixer::terminate stop track',\n this.name,\n track\n );\n });\n }\n this.originalStream = null;\n this.outStream = null;\n this.canvas = null;\n this.ctx = null;\n this.video = null;\n }\n\n destroy() {\n Logger.info('VirtualBackgroundMixer::destroy', this.name);\n _stateChange.removeEventListener('change', this.handleStateChange);\n this.loadingListener.length = 0;\n this.canvasBlur = null;\n }\n}\n\nexport default VirtualBackgroundMixer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport eyesonOptions from './options.js';\nimport LocalStorage from './LocalStorage.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst changedDevices = (listA, listB) => {\n if (listA.length !== listB.length) {\n return true;\n }\n for (\n let deviceA = null, found = false, { length } = listA, index = 0;\n index < length;\n index++\n ) {\n deviceA = listA[index];\n found = listB.find(deviceB => {\n return (\n deviceA.deviceId === deviceB.deviceId &&\n deviceA.groupId === deviceB.groupId &&\n deviceA.label === deviceB.label &&\n deviceA.kind === deviceB.kind\n );\n });\n if (!found) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * eyeson Device Manager used to handle cameras, microphones and speakers.\n **/\nclass DeviceManager {\n /* eslint-disable max-statements */\n constructor(options) {\n this.sinkId = 'default';\n this.options = options || { audio: true, video: true, eco: false };\n this.stream = null;\n this.cameras = [];\n this.listeners = [];\n this.speakers = [];\n this.microphones = [];\n this.constraints = {};\n this.terminationInProgress = false;\n this.virtualBackground = new VirtualBackgroundMixer('DeviceManager');\n this.virtualBackgroundType = 'off';\n\n DeviceManager.getSinkId().then(sinkId => (this.sinkId = sinkId));\n\n this.setStream = this.setStream.bind(this);\n this.handleError = this.handleError.bind(this);\n this.verifyStream = this.verifyStream.bind(this);\n this.storeConstraints = this.storeConstraints.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.initiateVirtualBackground = this.initiateVirtualBackground.bind(this);\n }\n /* eslint-enable max-statements */\n\n static getDevices() {\n if (!('mediaDevices' in navigator)) {\n return Promise.resolve([]);\n }\n return navigator.mediaDevices.enumerateDevices().then(devices => {\n // hack for safari ios and desktop because they hide existing devices to avoid fingerprinting: https://webkit.org/blog/7763/a-closer-look-into-webrtc/\n if (\n devices.length === 2 &&\n devices.every(\n device => device.kind === 'audioinput' && device.deviceId === ''\n )\n ) {\n return [\n { deviceId: '', groupId: '', kind: 'audioinput', label: '' },\n { deviceId: '', groupId: '', kind: 'videoinput', label: '' }\n ];\n }\n return devices;\n });\n }\n\n /**\n * Get constraints for specified options { audio: true, video: true }\n * If a specific device is chosen it has to be stored in localStorage or will\n * be ignored.\n **/\n static getConstraints(optionsParam) {\n const options = optionsParam || { audio: true, video: true };\n return DeviceManager.getDevices()\n .then(devices => {\n return DeviceManager.determineConstraintsForDevices(devices, options);\n })\n .catch(error => {\n Logger.error('DeviceManager::getConstraints ', error);\n });\n }\n\n /* eslint-disable max-statements, complexity */\n static determineConstraintsForDevices(devices, options) {\n const constraints = LocalStorage.load('mediaConstraints', options);\n const stereo = FeatureDetector.canStereo() && !options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n\n if (!('video' in constraints)) {\n constraints.video = true;\n }\n if (!('audio' in constraints)) {\n constraints.audio = audioConstraints;\n }\n\n if (constraints.video.deviceId) {\n const videoDeviceId = constraints.video.deviceId.exact;\n if (!devices.find(device => device.deviceId === videoDeviceId)) {\n constraints.video = options.video;\n }\n }\n if (constraints.audio.deviceId) {\n const audioDeviceId = constraints.audio.deviceId.exact;\n if (!devices.find(device => device.deviceId === audioDeviceId)) {\n constraints.audio = options.audio ? audioConstraints : false;\n }\n }\n\n if (options.video === false && !options.eco) {\n constraints.video = false;\n }\n if (options.video === true && constraints.video === false) {\n constraints.video = true;\n }\n if (\n (options.audio === true && constraints.audio === false) ||\n constraints.audio === true\n ) {\n constraints.audio = audioConstraints;\n }\n if (\n constraints.audio &&\n constraints.audio.channelCount !== audioConstraints.channelCount\n ) {\n constraints.audio.channelCount = audioConstraints.channelCount;\n }\n\n // In case we don't have a videoinput device but specify\n // video: true, we get NotFoundError in FF & DevicesNotFoundError in\n // Chrome.\n if (devices.filter(device => device.kind === 'videoinput').length === 0) {\n constraints.video = false;\n }\n\n DeviceManager.applyLastUsedDevices(constraints, devices);\n DeviceManager.applyWidescreen(constraints);\n\n return constraints;\n }\n /* eslint-enable max-statements, complexity */\n\n static applyLastUsedDevices(constraints, devices) {\n const videoId = LocalStorage.load('videoId');\n const audioId = LocalStorage.load('audioId');\n if (\n constraints.video === true &&\n videoId &&\n devices.find(device => device.deviceId === videoId)\n ) {\n constraints.video = { deviceId: { exact: videoId } };\n }\n if (\n constraints.audio &&\n audioId &&\n devices.find(device => device.deviceId === audioId)\n ) {\n constraints.audio.deviceId = { exact: audioId };\n }\n }\n\n static applyWidescreen(constraints) {\n const { widescreen } = eyesonOptions;\n if (widescreen) {\n if (constraints.video === true) {\n constraints.video = {};\n }\n if (constraints.video) {\n Object.assign(constraints.video, { width: 640, height: 360 });\n }\n } else if (\n typeof constraints.video === 'object' &&\n ('width' in constraints.video || 'height' in constraints.video)\n ) {\n Reflect.deleteProperty(constraints.video, 'width');\n Reflect.deleteProperty(constraints.video, 'height');\n }\n }\n\n /**\n * For now we handle the mobile options and constraints completely separately.\n * That way we can address the facingMode constraint.\n **/\n static getMobileConstraints(options) {\n let constraints = Object.assign({ audio: true, video: true }, options);\n DeviceManager.applyWidescreen(constraints);\n return Promise.resolve(constraints);\n }\n\n /**\n * Get sinkId.\n **/\n static getSinkId() {\n let sinkId = LocalStorage.load('sinkId', '');\n return DeviceManager.getDevices().then(devices => {\n if (!devices.find(device => device.deviceId === sinkId)) {\n sinkId = 'default';\n }\n return sinkId;\n });\n }\n\n /**\n * Return available devices in a friendly format.\n **/\n static fetchDevices() {\n return DeviceManager.getDevices().then(devices => {\n const speakers = devices.filter(device => device.kind === 'audiooutput');\n if (\n speakers.length > 0 &&\n speakers.findIndex(speaker => speaker.deviceId === 'default') === -1\n ) {\n speakers.unshift({\n deviceId: 'default',\n kind: 'audiooutput',\n groupId: 'default',\n label: 'System default'\n });\n }\n return {\n cameras: devices.filter(device => device.kind === 'videoinput'),\n microphones: devices.filter(device => device.kind === 'audioinput'),\n speakers: speakers\n };\n });\n }\n\n static fetchInputDevices() {\n return DeviceManager.getDevices().then(devices => {\n return devices.filter(device => device.kind.includes('input'));\n });\n }\n\n async setVirtualBackgroundType(type) {\n if (!VirtualBackgroundMixer.isTypeAllowed(type)) {\n Logger.warn(\n 'DeviceManage::setVirtualBackgroundType type not allowed',\n type\n );\n return;\n }\n await VirtualBackgroundMixer.checkExternalImage(type);\n const wasOff = this.virtualBackgroundType === 'off';\n const willBeOff = type === 'off';\n this.virtualBackgroundType = type;\n this.virtualBackground.changeBackground(type);\n if (this.stream && ((wasOff && !willBeOff) || (!wasOff && willBeOff))) {\n this.update();\n }\n }\n\n static getStoredVirtualBackgroundType(isBlobAvailable) {\n const type = LocalStorage.load('virtualBackgroundType', 'off');\n if (type === 'image:blob') {\n return VirtualBackgroundMixer.getImageBlobOrFallback(isBlobAvailable);\n }\n return type;\n }\n\n loadLocalImageForVirtualBackground(callbackFN) {\n VirtualBackgroundMixer.loadLocalImage(error => {\n if (!error) {\n this.setVirtualBackgroundType('image:blob');\n }\n callbackFN(error);\n });\n }\n\n /**\n * Sets cameras, microphones, and speakers and starts a video stream\n * with supplied options.\n **/\n start() {\n this.watchForNewDevices();\n\n return DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .then(() => DeviceManager.getConstraints(this.options))\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n stopStream() {\n if (!this.stream) {\n return;\n }\n if (this.virtualBackground.originalStream) {\n this.virtualBackground.stopOriginalStream();\n this.virtualBackground.terminate();\n } else {\n stopStream(this.stream);\n }\n this.stream = null;\n }\n\n /**\n * Stop the media stream. Since we call getUserMedia on gotDevices we don't\n * have a stream in that case.\n **/\n stop() {\n this.stopStream();\n }\n\n terminate() {\n navigator.mediaDevices.ondevicechange = null;\n this.terminationInProgress = true;\n window.setTimeout(() => {\n this.stop();\n this.virtualBackground.destroy();\n }, 10);\n }\n\n setDevices(devices) {\n const camHasChanged = changedDevices(this.cameras, devices.cameras);\n const micHasChanged = changedDevices(this.microphones, devices.microphones);\n const speakerHasChanged = changedDevices(this.speakers, devices.speakers);\n this.cameras = devices.cameras;\n this.microphones = devices.microphones;\n this.speakers = devices.speakers;\n this.options.audio =\n this.microphones.length > 0 ? this.options.audio : false;\n this.options.video = this.cameras.length > 0 ? this.options.video : false;\n if (camHasChanged || micHasChanged || speakerHasChanged) {\n this.emit(devices);\n }\n }\n\n watchForNewDevices() {\n navigator.mediaDevices.ondevicechange = () => {\n DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .catch(this.handleError);\n };\n }\n\n /**\n * Register listeners for changes on devices.\n **/\n onChange(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * Remove a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * Wrapper around mediaDevices getUserMedia. Ensures a running stream is\n * stopped and a new one started with newly defined constraints.\n **/\n update(constraints) {\n this.constraints = constraints || this.constraints;\n this.stop();\n\n this.watchForNewDevices();\n\n return navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n /**\n * Similar to update but instead of directly supplying constraints,\n * update with options.\n **/\n updateWithOptions(options, isMobile = false) {\n this.options = options || this.options;\n this.stop();\n\n this.watchForNewDevices();\n\n const constraintsFn = isMobile ? 'getMobileConstraints' : 'getConstraints';\n return DeviceManager[constraintsFn](this.options)\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n stream.getAudioTracks()[0].enabled = this.options.audio;\n }\n return stream;\n }\n\n initiateVirtualBackground(stream) {\n if (\n this.virtualBackgroundType !== 'off' &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return this.virtualBackground.initiateStream(stream);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n storeConstraints() {\n const { constraints } = this;\n const { video, audio } = constraints;\n Logger.debug('DeviceManager::storeConstraints', constraints);\n LocalStorage.store('mediaConstraints', constraints);\n LocalStorage.store('sinkId', this.sinkId);\n LocalStorage.store('virtualBackgroundType', this.virtualBackgroundType);\n if (video && video.deviceId && video.deviceId.exact) {\n LocalStorage.store('videoId', video.deviceId.exact);\n }\n if (audio && audio.deviceId && audio.deviceId.exact) {\n LocalStorage.store('audioId', audio.deviceId.exact);\n }\n this.virtualBackground.updateCache(this.virtualBackgroundType);\n }\n\n /**\n * Set active stream.\n *\n * NOTE: This can be called _after_ we have already stopped.\n **/\n // eslint-disable-next-line max-statements\n setStream(stream) {\n const firstRun = this.stream === null;\n this.stream = stream;\n if (this.terminationInProgress) {\n this.stop();\n return Promise.resolve();\n }\n const emitStreamUpdate = () => {\n this.emit({\n stream: this.stream,\n constraints: this.constraints,\n options: this.options\n });\n this.verifyStream();\n };\n if (firstRun) {\n return DeviceManager.fetchDevices().then(devices => {\n this.setDevices(devices);\n emitStreamUpdate();\n });\n }\n emitStreamUpdate();\n return Promise.resolve();\n }\n\n verifyStream() {\n if (\n this.constraints.video &&\n this.stream &&\n this.stream.getVideoTracks().length === 0 &&\n !this.options.eco\n ) {\n this.handleError({ name: 'EyesonCameraError' });\n }\n\n if (\n this.constraints.audio &&\n this.stream &&\n this.stream.getAudioTracks().length === 0\n ) {\n this.handleError({ name: 'EyesonMicrophoneError' });\n }\n }\n\n /**\n * Set video input selection.\n **/\n setVideoInput(deviceId) {\n let videoConstraints = {};\n Object.assign(videoConstraints, this.constraints.video, {\n deviceId: { exact: deviceId }\n });\n this.constraints.video = videoConstraints;\n return this.update();\n }\n\n /**\n * Set audio input selection.\n **/\n setAudioInput(deviceId, options = {}) {\n let audioConstraints = {};\n Object.assign(audioConstraints, this.constraints.audio, {\n deviceId: { exact: deviceId }\n });\n this.constraints.audio = audioConstraints;\n if (options.preventUpdate === true) {\n return Promise.resolve();\n }\n return this.update();\n }\n\n /**\n * Set and store audio output selection.\n **/\n setAudioOutput(sinkId) {\n this.sinkId = sinkId || 'default';\n LocalStorage.store('sinkId', this.sinkId);\n this.emit({ sinkId: this.sinkId });\n }\n\n handleError(error) {\n Logger.error('DeviceManager::', error);\n this.emit({ error: error, constraints: this.constraints });\n }\n\n /**\n * emit bound listeners about changes.\n **/\n emit(state) {\n this.listeners.forEach(listener => listener(state));\n }\n}\n\nexport default DeviceManager;\n/* eslint-enable max-lines */\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport NinjaStream from './NinjaStream.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport {\n stopTrack,\n captureStream,\n isCanvasPresentationStream,\n isScreenStream,\n isScreenPresentationStream,\n getScreenTracks,\n getScreenPresentationTracks,\n getCanvasTracks,\n getCameraTracks,\n toggleAudio,\n stopStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Options are basically what the user of MediaStreamBuilder \"wants\" to see in\n * the conference session. For example: no camera video -> options video: false\n * but we'd still have a media stream track with video because conference server\n * currently expects this behaviour and relies on mute_video command being\n * sent.\n **/\nclass MediaStreamBuilder {\n constructor(\n options = {\n eco: false,\n audio: true,\n video: true,\n screen: false,\n surface: null,\n screenStream: null,\n canvas: null,\n existingStream: null,\n micMixer: null,\n vbgMixer: null,\n isPresentation: false,\n virtualBackground: false,\n deviceMonitor: null\n }\n ) {\n this.options = options;\n this.tempStream = null;\n this.brokenTrackCallback = null;\n this.bindMethods();\n }\n\n bindMethods() {\n this.getMediaStream = this.getMediaStream.bind(this);\n this.addNinjaTrack = this.addNinjaTrack.bind(this);\n this.addCanvasTrack = this.addCanvasTrack.bind(this);\n this.addScreenTrack = this.addScreenTrack.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.adjustVideoTrack = this.adjustVideoTrack.bind(this);\n this.addScreenStreamTrack = this.addScreenStreamTrack.bind(this);\n this.initializeVirtualBackground =\n this.initializeVirtualBackground.bind(this);\n }\n\n /**\n * We always acquire a stream with at least audio enabled and adjust\n * the desired mute behaviour via the track.\n * Unless, we have no camera and microphones. In that case we use a\n * NinjaStream.\n * If the browser does not support updating the peerConnection\n * we acquire a audio and video stream and adjust the tracks accordingly.\n *\n * In case of replaceTrack support we stop the tracks before\n * acquiring a new stream. Since stopping a track also stops the source.\n * So, at least in Safari we'd stop the camera if the old and new track\n * use the same source.\n * Furthermore Safari on iOS behaves differently again. Camera muting\n * _sometimes_ freezes the remote stream video playback (audio fine).\n **/\n start() {\n Logger.debug('MediaStreamBuilder::start', this.options);\n const {\n existingStream,\n video,\n audio,\n screen,\n canvas,\n micMixer,\n screenStream\n } = this.options;\n if (\n FeatureDetector.isIOSDevice() &&\n existingStream &&\n typeof video === 'boolean' &&\n existingStream.active &&\n getCameraTracks(existingStream).length > 0 &&\n getCameraTracks(existingStream)[0].readyState !== 'ended'\n ) {\n // eslint-disable-next-line max-statements\n return new Promise(resolve => {\n const [vTrack] = getCameraTracks(existingStream);\n vTrack.enabled = video;\n vTrack.onended =\n video && this.brokenTrackCallback\n ? () => {\n Logger.error('iOS video track broken');\n existingStream.getTracks().forEach(track => track.stop());\n this.brokenTrackCallback();\n }\n : null;\n if (typeof audio === 'boolean') {\n toggleAudio(existingStream, audio);\n }\n if (canvas) {\n const newStream = new MediaStream(existingStream.getTracks());\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n newStream.addTrack(canvasTrack);\n resolve(newStream);\n return;\n }\n resolve(existingStream);\n });\n }\n\n if (FeatureDetector.isSafari() && screen && micMixer && !canvas) {\n return (\n screenStream ? Promise.resolve(screenStream) : this.getDisplayMedia()\n )\n .then(displayStream => {\n return DeviceManager.getConstraints().then(constraints => {\n const stream = new MediaStream();\n this.addScreenStreamTrack(stream, displayStream);\n this.tempStream = new MediaStream(displayStream.getTracks());\n return navigator.mediaDevices\n .getUserMedia({ audio: constraints.audio })\n .then(audioStream => {\n this.adjustAudioTrack(audioStream);\n audioStream\n .getTracks()\n .forEach(track => this.tempStream.addTrack(track));\n micMixer.mixScreenshareAudio(\n audioStream,\n displayStream,\n stream\n );\n if (micMixer.active) {\n micMixer.setMicOnlyStream(audioStream, displayStream);\n }\n return stream;\n });\n });\n })\n .then(stream => {\n this.tempStream = null;\n return stream;\n })\n .catch(error => {\n if (this.tempStream) {\n stopStream(this.tempStream);\n this.tempStream = null;\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n return DeviceManager.fetchInputDevices()\n .then(this.getMediaStream)\n .then(this.adjustVideoTrack)\n .then(this.adjustAudioTrack)\n .then(this.initializeVirtualBackground)\n .then(this.addCanvasTrack)\n .then(this.addScreenTrack)\n .then(this.addNinjaTrack)\n .then(stream => {\n this.tempStream = null;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.applyTempTracks();\n }\n return stream;\n })\n .catch(error => {\n this.cleanupTempStream();\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.discardTempTracks();\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n // eslint-disable-next-line max-statements\n getMediaStream(devices) {\n if (devices.length === 0) {\n this.options = { audio: false, video: false };\n this.tempStream = new NinjaStream().stream;\n return this.tempStream;\n }\n const { eco, video, existingStream } = this.options;\n const options = {\n video: FeatureDetector.hasCanvasCaptureSupport() || eco ? video : true,\n audio: true\n };\n if (video === false && !eco && FeatureDetector.isIOSDevice()) {\n options.video = true;\n }\n let { getConstraints } = DeviceManager;\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n stopStream(existingStream);\n }\n if (FeatureDetector.isPhone() || FeatureDetector.isIOSDevice()) {\n stopStream(existingStream);\n getConstraints = DeviceManager.getMobileConstraints;\n }\n return getConstraints(options).then(constraints => {\n return navigator.mediaDevices.getUserMedia(constraints).then(stream => {\n this.tempStream = stream;\n return stream;\n });\n });\n }\n\n /**\n * Adjust audio and video tracks according to the supplied options.\n * We stop the video track so the camera indicator isn't active.\n * We add a filler video track, unless we're in eco mode, which would result\n * in sdp with media section for video & recvonly. meaning we'd still\n * receive video.\n * In case of iOS we have the cam track that shouldn't get stopped to get turned\n * on again\n **/\n adjustVideoTrack(stream) {\n if (stream.getVideoTracks().length === 1) {\n const [vTrack] = stream.getVideoTracks();\n vTrack.enabled = this.options.video;\n if (this.options.video === false && !FeatureDetector.isIOSDevice()) {\n stopTrack(vTrack);\n }\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addVideoTrack(vTrack);\n }\n }\n return stream;\n }\n\n initializeVirtualBackground(stream) {\n const { screen, virtualBackground, vbgMixer } = this.options;\n if (\n !screen &&\n virtualBackground &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return vbgMixer.initiateStream(stream);\n }\n return stream;\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n const [aTrack] = stream.getAudioTracks();\n aTrack.enabled = this.options.audio;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addAudioTrack(aTrack);\n }\n }\n return stream;\n }\n\n addCanvasTrack(stream) {\n const { canvas, existingStream } = this.options;\n if (canvas) {\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n stream.addTrack(canvasTrack);\n }\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n stream.addTrack(canvasTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n async addScreenTrack(stream) {\n let { screenStream } = this.options;\n const { screen, existingStream, micMixer } = this.options;\n if (screen && micMixer) {\n if (screenStream === null || typeof screenStream === 'undefined') {\n screenStream = await this.getDisplayMedia();\n }\n const outStream = new MediaStream();\n this.addScreenStreamTrack(outStream, screenStream);\n micMixer.mixScreenshareAudio(stream, screenStream, outStream);\n if (micMixer.active) {\n micMixer.setMicOnlyStream(stream, screenStream);\n }\n this.tempStream = new MediaStream(\n stream.getTracks().concat(screenStream.getTracks())\n );\n return outStream;\n }\n // this is crazy! for now, we loose screen audio if there was any\n if (isScreenPresentationStream(existingStream)) {\n const [screenTrack] = getScreenPresentationTracks(existingStream);\n stream.addTrack(screenTrack);\n }\n return stream;\n }\n\n addScreenStreamTrack(stream, screenStream) {\n const [screenTrack] = screenStream.getVideoTracks();\n // options required for SAFARI\n screenTrack.type = this.options.isPresentation\n ? 'screen-track'\n : 'screen-video-track';\n if (stream) {\n stream.addTrack(screenTrack);\n }\n }\n\n getDisplayMedia() {\n if (FeatureDetector.hasGetDisplayMedia()) {\n const stereo = FeatureDetector.canStereo() && !this.options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n const videoConstraints = {\n // removed width constraint due to safari bug drawing a green line\n // width: { max: 1920 },\n height: { max: 1080 },\n frameRate: { max: 15 }\n };\n if (FeatureDetector.isChrome() && FeatureDetector.isMacOS()) {\n // disable audio processing to prevent down-mixing\n // unfortunately audio on entire screen (not supported on Mac) causes echo!\n audioConstraints.echoCancellation = false;\n }\n if (this.options.surface && FeatureDetector.canChooseDisplaySurface()) {\n videoConstraints.displaySurface = this.options.surface;\n }\n return navigator.mediaDevices.getDisplayMedia({\n audio: audioConstraints,\n video: videoConstraints,\n surfaceSwitching: 'include',\n selfBrowserSurface: 'include',\n systemAudio: 'include'\n });\n }\n return navigator.mediaDevices.getUserMedia({\n video: {\n mediaSource: 'screen',\n width: { max: 1920 },\n height: { max: 1040 },\n frameRate: { max: 15 }\n }\n });\n }\n\n addNinjaTrack(stream) {\n const { eco, video } = this.options;\n if (eco || !FeatureDetector.hasCanvasCaptureSupport()) {\n return stream;\n }\n if (stream.getVideoTracks().length === 0) {\n const [fillerTrack] = new NinjaStream().stream.getVideoTracks();\n fillerTrack.enabled = video;\n stream.addTrack(fillerTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n cleanupTempStream() {\n let { tempStream } = this;\n if (!tempStream) {\n return;\n }\n const { existingStream, screenStream } = this.options;\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n tempStream.removeTrack(canvasTrack);\n }\n if (isScreenStream(existingStream)) {\n const [screenTrack] = getScreenTracks(existingStream);\n tempStream.removeTrack(screenTrack);\n }\n if (isScreenPresentationStream(screenStream)) {\n const [screenTrack] = getScreenPresentationTracks(screenStream);\n tempStream.removeTrack(screenTrack);\n }\n stopStream(tempStream);\n this.tempStream = null;\n }\n\n onBrokenTrackError(callback) {\n this.brokenTrackCallback = callback;\n return this;\n }\n}\n\nexport default MediaStreamBuilder;\n","import Logger from './Logger.js';\nimport { stopStream, stopTrack } from './utils/StreamHelpers.js';\n\nclass MicMixer {\n constructor() {\n this.active = false;\n this.audioContext = null;\n this.acOut = null;\n this.micOnlyStream = null;\n this.originalStream = null;\n }\n\n setMicOnlyStream(audioStream, videoStream) {\n this.micOnlyStream = new MediaStream();\n const audioTracks = audioStream.getAudioTracks();\n const videoTracks = videoStream.getVideoTracks();\n if (audioTracks.length > 0) {\n this.micOnlyStream.addTrack(audioTracks[0]);\n }\n if (videoTracks.length > 0) {\n this.micOnlyStream.addTrack(videoTracks[0]);\n }\n return this.micOnlyStream;\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n getOriginalStream() {\n return this.originalStream;\n }\n\n stopOriginalStream() {\n stopStream(this.originalStream);\n }\n\n noMix(userMediaStream, outStream) {\n const audioTracks = userMediaStream.getAudioTracks();\n if (audioTracks.length > 0) {\n outStream.addTrack(audioTracks[0]);\n }\n }\n\n initMixScreenshareMix(userMediaStream, displayStream, outStream) {\n this.audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n this.acOut = this.audioContext.createMediaStreamDestination();\n this.audioContext\n .createMediaStreamSource(displayStream)\n .connect(this.acOut);\n this.audioContext\n .createMediaStreamSource(userMediaStream)\n .connect(this.acOut);\n outStream.addTrack(this.acOut.stream.getAudioTracks()[0]);\n }\n\n mixScreenshareAudio(userMediaStream, displayStream, outStream) {\n this.originalStream = displayStream;\n const displayAudio = displayStream.getAudioTracks();\n if (displayAudio.length === 0) {\n this.noMix(userMediaStream, outStream);\n } else {\n try {\n this.initMixScreenshareMix(userMediaStream, displayStream, outStream);\n this.active = true;\n } catch (exc) {\n Logger.error('MicMixer::mixScreenshareAudio', exc);\n stopTrack(displayAudio[0]);\n this.noMix(userMediaStream, outStream);\n }\n }\n }\n\n destroy() {\n this.stopOriginalStream();\n this.micOnlyStream = null;\n this.originalStream = null;\n if (this.audioContext) {\n stopStream(this.acOut.stream);\n this.audioContext.close().then(() => {\n this.audioContext = null;\n this.acOut = null;\n this.active = false;\n });\n return;\n }\n this.active = false;\n }\n}\n\nexport default MicMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst adjustMediaStreamTracks = (stream, audio, video) => {\n stream.getAudioTracks().forEach(track => (track.enabled = audio));\n stream.getVideoTracks().forEach(track => (track.enabled = video));\n};\n\n/**\n * ChangeLocalStream (optimization after PodiumEvent).\n **/\nclass ChangeLocalStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio, video, screen = false, surface }) {\n Logger.debug('ChangeLocalStreamEvent::handle');\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream, vbgMixer } = _session;\n const wasScreenAsVideo = Boolean(_session.micMixer);\n\n if (\n FeatureDetector.isIOSDevice() ||\n (FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !wasScreenAsVideo &&\n !localStream.wasScreenAsVideo)\n ) {\n if (vbgMixer) {\n if (video) {\n vbgMixer.resume();\n } else {\n vbgMixer.suspend();\n }\n if (\n vbgMixer.originalStream &&\n vbgMixer.originalStream !== localStream\n ) {\n adjustMediaStreamTracks(vbgMixer.originalStream, audio, video);\n }\n }\n adjustMediaStreamTracks(localStream, audio, video);\n localStream.locallyChanged = true;\n _session.emit({ type: 'stream_update', localStream });\n return;\n }\n\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n }\n\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n\n new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(stream => {\n stream.locallyChanged = true;\n stream.wasScreenAsVideo = wasScreenAsVideo;\n _session.setStream(stream);\n })\n .catch(error => {\n Logger.error('ChangeLocalStreamEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n _session.emit({ type: 'stop_screen_video' });\n }\n });\n }\n}\n\nexport default ChangeLocalStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport ForwardEvent from './ForwardEvent.js';\nimport ChangeLocalStreamEvent from './ChangeLocalStreamEvent.js';\nimport {\n isPresentationStream,\n isCameraStream,\n isVBGStream,\n hasAudio,\n hasVideo\n} from './../utils/StreamHelpers.js';\n\nclass PodiumEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n // For dev\n Logger.debug('PodiumEvent::handle', msg);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream } = _session;\n\n if (\n !msg.hasPresenter &&\n isPresentationStream(localStream) &&\n !_session.stopPresentingSet\n ) {\n _session.emit({ type: 'stop_presenting' });\n }\n\n if (_session && !_session.externalStream) {\n this.scanMessageForLocalStreamOptimization(localStream, msg);\n }\n\n new ForwardEvent(this.context).handle(msg);\n }\n\n // Optimization to avoid streaming when not on video podium.\n // First, we need a localStream, then we avoid adjustments when we initially\n // join the room (isSource) and finally if we're not on the podium,\n // but have a local camera stream with video, we change our local stream.\n //\n // We only re-activate the camera in the opposite case if the current\n // localStream was locallyChanged (through this optimization) since we\n // want to avoid situations where a user doesn't expect to be on the video\n // podium and we suddenly turned on their camera.\n //\n // Last case: someone else is presenting (screen share or canvas presentation)\n // we're still on the video podium but not actively presenting.\n // eslint-disable-next-line max-statements\n scanMessageForLocalStreamOptimization(localStream, msg) {\n const { video, isSource, isPresenter, hasPresenter, hasDesktopSources } =\n msg;\n\n if (!localStream) {\n return;\n }\n\n if (\n isSource &&\n ((!video && (isCameraStream(localStream) || isVBGStream(localStream))) ||\n (video &&\n !hasVideo(localStream) &&\n localStream.locallyChanged &&\n !hasPresenter))\n ) {\n const options = {\n audio: hasAudio(localStream),\n video: video\n };\n if (localStream.wasScreenAsVideo) {\n options.video = false;\n options.screen = true;\n }\n new ChangeLocalStreamEvent(this.context).handle(options);\n }\n\n if (video && !isPresenter && hasDesktopSources) {\n new ChangeLocalStreamEvent(this.context).handle({\n audio: hasAudio(localStream),\n video: false\n });\n }\n }\n}\n\nexport default PodiumEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SnapshotEvent extends BaseEvent {\n handle() {\n this.context._api.takeSnapshot();\n }\n}\n\nexport default SnapshotEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayerEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayer(msg.params);\n }\n}\n\nexport default SetLayerEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SendChatEvent extends BaseEvent {\n handle(msg) {\n if (!this.context._session) {\n throw new Error('Session does not exist');\n }\n this.context._session.send({\n type: 'chat',\n content: msg.content\n });\n }\n}\n\nexport default SendChatEvent;\n","import Logger from '../Logger';\nimport PublicEvent from './PublicEvent';\n\nclass StopRtmpEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopBroadcast('generic')\n .then(() => super.handle({ type: msg.type }))\n .catch(error => Logger.warn(error));\n }\n}\n\nexport default StopRtmpEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayoutEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayout(msg.params);\n }\n}\n\nexport default SetLayoutEvent;\n","import BaseEvent from './BaseEvent';\n\nconst fixUrlEnd = url => {\n if (!url.endsWith('/')) {\n return url + '/';\n }\n return url;\n};\n\nclass StartRtmpEvent extends BaseEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n const streamUrl = fixUrlEnd(msg.url) + msg.key;\n _api.startBroadcast({ streamUrl }, 'generic').catch(error => {\n _session.emit({\n type: 'start_broadcast_error',\n platform: 'generic',\n error: error\n });\n });\n }\n}\n\nexport default StartRtmpEvent;\n","const EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nclass EventEmitter {\n constructor() {\n this.listeners = new Map();\n this.target = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\n }\n\n onEvent(cb) {\n const fn = ({ detail }) => cb(detail);\n this.target.addEventListener('event', fn);\n this.listeners.set(cb, fn);\n }\n\n offEvent(cb) {\n const fn = this.listeners.get(cb);\n if (fn) {\n this.target.removeEventListener('event', fn);\n this.listeners.delete(cb);\n }\n }\n\n removeAllListeners() {\n const { listeners, target } = this;\n listeners.forEach(fn => target.removeEventListener('event', fn));\n listeners.clear();\n }\n\n emit(data) {\n const event = new CustomEvent('event', { detail: data });\n this.target.dispatchEvent(event);\n }\n}\n\nexport default EventEmitter;\n","import EventEmitter from './eventEmitter.js';\n\nclass Transport extends EventEmitter {\n constructor(options) {\n super();\n this.connection = null;\n this.options = options;\n this.wasOpen = false;\n }\n\n connect() {\n const { options } = this;\n this.wasOpen = false;\n const connection = new WebSocket(\n `${options.endpoint}?auth_token=${options.auth_token}`\n );\n connection.onopen = () => {\n this.wasOpen = true;\n this.emit({ type: 'connected' });\n };\n connection.onmessage = ({ data }) => {\n this.emit({ type: 'message', message: data });\n };\n connection.onerror = () => {\n this.emit({ type: 'transportError' });\n };\n connection.onclose = () => {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event\n this.destroy();\n };\n this.connection = connection;\n }\n\n isConnected() {\n const { connection } = this;\n if (connection) {\n return connection.readyState === WebSocket.OPEN;\n }\n return false;\n }\n\n send(message) {\n const { connection } = this;\n if (!connection) {\n return false;\n }\n connection.send(message);\n return true;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { connection, wasOpen } = this;\n if (connection) {\n this.connection = null;\n connection.onopen = null;\n connection.onmessage = null;\n connection.onerror = null;\n connection.onclose = null;\n if (connection.readyState <= WebSocket.OPEN) {\n connection.close();\n }\n this.emit({ type: 'disconnected', was_open: wasOpen });\n }\n this.removeAllListeners();\n }\n}\n\nexport default Transport;\n","// https://github.com/bluelovers/ws-string/blob/master/packages/crlf-normalize/src/index.ts\nconst R_CRLF = /\\r\\n|\\r(?!\\n)|\\n/g;\nconst CRLF = '\\r\\n';\nconst crlfNormalize = text => text.replace(R_CRLF, CRLF);\n\nexport default crlfNormalize;\n","// https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library\nconst parseJwtPayload = token => {\n try {\n return JSON.parse(atob(token.split('.')[1]));\n } catch (error) {\n return false;\n }\n};\n\nexport default parseJwtPayload;\n","const supportsRandomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function';\n\nconst uuid = () => {\n if (supportsRandomUUID) {\n return crypto.randomUUID();\n }\n let index = 0;\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, char => {\n const byte = bytes[index];\n index += 1;\n // eslint-disable-next-line no-bitwise\n return (char ^ (byte & (15 >> (char / 4)))).toString(16);\n });\n};\n\nexport default uuid;\n","/* eslint-disable max-lines */\nimport EventEmitter from './eventEmitter.js';\nimport Transport from './Transport.js';\nimport crlfNormalize from './crlfNormalize.js';\nimport parseJwtPayload from './parseJwtPayload.js';\nimport uuid from './uuid.js';\n\nconst checkUserAgentOptions = (options = {}) => {\n let failed = '';\n [\n 'client_id',\n 'conf_id',\n 'client_name',\n 'sessionDescriptionHandlerFactory',\n 'transportOptions'\n ].some(key => {\n if (!options[key]) {\n failed = key;\n return false;\n }\n return true;\n });\n if (!failed) {\n ['auth_token', 'endpoint'].some(key => {\n if (!options.transportOptions[key]) {\n failed = `transportOptions.${key}`;\n return false;\n }\n return true;\n });\n }\n if (failed) {\n throw new Error(`Invalid options - ${failed}`);\n }\n};\n\nconst slowdown = (fn, ms, ctx) => {\n const stack = [];\n let wait = false;\n const cb = (...args) => {\n if (wait) {\n stack.push(args);\n return;\n }\n wait = true;\n setTimeout(() => {\n wait = false;\n if (stack.length > 0) {\n const nextArgs = stack.shift();\n Reflect.apply(cb, null, nextArgs);\n }\n }, ms);\n Reflect.apply(fn, ctx, args);\n };\n return cb;\n};\n\nclass UserAgent extends EventEmitter {\n constructor(options) {\n super();\n checkUserAgentOptions(options);\n this.callId = null;\n this.sessionDescriptionHandler = null;\n this.options = options;\n this.initAuthToken();\n this.debouncedHandleSDPUpdate = slowdown(this.handleSdpUpdate, 250, this);\n }\n\n // eslint-disable-next-line max-statements\n async onMessage(message) {\n const obj = JSON.parse(message);\n const { type, data } = obj;\n this.verifySender(obj);\n if (type === 'call_accepted') {\n this.setCallId(data.call_id);\n await this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'accepted' });\n } else if (type === 'call_resumed') {\n this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'resumed' });\n } else if (type === 'call_rejected') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'reject',\n code: data.reject_code\n });\n this.terminate();\n } else if (type === 'call_terminated') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'bye',\n code: data.term_code\n });\n this.terminate();\n } else if (type === 'sdp_update') {\n this.debouncedHandleSDPUpdate(data);\n } else {\n data.type = type;\n this.emit({ type: 'message', data });\n }\n }\n\n initAuthToken() {\n const { options } = this;\n const jwt = parseJwtPayload(options.transportOptions.auth_token);\n if (\n jwt === false ||\n jwt.client_id !== options.client_id ||\n jwt.conf_id !== options.conf_id ||\n !jwt.exp\n ) {\n throw new Error('Invalid auth token');\n }\n }\n\n setCallId(callId) {\n this.callId = callId;\n }\n\n verifySender(message) {\n const { options } = this;\n if (\n !(message.from === options.conf_id && message.to === options.client_id)\n ) {\n // throw new Error('Invalid message sender');\n // eslint-disable-next-line no-console\n console.error(new Error('Invalid message sender', message));\n }\n }\n\n async handleSdpUpdate(data) {\n const { callId } = this;\n const { sdp } = data;\n if (!callId || callId !== data.call_id) {\n throw new Error('Invalid call id');\n }\n this.emit({ type: 'sdp_update', sdp });\n const answerSdp = await this.sessionDescriptionHandler.updateDescription(\n sdp\n );\n if (sdp.type === 'offer' && answerSdp) {\n const desc = {\n type: answerSdp.type,\n sdp: crlfNormalize(answerSdp.sdp)\n };\n this.message('sdp_update', {\n call_id: callId,\n sdp: desc\n });\n }\n }\n\n message(type = 'message', data = {}) {\n const { options } = this;\n const message = JSON.stringify({\n type,\n msg_id: uuid(),\n from: options.client_id,\n to: options.conf_id,\n data\n });\n this.transport.send(message);\n }\n\n connect() {\n const { options } = this;\n const transport = new Transport(options.transportOptions);\n this.transport = transport;\n this.termination = false;\n this.emit({ type: 'transportCreated', transport });\n transport.onEvent(event => {\n const { type } = event;\n if (type === 'connected') {\n if (!this.sessionDescriptionHandler) {\n this.sessionDescriptionHandler =\n options.sessionDescriptionHandlerFactory(\n options.sessionDescriptionHandlerFactoryOptions\n );\n this.emit({ type: 'registered' });\n }\n } else if (type === 'message') {\n this.onMessage(event.message);\n } else if (type === 'disconnected') {\n if (!this.termination) {\n this.emit({\n type: 'terminated',\n reason: 'disconnect',\n code: event.was_open ? 0 : -1\n });\n }\n }\n });\n transport.connect();\n }\n\n // eslint-disable-next-line max-statements\n async call() {\n const { sessionDescriptionHandler, options } = this;\n if (!sessionDescriptionHandler) {\n throw new Error('Invalid sessionDescriptionHandler');\n }\n const description = await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_start', {\n sdp: desc,\n display_name: options.client_name,\n mute_video: options.mute_video\n });\n }\n\n resume(authToken) {\n if (!this.callId) {\n throw new Error('Session was already closed');\n }\n this.options.transportOptions.auth_token = authToken;\n try {\n this.initAuthToken();\n } catch (error) {\n this.emit({ type: 'terminated', reason: 'disconnect', code: -1 });\n return;\n }\n const onReconnect = seppEvent => {\n if (seppEvent.type === 'transportCreated') {\n this.offEvent(onReconnect);\n // eslint-disable-next-line max-statements\n this.transport.onEvent(async transportEvent => {\n if (transportEvent.type === 'connected') {\n const { transport, sessionDescriptionHandler } = this;\n if (!this.callId) {\n transport.destroy();\n throw new Error('Session was already closed');\n }\n try {\n const description =\n await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_resume', {\n call_id: this.callId,\n sdp: desc\n });\n } catch (error) {\n transport.destroy();\n throw new Error('Unable to reconnect');\n }\n }\n });\n }\n };\n this.onEvent(onReconnect);\n this.connect();\n }\n\n // eslint-disable-next-line max-statements\n terminate() {\n const { sessionDescriptionHandler, transport, callId } = this;\n this.callId = null;\n if (sessionDescriptionHandler) {\n sessionDescriptionHandler.close();\n }\n if (transport) {\n if (transport.isConnected() && callId) {\n this.termination = true;\n this.message('call_terminate', {\n call_id: callId,\n term_code: 0\n });\n this.emit({ type: 'terminated', reason: 'terminate', code: 0 });\n }\n this.transport = null;\n transport.destroy();\n }\n }\n}\n\nexport default { UserAgent };\n","/**\n * This is where we keep the list of sip events we're interested in forwarding.\n **/\nexport default [\n 'chat',\n 'recording',\n 'memberlist',\n 'source_update',\n 'voice_activity'\n];\n","/**\n * Podium Facade.\n **/\nclass PodiumFacade {\n constructor(message, clientId) {\n const { src = [], psrc, asrc, vsrc, dsrc, dims } = message;\n this.clientId = clientId;\n this.sources = src;\n this.presenterIdx = psrc;\n this.audioSources = asrc;\n this.videoSources = vsrc;\n this.desktopSources = dsrc;\n this.dimensions = dims;\n this.userSourceIndex = src.indexOf(clientId);\n }\n\n get isSolo() {\n const uniqueSources = Array.from(new Set(this.sources));\n return uniqueSources.length === 1 && this.sources[0] === this.clientId;\n }\n\n get isSource() {\n return this.sources.includes(this.clientId);\n }\n\n get isPresenter() {\n return this.hasPresenter && this.presenter === this.clientId;\n }\n\n get presenter() {\n return this.hasPresenter && this.sources[this.presenterIdx];\n }\n\n get hasMedia() {\n return this.sources.some(source => /media/.test(source));\n }\n\n get hasPresenter() {\n return Number.isInteger(this.presenterIdx) && this.presenterIdx > -1;\n }\n\n get hasVideoSources() {\n return Boolean(this.videoSources);\n }\n\n get hasDesktopSources() {\n return Number.isInteger(this.desktopSources) && this.desktopSources > -1;\n }\n\n get hasAudioPosition() {\n return this.audioSources.includes(this.userSourceIndex);\n }\n\n get hasVideoPosition() {\n return this.videoSources.includes(this.userSourceIndex);\n }\n\n get hasMutedVideoPeers() {\n return (\n !this.hasDesktopSources &&\n this.videoSources.filter(source => source !== this.userSourceIndex)\n .length === 0\n );\n }\n\n get userDimensions() {\n const userVideoIndex = this.videoSources.indexOf(this.userSourceIndex);\n if (userVideoIndex > -1) {\n return this.dimensions[userVideoIndex];\n }\n return null;\n }\n}\n\nexport default PodiumFacade;\n","import Logger from './Logger.js';\nimport PodiumFacade from './PodiumFacade.js';\n\n/**\n * SipMessageTransformer\n **/\nclass SigMessageTransformer {\n constructor(clientId) {\n this.clientId = clientId;\n this.stamp = this.stamp.bind(this);\n this.default = this.default.bind(this);\n this.process = this.process.bind(this);\n this.sourceUpdate = this.sourceUpdate.bind(this);\n this.voiceActivity = this.voiceActivity.bind(this);\n }\n\n /**\n * Put a stamp with _src on the message.\n **/\n stamp(message) {\n return Object.assign({ _src: 'sig' }, message);\n }\n\n process(message) {\n /* eslint-disable camelcase */\n const transformation =\n {\n source_update: this.sourceUpdate,\n voice_activity: this.voiceActivity\n }[message.type] || this.default;\n /* eslint-enable camelcase */\n\n return transformation(this.stamp(message));\n }\n\n default(message) {\n Logger.debug('SipMessageTransformer::default', message);\n return message;\n }\n\n sourceUpdate(message) {\n Logger.debug('SipMessageTransformer::sourceUpdate', message);\n\n const podium = new PodiumFacade(message, this.clientId);\n\n const transformed = {\n type: 'podium',\n solo: podium.isSolo,\n audio: podium.hasAudioPosition,\n video: podium.hasVideoPosition,\n media: podium.hasMedia,\n sources: podium.sources,\n isSource: podium.isSource,\n presenter: podium.presenter,\n isPresenter: podium.isPresenter,\n hasPresenter: podium.hasPresenter,\n videoSources: podium.videoSources,\n userDimensions: podium.userDimensions,\n hasVideoSources: podium.hasVideoSources,\n hasDesktopSources: podium.hasDesktopSources,\n hasMutedVideoPeers: podium.hasMutedVideoPeers\n };\n\n return transformed;\n }\n\n voiceActivity(message) {\n Logger.debug('SipMessageTransformer::voiceActivity', message);\n\n // we rename the type here so we can use 'voice_activity' for passing to the\n // ui\n const transformed = Object.assign({\n type: 'voice_activity_raw',\n on: message.on,\n userId: message.cid\n });\n\n return transformed;\n }\n}\n\nexport default SigMessageTransformer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport 'webrtc-adapter';\nimport {\n stopTrack,\n getCanvasTracks,\n isCanvasPresentationStream\n} from './utils/StreamHelpers.js';\n\nconst _iceCheckingTimeout = 3000;\n\n/**\n * SessionDescriptionHandler\n */\nclass SessionDescriptionHandler {\n // eslint-disable-next-line max-statements\n constructor(options) {\n this.datachannel = null;\n this.peerConnection = null;\n this.localStream = null;\n this.remoteStream = null;\n this.connected = false;\n this.iceCheckingTimer = null;\n this.peerConnectionReady = null;\n this.options = options || {};\n this.connection = options.connection;\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.initPeerConnection();\n }\n\n /**\n * Gets the local description from the underlying media implementation\n */\n // eslint-disable-next-line max-statements\n async getDescription() {\n const { options, peerConnection } = this;\n Logger.debug('SessionDescriptionHandler::getDescription:', options);\n this.localStream = options.stream;\n const offer = await peerConnection.createOffer(options.RTCOfferOptions);\n options.SDPModifiers.active.forEach(modifier => {\n offer.sdp = modifier(offer.sdp);\n });\n await peerConnection.setLocalDescription(offer);\n await this.peerConnectionReady;\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug('SessionDescriptionHandler::getDescription offer', sdp);\n return { type: 'offer', sdp };\n }\n\n /**\n * Set the remote description to the underlying media implementation\n */\n async setDescription(sessionDescription) {\n const { datachannel } = this;\n Logger.debug(\n 'SessionDescriptionHandler::setDescription:',\n sessionDescription\n );\n if (sessionDescription && sessionDescription.sdp) {\n this.connection.seppMessaging = sessionDescription.sdp.includes(\n 'a=eyeson-sepp-messaging'\n );\n }\n await this.peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n if (datachannel.readyState === 'connecting') {\n await new Promise(resolve => {\n datachannel.onopen = () => {\n datachannel.onopen = null;\n resolve();\n };\n });\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateDescription(sessionDescription) {\n const { options, peerConnection } = this;\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription:',\n sessionDescription\n );\n if (sessionDescription.type === 'offer') {\n try {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n const answer = await peerConnection.createAnswer();\n options.SDPModifiers.active.forEach(modifier => {\n answer.sdp = modifier(answer.sdp);\n });\n await peerConnection.setLocalDescription(answer);\n this.options.remoteDescriptionUpdate(sessionDescription);\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription answer',\n sdp\n );\n return { type: 'answer', sdp };\n } catch (error) {\n Logger.error('SessionDescriptionHandler::updateDescription', error);\n }\n } else if (sessionDescription.type === 'answer') {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n }\n return null;\n }\n\n close() {\n Logger.debug('SessionDescriptionHandler::close');\n clearTimeout(this.iceCheckingTimer);\n if (this.peerConnection) {\n this.stopAllTracks();\n this.peerConnection.close();\n this.peerConnection = null;\n if (\n this.datachannel &&\n ['connecting', 'open'].includes(this.datachannel.readyState)\n ) {\n this.datachannel.close();\n this.datachannel = null;\n }\n Logger.debug(\n 'SessionDescriptionHandler::close ' +\n 'Stopped streams and closed peerConnection.'\n );\n }\n }\n\n // eslint-disable-next-line max-statements\n initPeerConnection() {\n const { options } = this;\n const pcOptions = this.buildPeerConnectionOptions();\n Logger.debug(\n 'SessionDescriptionHandler::initPeerConnection with',\n pcOptions\n );\n let resolveReady = null;\n this.peerConnectionReady = new Promise(resolve => (resolveReady = resolve));\n try {\n const pc = new RTCPeerConnection(pcOptions);\n this.peerConnection = pc;\n options.stream.getTracks().forEach(track => {\n pc.addTrack(track, options.stream);\n });\n const channel = pc.createDataChannel('data', { negotiated: true, id: 0 });\n this.handleDatachannel(channel);\n pc.onicecandidate = ({ candidate }) => {\n if (!candidate) {\n resolveReady();\n return;\n }\n Logger.debug(\n 'SessionDescriptionHandler::gotIceCandidate',\n candidate.candidate\n );\n };\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n resolveReady();\n }\n };\n if (options.sendOnly === true) {\n pc.addEventListener(\n 'connectionstatechange',\n this.handleConnectionStateChange\n );\n } else {\n pc.ontrack = this.handleOntrack.bind(this);\n }\n this.iceCheckingTimer = setTimeout(\n () => resolveReady(),\n _iceCheckingTimeout\n );\n } catch (error) {\n Logger.error(\n 'SessionDescriptionHandler::initPeerConnection failed:',\n error,\n this.connection.uaOptions\n );\n }\n }\n\n /**\n * Only signal (handleAccept) that we have a remote stream once ontrack\n * says so. Is called twice, once for audio and once for video track.\n */\n handleOntrack({ track, streams }) {\n const { options } = this;\n [this.remoteStream] = streams;\n Logger.debug('SessionDescriptionHandler::handleOntrack:', track.kind);\n track.onunmute = () => options.handleUnmute(track);\n options.handleAccept(this.remoteStream);\n }\n\n handleConnectionStateChange() {\n if (\n this.peerConnection.connectionState === 'connected' &&\n !this.connected\n ) {\n this.connected = true;\n this.options.handleAccept();\n }\n }\n\n handleDatachannel(channel) {\n this.datachannel = channel;\n this.connection.initDatachannel(channel);\n }\n\n /**\n * We need to re-format the iceServers here. SIP.js used to offer a\n * higher level api and we supplied the servers in a different format e.g:\n *\n * { stunServers: [\"stun:stun1.visocon.com:3478\"] }\n * { turnServers: [{ urls: [1,2,3], username: \"bob\", password: \"nob\" }] }\n *\n * We currently have the api set return the creds in that format.\n * The peerConnection however expects:\n *\n * {\n * \"iceServers\": [\n * { \"urls\": \"stun:stun1.visocon.com:3478\" },\n * { \"urls\": [1,2,3], \"username\": \"bob\", \"credential\": \"nob\" }\n * ]\n * }\n */\n buildPeerConnectionOptions() {\n const { options } = this;\n const iceServers = [{ urls: options.stun_servers }];\n options.turn_servers.forEach(turnServer => {\n turnServer.credential = turnServer.password;\n iceServers.push(turnServer);\n });\n const pcOptions = {\n sdpSemantics: 'unified-plan',\n iceServers\n };\n return pcOptions;\n }\n\n getLocalStream() {\n return this.localStream;\n }\n\n getRemoteStream() {\n return this.remoteStream;\n }\n\n setStream(newStream) {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n let oldStream = this.getLocalStream();\n this.localStream = newStream;\n\n this.stopUnusedTracks(oldStream, newStream);\n\n let [audioTrack] = newStream.getAudioTracks();\n // in case of multiple streams, the preferred video track is the\n // canvas presentation stream\n let [videoTrack] = isCanvasPresentationStream(newStream)\n ? getCanvasTracks(newStream)\n : newStream.getVideoTracks();\n\n if (!this.tracksExist()) {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n return;\n }\n const senders = this.peerConnection.getSenders();\n\n const audioSender = senders.find(\n sender => sender.track && sender.track.kind === 'audio'\n );\n const videoSender = senders.find(\n sender => sender.track && sender.track.kind === 'video'\n );\n Promise.all([\n audioSender ? audioSender.replaceTrack(audioTrack) : null,\n videoSender ? videoSender.replaceTrack(videoTrack) : null\n ])\n .then(() => {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n })\n .catch(reject);\n });\n }\n\n stopUnusedTracks(oldStream, newStream) {\n if (this.connection.hasExternalStream) {\n return;\n }\n const unusedTracks = oldStream\n .getTracks()\n .filter(track => !newStream.getTracks().includes(track));\n unusedTracks.forEach(stopTrack);\n }\n\n tracksExist() {\n return Boolean(\n this.peerConnection.getSenders().find(sender => sender.track !== null)\n );\n }\n\n scaleResolution(factor) {\n // factor 0.5 => scaleResolutionDownBy 2\n try {\n const ratio = Math.max(1.0 / Math.max(factor, 0.1), 1.0);\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].scaleResolutionDownBy !== ratio) {\n params.encodings[0].scaleResolutionDownBy = ratio;\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::scaleResolution failed:', error);\n }\n }\n\n // eslint-disable-next-line max-statements\n limitFramerate(fps) {\n try {\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].maxFramerate !== fps) {\n if (fps) {\n params.encodings[0].maxFramerate = fps;\n } else {\n Reflect.deleteProperty(params.encodings[0], 'maxFramerate');\n }\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::limitFramerate failed:', error);\n }\n }\n\n /**\n * Stop all tracks\n */\n stopAllTracks() {\n Logger.debug('SessionDescriptionHandler::stopAllTracks');\n let receivers = this.peerConnection.getReceivers\n ? this.peerConnection.getReceivers()\n : [];\n this.peerConnection\n .getSenders()\n .concat(receivers)\n .forEach(rtp => {\n if (rtp.track) {\n stopTrack(rtp.track);\n }\n });\n }\n}\n\nexport default SessionDescriptionHandler;\n/* eslint-enable max-lines */\n","import SEPP from './sepp/SEPP.js';\nimport Logger from './Logger.js';\nimport WHITELIST from './SigMessageWhitelist.js';\nimport SigMessageTransformer from './SigMessageTransformer.js';\nimport SessionDescriptionHandler from './SessionDescriptionHandler.js';\n\nconst maxMessageSize = 32 * 1024;\n\n/**\n * eyeson Sip Connection.\n *\n * Registers with provided sip credentials and handles events received.\n **/\nclass SigConnection {\n constructor(signaling, user) {\n this.listeners = [];\n this.messageListener = [];\n this.datachannel = null;\n this.uaOptions = this.initUserAgentOptions(signaling, user);\n this.clientId = this.uaOptions.client_id;\n this.userAgent = null;\n this.transformer = new SigMessageTransformer(this.clientId);\n this.seppMessaging = false;\n }\n\n initUserAgentOptions(signaling, user) {\n if (signaling.type !== 'sepp') {\n return {\n client_id: null\n };\n }\n const signalingOptions = signaling.options;\n const uaOptions = {\n client_id: signalingOptions.client_id,\n conf_id: signalingOptions.conf_id,\n client_name: user.name,\n mute_video: false,\n sessionDescriptionHandlerFactory: options => {\n return new SessionDescriptionHandler(options);\n },\n sessionDescriptionHandlerFactoryOptions: {\n stun_servers: signalingOptions.stun_servers,\n turn_servers: signalingOptions.turn_servers\n },\n transportOptions: {\n auth_token: signalingOptions.auth_token,\n endpoint: signalingOptions.endpoint\n }\n };\n return uaOptions;\n }\n\n /**\n * Connect and register to the configured WebSocket server.\n **/\n start() {\n return new Promise(resolve => {\n if (!this.uaOptions.client_id) {\n throw new TypeError('Invalid signaling data');\n }\n this.userAgent = new SEPP.UserAgent(this.uaOptions);\n resolve();\n });\n }\n\n /**\n * Start a session on current connection.\n **/\n startSession(options) {\n Object.assign(\n this.uaOptions.sessionDescriptionHandlerFactoryOptions,\n options\n );\n if (options.mediaOptions) {\n this.uaOptions.mute_video = !options.mediaOptions.video;\n }\n this.userAgent.onEvent(({ type, data }) => {\n if (type === 'registered') {\n // eslint-disable-next-line prefer-reflect\n this.userAgent.call();\n } else if (type === 'message') {\n this.handleMessage(data);\n }\n });\n this.userAgent.connect();\n return this.userAgent;\n }\n\n updateAuthAndRestartSession(roomData) {\n Logger.debug('updateAuthAndRestartSession', roomData);\n if (!roomData.error) {\n this.uaOptions.transportOptions.auth_token =\n roomData.signaling.options.auth_token;\n }\n this.userAgent.connect();\n }\n\n updateAuthAndResume(roomData) {\n Logger.debug('updateAuthAndResume', roomData);\n if (!this.userAgent) {\n Logger.warn('updateAuthAndResume', 'userAgent already gone');\n return;\n }\n if (roomData.error) {\n this.userAgent.resume(null);\n return;\n }\n this.userAgent.resume(roomData.signaling.options.auth_token);\n }\n\n initDatachannel(channel) {\n this.datachannel = channel;\n Logger.debug('SigConnection::initDatachannel', channel);\n channel.onmessage = event => {\n if (event.data === '{\"type\":\"ping\"}' && channel.readyState === 'open') {\n channel.send('{\"type\":\"pong\"}');\n return;\n }\n Logger.debug('SigConnection::dataChannelMessage', event.data);\n const message = JSON.parse(event.data);\n if (message.type === 'ack') {\n return;\n }\n this.handleMessage(message);\n };\n }\n\n /**\n * Stop listening for messages.\n **/\n // eslint-disable-next-line max-statements\n close() {\n const { datachannel, userAgent } = this;\n this.datachannel = null;\n this.userAgent = null;\n if (datachannel && datachannel.readyState === 'open') {\n datachannel.close();\n }\n if (userAgent) {\n userAgent.removeAllListeners();\n userAgent.terminate();\n }\n }\n\n /**\n * Parse, filter, transform and finally forward messages received from SIP\n * connection.\n **/\n onMessage(callback) {\n this.messageListener.push(callback);\n }\n\n handleMessage(message) {\n if (!WHITELIST.includes(message.type)) {\n Logger.debug(\n `SigConnection::handleMessage ignoring \"${message.type}\" message.`\n );\n return;\n }\n const transformedMessage = this.transformer.process(message);\n this.messageListener.forEach(cb => cb(transformedMessage));\n }\n\n /**\n * Transport a message over current connection.\n **/\n // eslint-disable-next-line max-statements\n send(msg) {\n if (this.seppMessaging) {\n this.sendSeppMessage(msg);\n return;\n }\n const { datachannel } = this;\n msg.cid = this.uaOptions.client_id;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (\n datachannel &&\n datachannel.readyState === 'open' &&\n data.length < maxMessageSize\n ) {\n Logger.debug('SigConnection::send datachannel', data);\n datachannel.send(data);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n\n // eslint-disable-next-line max-statements\n sendSeppMessage(msg) {\n const { userAgent } = this;\n if (userAgent && userAgent.callId) {\n msg.cid = this.uaOptions.client_id;\n msg.call_id = userAgent.callId;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (data.length < maxMessageSize) {\n Logger.debug('SigConnection::send sepp', msg);\n userAgent.message(msg.type, msg);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n }\n\n onError(errorHandler) {\n this.listeners.push(errorHandler);\n return this;\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n}\n\nexport default SigConnection;\n","import eyesonOptions from '../options.js';\nimport Logger from '../Logger.js';\nimport PublicEvent from './PublicEvent.js';\nimport SigConnection from '../SigConnection.js';\n\nconst startSigConnection = (context, signaling, user) => {\n context.connection = new SigConnection(signaling, user);\n context._connection\n .onError(msg => context.send(msg))\n .start()\n .then(() => context.send({ type: 'connection', connectionStatus: 'ready' }))\n .catch(() =>\n context.send({ type: 'connection', connectionStatus: 'transport_error' })\n );\n};\n\nclass RoomReceived extends PublicEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n super.handle(msg);\n this.context.rtData = msg.content;\n\n if (msg.content.ready !== true) {\n Logger.debug('RoomReceived not ready:', msg.content);\n return;\n }\n\n const { user, room, signaling, links, options } = msg.content;\n\n // Update eyeson's public data\n this.context._eyeson.room = room;\n this.context._eyeson.user = this.context._api.addUserAttributes(\n user,\n user.id,\n signaling.options.client_id\n );\n this.context._eyeson.links = links;\n eyesonOptions.widescreen = Boolean(options.widescreen);\n\n if (this.context._connection) {\n Logger.debug('RoomReceived double room_ready');\n return;\n }\n startSigConnection(this.context, signaling, user);\n }\n}\n\nexport default RoomReceived;\n","import PublicEvent from './PublicEvent.js';\n\nclass FetchRoomEvent extends PublicEvent {\n handle() {\n this.context._api.getRoom(room => {\n return super.handle({ type: 'fetch_room', room });\n });\n }\n}\n\nexport default FetchRoomEvent;\n","import BaseEvent from './BaseEvent.js';\n\n/**\n * Deletes a file using the com api.\n **/\nclass DeleteFileEvent extends BaseEvent {\n handle(msg) {\n this.context._api.deleteFile(msg.file);\n }\n}\n\nexport default DeleteFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\n/**\n * Uploads a file using the com api.\n **/\n\nclass UploadFileEvent extends PublicEvent {\n handle(msg) {\n this.context._api.uploadFile(msg.file, this.addFile.bind(this));\n }\n\n addFile(response) {\n super.handle({\n type: 'add_file',\n file: response\n });\n }\n}\n\nexport default UploadFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass ReceiveChatEvent extends PublicEvent {\n handle(msg) {\n // remove domain part to support legacy SIP user\n const userId = msg.cid.split('@').shift();\n\n this.msg = msg;\n this.context._api.getUser(userId, this.forwardMessage.bind(this));\n }\n\n forwardMessage(user) {\n const timestamp = Date.parse(this.msg.ts || this.msg.created_at);\n super.handle({\n type: this.msg.type,\n user: user,\n timestamp: new Date(timestamp),\n content: this.msg.content\n });\n }\n}\n\nexport default ReceiveChatEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport DeviceManager from '../DeviceManager.js';\nimport MicMixer from '../MicMixer.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport { getScreenAsVideoTracks, stopStream } from '../utils/StreamHelpers.js';\n\nclass StartStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({\n audio = true,\n video = true,\n virtualBackground = false,\n screen = false,\n surface = null\n }) {\n Logger.debug(\n `StartStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.options.virtualBackground = virtualBackground;\n if (_session.vbgMixer) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n _session.vbgMixer.changeBackground(type);\n }\n if (\n _session.localStream &&\n !FeatureDetector.canMultipleDifferentMicrophones()\n ) {\n stopStream(_session.localStream);\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n return new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(() => _session.send({ type: 'mute_video', on: !(video || screen) }))\n .then(() => {\n if (_session.externalStream) {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n }\n })\n .catch(error => {\n Logger.error('StartStreamEvent', error);\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n });\n }\n}\n\nexport default StartStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport {\n toggleAudio,\n toggleVideo,\n toggleCamera,\n toggleVbgTrack,\n isNinjaStreamTrack,\n isScreenAsVideoTrack,\n getScreenAsVideoTracks,\n isCanvasPresentationStream\n} from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ChangeStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio = true, video = true, screen = false, surface }) {\n Logger.debug(\n `ChangeStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n const changeStream = () => {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n if (\n FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !screen\n ) {\n const [videoTrack] = _session.localStream.getVideoTracks();\n const [audioTrack] = _session.localStream.getAudioTracks();\n if (\n !(video && isNinjaStreamTrack(videoTrack)) &&\n videoTrack.readyState !== 'ended' &&\n audioTrack.readyState !== 'ended' &&\n !isScreenAsVideoTrack(videoTrack)\n ) {\n if (_session.vbgMixer && _session.vbgMixer.originalStream) {\n _session.vbgMixer[video ? 'start' : 'stop']();\n toggleVbgTrack(_session.localStream, video);\n toggleCamera(_session.vbgMixer.originalStream, video);\n } else {\n toggleCamera(_session.localStream, video);\n }\n toggleAudio(_session.localStream, audio);\n resolve(_session.localStream);\n return;\n }\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: _session.localStream,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.screen = true;\n options.video = false;\n options.surface = surface;\n options.virtualBackground = false;\n options.vbgMixer = null;\n options.micMixer = _session.micMixer;\n }\n new MediaStreamBuilder(options)\n .onBrokenTrackError(() => {\n _session.emit({ type: 'broken_track_error' });\n })\n .start()\n .then(resolve)\n .catch(reject);\n });\n };\n\n if (_session.externalStream) {\n toggleAudio(_session.externalStream, audio);\n toggleVideo(_session.externalStream, video);\n _session.send({ type: 'mute_video', on: !video });\n return Promise.resolve();\n }\n\n return (\n changeStream()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(stream => {\n if (isCanvasPresentationStream(stream)) {\n _session.canvasMixer.setStream(stream);\n } else {\n _session.send({ type: 'mute_video', on: !(video || screen) });\n }\n })\n // eslint-disable-next-line max-statements\n .catch(err => {\n Logger.error(err);\n if (\n err instanceof Error &&\n [\n 'NotReadableError',\n 'DevicesNotFoundError',\n 'NotFoundError'\n ].includes(err.name)\n ) {\n _session.emit({ type: 'warning', name: 'error_' + err.name });\n }\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${err.name}`;\n if (err.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${err.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n })\n );\n }\n}\n\nexport default ChangeStreamEvent;\n","import Logger from '../Logger';\nimport BaseEvent from './BaseEvent';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from '../utils/StreamHelpers';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ReplaceStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const stream = createExternalStream(msg.stream);\n if (!stream) {\n Logger.error('ReplaceStreamEvent::handle invalid stream', msg.stream);\n return Promise.reject(new TypeError('Invalid stream'));\n }\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n\n _session.options.audio = hasAudio(stream);\n _session.options.video = hasVideo(stream);\n\n return _session\n .setStream(stream)\n .then(() => {\n _session.externalStream = stream;\n _connection.hasExternalStream = true;\n _session.send({ type: 'mute_video', on: !hasVideo(stream) });\n })\n .catch(err => {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n Logger.error(err);\n });\n }\n}\n\nexport default ReplaceStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\n\nclass ToggleCameraEvent extends BaseEvent {\n handle({ facingMode }) {\n Logger.debug('ToggleCameraEvent::handle', facingMode);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: { facingMode: facingMode },\n existingStream: _session.localStream,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(_session.setStream)\n .catch(Logger.error);\n }\n}\n\nexport default ToggleCameraEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass AcceptSessionEvent extends PublicEvent {\n handle(msg) {\n const {\n type,\n session: { sessionDescriptionHandler }\n } = msg;\n const localStream = sessionDescriptionHandler.getLocalStream();\n const remoteStream = sessionDescriptionHandler.getRemoteStream();\n super.handle({\n type,\n localStream,\n remoteStream\n });\n }\n}\n\nexport default AcceptSessionEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopRecordingEvent extends PublicEvent {\n handle(msg) {\n this.context._api.stopRecording(msg);\n }\n}\n\nexport default StopRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * VoiceActivityEvent\n **/\nclass VoiceActivityEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise(resolve => {\n this.context._api.getUser(id, resolve);\n });\n }\n\n handle(msg) {\n this.getUser(msg.userId).then(\n user => {\n this.context.send({ type: 'voice_activity', user: user, on: msg.on });\n },\n error => {\n Logger.error('VoiceActivityEvent::handle', error);\n }\n );\n }\n}\n\nexport default VoiceActivityEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartRecordingEvent extends PublicEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n\n _api\n .startRecording(msg)\n .catch(error => _session.emit({ type: 'recording_error', error: error }));\n }\n}\n\nexport default StartRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport { getScreenPresentationTracks } from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\nconst detectDisplaySurface = screenTrack => {\n if (screenTrack && typeof screenTrack.getSettings === 'function') {\n const settings = screenTrack.getSettings();\n if (\n Reflect.apply(Object.prototype.hasOwnProperty, settings, [\n 'displaySurface'\n ])\n ) {\n return settings.displaySurface;\n }\n }\n return '';\n};\n\nclass ScreenCaptureEvent extends BaseEvent {\n handle({ audio, screen = false, screenStream, surface }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n }\n _session.micMixer = new MicMixer();\n\n const onError = error => {\n Logger.error('ScreenCaptureEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'capture_error', name });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: false,\n screen: screen,\n surface: surface,\n screenStream: screenStream,\n existingStream: _session.localStream,\n micMixer: _session.micMixer,\n isPresentation: true,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n let present = 'screen';\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n });\n const displaySurface = detectDisplaySurface(screenTrack);\n if (displaySurface) {\n present = `screen-${displaySurface}`;\n }\n }\n _session.emit({ type: 'start_presenting', stream, present });\n })\n .catch(onError);\n }\n}\n\nexport default ScreenCaptureEvent;\n","import Logger from '../Logger.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport BaseEvent from './BaseEvent.js';\n\nclass StartPresentingEvent extends BaseEvent {\n streamVideo() {\n const { _session } = this.context;\n\n const onError = error => {\n Logger.error('StartPresentingEvent', error);\n if (!error.name.match(/notallowed|permission/i)) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(userMediaStream => {\n const stream = _session.videoPlayer.invokeStream(userMediaStream);\n return this.handle({ stream });\n })\n .catch(onError);\n }\n\n // eslint-disable-next-line max-statements\n async handle({ stream = null, present = '' }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n if (_session.videoPlayer && !_session.videoPlayer.isStreaming()) {\n this.streamVideo();\n } else {\n let presentationStream = stream || _session.localStream;\n if (_session.canvasMixer && _session.canvasMixer.stream) {\n // eslint-disable-next-line prefer-destructuring\n presentationStream = _session.canvasMixer.stream;\n }\n await _session.setStream(presentationStream);\n _session.send({ type: 'set_presenter', on: true });\n _session.send({ type: 'desktopstreaming', on: true });\n _session.emit({ type: 'presentation_started', present });\n }\n }\n}\n\nexport default StartPresentingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StopPresentingEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.canvasMixer) {\n if (_session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.stopOriginalStream();\n _session.canvasMixer.vbgMixer.terminate();\n _session.canvasMixer.vbgMixer = null;\n }\n _session.canvasMixer.stop();\n _session.canvasMixer = null;\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.videoPlayer) {\n _session.videoPlayer.destroy();\n _session.videoPlayer = null;\n }\n _session.send({ type: 'desktopstreaming', on: false });\n _session.send({ type: 'set_presenter', on: false });\n _session.emit({ type: 'presentation_ended' });\n _session.stopPresentingSet = true;\n }\n}\n\nexport default StopPresentingEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopBroadcastsEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopAllBroadcasts()\n .then(() => super.handle({ type: msg.type }));\n }\n}\n\nexport default StopBroadcastsEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ClearFrontLayerEvent extends BaseEvent {\n handle() {\n this.context._api.clearFrontLayer();\n }\n}\n\nexport default ClearFrontLayerEvent;\n","import ComApi from '../ComApi.js';\nimport PublicEvent from './PublicEvent.js';\n\n/**\n * Request a user from guest token.\n * use same error if meeting is locked due to backwards compatibility for mobile apps\n * error 423 Locked = meeting locked\n **/\nclass RequestGuestUserEvent extends PublicEvent {\n handle(msg) {\n return new ComApi(msg.api, msg.token).requestUser(\n { name: msg.name, email: msg.email, locale: msg.locale },\n response => {\n if (!response.access_key) {\n let isLocked = response.locked;\n if (response.error && response.error.message === 'ComApiError: 423') {\n isLocked = true;\n }\n super.handle({\n type: 'error',\n content: 'Request guest user failed',\n locked: isLocked\n });\n return;\n }\n super.handle({ type: 'guest_user', token: response.access_key });\n }\n );\n }\n}\n\nexport default RequestGuestUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SessionTerminationEvent extends BaseEvent {\n handle() {\n this.context._eyeson.destroy();\n }\n}\n\nexport default SessionTerminationEvent;\n","import Logger from './../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * We handle participants list update is separated in two actions: one to\n * add, one to remove. In order to keep it easy to handle, the user data is\n * fetched from api (or later received via websocket). Not to mess with\n * comApi current handling, we keep it here for a while.\n **/\nclass ParticipantListUpdateEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise((resolve, reject) => {\n if (!this.context._api) {\n reject(new Error('missing ComAPI'));\n return;\n }\n try {\n this.context._api.getUser(id, resolve);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n handle(msg) {\n (msg.add || []).forEach((user, idx, add) => {\n const id = user.cid;\n const { clientId } = this.context._connection;\n\n const initial = Boolean(add.find(addition => addition.cid === clientId));\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({\n type: 'add_user',\n user: apiUser,\n initial: initial\n });\n })\n .catch(error => Logger.error(error));\n });\n (msg.del || []).forEach(user => {\n const id = user;\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({ type: 'remove_user', userId: id, user: apiUser });\n })\n .catch(error => Logger.error(error));\n });\n this.context.send({ type: 'playback_update', playing: msg.media || [] });\n }\n}\n\nexport default ParticipantListUpdateEvent;\n","const toFixedNumber = number => Number(parseFloat(number).toFixed(2));\n\nconst scale = (width, height, max) => {\n const ratio = Math.min(max.width / width, max.height / height);\n const xScaled = toFixedNumber(width * ratio);\n const yScaled = toFixedNumber(height * ratio);\n\n return { width: xScaled, height: yScaled };\n};\n\nexport default scale;\n","/* eslint-disable */\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @see https://davidwalsh.name/javascript-debounce-function\n **/\nexport default (func, wait, immediate) => {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n};\n/* eslint-enable */\n","/* eslint-disable max-lines */\nimport scale from './utils/scale.js';\nimport Logger from './Logger.js';\nimport debounce from './utils/debounce.js';\n\nimport {\n isVBGStream,\n getVbgTracks,\n getScreenPresentationTracks,\n getCameraTracks,\n getCanvasTracks,\n stopStream\n} from './utils/StreamHelpers';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst FPS = 15;\nconst FPS_INTERVAL = 1000 / FPS;\nconst CAMERA_SMALL = { width: 220, height: 140 };\nconst CAMERA_MEDIUM = { width: 320, height: 240 };\nconst CAMERA_LARGE = { width: 420, height: 340 };\nconst CAMERA_NONE = { width: 0, height: 0 };\n\nconst supportsTrackProcessor =\n typeof window.MediaStreamTrackProcessor === 'function';\n\nconst defaultTrack = {\n getSettings: () => ({ width: 0, height: 0 }),\n addEventListener: () => null\n};\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\n// Note:\n// autoplay elements will stop playing in safari if not in viewport:\n// https://webkit.org/blog/6784/new-video-policies-for-ios/\n// that's the reason why we don't set autoplay\n// video.setAttribute('autoplay', '1');\n// but instead `.play` manually.\n// eslint-disable-next-line max-statements\nconst bindVideoToStream = stream => {\n const [track] = stream.getVideoTracks();\n if (!track) {\n return null;\n }\n if (supportsTrackProcessor) {\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n return processor.readable.getReader();\n }\n const { width, height } = track.getSettings();\n const video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = stream;\n track.addEventListener('stopped', () => {\n video.srcObject = null;\n });\n video\n .play()\n .catch(error =>\n Logger.warn('bindVideoToStream: play', error, error.message)\n );\n return video;\n};\n\n/* eslint-disable max-statements, id-length */\nconst fitImage = (target, source) => {\n const sourceAspectRatio = source.width / source.height;\n const targetAspectRatio = target.width / target.height;\n\n let { width, height } = target;\n let x = 0;\n let y = 0;\n\n // Image's aspect ratio is less than target's we fit on height\n // and place the image centrally along width\n if (sourceAspectRatio < targetAspectRatio) {\n width = source.width * (height / source.height);\n x = (target.width - width) / 2;\n }\n // Image's aspect ratio is greater than target's we fit on width\n // and place the image centrally along height\n if (sourceAspectRatio > targetAspectRatio) {\n height = source.height * (width / source.width);\n y = (target.height - height) / 2;\n }\n\n return { x: x, y: y, width: width, height: height };\n};\n/* eslint-enable max-statements */\n\nconst initIOSSettings = mixer => {\n // neccessary to run calcSizesAndPositions and draw functions\n // without camera\n mixer.cameraStream = { getVideoTracks: () => [] };\n mixer.screenStream = { getVideoTracks: () => [] };\n};\n\nconst getCanvasCaptureTrackCanvas = stream => {\n if (stream && stream.getVideoTracks().length > 0) {\n const [track] = stream.getVideoTracks();\n if ('canvas' in track) {\n return track.canvas;\n }\n }\n return null;\n};\n\nclass CanvasMixer {\n /* eslint-disable max-statements */\n constructor(canvas, stream) {\n this.canvas = canvas;\n this.stream = stream;\n this.camera = null;\n this.screen = null;\n this.canvasTrack = null;\n this.context = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true\n });\n this.xPos = 0;\n this.camSize = CAMERA_MEDIUM;\n this.isCanvasCapture = false;\n\n this.draw = this.draw.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onError = this.onError.bind(this);\n this.onRedraw = this.onRedraw.bind(this);\n this.setStream = this.setStream.bind(this);\n this.setCamera = this.setCamera.bind(this);\n this.drawFrame = this.drawFrame.bind(this);\n this.calcSizesAndPositions = this.calcSizesAndPositions.bind(this);\n\n this.bouncedDraw = debounce(this.draw, FPS_INTERVAL);\n }\n /* eslint-enable max-statements */\n\n onError(errorCallback) {\n this.errorCallback = errorCallback;\n }\n\n onRedraw(redrawCallback) {\n this.redrawCallback = redrawCallback;\n }\n\n // eslint-disable-next-line max-statements\n start() {\n const [canvasTrack] = getCanvasTracks(this.stream);\n this.canvasTrack = canvasTrack;\n if (isIOSDevice) {\n initIOSSettings(this);\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'none');\n } else {\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'medium');\n this.setStream(this.stream);\n }\n this.draw();\n }\n\n stop() {\n if (this.stream) {\n stopStream(this.stream);\n this.stream = null;\n this.camera = null;\n this.screen = null;\n this.screenStream = null;\n this.cameraStream = null;\n this.canvasTrack = null;\n }\n }\n\n // eslint-disable-next-line max-statements\n setStream(newStream) {\n this.stream = newStream;\n this.cameraStream = new MediaStream(\n isVBGStream(newStream)\n ? getVbgTracks(newStream)\n : getCameraTracks(newStream)\n );\n this.screenStream = new MediaStream(\n getScreenPresentationTracks(this.stream)\n );\n const originalCanvas = getCanvasCaptureTrackCanvas(this.cameraStream);\n if (originalCanvas) {\n this.isCanvasCapture = true;\n this.camera = originalCanvas;\n } else {\n this.isCanvasCapture = false;\n this.camera = bindVideoToStream(this.cameraStream);\n }\n this.screen = bindVideoToStream(this.screenStream);\n this.calcSizesAndPositions();\n this.redrawQueued = true;\n }\n\n setCamera(position, size) {\n this.cameraPosition = position || this.cameraPosition;\n this.cameraSizeInWords = size || this.cameraSizeInWords;\n this.redrawQueued = true;\n }\n\n calcSizesAndPositions() {\n // Fetch the latest settings (width and height) from the track directly,\n // otherwise resized windows won't be positioned/scaled correctly...\n const [screenTrack = defaultTrack] = this.screenStream.getVideoTracks();\n const screenStreamSettings = screenTrack.getSettings();\n const fitScreen = fitImage(this.canvas, screenStreamSettings);\n const [cameraTrack = defaultTrack] = this.cameraStream.getVideoTracks();\n const cameraTrackSettings = cameraTrack.getSettings();\n\n this.camSize = {\n small: CAMERA_SMALL,\n medium: CAMERA_MEDIUM,\n large: CAMERA_LARGE,\n none: CAMERA_NONE\n }[this.cameraSizeInWords];\n\n const scaledCam = scale(\n cameraTrackSettings.width,\n cameraTrackSettings.height,\n this.camSize\n );\n\n this.sizes = {\n screen: { width: fitScreen.width, height: fitScreen.height },\n camera: { width: scaledCam.width, height: scaledCam.height }\n };\n /* eslint-disable id-length, camelcase */\n const camPosition = {\n x:\n this.cameraPosition.horizontal === 'right'\n ? this.canvas.width - this.sizes.camera.width\n : 0,\n y:\n this.cameraPosition.vertical === 'bottom'\n ? this.canvas.height - this.sizes.camera.height\n : 0\n };\n this.positions = {\n screen: { x: fitScreen.x, y: fitScreen.y },\n camera: { x: camPosition.x, y: camPosition.y }\n };\n /* eslint-enable id-length */\n }\n\n /* eslint-disable max-statements */\n async draw() {\n try {\n if (!this.stream || !this.stream.active) {\n return;\n }\n\n // Doing this on every draw due to resizeable windows while screensharing\n this.calcSizesAndPositions();\n\n // In case we need to report back a redraw - doc/image can re-render\n if (this.redrawCallback && this.redrawQueued) {\n this.redrawCallback();\n this.redrawQueued = false;\n }\n\n // Actual drawing code\n const t0 = performance.now();\n if (this.screen) {\n let screenFrame = this.screen;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.screen instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.screen.read();\n screenFrame = result.value;\n }\n this.drawFrame(\n screenFrame,\n this.positions.screen,\n this.sizes.screen,\n false,\n true\n );\n }\n let cameraFrame = this.camera;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.camera instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.camera.read();\n cameraFrame = result.value;\n }\n this.drawFrame(\n cameraFrame,\n this.positions.camera,\n this.sizes.camera,\n this.isCanvasCapture,\n false\n );\n const t1 = performance.now();\n if (t1 - t0 >= FPS_INTERVAL) {\n Logger.warn(`Mixer::drawFrame took ${t1 - t0}ms.`);\n }\n\n // Request a frame so remote end receives updates reliably\n try {\n if (this.canvasTrack) {\n this.canvasTrack.requestFrame();\n }\n } catch (error) {\n Logger.warn(`CanvasMixer draw requestFrame error - ${error.message}`);\n }\n\n // Request another draw if the stream is still active\n this.bouncedDraw();\n } catch (error) {\n Logger.error(error);\n this.errorCallback(error);\n }\n }\n /* eslint-enable max-statements */\n\n // eslint-disable-next-line max-statements\n drawFrame(video, pos, size, isCanvasCapture, isScreenStream) {\n // Pollute the canvas even if we don't have a stream, so we force a frame\n // update.\n const { context, canvas } = this;\n if (\n !video ||\n (!isCanvasCapture &&\n video instanceof HTMLVideoElement &&\n (!video.srcObject || !video.srcObject.active))\n ) {\n const imgData = context.createImageData(1, 1);\n context.putImageData(imgData, 0, 0);\n return;\n }\n\n // Clear prev drawn frames only for screen streams, otherwise old frames\n // show up if the window is resized (smaller).\n if (isScreenStream && !isCanvasCapture) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n context.drawImage(video, pos.x, pos.y, size.width, size.height);\n if (supportsTrackProcessor && typeof video.close === 'function') {\n video.close();\n }\n }\n}\n\nexport default CanvasMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport CanvasMixer from '../CanvasMixer.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport {\n getScreenPresentationTracks,\n stopTrack\n} from '../utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from '../VirtualBackgroundMixer.js';\nimport DeviceManager from '../DeviceManager.js';\n\nclass StartMixerEvent extends BaseEvent {\n handle({\n audio,\n video,\n canvas,\n screen = false,\n surface,\n onRedraw,\n changeStream = false,\n present = 'mixer'\n }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n // if (_session.micMixer) {\n // _session.micMixer.destroy();\n // _session.micMixer = null;\n // }\n const vbgType = DeviceManager.getStoredVirtualBackgroundType();\n const vbgMixer = new VirtualBackgroundMixer('canvasmixer');\n vbgMixer.changeBackground(vbgType);\n\n const onError = error => {\n Logger.error('StartMixerEvent', error);\n if (!_session.canvasMixer && vbgMixer) {\n vbgMixer.terminate();\n }\n if (!error.name.match(/notallowed|permission/i) && screen) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n screen: screen,\n surface: surface,\n canvas: canvas,\n existingStream: _session.localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n stopTrack(screenTrack);\n });\n }\n _session.canvasMixer = new CanvasMixer(canvas, stream);\n _session.canvasMixer.vbgMixer = vbgMixer;\n _session.canvasMixer.onError(onError);\n _session.canvasMixer.onRedraw(onRedraw);\n _session.canvasMixer.start();\n return stream;\n })\n .then(stream => {\n if (changeStream) {\n _session.emit({ type: 'start_presenting', stream, present });\n } else {\n _session.emit({ type: 'stream_update', presentationStream: stream });\n }\n })\n .catch(onError);\n }\n}\n\nclass UpdateMixerEvent extends BaseEvent {\n handle({ position, size }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n _session.canvasMixer.setCamera(position, size);\n } catch (error) {\n Logger.error(error);\n }\n }\n}\n\nexport { StartMixerEvent, UpdateMixerEvent };\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\n\nconst videoFrameSupport =\n typeof HTMLVideoElement.prototype.requestVideoFrameCallback === 'function';\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass VideoPlayer {\n // eslint-disable-next-line max-statements\n constructor({\n canvas,\n file,\n onReady,\n onDuration,\n onTimeUpdate,\n onEnd,\n performAction\n }) {\n this.ac = null;\n this.acOut = null;\n this.gainNode = null;\n this.timer = null;\n this.canvas = canvas;\n this.url = URL.createObjectURL(file);\n this.ctx = canvas.getContext('2d');\n this.video = document.createElement('video');\n this.callback = { onReady, onDuration, onTimeUpdate, onEnd, performAction };\n this.errorCallback = null;\n this.boundDrawVideoFrame = this.drawVideoFrame.bind(this);\n this.boundInitCanvasStream = this.initCanvasStream.bind(this);\n this.isPlaying = false;\n this.blockTimeUpdate = false;\n this.micOnlyStream = null;\n this.userMediaStream = null;\n this.initTimeout = null;\n this.invokationTimer = null;\n this.initVideo();\n }\n\n drawVideoFrame() {\n this.ctx.drawImage(this.video, 0, 0);\n if (videoFrameSupport) {\n this.timer = this.video.requestVideoFrameCallback(\n this.boundDrawVideoFrame\n );\n } else {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n }\n\n // eslint-disable-next-line max-statements\n initVideo() {\n const { video } = this;\n video.playsInline = true;\n video.autoplay = Boolean(isIOSDevice);\n video.preload = '';\n video.onplaying = this.onVideoPlay.bind(this);\n video.onpause = this.onVideoPause.bind(this);\n video.onseeked = this.onVideoSeeked.bind(this);\n video.ontimeupdate = this.onVideoTimeUpdate.bind(this);\n video.onloadeddata = this.onVideoReady.bind(this);\n video.onerror = this.onVideoError.bind(this);\n video.onended = this.onVideoEnd.bind(this);\n this.initTimeout = setTimeout(() => this.onVideoError(), 6000);\n video.src = this.url;\n }\n\n // eslint-disable-next-line max-statements\n onVideoReady() {\n const { video, canvas } = this;\n clearTimeout(this.initTimeout);\n this.callback.onDuration(video.duration);\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n this.ac = new (window.AudioContext || window.webkitAudioContext)();\n this.gainNode = this.ac.createGain();\n this.ac.createMediaElementSource(video).connect(this.gainNode);\n this.gainNode.connect(this.ac.destination);\n if (videoFrameSupport) {\n this.timer = video.requestVideoFrameCallback(this.boundDrawVideoFrame);\n }\n this.callback.performAction(this.onVideoAction.bind(this));\n try {\n this.ctx.drawImage(video, 0, 0);\n } catch (error) {\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return;\n }\n this.callback.onReady();\n if (video.autoplay) {\n setTimeout(() => {\n video.pause();\n video.currentTime = 0;\n });\n }\n }\n\n onVideoAction(type, value) {\n if (type === 'play') {\n return this.onPlayAction();\n } else if (type === 'pause') {\n return this.onPauseAction();\n } else if (type === 'time') {\n this.onTimeAction(value);\n } else if (type === 'volume') {\n this.onVolumeAction(value);\n }\n return Promise.resolve();\n }\n\n onPlayAction() {\n const { video } = this;\n if (video.paused && !this.isPlaying) {\n return video.play().then(\n () => video.paused,\n () => video.paused\n );\n }\n return Promise.resolve(video.paused);\n }\n\n onPauseAction() {\n const { video } = this;\n if (!video.paused && this.isPlaying) {\n video.pause();\n }\n return Promise.resolve(video.paused);\n }\n\n onTimeAction(time) {\n const { video } = this;\n this.blockTimeUpdate = true;\n if (time >= video.duration) {\n video.currentTime = video.duration - 0.1;\n } else {\n video.currentTime = time;\n }\n this.blockTimeUpdate = false;\n }\n\n onVolumeAction(volume) {\n if (this.gainNode) {\n this.gainNode.gain.value = volume;\n }\n }\n\n onVideoPlay() {\n this.isPlaying = true;\n if (!videoFrameSupport) {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n }\n\n onVideoPause() {\n // also triggered on onended\n this.isPlaying = false;\n if (!videoFrameSupport && this.timer) {\n cancelAnimationFrame(this.timer);\n }\n }\n\n onVideoSeeked() {\n if (!videoFrameSupport && !this.isPlaying) {\n this.ctx.drawImage(this.video, 0, 0);\n }\n }\n\n onVideoTimeUpdate() {\n if (!this.blockTimeUpdate) {\n this.callback.onTimeUpdate(this.video.currentTime);\n }\n }\n\n onVideoError() {\n const { video } = this;\n const error =\n video && video.error ? video.error : new TypeError('VideoPlayer failed');\n Logger.error('VideoPlayer failed', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n }\n\n onVideoEnd() {\n this.callback.onEnd();\n }\n\n initCanvasStream() {\n this.ctx.drawImage(this.video, 0, 0);\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n\n // eslint-disable-next-line max-statements\n invokeStream(userMediaStream) {\n const canvasStream = this.canvas.captureStream(25);\n const [canvasStreamTrack] = canvasStream.getVideoTracks();\n // Firefox issue, track is no CanvasCaptureMediaStreamTrack\n if (!canvasStreamTrack.canvas) {\n canvasStreamTrack.type = 'canvas-track';\n canvasStreamTrack.canvas = this.canvas;\n }\n const outStream = new MediaStream([canvasStreamTrack]);\n this.acOut = this.ac.createMediaStreamDestination();\n this.gainNode.connect(this.acOut);\n this.ac.createMediaStreamSource(userMediaStream).connect(this.acOut);\n this.acOut.stream\n .getAudioTracks()\n .forEach(track => outStream.addTrack(track));\n this.userMediaStream = userMediaStream;\n this.micOnlyStream = new MediaStream(\n userMediaStream.getAudioTracks().concat(canvasStreamTrack)\n );\n if (!this.isPlaying) {\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n return outStream;\n }\n\n isStreaming() {\n return Boolean(this.micOnlyStream);\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { video } = this;\n clearTimeout(this.initTimeout);\n if (this.url) {\n URL.revokeObjectURL(this.url);\n this.url = null;\n }\n if (this.timer) {\n if (videoFrameSupport) {\n video.cancelVideoFrameCallback(this.timer);\n } else {\n cancelAnimationFrame(this.timer);\n }\n this.timer = null;\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n if (this.userMediaStream) {\n stopStream(this.userMediaStream);\n this.userMediaStream = null;\n }\n if (this.micOnlyStream) {\n stopStream(this.micOnlyStream);\n this.micOnlyStream = null;\n }\n if (this.acOut) {\n stopStream(this.acOut.stream);\n this.acOut = null;\n }\n if (this.ac) {\n this.gainNode.disconnect();\n this.ac.close().then(() => {\n this.ac = null;\n this.gainNode = null;\n });\n }\n if (video) {\n video.pause();\n video.onplaying = null;\n video.onpause = null;\n video.ontimeupdate = null;\n video.onloadeddata = null;\n video.onseeked = null;\n video.onerror = null;\n video.onended = null;\n this.video = null;\n }\n this.callback = null;\n this.errorCallback = null;\n this.ctx = null;\n this.canvas = null;\n this.boundDrawVideoFrame = null;\n }\n}\n\nexport default VideoPlayer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport VideoPlayer from '../VideoPlayer.js';\n\nclass StartMediaEvent extends BaseEvent {\n handle(message) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const onError = error => {\n Logger.error('StartMediaEvent', error);\n const name =\n error && (error instanceof MediaError || error instanceof DOMException)\n ? 'error_VideoError'\n : 'error_TypeError';\n _session.emit({ type: 'warning', name: name });\n _session.emit({ type: 'stop_presenting' });\n };\n\n try {\n _session.videoPlayer = new VideoPlayer(message);\n _session.videoPlayer.onError(onError);\n } catch (error) {\n onError(error);\n }\n }\n}\n\nexport { StartMediaEvent };\n","import BaseEvent from './BaseEvent.js';\n\nclass LockMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.lockMeeting();\n }\n}\n\nexport default LockMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass TerminateMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.terminateMeeting();\n }\n}\n\nexport default TerminateMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass KickUserEvent extends BaseEvent {\n handle(msg) {\n this.context._api.kickUser(msg.userId);\n }\n}\n\nexport default KickUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass VirtualBackgroundEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n if (msg.state === 'suspend') {\n _session.vbgMixer.suspend();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.suspend();\n }\n } else if (msg.state === 'resume') {\n _session.vbgMixer.resume();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.resume();\n }\n }\n }\n }\n}\n\nexport default VirtualBackgroundEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst destroySessionMicMixer = session => {\n if (session.micMixer) {\n session.micMixer.destroy();\n session.micMixer = null;\n }\n};\n\nconst getScreenErrorName = error => {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n return name;\n};\n\nclass ScreenVideoChangeEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n async handle({ surface }) {\n let screenStream = null;\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n const mediaStreamBuilder = new MediaStreamBuilder({ surface });\n screenStream = await mediaStreamBuilder.getDisplayMedia();\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n _session.emit({ type: 'warning', name: getScreenErrorName(error) });\n return;\n }\n destroySessionMicMixer(_session);\n _session.micMixer = new MicMixer();\n const options = {\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n screen: true,\n surface,\n micMixer: _session.micMixer,\n screenStream\n };\n try {\n const stream = await new MediaStreamBuilder(options).start();\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n _session.setStream(stream);\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n destroySessionMicMixer(_session);\n _session.emit({\n type: 'screen_capture_error',\n name: getScreenErrorName(error)\n });\n _session.emit({ type: 'screen_video_ended' });\n }\n }\n}\n\nexport default ScreenVideoChangeEvent;\n","import BaseEvent from './BaseEvent';\n\nclass ScreenVideoStoppedEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.emit({ type: 'screen_video_ended' });\n }\n}\n\nexport default ScreenVideoStoppedEvent;\n","import FeatureDetector from './FeatureDetector.js';\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass DeviceMonitor {\n constructor() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n this.audioTrack = null;\n this.videoTrack = null;\n this.audioEnded = null;\n this.videoEnded = null;\n this.boundOnAudioEnd = this.onAudioEnd.bind(this);\n this.boundOnVideoEnd = this.onVideoEnd.bind(this);\n this.listeners = [];\n }\n\n addAudioTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempAudioTrack = track;\n }\n }\n\n addVideoTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempVideoTrack = track;\n }\n }\n\n applyTempTracks() {\n this.clearTracks();\n if (this.tempAudioTrack) {\n this.audioTrack = this.tempAudioTrack;\n this.tempAudioTrack = null;\n this.audioTrack.addEventListener('ended', this.boundOnAudioEnd);\n }\n if (this.tempVideoTrack) {\n this.videoTrack = this.tempVideoTrack;\n this.tempVideoTrack = null;\n this.videoTrack.addEventListener('ended', this.boundOnVideoEnd);\n }\n }\n\n discardTempTracks() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n }\n\n onAudioEnd() {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n return;\n }\n this.audioEnded = setTimeout(() => {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n } else {\n this.emit({ type: 'audio_device_ended' });\n }\n }, 1000);\n }\n\n onVideoEnd() {\n this.videoEnded = setTimeout(() => {\n if (!this.audioEnded) {\n this.emit({ type: 'video_device_ended' });\n }\n }, 1000);\n }\n\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n clearTracks() {\n clearTimeout(this.audioEnded);\n clearTimeout(this.videoEnded);\n if (this.audioTrack) {\n this.audioTrack.removeEventListener('ended', this.boundOnAudioEnd);\n this.audioTrack = null;\n }\n if (this.videoTrack) {\n this.videoTrack.removeEventListener('ended', this.boundOnVideoEnd);\n this.videoTrack = null;\n }\n this.audioEnded = null;\n this.videoEnded = null;\n }\n\n destroy() {\n this.listeners.length = 0;\n this.discardTempTracks();\n this.clearTracks();\n }\n}\n\nexport default DeviceMonitor;\n","import FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport eyesonOptions from './options.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceManager from './DeviceManager.js';\nimport DeviceMonitor from './DeviceMonitor.js';\n\nclass PipCam {\n constructor(session) {\n this.video = null;\n this.stream = null;\n this.canvasStream = null;\n this.vbgMixer = null;\n this.deviceMonitor = null;\n this.session = session;\n this.isActive = false;\n this.startTimer = null;\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n const { session } = this;\n if (!FeatureDetector.hasPipCamSupport()) {\n session.emit({ type: 'pip_cam_warning_unsupported' });\n return;\n }\n try {\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n this.initFakeStream();\n await this.initVideoAndPip();\n await this.initCamera();\n clearTimeout(this.startTimer);\n this.isActive = true;\n session.emit({ type: 'pip_cam', active: true });\n } catch (error) {\n this.onError(error);\n }\n }\n\n onError(error) {\n const { session } = this;\n clearTimeout(this.startTimer);\n Logger.error('PipCam error', error);\n if (session) {\n session.emit({ type: 'pip_cam_error' });\n session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateCamera() {\n if (!this.isActive) {\n return;\n }\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n try {\n video.srcObject = canvasStream;\n await video.play();\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n await this.initCamera();\n clearTimeout(this.startTimer);\n } catch (error) {\n this.onError(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n initFakeStream() {\n const { widescreen } = eyesonOptions;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d', { alpha: false });\n canvas.width = 640;\n canvas.height = widescreen ? 360 : 480;\n ctx.fillStyle = '#404040';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n // https://aydos.com/svgedit/\n const path = new Path2D(\n widescreen\n ? 'M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n : 'M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n );\n ctx.fillStyle = '#212121';\n ctx.fill(path);\n this.canvasStream = canvas.captureStream();\n }\n\n async initVideoAndPip() {\n const video = document.createElement('video');\n this.video = video;\n video.muted = true;\n video.playsInline = true;\n video.onleavepictureinpicture = () => this.onExitPip();\n video.onpause = ({ target }) => this.onVideoPause(target);\n video.srcObject = this.canvasStream;\n await video.play();\n await video.requestPictureInPicture();\n }\n\n // eslint-disable-next-line max-statements\n async initCamera() {\n const { virtualBackground } = this.session.options;\n if (virtualBackground) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer('PipCam');\n this.vbgMixer.changeBackground(type);\n }\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(event => this.onDeviceEvent(event));\n\n const options = {\n audio: false,\n video: true,\n virtualBackground: virtualBackground,\n vbgMixer: this.vbgMixer,\n deviceMonitor: this.deviceMonitor\n };\n this.stream = await new MediaStreamBuilder(options).start();\n this.video.srcObject = this.stream;\n await this.video.play();\n }\n\n onExitPip() {\n if (this.session) {\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n onVideoPause(video) {\n // eslint-disable-next-line no-empty-function\n setTimeout(() => video.play().catch(() => {}));\n }\n\n onDeviceEvent({ type }) {\n if (type.endsWith('_ended')) {\n clearTimeout(this.startTimer);\n if (this.session) {\n this.session.emit({ type: 'pip_cam_warning_video_ended' });\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n }\n\n // eslint-disable-next-line max-statements\n async stop() {\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n clearTimeout(this.startTimer);\n if (video) {\n video.onpause = null;\n video.onleavepictureinpicture = null;\n if (document.pictureInPictureElement === video) {\n try {\n await document.exitPictureInPicture();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n video.srcObject = null;\n this.video = null;\n }\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n if (canvasStream) {\n stopStream(canvasStream);\n this.canvasStream = null;\n }\n if (this.isActive) {\n if (this.session) {\n this.session.emit({ type: 'pip_cam', active: false });\n }\n this.isActive = false;\n }\n }\n\n async destroy() {\n await this.stop();\n this.session = null;\n }\n}\n\nexport default PipCam;\n","import BaseEvent from './BaseEvent.js';\nimport PipCam from '../PipCam.js';\n\nclass StartPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: _session.pipCam.isActive });\n return;\n }\n _session.pipCam = new PipCam(_session);\n _session.pipCam.start();\n }\n}\n\nclass StopPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (!_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: false });\n return;\n }\n _session.pipCam.destroy();\n _session.pipCam = null;\n }\n}\n\nclass UpdatePipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.pipCam.updateCamera();\n }\n }\n}\n\nexport { StartPipCamEvent, StopPipCamEvent, UpdatePipCamEvent };\n","import PublicEvent from './PublicEvent.js';\nimport ChangeStreamEvent from './ChangeStreamEvent.js';\nimport { hasAudio, hasVideo } from '../utils/StreamHelpers.js';\nimport Logger from '../Logger.js';\nimport DeviceManager from '../DeviceManager.js';\nimport LocalStorage from '../LocalStorage.js';\nimport FeatureDetector from '../FeatureDetector.js';\n\nclass AudioDeviceEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n const video = hasVideo(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AudioDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass VideoDeviceEndEvent extends PublicEvent {\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n } catch (error) {\n Logger.error('VideoDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass AllDevicesEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AllDevicesEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nexport { AudioDeviceEndEvent, VideoDeviceEndEvent, AllDevicesEndEvent };\n","import Logger from './Logger.js';\n\nimport {\n StopPlaybackEvent,\n StartPlaybackEvent\n} from './events/PlaybackEvents.js';\n\nimport {\n StartAnnotationEvent,\n StopAnnotationEvent\n} from './events/AnnotationEvents.js';\n\nimport StfuEvent from './events/StfuEvent.js';\nimport IgnoreEvent from './events/IgnoreEvent.js';\nimport PublicEvent from './events/PublicEvent.js';\nimport PodiumEvent from './events/PodiumEvent.js';\nimport ForwardEvent from './events/ForwardEvent.js';\nimport SnapshotEvent from './events/SnapshotEvent.js';\nimport SetLayerEvent from './events/SetLayerEvent.js';\nimport SendChatEvent from './events/SendChatEvent.js';\nimport StopRtmpEvent from './events/StopRtmpEvent.js';\nimport SetLayoutEvent from './events/SetLayoutEvent.js';\nimport StartRtmpEvent from './events/StartRtmpEvent.js';\nimport RoomReceivedEvent from './events/RoomReceivedEvent.js';\nimport FetchRoomEvent from './events/FetchRoomEvent.js';\nimport DeleteFileEvent from './events/DeleteFileEvent.js';\nimport UploadFileEvent from './events/UploadFileEvent.js';\nimport ReceiveChatEvent from './events/ReceiveChatEvent.js';\nimport StartStreamEvent from './events/StartStreamEvent.js';\nimport ChangeStreamEvent from './events/ChangeStreamEvent.js';\nimport ReplaceStreamEvent from './events/ReplaceStreamEvent.js';\nimport ToggleCameraEvent from './events/ToggleCameraEvent.js';\nimport AcceptSessionEvent from './events/AcceptSessionEvent.js';\nimport StopRecordingEvent from './events/StopRecordingEvent.js';\nimport VoiceActivityEvent from './events/VoiceActivityEvent.js';\nimport StartRecordingEvent from './events/StartRecordingEvent.js';\nimport StartScreenCaptureEvent from './events/ScreenCaptureEvent.js';\nimport StartPresentingEvent from './events/StartPresentingEvent.js';\nimport StopPresentingEvent from './events/StopPresentingEvent.js';\nimport StopBroadcastsEvent from './events/StopBroadcastsEvent.js';\nimport ClearFrontLayerEvent from './events/ClearFrontLayerEvent.js';\nimport RequestGuestUserEvent from './events/RequestGuestUserEvent.js';\nimport SessionTerminationEvent from './events/SessionTerminationEvent.js';\nimport ParticipantListUpdateEvent from './events/ParticipantListUpdateEvent.js';\nimport { StartMixerEvent, UpdateMixerEvent } from './events/MixerEvents.js';\nimport { StartMediaEvent } from './events/MediaEvents.js';\nimport LockMeetingEvent from './events/LockMeetingEvent.js';\nimport TerminateMeetingEvent from './events/TerminateMeetingEvent.js';\nimport KickUserEvent from './events/KickUserEvent.js';\nimport VirtualBackgroundEvent from './events/VirtualBackgroundEvent.js';\nimport ScreenVideoChangeEvent from './events/ScreenVideoChangeEvent.js';\nimport ScreenVideoStoppedEvent from './events/ScreenVideoStoppedEvent.js';\nimport {\n StartPipCamEvent,\n StopPipCamEvent,\n UpdatePipCamEvent\n} from './events/PipCamEvents.js';\nimport {\n AudioDeviceEndEvent,\n VideoDeviceEndEvent,\n AllDevicesEndEvent\n} from './events/DeviceEndEvents.js';\n\n/**\n * Event Handler uses the connection credentials for the room and\n * the user to setup a (monitored) connection, start a session and\n * listen for any events.\n **/\nclass EventHandler {\n constructor() {\n this.listeners = [];\n this._eyeson = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n\n this.send = this.send.bind(this);\n }\n\n /* eslint-disable max-statements */\n destroy() {\n if (this._monitor) {\n this._monitor.destroy();\n }\n if (this._connection) {\n this._connection.close();\n }\n if (this._rtConnection) {\n this._rtConnection.close();\n }\n if (this._session) {\n if (this._session.vbgMixer) {\n this._session.vbgMixer.stopOriginalStream();\n this._session.vbgMixer.terminate();\n this._session.vbgMixer.destroy();\n }\n this._session.end();\n }\n this._api = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n }\n /* eslint-enable max-statements */\n\n set connection(con) {\n if (this._connection) {\n Logger.error(\n 'A connection is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._connection = con;\n this._connection.onMessage(this.send);\n }\n\n get connection() {\n return null;\n }\n\n set rtConnection(con) {\n if (this._rtConnection) {\n Logger.error(\n 'A real-time connection is already set. If you are trying to start' +\n ' a new session you have the close the current before.'\n );\n return;\n }\n this._rtConnection = con;\n this._rtConnection.onMessage(this.send);\n }\n\n get rtConnection() {\n return null;\n }\n\n set monitor(mon) {\n if (this._monitor) {\n Logger.error(\n 'A monitor is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._monitor = mon;\n this._monitor.onEvent(this.send);\n }\n\n get monitor() {\n return this._monitor;\n }\n\n set session(ses) {\n if (this._session) {\n Logger.error(\n 'A session is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._session = ses;\n this._session.onEvent(this.send);\n }\n\n get session() {\n return null;\n }\n\n set api(api) {\n this._api = api;\n }\n\n get api() {\n return null;\n }\n\n set rtData(data) {\n this._rtData = data;\n }\n\n get rtData() {\n return null;\n }\n\n set eyeson(eyeson) {\n this._eyeson = eyeson;\n }\n\n get eyeson() {\n return null;\n }\n\n /**\n * Register a new listener.\n **/\n onReceive(callback) {\n Logger.debug('EventHandler::onReceive');\n this.listeners.push(callback);\n }\n\n /**\n * Unregisters a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n /* eslint-disable camelcase */\n send(msg) {\n if (!msg.silenced) {\n Logger.debug('EventHandler::send', msg);\n }\n new ({\n stfu: ForwardEvent,\n chat: ReceiveChatEvent,\n accept: AcceptSessionEvent,\n podium: PodiumEvent,\n snapshot: SnapshotEvent,\n send_chat: SendChatEvent,\n set_layer: SetLayerEvent,\n set_layout: SetLayoutEvent,\n fetch_room: FetchRoomEvent,\n room_ready: RoomReceivedEvent,\n room_setup: RoomReceivedEvent,\n memberlist: ParticipantListUpdateEvent,\n upload_file: UploadFileEvent,\n delete_file: DeleteFileEvent,\n request_stfu: StfuEvent,\n change_stream: ChangeStreamEvent,\n replace_stream: ReplaceStreamEvent,\n toggle_camera: ToggleCameraEvent,\n stop_playback: StopPlaybackEvent,\n playback_update: ForwardEvent,\n start_playback: StartPlaybackEvent,\n start_stream: StartStreamEvent,\n stop_recording: StopRecordingEvent,\n start_screen_capture: StartScreenCaptureEvent,\n stop_broadcasts: StopBroadcastsEvent,\n start_recording: StartRecordingEvent,\n stop_presenting: StopPresentingEvent,\n start_presenting: StartPresentingEvent,\n stop_annotation: StopAnnotationEvent,\n start_annotation: StartAnnotationEvent,\n clear_front_layer: ClearFrontLayerEvent,\n request_guest_user: RequestGuestUserEvent,\n voice_activity_raw: VoiceActivityEvent,\n start_mixer: StartMixerEvent,\n update_mixer: UpdateMixerEvent,\n lock_meeting: LockMeetingEvent,\n terminate_meeting: TerminateMeetingEvent,\n kick_user: KickUserEvent,\n session_termination: SessionTerminationEvent,\n start_media: StartMediaEvent,\n change_screen_video: ScreenVideoChangeEvent,\n stop_screen_video: ScreenVideoStoppedEvent,\n stop_rtmp: StopRtmpEvent,\n start_rtmp: StartRtmpEvent,\n suspend_virtual_background: VirtualBackgroundEvent,\n audio_device_ended: AudioDeviceEndEvent,\n video_device_ended: VideoDeviceEndEvent,\n all_devices_ended: AllDevicesEndEvent,\n start_pip_cam: StartPipCamEvent,\n stop_pip_cam: StopPipCamEvent,\n update_pip_cam: UpdatePipCamEvent,\n\n capture_error: ForwardEvent,\n voice_activity: ForwardEvent,\n options_update: ForwardEvent,\n ext_not_installed: ForwardEvent,\n broadcasts_update: ForwardEvent,\n presentation_ended: ForwardEvent,\n\n recording: IgnoreEvent,\n ext_cancel: IgnoreEvent,\n ext_installed: IgnoreEvent,\n message_status: IgnoreEvent,\n moderator_info: IgnoreEvent\n }[msg.type] || PublicEvent)(this).handle(msg);\n }\n /* eslint-enable camelcase */\n}\n\nexport default EventHandler;\n","import FeatureDetector from './FeatureDetector.js';\n\n/**\n * Add 'Visoweb' identifier to origin field of sdp. Believe this is still\n * relevant for some remotes.\n **/\nconst addOriginToSDP = sdp => {\n return sdp.replace('o=-', 'o=Visoweb');\n};\n\n/**\n * Add session attribute to disable sfu mode from the client.\n **/\n// eslint-disable-next-line max-statements\nconst addSessionAttributes = sdp => {\n // double check config.allowSafariSFU on runtime\n const splitSDP = sdp.split('\\r\\n');\n const tLineIdx = splitSDP.findIndex(line => line.startsWith('t='));\n let addIndex = 1;\n if (FeatureDetector.canSFU()) {\n // insert sfuLine after tLine (timing), delete 0 elements\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=sfu-capable');\n addIndex++;\n if (FeatureDetector.disallowAudioSyncSrcChange()) {\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=disallow-audio-ssrc-change');\n addIndex++;\n }\n }\n if (FeatureDetector.canDataChannel()) {\n splitSDP.splice(\n tLineIdx + addIndex,\n 0,\n 'a=eyeson-datachan-capable',\n 'a=eyeson-datachan-keepalive',\n 'a=eyeson-sepp-messaging'\n );\n }\n return splitSDP.join('\\r\\n');\n};\n\n// eslint-disable-next-line max-statements\nconst addStereo = sdp => {\n const stereo = FeatureDetector.canStereo();\n const codecMatch = sdp.match(/^a=rtpmap:(\\d+) opus/m);\n if (codecMatch) {\n const fmtpRegExp = new RegExp(`^a=fmtp:${codecMatch[1]} (.+)$`, 'm');\n const fmtpMatch = sdp.match(fmtpRegExp);\n if (fmtpMatch) {\n const options = {};\n fmtpMatch[1].split(';').forEach(entry => {\n const [key, value] = entry.split('=');\n options[key] = value;\n });\n options['stereo'] = stereo ? '1' : '0';\n // options['sprop-stereo'] = '1';\n const result = Object.entries(options)\n .map(([key, value]) => `${key}=${value}`)\n .join(';');\n return sdp.replace(fmtpRegExp, `a=fmtp:${codecMatch[1]} ${result}`);\n }\n }\n return sdp;\n};\n\nconst sendOnly = sdp => {\n const lines = sdp.split('\\r\\n');\n let doIt = false;\n lines.forEach((line, row) => {\n if (line.startsWith('m=audio') || line.startsWith('m=video')) {\n doIt = true;\n } else if (line.startsWith('m=application')) {\n doIt = false;\n } else if (line === 'a=sendrecv' && doIt) {\n lines[row] = 'a=sendonly';\n }\n });\n return lines.join('\\r\\n');\n};\n\nconst getModifiers = options => {\n const modifiers = {\n active: [addStereo],\n passive: [addOriginToSDP, addSessionAttributes]\n };\n if (options.sendOnly === true) {\n modifiers.active.push(sendOnly);\n }\n return modifiers;\n};\n\nexport { getModifiers };\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport { getModifiers } from './SDPModifiers.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceMonitor from './DeviceMonitor.js';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Conference Session is starting a session from active connection,\n * delegating events to registered listeners.\n **/\nclass ConferenceSession {\n /* eslint-disable max-statements */\n constructor(connection, comApi, options = {}) {\n this.options = options;\n this.options.RTCConstraints = Object.assign(\n {},\n this.defaultRTCConstraints,\n { offerToReceiveVideo: !this.options.eco }\n );\n this.accepted = false;\n this.listeners = [];\n this.restarting = false;\n this.connection = connection;\n this.comApi = comApi;\n this.sipSession = null;\n this.startAttempts = 0;\n this.maxStartAttempts = 3;\n this.tryAuthUpdate = true;\n this.tryResume = true;\n this.tryWaitResume = true;\n this.resumeTimer = null;\n this.waitResumeTimer = null;\n\n this.end = this.end.bind(this);\n this.emit = this.emit.bind(this);\n this.setStream = this.setStream.bind(this);\n this.endSession = this.endSession.bind(this);\n this.initSession = this.initSession.bind(this);\n this.handleFailed = this.handleFailed.bind(this);\n this.handleAccept = this.handleAccept.bind(this);\n this.handleUnmute = this.handleUnmute.bind(this);\n this.restartSession = this.restartSession.bind(this);\n this.tryRecoveryFrom = this.tryRecoveryFrom.bind(this);\n this.terminateSession = this.terminateSession.bind(this);\n this.remoteDescriptionUpdate = this.remoteDescriptionUpdate.bind(this);\n }\n /* eslint-enable max-statements */\n\n get peerConnection() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.peerConnection;\n }\n return null;\n }\n\n get localStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.localStream;\n }\n return null;\n }\n\n get remoteStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.remoteStream;\n }\n return null;\n }\n\n get defaultRTCConstraints() {\n return { offerToReceiveAudio: true, offerToReceiveVideo: true };\n }\n\n /**\n * Request stream and invoke session start.\n **/\n start() {\n if (this.options.stream) {\n this.initExternalStream();\n return;\n }\n this.initDeviceMonitor();\n this.initVirtualBackground();\n new MediaStreamBuilder(this.options)\n .start()\n .then(this.initSession)\n .catch(this.handleFailed);\n }\n\n initExternalStream() {\n const audioOnly = !hasVideo(this.options.stream) && this.options.eco;\n const stream = createExternalStream(this.options.stream, audioOnly);\n if (!stream) {\n this.handleFailed({ name: 'invalid_stream' });\n return;\n }\n this.externalStream = stream;\n this.options.audio = hasAudio(stream);\n this.options.video = hasVideo(stream);\n this.initSession(this.externalStream);\n }\n\n initVirtualBackground() {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer();\n this.vbgMixer.changeBackground(type);\n this.options.vbgMixer = this.vbgMixer;\n }\n\n initDeviceMonitor() {\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(msg => this.emit(msg));\n this.options.deviceMonitor = this.deviceMonitor;\n }\n\n buildSessionOptions(stream) {\n const { options } = this;\n if (options.sendOnly === true) {\n options.RTCConstraints = {};\n }\n return {\n stream: stream,\n sendOnly: options.sendOnly,\n SDPModifiers: getModifiers({\n sendOnly: options.sendOnly\n }),\n connection: this.connection,\n handleAccept: this.handleAccept,\n handleUnmute: this.handleUnmute,\n RTCConstraints: options.RTCConstraints,\n remoteDescriptionUpdate: this.remoteDescriptionUpdate,\n mediaOptions: { audio: options.audio, video: options.video }\n };\n }\n\n /**\n * Init session and start stream.\n **/\n // eslint-disable-next-line max-statements\n initSession(stream) {\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n const options = this.buildSessionOptions(stream);\n this.sipSession = this.connection.startSession(options);\n this.onUnmute(stream);\n this.sipSession.onEvent(event => {\n if (event.type === 'accepted') {\n this.adjustVideoPodium();\n } else if (event.type === 'resumed') {\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n } else if (event.type === 'terminated') {\n this.handleTermination(event.reason, event.code);\n }\n });\n if (this.externalStream) {\n this.connection.hasExternalStream = true;\n }\n\n if (window) {\n window.addEventListener(\n FeatureDetector.isIOSDevice() ? 'pagehide' : 'beforeunload',\n this.endSession\n );\n }\n }\n\n /**\n * End a conference session.\n **/\n end() {\n this.listeners = [];\n this.endSession();\n this.accepted = false;\n this.sipSession = null;\n this.connection = null;\n }\n\n /**\n * Before terminating the session, remove all listeners and stop all\n * streams.\n **/\n endSession() {\n Logger.debug('ConferenceSession::endSession');\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if (this.sipSession) {\n this.sipSession.removeAllListeners();\n this.terminateSession();\n }\n if (this.connection) {\n this.connection.close();\n }\n if (this.deviceMonitor) {\n this.deviceMonitor.destroy();\n }\n }\n /* eslint-enable max-statements */\n\n /**\n * Depending on the state of the session, this function may send a CANCEL\n * request, a non-2xx final response, a BYE request, or even no request at\n * all.\n * https://sipjs.com/api/0.7.0/session/#terminateoptions\n **/\n terminateSession() {\n Logger.debug('ConferenceSession::terminateSession');\n try {\n this.sipSession.terminate();\n } catch (error) {\n Logger.error(error);\n }\n }\n\n /**\n * Replace the active stream with newStream and emit 'stream_update' with the\n * new stream.\n *\n * In case of an error (as will be the case in current EDGE (May 2019))\n * report back the current streams.\n **/\n // eslint-disable-next-line max-statements\n async setStream(newStream) {\n if (!this.sipSession) {\n return null;\n }\n try {\n const { sessionDescriptionHandler } = this.sipSession;\n const streams = await sessionDescriptionHandler.setStream(newStream);\n this.stopPresentingSet = false;\n if (this.micMixer && this.micMixer.active) {\n streams.newStream = this.micMixer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n if (this.videoPlayer && this.videoPlayer.isStreaming()) {\n streams.newStream = this.videoPlayer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n this.onUnmute(streams.newStream);\n this.emit({\n type: 'stream_update',\n localStream: streams.newStream,\n stream: streams.remoteStream\n });\n return streams.newStream;\n } catch (error) {\n Logger.error('ConferenceSession::setStream', error);\n this.emit({\n type: 'stream_update',\n localStream: this.localStream,\n stream: this.remoteStream\n });\n return this.localStream;\n }\n }\n\n /**\n * Trigger local track unmuted event.\n * Used to prevent iOS issue black video after incoming call.\n */\n onUnmute(stream) {\n if (stream) {\n stream.getTracks().forEach(track => {\n track.onunmute = () =>\n this.emit({ type: 'local_track_unmuted', track: track });\n });\n }\n }\n\n /**\n * Register a session monitor.\n **/\n setMonitor(monitor) {\n this.monitor = monitor;\n }\n\n /**\n * Forward accept event, build expected message format.\n **/\n handleAccept(remoteStream) {\n if (this.monitor) {\n this.monitor.observe(this.peerConnection);\n }\n if (!this.accepted) {\n this.emit({ type: 'accept', session: this.sipSession });\n this.accepted = true;\n }\n if (remoteStream) {\n this.emit({ type: 'stream_update', stream: remoteStream });\n }\n }\n\n handleUnmute(track) {\n this.emit({ type: 'track_unmuted', track: track });\n }\n\n remoteDescriptionUpdate(sdpWrapper) {\n Logger.debug('ConferenceSession::remoteDescriptionUpdate', sdpWrapper.sdp);\n let sfu = false;\n\n const splitSDP = sdpWrapper.sdp.split('\\r\\n');\n const sfuLine = splitSDP.find(line => line.startsWith('a=sfu-mode'));\n\n if (sfuLine) {\n sfu = sfuLine.includes('on');\n }\n\n this.emit({ type: 'remote_description_update', update: { sfu: sfu } });\n }\n\n /**\n * Once we have accepted the session, we need to adjust the video podium,\n * according to the current options.\n **/\n adjustVideoPodium() {\n this.send({ type: 'mute_video', on: !this.options.video });\n }\n\n /**\n * On Termination log to debug what happened.\n **/\n // eslint-disable-next-line max-statements\n handleTermination(reason, code) {\n Logger.debug('ConfSession::handleTermination', reason, code);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if ((reason === 'bye' && code === 200) || reason === 'terminate') {\n this.handleExit();\n } else if (reason === 'disconnect') {\n if (code === -1) {\n if (this.tryAuthUpdate) {\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data =>\n this.connection.updateAuthAndRestartSession(data)\n );\n return;\n } else if (this.tryWaitResume && this.connection) {\n this.tryWaitResume = false;\n this.waitResumeTimer = setTimeout(() => {\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n }, 5000);\n this.resumeTimer = setTimeout(() => {\n this.handleFailed({ name: 503 });\n }, 15000);\n return;\n }\n this.handleFailed({ name: 503 });\n } else {\n if (this.tryResume && this.connection) {\n this.tryResume = false;\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n this.resumeTimer = setTimeout(\n () => this.handleFailed({ name: 410 }),\n 10000\n );\n return;\n }\n this.handleFailed({ name: 410 });\n }\n } else {\n this.handleFailed({ name: code });\n }\n if (!this.restarting) {\n this.emit({ type: 'session_termination' });\n }\n }\n\n /**\n * Forward exit event\n **/\n handleExit() {\n this.emit({ type: 'exit', reason: 'bye' });\n }\n\n /**\n * Forward failed event unless we attempt a recovery.\n **/\n handleFailed(reason) {\n Logger.warn('ConferenceSession::handleFailed: ', reason);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n let key = 'Desert';\n if (reason && reason.name) {\n key = reason.name;\n }\n\n if (this.tryRecoveryFrom(key)) {\n return;\n }\n\n const name =\n {\n NotFoundError: 'devices',\n NotAllowedError: 'permission',\n DevicesNotFoundError: 'devices',\n PermissionDeniedError: 'permission',\n NotReadableError: 'not_readable',\n 403: 'session_in_use',\n 410: 'abrupt_disconnect',\n 413: 'request_too_large',\n 426: 'ice_error',\n 486: 'session_in_use',\n 607: 'meeting_locked'\n }[key] || 'session_failed';\n\n this.emit({\n type: 'error',\n name: name,\n code: this.errorCodeName(key, name)\n });\n }\n\n errorCodeName(key, name) {\n if (\n [\n 'permission',\n 'devices',\n 'not_readable',\n 'meeting_locked',\n 'session_in_use',\n 'transport_error'\n ].includes(name)\n ) {\n return '';\n }\n return String(key);\n }\n\n /**\n * Conference session may recover from `failure` if a recovery for that\n * `failure` is known and its condition applies.\n **/\n tryRecoveryFrom(failure) {\n Logger.debug('ConferenceSession::tryRecoveryFrom: ', failure);\n\n const recovery = {\n 404: {\n condition: () => this.startAttempts < this.maxStartAttempts,\n action: () => this.restartSession()\n }\n }[failure];\n\n if (this.startAttempts >= this.maxStartAttempts) {\n this.restarting = false;\n return false;\n }\n\n return Boolean(recovery && recovery.condition() && recovery.action());\n }\n\n /**\n * End the previously started session, but keep already registered listeners.\n **/\n restartSession() {\n Logger.debug('ConferenceSession::restartSession: ', this.startAttempts);\n this.restarting = true;\n this.startAttempts += 1;\n\n setTimeout(() => {\n this.endSession();\n this.start();\n }, 1000);\n\n return true;\n }\n\n /**\n * Register event listeners.\n **/\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n /**\n * Transport a message over the connection.\n **/\n send(msg) {\n return this.connection.send(msg);\n }\n}\n\nexport default ConferenceSession;\n\n/* eslint-enable max-lines */\n","import Logger from '../Logger.js';\n\nconst Status = {\n NO_CONNECTION: 3,\n BAD: 2,\n OK: 1,\n GOOD: 0\n};\n\nconst calculateStatus = (\n packetLossRate = 0,\n jitter = 0,\n roundTripTime = 0,\n nackRate = 0\n) => {\n if (\n roundTripTime > 1 ||\n packetLossRate > 0.2 ||\n jitter > 0.5 ||\n nackRate > 0.2\n ) {\n return Status.BAD;\n }\n if (\n roundTripTime > 0.3 ||\n packetLossRate > 0.1 ||\n jitter > 0.3 ||\n nackRate > 0.1\n ) {\n return Status.OK;\n }\n return Status.GOOD;\n};\n\nconst getOldestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time < result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst getNewestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time > result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst addHistory = (history, entry) => {\n if (history.length < 3) {\n history.push(Object.assign({}, entry));\n return;\n }\n Object.assign(getOldestHistoryEntry(history), entry);\n};\n\n// eslint-disable-next-line max-statements\nconst getHistoryAverage = history => {\n const { length } = history;\n const result = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n bitrateSend: 0,\n bitrateRecv: 0,\n status: Status.GOOD\n };\n const newest = getNewestHistoryEntry(history);\n for (const entry of history) {\n result.jitter += entry.jitter;\n result.packetLoss += entry.packetLoss;\n result.roundTripTime += entry.roundTripTime;\n result.nack += entry.nack;\n result.bitrateSend += entry.bitrateSend;\n result.bitrateRecv += entry.bitrateRecv;\n }\n result.jitter = newest.jitter === null ? null : result.jitter / length;\n result.packetLoss =\n newest.packetLoss === null ? null : result.packetLoss / length;\n result.roundTripTime =\n newest.roundTripTime === null ? null : result.roundTripTime / length;\n result.nack = newest.nack === null ? null : result.nack / length;\n result.bitrateSend /= length;\n result.bitrateRecv /= length;\n result.status = calculateStatus(\n result.packetLoss,\n result.jitter,\n result.roundTripTime,\n result.nack\n );\n return result;\n};\n\nclass ConnectionStatistics {\n constructor() {\n this.peerConnection = null;\n this.timer = null;\n this.listeners = [];\n this.history = [];\n this.entry = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n time: 0,\n bitrateSend: 0,\n bitrateRecv: 0\n };\n this.lastStat = {\n time: null,\n bytesSent: null,\n bytesReceived: null,\n audio: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null\n },\n in: {\n packetsReceived: null\n }\n },\n video: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null,\n nackCount: null\n },\n in: {\n bytesReceived: null\n }\n }\n };\n this.boundPrintStats = this.printStats.bind(this);\n }\n\n init(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n // eslint-disable-next-line max-statements\n async printStats() {\n const { peerConnection, entry, lastStat, history } = this;\n const stats = await peerConnection.getStats();\n const now = Date.now();\n let statsCurrentRoundTripTime = null;\n Object.keys(entry).forEach(key => {\n entry[key] = 0;\n });\n entry.jitter = null;\n entry.packetLoss = null;\n entry.roundTripTime = null;\n entry.nack = null;\n entry.time = now;\n\n // eslint-disable-next-line max-statements, complexity\n stats.forEach(report => {\n if (report.type === 'inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const received = Math.max(\n report.bytesReceived - lastStat[kind].in.bytesReceived,\n 0\n );\n entry.bitrateRecv += (received * 8) / diff;\n }\n lastStat[kind].in.bytesReceived = report.bytesReceived;\n } else if (report.type === 'outbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const sent = report.bytesSent - lastStat[kind].out.bytesSent;\n entry.bitrateSend += (sent * 8) / diff;\n }\n lastStat[kind].out.bytesSent = report.bytesSent;\n } else if (report.type === 'remote-inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat[kind]) {\n const outbound = stats.get(report.localId);\n const hasRTT = typeof report.roundTripTime !== 'undefined';\n const hasJitter = typeof report.jitter !== 'undefined';\n const hasPacketLoss = typeof report.packetsLost !== 'undefined';\n const hasNackCount = typeof outbound.nackCount !== 'undefined';\n if (lastStat.time) {\n const lost = report.packetsLost - lastStat[kind].out.packetsLost;\n const packets =\n outbound.packetsSent - lastStat[kind].out.packetsSent;\n const packetLossRate = packets > 0 ? lost / packets : 0;\n entry.jitter = hasJitter\n ? Math.max(entry.jitter, packets > 0 ? report.jitter : 0)\n : null;\n entry.packetLoss = hasPacketLoss\n ? Math.max(entry.packetLoss, packetLossRate)\n : null;\n entry.roundTripTime = hasRTT\n ? Math.max(entry.roundTripTime, report.roundTripTime)\n : null;\n if (kind === 'video') {\n const nack = outbound.nackCount - lastStat[kind].out.nackCount;\n const nackRate = packets > 0 ? nack / packets : 0;\n entry.nack = hasNackCount ? Math.max(entry.nack, nackRate) : null;\n }\n }\n if (kind === 'video') {\n lastStat[kind].out.nackCount = outbound.nackCount;\n }\n lastStat[kind].out.packetsSent = outbound.packetsSent;\n lastStat[kind].out.packetsLost = report.packetsLost;\n }\n } else if (\n report.type === 'candidate-pair' &&\n report.state === 'succeeded' &&\n 'currentRoundTripTime' in report\n ) {\n statsCurrentRoundTripTime = report.currentRoundTripTime;\n }\n });\n if (entry.roundTripTime === null && statsCurrentRoundTripTime !== null) {\n entry.roundTripTime = statsCurrentRoundTripTime;\n }\n addHistory(history, entry);\n const average = getHistoryAverage(history);\n if (navigator.onLine === false) {\n average.status = Status.BAD;\n }\n if (\n ['disconnected', 'failed', 'closed'].includes(\n peerConnection.iceConnectionState\n )\n ) {\n average.status = Status.NO_CONNECTION;\n }\n this.emit(average);\n lastStat.time = now;\n }\n\n getCurrentStatistics() {\n return getHistoryAverage(this.history);\n }\n\n onUpdate(listener) {\n const { listeners, timer } = this;\n if (listeners.length === 0 && timer === null) {\n this.timer = setInterval(this.boundPrintStats, 1000);\n this.peerConnection.addEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n window.addEventListener('offline', this.boundPrintStats);\n }\n listeners.push(listener);\n }\n\n emit(statistics) {\n this.listeners.forEach(listener => {\n try {\n listener(statistics);\n } catch (err) {\n Logger.error('ConnectionStatistics::emit', err);\n }\n });\n }\n\n destroy() {\n clearInterval(this.timer);\n window.removeEventListener('offline', this.boundPrintStats);\n if (this.peerConnection) {\n this.peerConnection.removeEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n this.peerConnection = null;\n }\n this.timer = null;\n this.history.length = 0;\n this.listeners.length = 0;\n }\n}\n\nConnectionStatistics.Status = Status;\n\nexport default ConnectionStatistics;\n","import Logger from './Logger.js';\nimport ConnectionStatistics from './utils/ConnectionStatistics.js';\n/**\n * Connection Monitor informs about on and offline and ice state changes.\n * I.e. when the connection to the conf server (from a webRTC point of view)\n * is breaking up or degrading.\n **/\nclass ConnectionMonitor {\n constructor() {\n this.pc = null;\n this.statistics = new ConnectionStatistics();\n this.listeners = [];\n this.disconnectTimer = null;\n this.prevIceState = 'initial';\n this.onOffline = this.onOffline.bind(this);\n this.handleIceStateChange = this.handleIceStateChange.bind(this);\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.addEventListeners();\n }\n\n addEventListeners() {\n window.addEventListener('offline', this.onOffline);\n }\n\n onOffline() {\n this.emit({ type: 'offline' });\n }\n\n observe(peerConnection) {\n if (this.pc) {\n return;\n }\n this.pc = peerConnection;\n this.pc.oniceconnectionstatechange = this.handleIceStateChange;\n this.pc.onconnectionstatechange = this.handleConnectionStateChange;\n this.statistics.init(peerConnection);\n this.emit({ type: 'statistics_ready', statistics: this.statistics });\n }\n\n destroy() {\n const { pc, statistics } = this;\n clearTimeout(this.disconnectTimer);\n if (statistics) {\n statistics.destroy();\n this.statistics = null;\n }\n if (pc) {\n pc.onconnectionstatechange = null;\n pc.oniceconnectionstatechange = null;\n this.pc = null;\n }\n window.removeEventListener('offline', this.onOffline);\n }\n\n onEvent(listener) {\n this.listeners.push(listener);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n handleConnectionStateChange(event) {\n if (event.currentTarget) {\n Logger.warn(\n 'connectionStateChange: ',\n event.currentTarget.connectionState\n );\n }\n }\n\n /* eslint-disable max-statements */\n handleIceStateChange(event) {\n // event doesn't have a current target in EDGE\n if (!event.currentTarget) {\n return;\n }\n\n const { iceConnectionState: currentIceState } = event.currentTarget;\n\n if (currentIceState === 'disconnected') {\n this.emit({ type: 'warning', name: 'ice_disconnected' });\n // As of Chrome 76 failed is no longer emitted\n // https://bugs.chromium.org/p/chromium/issues/detail?id=982793&q=ice%20failed&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified\n //\n // We use a 2 seconds delay to re-check the connection.\n clearTimeout(this.disconnectTimer);\n this.disconnectTimer = window.setTimeout(() => {\n if (this.pc && this.pc.iceConnectionState !== 'connected') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Goldfinger' });\n }\n }, 2000);\n }\n\n if (currentIceState === 'failed') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Thunderball' });\n }\n\n if (\n this.prevIceState === 'disconnected' &&\n ['completed', 'connected'].includes(currentIceState)\n ) {\n this.emit({ type: 'clear_warning', name: 'ice_disconnected' });\n }\n\n this.prevIceState = currentIceState;\n }\n /* eslint-enable max-statements */\n}\n\nexport default ConnectionMonitor;\n","var adapters = {\n logger: self.console,\n WebSocket: self.WebSocket\n};\n\nvar logger = {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now());\n adapters.logger.log(\"[ActionCable]\", ...messages);\n }\n }\n};\n\nconst now = () => (new Date).getTime();\n\nconst secondsSince = time => (now() - time) / 1e3;\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this);\n this.connection = connection;\n this.reconnectAttempts = 0;\n }\n start() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n addEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);\n }\n }\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(\"ConnectionMonitor stopped\");\n }\n }\n isRunning() {\n return this.startedAt && !this.stoppedAt;\n }\n recordPing() {\n this.pingedAt = now();\n }\n recordConnect() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n logger.log(\"ConnectionMonitor recorded connect\");\n }\n recordDisconnect() {\n this.disconnectedAt = now();\n logger.log(\"ConnectionMonitor recorded disconnect\");\n }\n startPolling() {\n this.stopPolling();\n this.poll();\n }\n stopPolling() {\n clearTimeout(this.pollTimeout);\n }\n poll() {\n this.pollTimeout = setTimeout((() => {\n this.reconnectIfStale();\n this.poll();\n }), this.getPollInterval());\n }\n getPollInterval() {\n const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));\n const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;\n const jitter = jitterMax * Math.random();\n return staleThreshold * 1e3 * backoff * (1 + jitter);\n }\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);\n } else {\n logger.log(\"ConnectionMonitor reopening\");\n this.connection.reopen();\n }\n }\n }\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt;\n }\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;\n }\n disconnectedRecently() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n }\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout((() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);\n this.connection.reopen();\n }\n }), 200);\n }\n }\n}\n\nConnectionMonitor.staleThreshold = 6;\n\nConnectionMonitor.reconnectionBackoffRate = .15;\n\nvar INTERNAL = {\n message_types: {\n welcome: \"welcome\",\n disconnect: \"disconnect\",\n ping: \"ping\",\n confirmation: \"confirm_subscription\",\n rejection: \"reject_subscription\"\n },\n disconnect_reasons: {\n unauthorized: \"unauthorized\",\n invalid_request: \"invalid_request\",\n server_restart: \"server_restart\"\n },\n default_mount_path: \"/cable\",\n protocols: [ \"actioncable-v1-json\", \"actioncable-unsupported\" ]\n};\n\nconst {message_types: message_types, protocols: protocols} = INTERNAL;\n\nconst supportedProtocols = protocols.slice(0, protocols.length - 1);\n\nconst indexOf = [].indexOf;\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this);\n this.consumer = consumer;\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ConnectionMonitor(this);\n this.disconnected = true;\n }\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n }\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);\n return false;\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);\n if (this.webSocket) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n }\n close({allowReconnect: allowReconnect} = {\n allowReconnect: true\n }) {\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isOpen()) {\n return this.webSocket.close();\n }\n }\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`);\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error);\n } finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n }\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol;\n }\n }\n isOpen() {\n return this.isState(\"open\");\n }\n isActive() {\n return this.isState(\"open\", \"connecting\");\n }\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;\n }\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0;\n }\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase();\n }\n }\n }\n return null;\n }\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this);\n this.webSocket[`on${eventName}`] = handler;\n }\n }\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {};\n }\n }\n}\n\nConnection.reopenDelay = 500;\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) {\n return;\n }\n const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`);\n return this.close({\n allowReconnect: reconnect\n });\n\n case message_types.ping:\n return this.monitor.recordPing();\n\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier);\n return this.subscriptions.notify(identifier, \"connected\");\n\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close(event) {\n logger.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error() {\n logger.log(\"WebSocket onerror event\");\n }\n};\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key];\n object[key] = value;\n }\n }\n return object;\n};\n\nclass Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer;\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n perform(action, data = {}) {\n data.action = action;\n return this.send(data);\n }\n send(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n }\n unsubscribe() {\n return this.consumer.subscriptions.remove(this);\n }\n}\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions;\n this.pendingSubscriptions = [];\n }\n guarantee(subscription) {\n if (this.pendingSubscriptions.indexOf(subscription) == -1) {\n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`);\n this.pendingSubscriptions.push(subscription);\n } else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`);\n }\n this.startGuaranteeing();\n }\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`);\n this.pendingSubscriptions = this.pendingSubscriptions.filter((s => s !== subscription));\n }\n startGuaranteeing() {\n this.stopGuaranteeing();\n this.retrySubscribing();\n }\n stopGuaranteeing() {\n clearTimeout(this.retryTimeout);\n }\n retrySubscribing() {\n this.retryTimeout = setTimeout((() => {\n if (this.subscriptions && typeof this.subscriptions.subscribe === \"function\") {\n this.pendingSubscriptions.map((subscription => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`);\n this.subscriptions.subscribe(subscription);\n }));\n }\n }), 500);\n }\n}\n\nclass Subscriptions {\n constructor(consumer) {\n this.consumer = consumer;\n this.guarantor = new SubscriptionGuarantor(this);\n this.subscriptions = [];\n }\n create(channelName, mixin) {\n const channel = channelName;\n const params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n const subscription = new Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n }\n add(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.subscribe(subscription);\n return subscription;\n }\n remove(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n }\n reject(identifier) {\n return this.findAll(identifier).map((subscription => {\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n return subscription;\n }));\n }\n forget(subscription) {\n this.guarantor.forget(subscription);\n this.subscriptions = this.subscriptions.filter((s => s !== subscription));\n return subscription;\n }\n findAll(identifier) {\n return this.subscriptions.filter((s => s.identifier === identifier));\n }\n reload() {\n return this.subscriptions.map((subscription => this.subscribe(subscription)));\n }\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));\n }\n notify(subscription, callbackName, ...args) {\n let subscriptions;\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [ subscription ];\n }\n return subscriptions.map((subscription => typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined));\n }\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription);\n }\n }\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`);\n this.findAll(identifier).map((subscription => this.guarantor.forget(subscription)));\n }\n sendCommand(subscription, command) {\n const {identifier: identifier} = subscription;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n }\n}\n\nclass Consumer {\n constructor(url) {\n this._url = url;\n this.subscriptions = new Subscriptions(this);\n this.connection = new Connection(this);\n }\n get url() {\n return createWebSocketURL(this._url);\n }\n send(data) {\n return this.connection.send(data);\n }\n connect() {\n return this.connection.open();\n }\n disconnect() {\n return this.connection.close({\n allowReconnect: false\n });\n }\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n }\n}\n\nfunction createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url();\n }\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n}\n\nfunction createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url);\n}\n\nfunction getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport { Connection, ConnectionMonitor, Consumer, INTERNAL, Subscription, SubscriptionGuarantor, Subscriptions, adapters, createConsumer, createWebSocketURL, getConfig, logger };\n","import Logger from './Logger.js';\nimport { createConsumer } from '@rails/actioncable';\n\n/**\n * Registers with provided token and room.\n **/\nclass ActionCableConnection {\n constructor(uri) {\n this.channels = {};\n this.onMessageHandler = this.defaultMessageHandler;\n\n this.onReceived = this.onReceived.bind(this);\n this.offMessage = this.offMessage.bind(this);\n this.onConnected = this.onConnected.bind(this);\n this.startSession = this.startSession.bind(this);\n this.onDisconnected = this.onDisconnected.bind(this);\n\n this.cable = createConsumer(uri);\n }\n\n startSession() {\n this.channels.RoomChannel = this.cable.subscriptions.create(\n { channel: 'RoomChannel' },\n {\n connected: this.onConnected,\n received: this.onReceived,\n disconnected: this.onDisconnected\n }\n );\n this.channels.UserChannel = this.cable.subscriptions.create(\n { channel: 'UserChannel' },\n { received: this.onReceived }\n );\n }\n\n onConnected() {\n if (this.disconnectTimestamp) {\n this.handleReconnect();\n }\n Logger.debug('ActionCableConnection::onConnected');\n }\n\n handleReconnect() {\n this.onMessageHandler({ type: 'reconnect' });\n }\n\n onReceived(msg) {\n Logger.debug('ActionCableConnection::onReceived', msg);\n msg._src = 'actioncable';\n this.onMessageHandler(msg);\n }\n\n onDisconnected() {\n Logger.debug('ActionCableConnection::onDisconnected');\n this.disconnectTimestamp = Date.now();\n this.onMessageHandler({ type: 'disconnect' });\n }\n\n onMessage(onMessageHandler) {\n if (typeof onMessageHandler !== 'function') {\n return;\n }\n this.onMessageHandler = onMessageHandler;\n }\n\n offMessage() {\n this.onMessageHandler = this.defaultMessageHandler;\n }\n\n defaultMessageHandler(msg) {\n Logger.debug('ActionCableConnection::defaultMessageHandler: ', msg);\n }\n\n /**\n * msg has the format { channel: 'xyz', type: 'abc' }\n **/\n send({ channel = 'RoomChannel', type = 'ping' }) {\n const subscription = this.channels[channel];\n\n if (!subscription) {\n Logger.warn(\n 'ActionCableConnection::send no subscription found! ',\n channel\n );\n return;\n }\n\n subscription.perform(type);\n }\n\n close() {\n this.cable.disconnect();\n this.offMessage();\n this.channels = {};\n this.cable = null;\n }\n}\n\nexport default ActionCableConnection;\n","import config from './config.js';\nimport options from './options.js';\nimport ComApi from './ComApi.js';\nimport Logger from './Logger.js';\nimport throttle from './utils/throttle.js';\nimport EventHandler from './EventHandler.js';\nimport ConferenceSession from './ConferenceSession.js';\nimport ConnectionMonitor from './ConnectionMonitor.js';\nimport ActionCableConnection from './ActionCableConnection.js';\n\n/**\n * Initial connection status change updater.\n **/\nconst updateStatus = (eyeson, status) =>\n eyeson.core.eventHandler.send({\n type: 'connection',\n connectionStatus: status\n });\n\nconst keepRoomAlive = eyeson => {\n eyeson.core.keepRoomAlive = setInterval(() => {\n eyeson.core.rtConnection.send({ type: 'user_joins' });\n }, 30000);\n};\n\n/**\n * Remove this once WSS messages arrive reliably.\n **/\nconst pollingFallback = eyeson => {\n let counter = 1;\n eyeson.core.pollingFallbackInterval = setInterval(() => {\n const { core } = eyeson;\n if (counter === 200) {\n Logger.debug(\n 'eyeson::pollingFallback: max count exceeded, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n if (core.eventHandler._connection) {\n Logger.debug(\n 'eyeson::pollingFallback: connection set, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n core.comApi.getRoom(data => {\n if (data.ready === true) {\n Logger.debug('eyeson::pollingFallback: room ready');\n core.eventHandler.send({ type: 'room_ready', content: data });\n return;\n }\n Logger.debug('eyeson::pollingFallback: room not ready', counter);\n counter += 1;\n });\n }, 5000);\n};\n\n/**\n * Load initial room data.\n **/\nconst loadInitialInfos = eyeson => {\n const { core } = eyeson;\n const { broadcasts } = core.eventHandler._rtData;\n if (broadcasts) {\n core.eventHandler.send({\n type: 'broadcasts_update',\n broadcasts: broadcasts\n });\n }\n};\n\n/**\n * Join a session and listen to any events. eventHandler keeps all the\n * stuff.\n **/\n// eslint-disable-next-line max-statements\nconst joinSession = (eyeson, mediaOptions) => {\n const { core } = eyeson;\n if (!core.eventHandler._connection) {\n Logger.error(\n 'You tried to join a session that is not yet available. ' +\n 'Before calling join, a connection status of connected has ' +\n 'to be received.'\n );\n return;\n }\n\n const session = new ConferenceSession(\n core.eventHandler._connection,\n core.comApi,\n mediaOptions\n );\n session.setMonitor(core.eventHandler.monitor);\n core.eventHandler.session = session;\n\n session.start();\n loadInitialInfos(eyeson);\n clearInterval(core.keepRoomAlive);\n eyeson.session = session;\n};\n\n/**\n * Initialise our connections.\n **/\nconst prepareConnection = eyeson => {\n const { core } = eyeson;\n updateStatus(eyeson, 'fetch_room');\n\n core.eventHandler.eyeson = eyeson;\n\n core.comApi.onError(() =>\n core.eventHandler.send({ type: 'warning', name: 'error:comapi' })\n );\n\n // eslint-disable-next-line max-statements\n core.comApi.getRoom(data => {\n if (data.error) {\n Logger.warn('eyeson::prepareConnection', data.error);\n updateStatus(eyeson, 'access_denied');\n return;\n }\n updateStatus(eyeson, 'received_room');\n\n core.rtConnection = new ActionCableConnection(data.links.websocket);\n core.eventHandler.rtConnection = core.rtConnection;\n core.rtConnection.startSession();\n\n core.eventHandler.monitor = new ConnectionMonitor();\n core.eventHandler.api = core.comApi;\n keepRoomAlive(eyeson);\n pollingFallback(eyeson);\n });\n};\n\n/****** The following represents the public API, adapt with caution! *********/\nclass eyesonClass {\n /****** Public data ********************************************************/\n constructor() {\n /**\n * The room, user and links to be updated when fetched from the ComAPI.\n */\n this.config = config;\n this.core = { eventHandler: new EventHandler() };\n this.room = {};\n this.user = {};\n this.links = {};\n this.options = options;\n }\n /****** Public helper methods **********************************************/\n\n /**\n * Attach event listener\n **/\n onEvent(listener) {\n if (typeof listener !== 'function') {\n Logger.error(\n 'A listener to eyeson events has to be of type function.' +\n ' The argument passed to onEvent is of type ' +\n typeof listener +\n '.'\n );\n return;\n }\n this.core.eventHandler.onReceive(listener);\n }\n\n /**\n * Remove event listener\n **/\n offEvent(listener) {\n this.core.eventHandler.removeListener(listener);\n }\n\n /**\n * Prepare required core connections.\n **/\n connect(token) {\n Logger.debug('eyeson::connect', token);\n this.core.comApi = new ComApi(this.config.api, token);\n prepareConnection(this);\n }\n\n /**\n * Join a session with supplied mediaOptions (audio/video).\n **/\n join(mediaOptions) {\n Logger.debug('eyeson::join', mediaOptions);\n joinSession(this, mediaOptions);\n }\n\n /**\n * Start an eyeson room meeting.\n **/\n start(token, mediaOptions = { audio: true, video: true }) {\n Logger.debug('eyeson::start');\n const joinOnConnect = event => {\n if (event.connectionStatus !== 'ready') {\n return;\n }\n this.offEvent(joinOnConnect);\n this.join(mediaOptions);\n };\n this.onEvent(joinOnConnect);\n this.connect(token);\n }\n\n /**\n * Destroy and cleanup a session.\n **/\n destroy() {\n const { core } = this;\n Logger.debug('eyeson::destroy');\n clearInterval(core.keepRoomAlive);\n clearInterval(core.pollingFallbackInterval);\n core.eventHandler.destroy();\n core.eventHandler = new EventHandler();\n }\n\n /**\n * Receive an event from client.\n **/\n send(msg) {\n msg._src = 'client';\n return this.core.eventHandler.send(msg);\n }\n\n /**\n * When invoked repeatedly, will only actually call the original function at\n * most once per every wait milliseconds.\n **/\n throttledSend(msg) {\n if (!this._throttledSend) {\n this._throttledSend = throttle(message => this.send(message), 500);\n }\n\n return this._throttledSend(msg);\n }\n\n /**\n * Create a new instance\n */\n createInstance() {\n // eslint-disable-next-line new-cap\n return new eyesonClass();\n }\n}\n\n// eslint-disable-next-line new-cap\nconst instance = new eyesonClass();\n\nexport default instance;\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import Logger from '../Logger.js';\n\nclass GiphyApi {\n constructor(roomUrl) {\n this.roomUrl = roomUrl;\n }\n\n search(query) {\n return this.request(`${this.roomUrl}/search?q=${query}`).then(\n ({ data }) => data\n );\n }\n\n random() {\n return this.request(`${this.roomUrl}/random`).then(({ data }) => data);\n }\n\n trending() {\n return this.request(`${this.roomUrl}/trending?limit=9`).then(({ data }) =>\n this.staff().then(staffGifs => [...data, ...staffGifs])\n );\n }\n\n staff() {\n return this.request(`${this.roomUrl}/staff`).then(({ data }) => data);\n }\n\n randomForQuery(query) {\n return new Promise((res, rej) => {\n this.search(query)\n .then(data => {\n if (!Array.isArray(data)) {\n return [];\n }\n return data.filter(img => img.images.original_mp4.mp4_size >= 40000);\n })\n .then(largerGifs => {\n if (largerGifs.length === 0) {\n throw new TypeError('No data found');\n }\n res(largerGifs[Math.floor(Math.random() * largerGifs.length)]);\n })\n .catch(rej);\n });\n }\n\n request(url) {\n return fetch(new Request(url))\n .then(response => response.json())\n .catch(error => {\n Logger.warn('GiphyApi', url, error);\n return { data: [] };\n });\n }\n}\n\nexport default GiphyApi;\n","import Logger from './Logger.js';\n\nconst updateInterval = 100;\n\n/**\n * Sound Meter that generates a number correlated to audio volume. The meter\n * itself displays nothing, but it makes the instantaneous and time-decaying\n * volumes available for inspection. It also reports on the fraction of samples\n * that were at or near the top of the measurement range.\n **/\nclass SoundMeter {\n // eslint-disable-next-line max-statements\n constructor() {\n this.level = 0;\n this.instant = 0;\n this.silenceDuration = 0;\n this.intervalCounter = 0;\n this.track = null;\n this.context = null;\n this.source = null;\n this.analyser = null;\n this.volumes = null;\n this.listener = [];\n this.timer = null;\n this.errorTimer = null;\n this.boundOnTrackEnded = this.onTrackEnded.bind(this);\n this.initError = false;\n this.init();\n }\n\n /**\n * Initialize audio context and prepare script processor to read input\n * channel data.\n **/\n init() {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof AudioContext === 'undefined') {\n Logger.error(\n 'AudioContext is not available. Probably the current' +\n ' user agent does not support this feature. Use the feature detector' +\n ' to hide not supported elements. Any call on onUpdate will not' +\n ' send values.'\n );\n return;\n }\n this.context = new AudioContext();\n\n this.context.onstatechange = ({ target }) => {\n if (target.state === 'suspended') {\n Logger.error('SoundMeter::init AudioContext: ', target.state);\n }\n };\n }\n\n /**\n * Connect to a media stream.\n **/\n // eslint-disable-next-line max-statements\n connectToSource(stream) {\n if (!this.context) {\n return this;\n }\n if (!stream || stream.getAudioTracks().length < 1) {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n Logger.debug('SoundMeter::connectToSource', stream);\n [this.track] = stream.getAudioTracks();\n if (this.track.readyState !== 'live') {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n this.track.addEventListener('ended', this.boundOnTrackEnded);\n this.source = this.context.createMediaStreamSource(stream);\n const analyser = this.context.createAnalyser();\n analyser.fftSize = 512;\n analyser.minDecibels = -127;\n analyser.maxDecibels = 0;\n analyser.smoothingTimeConstant = 0.5;\n this.source.connect(analyser);\n this.analyser = analyser;\n this.volumes = new Uint8Array(analyser.frequencyBinCount);\n if (!this.running && this.listener.length > 0) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n return this;\n }\n\n /**\n * Read audio level. Avoids triggering a re-render of the device-dialog\n * when the change is below 1% which wouldn't be noticable anyways.\n *\n * NOTE: When an USB Microphone is abruptly disconnected. The\n * intervalCounter reacts: when switching to a different mic, it seems to\n * take a bit to not return 0.00 for the audio level.\n **/\n // eslint-disable-next-line max-statements\n analyse() {\n const { analyser, volumes, level } = this;\n if (!analyser) {\n return;\n }\n analyser.getByteFrequencyData(volumes);\n let volumeSum = 0;\n for (const volume of volumes) {\n volumeSum += volume;\n }\n const averageVolume = volumeSum / volumes.length;\n const instant = Math.min(Math.round((averageVolume * 100) / 127), 100);\n\n // Handle microphone disconnect\n if (level === 0 && instant === 0 && this.intervalCounter === 10) {\n this.silenceDuration++;\n if (this.silenceDuration > 30 && !this.errorTimer) {\n this.errorTimer = setTimeout(() => {\n this.emit({ warning: 'MicrophoneSilenceWarning' });\n this.resetSilenceCounter();\n }, 1000);\n }\n }\n\n if (level !== instant) {\n // Clear a MicrophoneError once we get a signal, intervalCounter might be\n // too low sometimes.\n if (this.silenceDuration > 0) {\n this.resetSilenceCounter();\n }\n const diff = Math.abs(level - instant);\n if (diff >= 1) {\n this.level = instant;\n this.emit({ value: instant });\n }\n }\n if (this.intervalCounter < 10) {\n this.intervalCounter++;\n }\n }\n\n resetSilenceCounter() {\n clearTimeout(this.errorTimer);\n this.errorTimer = null;\n this.silenceDuration = 0;\n }\n\n /**\n * Stop read interval and disconnect from stream.\n **/\n // eslint-disable-next-line max-statements\n stop() {\n this.offUpdate();\n if (this.track) {\n this.track.removeEventListener('ended', this.boundOnTrackEnded);\n this.track = null;\n }\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n this.volumes = null;\n if (this.context && this.context.stop && this.context.state !== 'closed') {\n this.context.onstatechange = null;\n this.context.close();\n this.context = null;\n }\n }\n\n onUpdate(listener) {\n this.listener.push(listener);\n if (this.initError) {\n this.onTrackEnded();\n return;\n }\n if (!this.running && this.context && this.track) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n }\n\n offUpdate() {\n clearTimeout(this.errorTimer);\n this.listener.length = 0;\n if (this.running) {\n clearInterval(this.timer);\n this.running = false;\n }\n }\n\n onTrackEnded() {\n this.emit({ error: 'EyesonMicrophoneError' });\n this.stop();\n }\n\n emit(message) {\n this.listener.forEach(fn => fn(message));\n }\n}\n\nexport default SoundMeter;\n","import Logger from './Logger.js';\nimport FeatureDetector from './FeatureDetector.js';\n\n// sampleRate in Herz (Hz) to perform the check\nconst sampleRate = 1;\n\n// https://developer.chrome.com/docs/web-platform/compute-pressure/\nclass SystemPressureMonitor {\n constructor() {\n this._listener = [];\n this._monitor = null;\n this._running = false;\n this.state = null;\n }\n\n onUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener.push(listener);\n }\n }\n\n offUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener = this._listener.filter(fn => fn !== listener);\n } else {\n this._listener.length = 0;\n }\n }\n\n _emit(records) {\n // states are 'nominal', 'fair', 'serious', 'critical'\n // https://github.com/w3c/compute-pressure#design-considerations\n const { state } = records[records.length - 1];\n if (state === this.state) {\n return;\n }\n this.state = state;\n Logger.debug('SystemPressureMonitor::emit', state);\n this._listener.forEach(fn => {\n try {\n fn(state);\n } catch (error) {\n Logger.error('SystemPressureMonitor::emit', error);\n }\n });\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n if (FeatureDetector.canMonitorSystemPressure() === false) {\n Logger.error('SystemPressureMonitor is not supported');\n return;\n }\n try {\n if (!this._monitor) {\n // eslint-disable-next-line no-undef\n this._monitor = new PressureObserver(this._emit.bind(this), {\n sampleRate\n });\n }\n if (!this._running) {\n await this._monitor.observe('cpu');\n this._running = true;\n }\n if (this.state === null) {\n this._emit([{ state: 'nominal' }]);\n }\n Logger.debug('SystemPressureMonitor::start');\n } catch (error) {\n Logger.error('SystemPressureMonitor::start', error);\n }\n }\n\n stop() {\n if (this._monitor && this._running) {\n this._monitor.disconnect();\n this._running = false;\n }\n }\n\n destroy() {\n this.stop();\n this.offUpdate();\n this.state = null;\n this._monitor = null;\n }\n}\n\nexport default SystemPressureMonitor;\n","import eyeson from './src/eyeson.js';\n\nimport Logger from './src/Logger.js';\nimport MicMixer from './src/MicMixer.js';\nimport GiphyApi from './src/utils/GiphyApi.js';\nimport debounce from './src/utils/debounce.js';\nimport throttle from './src/utils/throttle.js';\nimport immediate from './src/utils/immediate.js';\nimport SoundMeter from './src/SoundMeter.js';\nimport LocalStorage from './src/LocalStorage.js';\nimport DeviceManager from './src/DeviceManager.js';\nimport FeatureDetector from './src/FeatureDetector.js';\nimport FullscreenHelper from './src/FullscreenHelper.js';\nimport MediaStreamBuilder from './src/MediaStreamBuilder.js';\nimport * as StreamHelpers from './src/utils/StreamHelpers.js';\nimport ConnectionStatistics from './src/utils/ConnectionStatistics.js';\nimport SystemPressureMonitor from './src/SystemPressureMonitor.js';\n\nexport {\n Logger,\n MicMixer,\n GiphyApi,\n debounce,\n throttle,\n immediate,\n SoundMeter,\n LocalStorage,\n StreamHelpers,\n DeviceManager,\n FeatureDetector,\n FullscreenHelper,\n MediaStreamBuilder,\n ConnectionStatistics,\n SystemPressureMonitor,\n};\n\nexport default eyeson;\n"],"names":["root","factory","exports","module","define","amd","self","objectTypes","window","this","freeExports","freeModule","nodeType","freeGlobal","g","global","maxSafeInteger","Math","pow","reOpera","objectProto","Object","prototype","hasOwnProperty","toString","capitalize","string","String","charAt","toUpperCase","slice","format","trim","test","forOwn","object","callback","key","call","getClassOf","value","qualify","replace","reduce","array","accumulator","index","length","each","platform","parse","ua","context","isCustomContext","nav","navigator","userAgent","data","isSpecialCasedOS","property","type","likeChrome","objectClass","airRuntimeClass","enviroClass","javaClass","java","phantomClass","rhino","environment","alpha","beta","doc","document","opera","operamini","operaClass","arch","description","prerelease","useFeatures","version","layout","result","guess","RegExp","pattern","exec","label","name","guesses","getName","product","getProduct","manufacturer","getManufacturer","os","split","cleanupOS","getOS","getVersion","patterns","push","unshift","indexOf","parseFloat","runtime","flash","system","Capabilities","phantom","major","minor","patch","documentMode","toFixed","lang","System","getProperty","require","join","e","process","browser","versions","electron","node","nw","appMinorVersion","external","parseInt","family","architecture","cpuClass","isCommonjs","fn","val","fnMap","i","l","ret","eventNameMap","change","fullscreenchange","error","fullscreenerror","screenfull","request","element","options","Promise","resolve","reject","onFullScreenEntered","off","bind","on","returnPromise","documentElement","requestFullscreen","then","catch","exit","isFullscreen","onFullScreenExit","exitFullscreen","toggle","onchange","onerror","event","eventName","addEventListener","removeEventListener","raw","defineProperties","get","Boolean","fullscreenElement","enumerable","isEnabled","fullscreenEnabled","SDPUtils","random","substring","localCName","generateIdentifier","splitLines","blob","map","line","splitSections","part","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","parseCandidate","parts","candidate","foundation","component","protocol","toLowerCase","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","undefined","writeCandidate","sdp","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","id","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","find","existingFeedback","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","stream","track","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","_typeof","_regeneratorRuntime","__esModule","Op","hasOwn","defineProperty","desc","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","configurable","writable","err","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","Context","makeInvokeMethod","tryCatch","arg","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","method","_invoke","AsyncIterator","PromiseImpl","invoke","record","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","state","Error","done","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","constructor","mark","setPrototypeOf","__proto__","awrap","async","iter","reverse","pop","skipTempReset","prev","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","n","getter","d","a","definition","o","prop","r","nmd","paths","children","_classCallCheck","instance","Constructor","_toPropertyKey","input","hint","prim","toPrimitive","res","Number","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","api","allowSafariSFU","screencapture","widescreen","_console","console","apply","arguments","warn","_console2","_console3","log","debug","_console4","ComApi","token","cache","users","errorCallback","_handleError","path","fetch","Request","response","contentType","headers","ok","json","text","concat","status","form","namespace","fd","FormData","formKey","File","append","_objectToFormData","_request","body","formData","Logger","userId","_this","user","cachedUser","apiUser","extendedUser","addUserAttributes","clientId","largeAvatarUrl","avatar","assign","apiId","sipId","largeAvatar","_this2","_post","email","custom_fields","locale","player_url","playerUrl","stream_url","streamUrl","_put","snapshotId","_this3","playback","play_id","func","wait","args","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","setTimeout","_setPrototypeOf","p","_inherits","subClass","superClass","_assertThisInitialized","ReferenceError","_possibleConstructorReturn","_getPrototypeOf","BaseEvent","msg","StartPlaybackEvent","_BaseEvent","_super","_createSuper","_api","startPlayback","StopPlaybackEvent","_BaseEvent2","_super2","stopPlayback","_get","Reflect","receiver","base","getOwnPropertyDescriptor","PublicEvent","_src","deleteProperty","listeners","StartAnnotationEvent","_PublicEvent","annotationLoop","setInterval","createAnnotation","annotation","clearInterval","StopAnnotationEvent","_PublicEvent2","stopAnnotation","StfuEvent","_rtConnection","send","IgnoreEvent","ForwardEvent","_arrayLikeToArray","arr","len","arr2","Array","_unsupportedIterableToArray","minLen","from","_slicedToArray","isArray","_i","_s","_e","_x","_r","_arr","_n","_d","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","wrapPeerConnectionEvent","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","has","unwrappedCb","delete","size","disableLog","bool","disableWarnings","deprecated","oldMethod","newMethod","isObject","compactObject","isObj","isEmptyObject","walkStats","stats","resultSet","endsWith","filterStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","shimGetUserMedia","browserDetails","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","ideal","exact","min","max","oldname_","oc","mix","advanced","shimConstraints_","constraints","audio","remap","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","some","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","DOMException","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","successCallbackWrapper_","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","RTCSessionDescription","signalingState","t","oldStream","nativeMethod","methodObj","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","streamid","shimPeerConnection","webkitRTCPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","code","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","encodings","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","all","finally","shimCreateAnswer","origCreateAnswer","createAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","toJSON","sdpMid","sdpMLineIndex","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","mLine","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","getMaxMessageSize","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","adapter","shimChrome","shimFirefox","shimSafari","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","commonShim","browserShim","adapterFactory","FullscreenHelper","onChange","hasSupport","_canvasBlurSupport","canMix","canPip","hasPipSupport","canSFU","isPhone","inIframe","isIOSDevice","canUseEyeson","canFullscreen","hasMobileDevice","canToggleCamera","canPresentFiles","canScreenCapture","canAdjustSettings","canAdjustDeviceSettings","canStreamLocalMedia","isExperimentalBrowser","isWebView","hasGetUserMedia","canDataChannel","isMinimumRequiredBrowser","hasGetDisplayMedia","hasPeerConnection","hasCaptureStream","HTMLMediaElement","hasCanvasCaptureSupport","hasSenders","hasTrackOnUnmute","isSafari","browserVersion","isWorkingIOSBrowser","hasWebpSupport","isChrome","isFF","canChangeAudioOutput","canChangeMicrophone","isOldSafari","isTestSuite","canMultipleDifferentMicrophones","canChangeCamera","config","isIPhone","audioContext","every","requiresLowerConstraints","browserName","txt","isEdge","isMinimumRequiredChrome","isMinimumRequiredFF","isMinimumRequiredSafari","isMinimumRequiredEdge","iOSBrowser","operaTouch","HTMLVideoElement","pictureInPictureEnabled","iOSPipCheck","support","createElement","preload","src","onsuspend","wkEnabled","webkitSupportsPresentationMode","isAndroidDevice","maxTouchPoints","MSStream","screen","isAndroidPhone","isAndroid","isMobile","isMacOS","userAgentData","top","isTouchDevice","canDisplayTooltips","canDrawCamera","stopsDeviceActivityIndicatorOnDisable","supportsBlurOnSVG","SVGElement","blur","hasLocalStorage","localStorage","setItem","canGet","getItem","safariWithoutVP8","uAVersion","disallowAudioSyncSrcChange","canShare","share","canVirtualBackground","WebAssembly","validate","instantiateStreaming","instantiate","CanvasRenderingContext2D","ImageData","requestAnimationFrame","canvasBlurSupport","canvas1","canvas2","ctx1","getContext","ctx2","fillStyle","fillRect","data1","getImageData","data2","canStereo","canChooseDisplaySurface","displaySurface","hasPipCamSupport","canMonitorSystemPressure","PressureObserver","supportedSources","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","NinjaStream","_stream","createStream","canvas","captureStream","CanvasCaptureMediaStream","fallbackStorage","FeatureDetector","store","load","defaultValueParam","defaultValue","storedValue","stack","messageName","CanvasMedia","CanvasCaptureMediaStreamTrack","hasAudio","enabled","hasVideo","disableAudio","enableAudio","toggleAudio","toggleVideo","stopTrack","stopStream","isScreenTrack","isScreenPresentationTrack","isScreenAsVideoTrack","isCanvasTrack","isNinjaStreamTrack","isVbgStreamTrack","isCameraTrack","getScreenTracks","getScreenPresentationTracks","getScreenAsVideoTracks","getCameraTracks","getVbgTracks","stopCamera","disableCamera","enableCamera","toggleCamera","toggleVbgTrack","getCanvasTracks","isScreenStream","isScreenPresentationStream","isCanvasStream","isVBGStream","isCameraStream","isCanvasPresentationStream","isPresentationStream","hasCameraVideo","getFacingMode","settings","requestFrame","createExternalStream","audioOnly","aTrack","vTrack","audioTrack","ac","createMediaStreamDestination","close","createFakeAudioTrack","videoTrack","createFakeVideoTrack","source","stopPropagation","postMessage","fps","raf","focus","abort","animationFrameThen","throttledRAF","elapsed","throttledImmediate","immediate","_requestAnimationFrame","cancelAnimationFrame","_cancelAnimationFrame","visibilityState","integrity","URL","location","href","script","onload","parentNode","remove","algo","hash","head","cacheStorageSupport","CacheStorage","storeBlobURL","_ref","_callee","blobURL","_context","caches","open","put","Response","t0","_x2","loadBlobURL","_ref2","_callee2","_context2","createObjectURL","_x3","deleteBlob","_ref3","_callee3","_context3","_x4","_mulTable","_shgTable","_canvas","_ctx","_previous","_g","_b","_vmin","_vmax","run","imageBitmap","amount","desynchronized","drawImage","imageData","wm","hm","rad1","mulSum","shgSum","Uint32Array","iterations","p1","p2","yw","yi","y","rsum","gsum","bsum","x","yp","putImageData","OffscreenCanvasSupport","OffscreenCanvas","OffscreenCanvasBlurSupport","OffscreenCanvasRenderingContext2D","ImageBitmapSupport","createImageBitmap","TrackProcessorSupport","MediaStreamTrackProcessor","SIMDSupport","Uint8Array","EventTargetConstructorSupport","EventTarget","_max","_stateChange","_segmentationModel","_tflite","_tfliteReady","_tfliteLoading","_inputMemoryOffset","_outputMemoryOffset","_localImageFile","_localImageFileBackup","initiateTFLite","loading","model","modelBufferOffset","importScript","arrayBuffer","_getModelBufferMemoryOffset","HEAPU8","_loadModel","_getInputMemoryOffset","_getOutputMemoryOffset","createOffscreenCanvas","ctx","LocalStorage","cacheStorage","loadImage","emitLoading","img","Image","host","crossOrigin","checkImageLoad","loadImageFile","callbackFN","accept","files","revokeObjectURL","click","createImageCanvas","image","hRatio","vRatio","ratio","imgWidth","imgHeight","centerShiftX","centerShiftY","createGeneraliCanvas","createGradientCanvas","gradient","createLinearGradient","startX","startY","endX","endY","addColorStop","color1","color2","createBlurCanvas","fullLength","bigWidth","bigHeight","blurCanvas","imageCanvas","_allowedTypesCheck","setState","VirtualBackgroundMixer","originalStream","outStream","reader","segmentationMaskCanvas","segmentationMaskCtx","segmentationMask","videoCanvas","videoCtx","playPromise","paused","throttledAnimationFrame","drawVideo","backgroundOld","backgroundType","backgroundValue","blurInit","canvasBlur","loadingListener","handleStateChange","_checkExternalImage","_initBackground","_drawVideo","listener","userMediaStream","videoTracks","trackSettings","stopOriginalStream","terminate","imageSmoothingEnabled","canvasTrack","srcLabel","srcDeviceId","start","_this$size","processor","readable","getReader","playsInline","muted","srcObject","willReadFrequently","initBackground","onloadeddata","play","frame","_yield$this$reader$re","heap","maskData","pixelCount","heapIndex","imgIndex","_index","person","read","displayWidth","displayHeight","t1","HEAPF32","_runInference","globalCompositeOperation","drawBackground","blurred","_callee4","_this$size2","_image","_context4","setBackgroundFallback","_this$size3","pause","_this4","_callee5","_context5","changedDevices","listA","listB","_ret","_loop","_deviceA","_found","deviceB","groupId","v","deviceA","found","DeviceManager","sinkId","eco","cameras","speakers","microphones","terminationInProgress","virtualBackground","virtualBackgroundType","getSinkId","setStream","handleError","verifyStream","storeConstraints","adjustAudioTrack","initiateVirtualBackground","_setVirtualBackgroundType","wasOff","willBeOff","isTypeAllowed","checkExternalImage","changeBackground","update","loadLocalImage","setVirtualBackgroundType","watchForNewDevices","fetchDevices","setDevices","getConstraints","ondevicechange","destroy","camHasChanged","micHasChanged","speakerHasChanged","emit","_this5","_this6","initiateStream","updateCache","_this7","firstRun","emitStreamUpdate","videoConstraints","audioConstraints","preventUpdate","device","optionsParam","getDevices","determineConstraintsForDevices","channelCount","videoDeviceId","audioDeviceId","applyLastUsedDevices","applyWidescreen","videoId","audioId","eyesonOptions","findIndex","speaker","isBlobAvailable","getImageBlobOrFallback","MediaStreamBuilder","surface","screenStream","existingStream","micMixer","vbgMixer","isPresentation","deviceMonitor","tempStream","brokenTrackCallback","bindMethods","_addScreenTrack","getMediaStream","addNinjaTrack","addCanvasTrack","addScreenTrack","adjustVideoTrack","addScreenStreamTrack","initializeVirtualBackground","_this$options","active","onended","canvasStream","displayStream","audioStream","mixScreenshareAudio","setMicOnlyStream","fetchInputDevices","applyTempTracks","cleanupTempStream","discardTempTracks","_this$options2","getMobileConstraints","addVideoTrack","_this$options3","addAudioTrack","_this$options4","_this$options5","_getScreenPresentatio","_getScreenPresentatio2","screenTrack","echoCancellation","surfaceSwitching","selfBrowserSurface","systemAudio","_this$options6","fillerTrack","_this$options7","MicMixer","acOut","micOnlyStream","videoStream","audioTracks","createMediaStreamSource","connect","displayAudio","noMix","initMixScreenshareMix","exc","adjustMediaStreamTracks","ChangeLocalStreamEvent","_ref$screen","_session","localStream","wasScreenAsVideo","resume","suspend","locallyChanged","PodiumEvent","hasPresenter","stopPresentingSet","scanMessageForLocalStreamOptimization","isSource","isPresenter","hasDesktopSources","SnapshotEvent","takeSnapshot","SetLayerEvent","setLayer","SendChatEvent","content","StopRtmpEvent","stopBroadcast","SetLayoutEvent","setLayout","StartRtmpEvent","_this$context","startBroadcast","EventEmitter","detail","clear","CustomEvent","_EventEmitter","Transport","connection","wasOpen","WebSocket","endpoint","auth_token","onopen","onmessage","onclose","OPEN","was_open","removeAllListeners","R_CRLF","atob","supportsRandomUUID","crypto","randomUUID","bytes","getRandomValues","char","byte","UserAgent","_call","_handleSdpUpdate","_onMessage","failed","transportOptions","checkUserAgentOptions","callId","sessionDescriptionHandler","initAuthToken","debouncedHandleSDPUpdate","ms","_len","_key","nextArgs","slowdown","handleSdpUpdate","verifySender","setCallId","call_id","setDescription","termination","reason","reject_code","term_code","jwt","parseJwtPayload","client_id","conf_id","exp","to","answerSdp","updateDescription","crlfNormalize","msg_id","uuid","transport","onEvent","sessionDescriptionHandlerFactory","sessionDescriptionHandlerFactoryOptions","onMessage","display_name","client_name","mute_video","authToken","onReconnect","seppEvent","offEvent","transportEvent","isConnected","PodiumFacade","_message$src","psrc","asrc","vsrc","dsrc","dims","sources","presenterIdx","audioSources","videoSources","desktopSources","dimensions","userSourceIndex","Set","presenter","isInteger","userVideoIndex","SigMessageTransformer","stamp","sourceUpdate","voiceActivity","source_update","voice_activity","podium","solo","isSolo","hasAudioPosition","hasVideoPosition","hasMedia","userDimensions","hasVideoSources","hasMutedVideoPeers","cid","SessionDescriptionHandler","datachannel","peerConnection","remoteStream","connected","iceCheckingTimer","peerConnectionReady","handleConnectionStateChange","initPeerConnection","_updateDescription","_setDescription","_getDescription","offer","RTCOfferOptions","SDPModifiers","modifier","localDescription","passive","sessionDescription","seppMessaging","remoteDescriptionUpdate","answer","stopAllTracks","pcOptions","buildPeerConnectionOptions","resolveReady","negotiated","handleDatachannel","onicecandidate","onicegatheringstatechange","iceGatheringState","sendOnly","ontrack","handleOntrack","uaOptions","onunmute","handleUnmute","handleAccept","initDatachannel","stun_servers","turn_servers","turnServer","credential","getLocalStream","stopUnusedTracks","tracksExist","audioSender","videoSender","replaceTrack","hasExternalStream","factor","rtp","SigConnection","signaling","messageListener","initUserAgentOptions","transformer","signalingOptions","SEPP","mediaOptions","handleMessage","roomData","WHITELIST","transformedMessage","sendSeppMessage","errorHandler","RoomReceived","rtData","ready","_msg$content","room","links","_eyeson","_connection","connectionStatus","startSigConnection","FetchRoomEvent","getRoom","DeleteFileEvent","deleteFile","file","UploadFileEvent","uploadFile","addFile","ReceiveChatEvent","getUser","forwardMessage","ts","created_at","StartStreamEvent","_ref$audio","_ref$video","_ref$virtualBackgroun","_ref$surface","getStoredVirtualBackgroundType","ChangeStreamEvent","onBrokenTrackError","canvasMixer","ReplaceStreamEvent","ToggleCameraEvent","AcceptSessionEvent","session","getRemoteStream","StopRecordingEvent","stopRecording","VoiceActivityEvent","StartRecordingEvent","startRecording","ScreenCaptureEvent","present","detectDisplaySurface","StartPresentingEvent","_handle","videoPlayer","invokeStream","_ref$stream","_ref$present","presentationStream","isStreaming","streamVideo","StopPresentingEvent","StopBroadcastsEvent","stopAllBroadcasts","ClearFrontLayerEvent","clearFrontLayer","RequestGuestUserEvent","requestUser","access_key","isLocked","locked","SessionTerminationEvent","ParticipantListUpdateEvent","add","initial","addition","del","playing","toFixedNumber","number","callNow","FPS_INTERVAL","CAMERA_SMALL","CAMERA_MEDIUM","CAMERA_LARGE","CAMERA_NONE","supportsTrackProcessor","defaultTrack","bindVideoToStream","_track$getSettings","CanvasMixer","camera","xPos","camSize","isCanvasCapture","draw","onRedraw","setCamera","drawFrame","calcSizesAndPositions","bouncedDraw","debounce","_draw","redrawCallback","mixer","cameraStream","horizontal","vertical","originalCanvas","getCanvasCaptureTrackCanvas","redrawQueued","position","cameraPosition","cameraSizeInWords","sourceAspectRatio","targetAspectRatio","_this$screenStream$ge3","screenStreamSettings","fitScreen","_this$cameraStream$ge3","cameraTrackSettings","small","medium","large","none","scaledCam","scale","sizes","camPosition","positions","screenFrame","cameraFrame","_result","performance","ReadableStreamDefaultReader","clearRect","imgData","createImageData","StartMixerEvent","_ref$changeStream","changeStream","vbgType","UpdateMixerEvent","videoFrameSupport","requestVideoFrameCallback","VideoPlayer","onReady","onDuration","onTimeUpdate","onEnd","performAction","gainNode","timer","boundDrawVideoFrame","drawVideoFrame","boundInitCanvasStream","initCanvasStream","isPlaying","blockTimeUpdate","initTimeout","invokationTimer","initVideo","autoplay","onplaying","onVideoPlay","onpause","onVideoPause","onseeked","onVideoSeeked","ontimeupdate","onVideoTimeUpdate","onVideoReady","onVideoError","onVideoEnd","duration","videoWidth","videoHeight","createGain","createMediaElementSource","destination","onVideoAction","currentTime","onPlayAction","onPauseAction","onTimeAction","onVolumeAction","time","volume","gain","canvasStreamTrack","cancelVideoFrameCallback","disconnect","StartMediaEvent","MediaError","LockMeetingEvent","lockMeeting","TerminateMeetingEvent","terminateMeeting","KickUserEvent","kickUser","VirtualBackgroundEvent","destroySessionMicMixer","getScreenErrorName","ScreenVideoChangeEvent","mediaStreamBuilder","_getScreenAsVideoTrac","_getScreenAsVideoTrac2","ScreenVideoStoppedEvent","DeviceMonitor","tempAudioTrack","tempVideoTrack","audioEnded","videoEnded","boundOnAudioEnd","onAudioEnd","boundOnVideoEnd","clearTracks","PipCam","isActive","startTimer","_destroy","_stop","_initCamera","_initVideoAndPip","_updateCamera","_start","initFakeStream","initVideoAndPip","initCamera","Path2D","fill","onleavepictureinpicture","onExitPip","requestPictureInPicture","onDeviceEvent","pictureInPictureElement","exitPictureInPicture","_callee6","_context6","StartPipCamEvent","pipCam","StopPipCamEvent","UpdatePipCamEvent","_BaseEvent3","_super3","updateCamera","AudioDeviceEndEvent","_tracks","mediaConstraints","newAudioDevice","VideoDeviceEndEvent","_handle2","AllDevicesEndEvent","_PublicEvent3","_handle3","_tracks2","_track$getSettings2","EventHandler","_monitor","end","con","mon","ses","_rtData","eyeson","silenced","stfu","chat","snapshot","send_chat","set_layer","set_layout","fetch_room","room_ready","RoomReceivedEvent","room_setup","memberlist","upload_file","delete_file","request_stfu","change_stream","replace_stream","toggle_camera","stop_playback","playback_update","start_playback","start_stream","stop_recording","start_screen_capture","StartScreenCaptureEvent","stop_broadcasts","start_recording","stop_presenting","start_presenting","stop_annotation","start_annotation","clear_front_layer","request_guest_user","voice_activity_raw","start_mixer","update_mixer","lock_meeting","terminate_meeting","kick_user","session_termination","start_media","change_screen_video","stop_screen_video","stop_rtmp","start_rtmp","suspend_virtual_background","audio_device_ended","video_device_ended","all_devices_ended","start_pip_cam","stop_pip_cam","update_pip_cam","capture_error","options_update","ext_not_installed","broadcasts_update","presentation_ended","recording","ext_cancel","ext_installed","message_status","moderator_info","addOriginToSDP","addSessionAttributes","splitSDP","tLineIdx","startsWith","addIndex","addStereo","stereo","codecMatch","fmtpRegExp","fmtpMatch","_entry$split2","entries","doIt","row","getModifiers","modifiers","ConferenceSession","comApi","RTCConstraints","defaultRTCConstraints","accepted","restarting","sipSession","startAttempts","maxStartAttempts","tryAuthUpdate","tryResume","tryWaitResume","resumeTimer","waitResumeTimer","endSession","initSession","handleFailed","restartSession","tryRecoveryFrom","terminateSession","_setStream","initExternalStream","initDeviceMonitor","initVirtualBackground","buildSessionOptions","startSession","onUnmute","adjustVideoPodium","handleTermination","getMicOnlyStream","monitor","observe","sdpWrapper","sfu","sfuLine","handleExit","updateAuthAndRestartSession","updateAuthAndResume","NotFoundError","NotAllowedError","NotReadableError","errorCodeName","failure","recovery","condition","action","Status","NO_CONNECTION","BAD","OK","GOOD","addHistory","history","getOldestHistoryEntry","getHistoryAverage","_step","jitter","packetLoss","roundTripTime","nack","bitrateSend","bitrateRecv","newest","getNewestHistoryEntry","_iterator","_createForOfIteratorHelper","packetLossRate","nackRate","calculateStatus","ConnectionStatistics","lastStat","bytesSent","bytesReceived","out","packetsSent","packetsLost","in","packetsReceived","nackCount","boundPrintStats","printStats","_printStats","statsCurrentRoundTripTime","average","mediaType","diff","received","localId","hasRTT","hasJitter","hasPacketLoss","hasNackCount","lost","packets","currentRoundTripTime","onLine","statistics","ConnectionMonitor","disconnectTimer","prevIceState","onOffline","handleIceStateChange","addEventListeners","oniceconnectionstatechange","onconnectionstatechange","init","currentTarget","currentIceState","adapters","logger","messages","getTime","secondsSince","visibilityDidChange","reconnectAttempts","isRunning","startedAt","stoppedAt","startPolling","staleThreshold","stopPolling","recordPing","pingedAt","recordConnect","disconnectedAt","recordDisconnect","poll","pollTimeout","reconnectIfStale","getPollInterval","reconnectionBackoffRate","connectionIsStale","refreshedAt","disconnectedRecently","reopen","isOpen","INTERNAL","message_types","welcome","ping","confirmation","rejection","disconnect_reasons","unauthorized","invalid_request","server_restart","default_mount_path","protocols","supportedProtocols","Connection","consumer","subscriptions","disconnected","webSocket","getState","uninstallEventHandlers","installEventHandlers","allowReconnect","reopenDelay","getProtocol","isState","isProtocolSupported","states","events","handler","identifier","reconnect","reload","confirmSubscription","notify","notifyAll","willAttemptReconnect","Subscription","mixin","properties","extend","perform","command","unsubscribe","SubscriptionGuarantor","pendingSubscriptions","guarantee","subscription","startGuaranteeing","forget","stopGuaranteeing","retrySubscribing","retryTimeout","subscribe","Subscriptions","guarantor","channelName","ensureActiveConnection","findAll","sendCommand","callbackName","Consumer","_url","createWebSocketURL","createConsumer","querySelector","getAttribute","getConfig","ActionCableConnection","onMessageHandler","defaultMessageHandler","onReceived","offMessage","onConnected","onDisconnected","cable","RoomChannel","UserChannel","disconnectTimestamp","handleReconnect","_ref$channel","_ref$type","updateStatus","core","eventHandler","prepareConnection","rtConnection","websocket","keepRoomAlive","counter","pollingFallbackInterval","pollingFallback","eyesonClass","onReceive","removeListener","setMonitor","broadcasts","loadInitialInfos","joinSession","joinOnConnect","_throttledSend","throttle","_toConsumableArray","GiphyApi","roomUrl","query","staff","staffGifs","_ref4","rej","search","images","original_mp4","mp4_size","largerGifs","floor","SoundMeter","level","instant","silenceDuration","intervalCounter","analyser","volumes","errorTimer","boundOnTrackEnded","onTrackEnded","initError","onstatechange","_stream$getAudioTrack2","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","frequencyBinCount","running","analyse","getByteFrequencyData","volumeSum","averageVolume","round","warning","resetSilenceCounter","abs","offUpdate","SystemPressureMonitor","_listener","_running","records","_emit","sampleRate"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"eyeson.js","mappings":"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","sources":["webpack://eyeson/webpack/universalModuleDefinition","webpack://eyeson/./node_modules/platform/platform.js","webpack://eyeson/./node_modules/screenfull/dist/screenfull.js","webpack://eyeson/./node_modules/sdp/sdp.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/regeneratorRuntime.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/regenerator/index.js","webpack://eyeson/webpack/bootstrap","webpack://eyeson/webpack/runtime/compat get default export","webpack://eyeson/webpack/runtime/define property getters","webpack://eyeson/webpack/runtime/global","webpack://eyeson/webpack/runtime/hasOwnProperty shorthand","webpack://eyeson/webpack/runtime/make namespace object","webpack://eyeson/webpack/runtime/node module decorator","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://eyeson/./src/config.js","webpack://eyeson/./src/options.js","webpack://eyeson/./src/Logger.js","webpack://eyeson/./src/ComApi.js","webpack://eyeson/./src/utils/throttle.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://eyeson/./src/events/BaseEvent.js","webpack://eyeson/./src/events/PlaybackEvents.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/get.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://eyeson/./src/events/PublicEvent.js","webpack://eyeson/./src/events/AnnotationEvents.js","webpack://eyeson/./src/events/StfuEvent.js","webpack://eyeson/./src/events/IgnoreEvent.js","webpack://eyeson/./src/events/ForwardEvent.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/utils.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/safari/safari_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/common_shim.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_core.js","webpack://eyeson/./node_modules/webrtc-adapter/src/js/adapter_factory.js","webpack://eyeson/./src/FullscreenHelper.js","webpack://eyeson/./src/FeatureDetector.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://eyeson/./src/NinjaStream.js","webpack://eyeson/./src/LocalStorage.js","webpack://eyeson/./src/utils/immediate.js","webpack://eyeson/./src/utils/StreamHelpers.js","webpack://eyeson/./src/utils/throttledAnimationFrame.js","webpack://eyeson/./src/utils/importScript.js","webpack://eyeson/./src/utils/cacheStorage.js","webpack://eyeson/./src/utils/canvasBlur.js","webpack://eyeson/./src/VirtualBackgroundMixer.js","webpack://eyeson/./src/DeviceManager.js","webpack://eyeson/./src/MediaStreamBuilder.js","webpack://eyeson/./src/MicMixer.js","webpack://eyeson/./src/events/ChangeLocalStreamEvent.js","webpack://eyeson/./src/events/PodiumEvent.js","webpack://eyeson/./src/events/SnapshotEvent.js","webpack://eyeson/./src/events/SetLayerEvent.js","webpack://eyeson/./src/events/SendChatEvent.js","webpack://eyeson/./src/events/StopRtmpEvent.js","webpack://eyeson/./src/events/SetLayoutEvent.js","webpack://eyeson/./src/events/StartRtmpEvent.js","webpack://eyeson/./src/sepp/eventEmitter.js","webpack://eyeson/./src/sepp/Transport.js","webpack://eyeson/./src/sepp/crlfNormalize.js","webpack://eyeson/./src/sepp/parseJwtPayload.js","webpack://eyeson/./src/sepp/uuid.js","webpack://eyeson/./src/sepp/SEPP.js","webpack://eyeson/./src/SigMessageWhitelist.js","webpack://eyeson/./src/PodiumFacade.js","webpack://eyeson/./src/SigMessageTransformer.js","webpack://eyeson/./src/SessionDescriptionHandler.js","webpack://eyeson/./src/SigConnection.js","webpack://eyeson/./src/events/RoomReceivedEvent.js","webpack://eyeson/./src/events/FetchRoomEvent.js","webpack://eyeson/./src/events/DeleteFileEvent.js","webpack://eyeson/./src/events/UploadFileEvent.js","webpack://eyeson/./src/events/ReceiveChatEvent.js","webpack://eyeson/./src/events/StartStreamEvent.js","webpack://eyeson/./src/events/ChangeStreamEvent.js","webpack://eyeson/./src/events/ReplaceStreamEvent.js","webpack://eyeson/./src/events/ToggleCameraEvent.js","webpack://eyeson/./src/events/AcceptSessionEvent.js","webpack://eyeson/./src/events/StopRecordingEvent.js","webpack://eyeson/./src/events/VoiceActivityEvent.js","webpack://eyeson/./src/events/StartRecordingEvent.js","webpack://eyeson/./src/events/ScreenCaptureEvent.js","webpack://eyeson/./src/events/StartPresentingEvent.js","webpack://eyeson/./src/events/StopPresentingEvent.js","webpack://eyeson/./src/events/StopBroadcastsEvent.js","webpack://eyeson/./src/events/ClearFrontLayerEvent.js","webpack://eyeson/./src/events/RequestGuestUserEvent.js","webpack://eyeson/./src/events/SessionTerminationEvent.js","webpack://eyeson/./src/events/ParticipantListUpdateEvent.js","webpack://eyeson/./src/utils/scale.js","webpack://eyeson/./src/utils/debounce.js","webpack://eyeson/./src/CanvasMixer.js","webpack://eyeson/./src/events/MixerEvents.js","webpack://eyeson/./src/VideoPlayer.js","webpack://eyeson/./src/events/MediaEvents.js","webpack://eyeson/./src/events/LockMeetingEvent.js","webpack://eyeson/./src/events/TerminateMeetingEvent.js","webpack://eyeson/./src/events/KickUserEvent.js","webpack://eyeson/./src/events/VirtualBackgroundEvent.js","webpack://eyeson/./src/events/ScreenVideoChangeEvent.js","webpack://eyeson/./src/events/ScreenVideoStoppedEvent.js","webpack://eyeson/./src/DeviceMonitor.js","webpack://eyeson/./src/PipCam.js","webpack://eyeson/./src/events/PipCamEvents.js","webpack://eyeson/./src/events/DeviceEndEvents.js","webpack://eyeson/./src/EventHandler.js","webpack://eyeson/./src/SDPModifiers.js","webpack://eyeson/./src/ConferenceSession.js","webpack://eyeson/./src/utils/ConnectionStatistics.js","webpack://eyeson/./src/ConnectionMonitor.js","webpack://eyeson/./node_modules/@rails/actioncable/app/assets/javascripts/actioncable.esm.js","webpack://eyeson/./src/ActionCableConnection.js","webpack://eyeson/./src/eyeson.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://eyeson/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://eyeson/./src/utils/GiphyApi.js","webpack://eyeson/./src/SoundMeter.js","webpack://eyeson/./src/SystemPressureMonitor.js","webpack://eyeson/./index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"eyeson\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"eyeson\"] = factory();\n\telse\n\t\troot[\"eyeson\"] = factory();\n})(self, () => {\nreturn ","/*!\n * Platform.js v1.3.6\n * Copyright 2014-2020 Benjamin Tan\n * Copyright 2011-2013 John-David Dalton\n * Available under MIT license\n */\n;(function() {\n 'use strict';\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Used as a reference to the global object. */\n var root = (objectTypes[typeof window] && window) || this;\n\n /** Backup possible global object. */\n var oldRoot = root;\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;\n if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {\n root = freeGlobal;\n }\n\n /**\n * Used as the maximum length of an array-like object.\n * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)\n * for more details.\n */\n var maxSafeInteger = Math.pow(2, 53) - 1;\n\n /** Regular expression to detect Opera. */\n var reOpera = /\\bOpera/;\n\n /** Possible global object. */\n var thisBinding = this;\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to check for own properties of an object. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to resolve the internal `[[Class]]` of values. */\n var toString = objectProto.toString;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Capitalizes a string value.\n *\n * @private\n * @param {string} string The string to capitalize.\n * @returns {string} The capitalized string.\n */\n function capitalize(string) {\n string = String(string);\n return string.charAt(0).toUpperCase() + string.slice(1);\n }\n\n /**\n * A utility function to clean up the OS name.\n *\n * @private\n * @param {string} os The OS name to clean up.\n * @param {string} [pattern] A `RegExp` pattern matching the OS name.\n * @param {string} [label] A label for the OS.\n */\n function cleanupOS(os, pattern, label) {\n // Platform tokens are defined at:\n // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx\n var data = {\n '10.0': '10',\n '6.4': '10 Technical Preview',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': 'Server 2008 R2 / 7',\n '6.0': 'Server 2008 / Vista',\n '5.2': 'Server 2003 / XP 64-bit',\n '5.1': 'XP',\n '5.01': '2000 SP1',\n '5.0': '2000',\n '4.0': 'NT',\n '4.90': 'ME'\n };\n // Detect Windows version from platform tokens.\n if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) &&\n (data = data[/[\\d.]+$/.exec(os)])) {\n os = 'Windows ' + data;\n }\n // Correct character case and cleanup string.\n os = String(os);\n\n if (pattern && label) {\n os = os.replace(RegExp(pattern, 'i'), label);\n }\n\n os = format(\n os.replace(/ ce$/i, ' CE')\n .replace(/\\bhpw/i, 'web')\n .replace(/\\bMacintosh\\b/, 'Mac OS')\n .replace(/_PowerPC\\b/i, ' OS')\n .replace(/\\b(OS X) [^ \\d]+/i, '$1')\n .replace(/\\bMac (OS X)\\b/, '$1')\n .replace(/\\/(\\d)/, ' $1')\n .replace(/_/g, '.')\n .replace(/(?: BePC|[ .]*fc[ \\d.]+)$/i, '')\n .replace(/\\bx86\\.64\\b/gi, 'x86_64')\n .replace(/\\b(Windows Phone) OS\\b/, '$1')\n .replace(/\\b(Chrome OS \\w+) [\\d.]+\\b/, '$1')\n .split(' on ')[0]\n );\n\n return os;\n }\n\n /**\n * An iteration utility for arrays and objects.\n *\n * @private\n * @param {Array|Object} object The object to iterate over.\n * @param {Function} callback The function called per iteration.\n */\n function each(object, callback) {\n var index = -1,\n length = object ? object.length : 0;\n\n if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) {\n while (++index < length) {\n callback(object[index], index, object);\n }\n } else {\n forOwn(object, callback);\n }\n }\n\n /**\n * Trim and conditionally capitalize string values.\n *\n * @private\n * @param {string} string The string to format.\n * @returns {string} The formatted string.\n */\n function format(string) {\n string = trim(string);\n return /^(?:webOS|i(?:OS|P))/.test(string)\n ? string\n : capitalize(string);\n }\n\n /**\n * Iterates over an object's own properties, executing the `callback` for each.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} callback The function executed per own property.\n */\n function forOwn(object, callback) {\n for (var key in object) {\n if (hasOwnProperty.call(object, key)) {\n callback(object[key], key, object);\n }\n }\n }\n\n /**\n * Gets the internal `[[Class]]` of a value.\n *\n * @private\n * @param {*} value The value.\n * @returns {string} The `[[Class]]`.\n */\n function getClassOf(value) {\n return value == null\n ? capitalize(value)\n : toString.call(value).slice(8, -1);\n }\n\n /**\n * Host objects can return type values that are different from their actual\n * data type. The objects we are concerned with usually return non-primitive\n * types of \"object\", \"function\", or \"unknown\".\n *\n * @private\n * @param {*} object The owner of the property.\n * @param {string} property The property to check.\n * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.\n */\n function isHostType(object, property) {\n var type = object != null ? typeof object[property] : 'number';\n return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n (type == 'object' ? !!object[property] : true);\n }\n\n /**\n * Prepares a string for use in a `RegExp` by making hyphens and spaces optional.\n *\n * @private\n * @param {string} string The string to qualify.\n * @returns {string} The qualified string.\n */\n function qualify(string) {\n return String(string).replace(/([ -])(?!$)/g, '$1?');\n }\n\n /**\n * A bare-bones `Array#reduce` like utility function.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function called per iteration.\n * @returns {*} The accumulated result.\n */\n function reduce(array, callback) {\n var accumulator = null;\n each(array, function(value, index) {\n accumulator = callback(accumulator, value, index, array);\n });\n return accumulator;\n }\n\n /**\n * Removes leading and trailing whitespace from a string.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} The trimmed string.\n */\n function trim(string) {\n return String(string).replace(/^ +| +$/g, '');\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Creates a new platform object.\n *\n * @memberOf platform\n * @param {Object|string} [ua=navigator.userAgent] The user agent string or\n * context object.\n * @returns {Object} A platform object.\n */\n function parse(ua) {\n\n /** The environment context object. */\n var context = root;\n\n /** Used to flag when a custom context is provided. */\n var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String';\n\n // Juggle arguments.\n if (isCustomContext) {\n context = ua;\n ua = null;\n }\n\n /** Browser navigator object. */\n var nav = context.navigator || {};\n\n /** Browser user agent string. */\n var userAgent = nav.userAgent || '';\n\n ua || (ua = userAgent);\n\n /** Used to flag when `thisBinding` is the [ModuleScope]. */\n var isModuleScope = isCustomContext || thisBinding == oldRoot;\n\n /** Used to detect if browser is like Chrome. */\n var likeChrome = isCustomContext\n ? !!nav.likeChrome\n : /\\bChrome\\b/.test(ua) && !/internal|\\n/i.test(toString.toString());\n\n /** Internal `[[Class]]` value shortcuts. */\n var objectClass = 'Object',\n airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject',\n enviroClass = isCustomContext ? objectClass : 'Environment',\n javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java),\n phantomClass = isCustomContext ? objectClass : 'RuntimeObject';\n\n /** Detect Java environments. */\n var java = /\\bJava/.test(javaClass) && context.java;\n\n /** Detect Rhino. */\n var rhino = java && getClassOf(context.environment) == enviroClass;\n\n /** A character to represent alpha. */\n var alpha = java ? 'a' : '\\u03b1';\n\n /** A character to represent beta. */\n var beta = java ? 'b' : '\\u03b2';\n\n /** Browser document object. */\n var doc = context.document || {};\n\n /**\n * Detect Opera browser (Presto-based).\n * http://www.howtocreate.co.uk/operaStuff/operaObject.html\n * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini\n */\n var opera = context.operamini || context.opera;\n\n /** Opera `[[Class]]`. */\n var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera))\n ? operaClass\n : (opera = null);\n\n /*------------------------------------------------------------------------*/\n\n /** Temporary variable used over the script's lifetime. */\n var data;\n\n /** The CPU architecture. */\n var arch = ua;\n\n /** Platform description array. */\n var description = [];\n\n /** Platform alpha/beta indicator. */\n var prerelease = null;\n\n /** A flag to indicate that environment features should be used to resolve the platform. */\n var useFeatures = ua == userAgent;\n\n /** The browser/environment version. */\n var version = useFeatures && opera && typeof opera.version == 'function' && opera.version();\n\n /** A flag to indicate if the OS ends with \"/ Version\" */\n var isSpecialCasedOS;\n\n /* Detectable layout engines (order is important). */\n var layout = getLayout([\n { 'label': 'EdgeHTML', 'pattern': 'Edge' },\n 'Trident',\n { 'label': 'WebKit', 'pattern': 'AppleWebKit' },\n 'iCab',\n 'Presto',\n 'NetFront',\n 'Tasman',\n 'KHTML',\n 'Gecko'\n ]);\n\n /* Detectable browser names (order is important). */\n var name = getName([\n 'Adobe AIR',\n 'Arora',\n 'Avant Browser',\n 'Breach',\n 'Camino',\n 'Electron',\n 'Epiphany',\n 'Fennec',\n 'Flock',\n 'Galeon',\n 'GreenBrowser',\n 'iCab',\n 'Iceweasel',\n 'K-Meleon',\n 'Konqueror',\n 'Lunascape',\n 'Maxthon',\n { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' },\n 'Midori',\n 'Nook Browser',\n 'PaleMoon',\n 'PhantomJS',\n 'Raven',\n 'Rekonq',\n 'RockMelt',\n { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' },\n 'SeaMonkey',\n { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Sleipnir',\n 'SlimBrowser',\n { 'label': 'SRWare Iron', 'pattern': 'Iron' },\n 'Sunrise',\n 'Swiftfox',\n 'Vivaldi',\n 'Waterfox',\n 'WebPositive',\n { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' },\n { 'label': 'UC Browser', 'pattern': 'UCBrowser' },\n 'Opera Mini',\n { 'label': 'Opera Mini', 'pattern': 'OPiOS' },\n 'Opera',\n { 'label': 'Opera', 'pattern': 'OPR' },\n 'Chromium',\n 'Chrome',\n { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' },\n { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' },\n { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' },\n { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' },\n { 'label': 'IE', 'pattern': 'IEMobile' },\n { 'label': 'IE', 'pattern': 'MSIE' },\n 'Safari'\n ]);\n\n /* Detectable products (order is important). */\n var product = getProduct([\n { 'label': 'BlackBerry', 'pattern': 'BB10' },\n 'BlackBerry',\n { 'label': 'Galaxy S', 'pattern': 'GT-I9000' },\n { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' },\n { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' },\n { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' },\n { 'label': 'Galaxy S5', 'pattern': 'SM-G900' },\n { 'label': 'Galaxy S6', 'pattern': 'SM-G920' },\n { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' },\n { 'label': 'Galaxy S7', 'pattern': 'SM-G930' },\n { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' },\n 'Google TV',\n 'Lumia',\n 'iPad',\n 'iPod',\n 'iPhone',\n 'Kindle',\n { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' },\n 'Nexus',\n 'Nook',\n 'PlayBook',\n 'PlayStation Vita',\n 'PlayStation',\n 'TouchPad',\n 'Transformer',\n { 'label': 'Wii U', 'pattern': 'WiiU' },\n 'Wii',\n 'Xbox One',\n { 'label': 'Xbox 360', 'pattern': 'Xbox' },\n 'Xoom'\n ]);\n\n /* Detectable manufacturers. */\n var manufacturer = getManufacturer({\n 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 },\n 'Alcatel': {},\n 'Archos': {},\n 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 },\n 'Asus': { 'Transformer': 1 },\n 'Barnes & Noble': { 'Nook': 1 },\n 'BlackBerry': { 'PlayBook': 1 },\n 'Google': { 'Google TV': 1, 'Nexus': 1 },\n 'HP': { 'TouchPad': 1 },\n 'HTC': {},\n 'Huawei': {},\n 'Lenovo': {},\n 'LG': {},\n 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 },\n 'Motorola': { 'Xoom': 1 },\n 'Nintendo': { 'Wii U': 1, 'Wii': 1 },\n 'Nokia': { 'Lumia': 1 },\n 'Oppo': {},\n 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 },\n 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 },\n 'Xiaomi': { 'Mi': 1, 'Redmi': 1 }\n });\n\n /* Detectable operating systems (order is important). */\n var os = getOS([\n 'Windows Phone',\n 'KaiOS',\n 'Android',\n 'CentOS',\n { 'label': 'Chrome OS', 'pattern': 'CrOS' },\n 'Debian',\n { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' },\n 'Fedora',\n 'FreeBSD',\n 'Gentoo',\n 'Haiku',\n 'Kubuntu',\n 'Linux Mint',\n 'OpenBSD',\n 'Red Hat',\n 'SuSE',\n 'Ubuntu',\n 'Xubuntu',\n 'Cygwin',\n 'Symbian OS',\n 'hpwOS',\n 'webOS ',\n 'webOS',\n 'Tablet OS',\n 'Tizen',\n 'Linux',\n 'Mac OS X',\n 'Macintosh',\n 'Mac',\n 'Windows 98;',\n 'Windows '\n ]);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Picks the layout engine from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected layout engine.\n */\n function getLayout(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the manufacturer from an array of guesses.\n *\n * @private\n * @param {Array} guesses An object of guesses.\n * @returns {null|string} The detected manufacturer.\n */\n function getManufacturer(guesses) {\n return reduce(guesses, function(result, value, key) {\n // Lookup the manufacturer by product or scan the UA for the manufacturer.\n return result || (\n value[product] ||\n value[/^[a-z]+(?: +[a-z]+\\b)*/i.exec(product)] ||\n RegExp('\\\\b' + qualify(key) + '(?:\\\\b|\\\\w*\\\\d)', 'i').exec(ua)\n ) && key;\n });\n }\n\n /**\n * Picks the browser name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected browser name.\n */\n function getName(guesses) {\n return reduce(guesses, function(result, guess) {\n return result || RegExp('\\\\b' + (\n guess.pattern || qualify(guess)\n ) + '\\\\b', 'i').exec(ua) && (guess.label || guess);\n });\n }\n\n /**\n * Picks the OS name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected OS name.\n */\n function getOS(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + '(?:/[\\\\d.]+|[ \\\\w.]*)', 'i').exec(ua)\n )) {\n result = cleanupOS(result, pattern, guess.label || guess);\n }\n return result;\n });\n }\n\n /**\n * Picks the product name from an array of guesses.\n *\n * @private\n * @param {Array} guesses An array of guesses.\n * @returns {null|string} The detected product name.\n */\n function getProduct(guesses) {\n return reduce(guesses, function(result, guess) {\n var pattern = guess.pattern || qualify(guess);\n if (!result && (result =\n RegExp('\\\\b' + pattern + ' *\\\\d+[.\\\\w_]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + ' *\\\\w+-[\\\\w]*', 'i').exec(ua) ||\n RegExp('\\\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\\\d+|[^ ();-]*)', 'i').exec(ua)\n )) {\n // Split by forward slash and append product version if needed.\n if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\\d.]+/.test(result[0])) {\n result[0] += ' ' + result[1];\n }\n // Correct character case and cleanup string.\n guess = guess.label || guess;\n result = format(result[0]\n .replace(RegExp(pattern, 'i'), guess)\n .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ')\n .replace(RegExp('(' + guess + ')[-_.]?(\\\\w)', 'i'), '$1 $2'));\n }\n return result;\n });\n }\n\n /**\n * Resolves the version using an array of UA patterns.\n *\n * @private\n * @param {Array} patterns An array of UA patterns.\n * @returns {null|string} The detected version.\n */\n function getVersion(patterns) {\n return reduce(patterns, function(result, pattern) {\n return result || (RegExp(pattern +\n '(?:-[\\\\d.]+/|(?: for [\\\\w-]+)?[ /-])([\\\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null;\n });\n }\n\n /**\n * Returns `platform.description` when the platform object is coerced to a string.\n *\n * @name toString\n * @memberOf platform\n * @returns {string} Returns `platform.description` if available, else an empty string.\n */\n function toStringPlatform() {\n return this.description || '';\n }\n\n /*------------------------------------------------------------------------*/\n\n // Convert layout to an array so we can add extra details.\n layout && (layout = [layout]);\n\n // Detect Android products.\n // Browsers on Android devices typically provide their product IDS after \"Android;\"\n // up to \"Build\" or \") AppleWebKit\".\n // Example:\n // \"Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36\n // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36\"\n if (/\\bAndroid\\b/.test(os) && !product &&\n (data = /\\bAndroid[^;]*;(.*?)(?:Build|\\) AppleWebKit)\\b/i.exec(ua))) {\n product = trim(data[1])\n // Replace any language codes (eg. \"en-US\").\n .replace(/^[a-z]{2}-[a-z]{2};\\s*/i, '')\n || null;\n }\n // Detect product names that contain their manufacturer's name.\n if (manufacturer && !product) {\n product = getProduct([manufacturer]);\n } else if (manufacturer && product) {\n product = product\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\\\s]', 'i'), manufacturer + ' ')\n .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\\\w)', 'i'), manufacturer + ' $2');\n }\n // Clean up Google TV.\n if ((data = /\\bGoogle TV\\b/.exec(product))) {\n product = data[0];\n }\n // Detect simulators.\n if (/\\bSimulator\\b/i.test(ua)) {\n product = (product ? product + ' ' : '') + 'Simulator';\n }\n // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS.\n if (name == 'Opera Mini' && /\\bOPiOS\\b/.test(ua)) {\n description.push('running in Turbo/Uncompressed mode');\n }\n // Detect IE Mobile 11.\n if (name == 'IE' && /\\blike iPhone OS\\b/.test(ua)) {\n data = parse(ua.replace(/like iPhone OS/, ''));\n manufacturer = data.manufacturer;\n product = data.product;\n }\n // Detect iOS.\n else if (/^iP/.test(product)) {\n name || (name = 'Safari');\n os = 'iOS' + ((data = / OS ([\\d_]+)/i.exec(ua))\n ? ' ' + data[1].replace(/_/g, '.')\n : '');\n }\n // Detect Kubuntu.\n else if (name == 'Konqueror' && /^Linux\\b/i.test(os)) {\n os = 'Kubuntu';\n }\n // Detect Android browsers.\n else if ((manufacturer && manufacturer != 'Google' &&\n ((/Chrome/.test(name) && !/\\bMobile Safari\\b/i.test(ua)) || /\\bVita\\b/.test(product))) ||\n (/\\bAndroid\\b/.test(os) && /^Chrome/.test(name) && /\\bVersion\\//i.test(ua))) {\n name = 'Android Browser';\n os = /\\bAndroid\\b/.test(os) ? os : 'Android';\n }\n // Detect Silk desktop/accelerated modes.\n else if (name == 'Silk') {\n if (!/\\bMobi/i.test(ua)) {\n os = 'Android';\n description.unshift('desktop mode');\n }\n if (/Accelerated *= *true/i.test(ua)) {\n description.unshift('accelerated');\n }\n }\n // Detect UC Browser speed mode.\n else if (name == 'UC Browser' && /\\bUCWEB\\b/.test(ua)) {\n description.push('speed mode');\n }\n // Detect PaleMoon identifying as Firefox.\n else if (name == 'PaleMoon' && (data = /\\bFirefox\\/([\\d.]+)\\b/.exec(ua))) {\n description.push('identifying as Firefox ' + data[1]);\n }\n // Detect Firefox OS and products running Firefox.\n else if (name == 'Firefox' && (data = /\\b(Mobile|Tablet|TV)\\b/i.exec(ua))) {\n os || (os = 'Firefox OS');\n product || (product = data[1]);\n }\n // Detect false positives for Firefox/Safari.\n else if (!name || (data = !/\\bMinefield\\b/i.test(ua) && /\\b(?:Firefox|Safari)\\b/.exec(name))) {\n // Escape the `/` for Firefox 1.\n if (name && !product && /[\\/,]|^[^(]+?\\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) {\n // Clear name of false positives.\n name = null;\n }\n // Reassign a generic name.\n if ((data = product || manufacturer || os) &&\n (product || manufacturer || /\\b(?:Android|Symbian OS|Tablet OS|webOS)\\b/.test(os))) {\n name = /[a-z]+(?: Hat)?/i.exec(/\\bAndroid\\b/.test(os) ? os : data) + ' Browser';\n }\n }\n // Add Chrome version to description for Electron.\n else if (name == 'Electron' && (data = (/\\bChrome\\/([\\d.]+)\\b/.exec(ua) || 0)[1])) {\n description.push('Chromium ' + data);\n }\n // Detect non-Opera (Presto-based) versions (order is important).\n if (!version) {\n version = getVersion([\n '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\\\d.]+$)|UCBrowser|YaBrowser)',\n 'Version',\n qualify(name),\n '(?:Firefox|Minefield|NetFront)'\n ]);\n }\n // Detect stubborn layout engines.\n if ((data =\n layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' ||\n /\\bOpera\\b/.test(name) && (/\\bOPR\\b/.test(ua) ? 'Blink' : 'Presto') ||\n /\\b(?:Midori|Nook|Safari)\\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' ||\n !layout && /\\bMSIE\\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') ||\n layout == 'WebKit' && /\\bPlayStation\\b(?! Vita\\b)/i.test(name) && 'NetFront'\n )) {\n layout = [data];\n }\n // Detect Windows Phone 7 desktop mode.\n if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\\d+)/i.exec(ua) || 0)[1])) {\n name += ' Mobile';\n os = 'Windows Phone ' + (/\\+$/.test(data) ? data : data + '.x');\n description.unshift('desktop mode');\n }\n // Detect Windows Phone 8.x desktop mode.\n else if (/\\bWPDesktop\\b/i.test(ua)) {\n name = 'IE Mobile';\n os = 'Windows Phone 8.x';\n description.unshift('desktop mode');\n version || (version = (/\\brv:([\\d.]+)/.exec(ua) || 0)[1]);\n }\n // Detect IE 11 identifying as other browsers.\n else if (name != 'IE' && layout == 'Trident' && (data = /\\brv:([\\d.]+)/.exec(ua))) {\n if (name) {\n description.push('identifying as ' + name + (version ? ' ' + version : ''));\n }\n name = 'IE';\n version = data[1];\n }\n // Leverage environment features.\n if (useFeatures) {\n // Detect server-side environments.\n // Rhino has a global function while others have a global object.\n if (isHostType(context, 'global')) {\n if (java) {\n data = java.lang.System;\n arch = data.getProperty('os.arch');\n os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version');\n }\n if (rhino) {\n try {\n version = context.require('ringo/engine').version.join('.');\n name = 'RingoJS';\n } catch(e) {\n if ((data = context.system) && data.global.system == context.system) {\n name = 'Narwhal';\n os || (os = data[0].os || null);\n }\n }\n if (!name) {\n name = 'Rhino';\n }\n }\n else if (\n typeof context.process == 'object' && !context.process.browser &&\n (data = context.process)\n ) {\n if (typeof data.versions == 'object') {\n if (typeof data.versions.electron == 'string') {\n description.push('Node ' + data.versions.node);\n name = 'Electron';\n version = data.versions.electron;\n } else if (typeof data.versions.nw == 'string') {\n description.push('Chromium ' + version, 'Node ' + data.versions.node);\n name = 'NW.js';\n version = data.versions.nw;\n }\n }\n if (!name) {\n name = 'Node.js';\n arch = data.arch;\n os = data.platform;\n version = /[\\d.]+/.exec(data.version);\n version = version ? version[0] : null;\n }\n }\n }\n // Detect Adobe AIR.\n else if (getClassOf((data = context.runtime)) == airRuntimeClass) {\n name = 'Adobe AIR';\n os = data.flash.system.Capabilities.os;\n }\n // Detect PhantomJS.\n else if (getClassOf((data = context.phantom)) == phantomClass) {\n name = 'PhantomJS';\n version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch);\n }\n // Detect IE compatibility modes.\n else if (typeof doc.documentMode == 'number' && (data = /\\bTrident\\/(\\d+)/i.exec(ua))) {\n // We're in compatibility mode when the Trident version + 4 doesn't\n // equal the document mode.\n version = [version, doc.documentMode];\n if ((data = +data[1] + 4) != version[1]) {\n description.push('IE ' + version[1] + ' mode');\n layout && (layout[1] = '');\n version[1] = data;\n }\n version = name == 'IE' ? String(version[1].toFixed(1)) : version[0];\n }\n // Detect IE 11 masking as other browsers.\n else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\\b/.test(name)) {\n description.push('masking as ' + name + ' ' + version);\n name = 'IE';\n version = '11.0';\n layout = ['Trident'];\n os = 'Windows';\n }\n os = os && format(os);\n }\n // Detect prerelease phases.\n if (version && (data =\n /(?:[ab]|dp|pre|[ab]\\d+pre)(?:\\d+\\+?)?$/i.exec(version) ||\n /(?:alpha|beta)(?: ?\\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) ||\n /\\bMinefield\\b/i.test(ua) && 'a'\n )) {\n prerelease = /b/i.test(data) ? 'beta' : 'alpha';\n version = version.replace(RegExp(data + '\\\\+?$'), '') +\n (prerelease == 'beta' ? beta : alpha) + (/\\d+\\+?/.exec(data) || '');\n }\n // Detect Firefox Mobile.\n if (name == 'Fennec' || name == 'Firefox' && /\\b(?:Android|Firefox OS|KaiOS)\\b/.test(os)) {\n name = 'Firefox Mobile';\n }\n // Obscure Maxthon's unreliable version.\n else if (name == 'Maxthon' && version) {\n version = version.replace(/\\.[\\d.]+/, '.x');\n }\n // Detect Xbox 360 and Xbox One.\n else if (/\\bXbox\\b/i.test(product)) {\n if (product == 'Xbox 360') {\n os = null;\n }\n if (product == 'Xbox 360' && /\\bIEMobile\\b/.test(ua)) {\n description.unshift('mobile mode');\n }\n }\n // Add mobile postfix.\n else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) &&\n (os == 'Windows CE' || /Mobi/i.test(ua))) {\n name += ' Mobile';\n }\n // Detect IE platform preview.\n else if (name == 'IE' && useFeatures) {\n try {\n if (context.external === null) {\n description.unshift('platform preview');\n }\n } catch(e) {\n description.unshift('embedded');\n }\n }\n // Detect BlackBerry OS version.\n // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp\n else if ((/\\bBlackBerry\\b/.test(product) || /\\bBB10\\b/.test(ua)) && (data =\n (RegExp(product.replace(/ +/g, ' *') + '/([.\\\\d]+)', 'i').exec(ua) || 0)[1] ||\n version\n )) {\n data = [data, /BB10/.test(ua)];\n os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0];\n version = null;\n }\n // Detect Opera identifying/masking itself as another browser.\n // http://www.opera.com/support/kb/view/843/\n else if (this != forOwn && product != 'Wii' && (\n (useFeatures && opera) ||\n (/Opera/.test(name) && /\\b(?:MSIE|Firefox)\\b/i.test(ua)) ||\n (name == 'Firefox' && /\\bOS X (?:\\d+\\.){2,}/.test(os)) ||\n (name == 'IE' && (\n (os && !/^Win/.test(os) && version > 5.5) ||\n /\\bWindows XP\\b/.test(os) && version > 8 ||\n version == 8 && !/\\bTrident\\b/.test(ua)\n ))\n ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) {\n // When \"identifying\", the UA contains both Opera and the other browser's name.\n data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : '');\n if (reOpera.test(name)) {\n if (/\\bIE\\b/.test(data) && os == 'Mac OS') {\n os = null;\n }\n data = 'identify' + data;\n }\n // When \"masking\", the UA contains only the other browser's name.\n else {\n data = 'mask' + data;\n if (operaClass) {\n name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2'));\n } else {\n name = 'Opera';\n }\n if (/\\bIE\\b/.test(data)) {\n os = null;\n }\n if (!useFeatures) {\n version = null;\n }\n }\n layout = ['Presto'];\n description.push(data);\n }\n // Detect WebKit Nightly and approximate Chrome/Safari versions.\n if ((data = (/\\bAppleWebKit\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n // Correct build number for numeric comparison.\n // (e.g. \"532.5\" becomes \"532.05\")\n data = [parseFloat(data.replace(/\\.(\\d)$/, '.0$1')), data];\n // Nightly builds are postfixed with a \"+\".\n if (name == 'Safari' && data[1].slice(-1) == '+') {\n name = 'WebKit Nightly';\n prerelease = 'alpha';\n version = data[1].slice(0, -1);\n }\n // Clear incorrect browser versions.\n else if (version == data[1] ||\n version == (data[2] = (/\\bSafari\\/([\\d.]+\\+?)/i.exec(ua) || 0)[1])) {\n version = null;\n }\n // Use the full Chrome version when available.\n data[1] = (/\\b(?:Headless)?Chrome\\/([\\d.]+)/i.exec(ua) || 0)[1];\n // Detect Blink layout engine.\n if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') {\n layout = ['Blink'];\n }\n // Detect JavaScriptCore.\n // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi\n if (!useFeatures || (!likeChrome && !data[1])) {\n layout && (layout[1] = 'like Safari');\n data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12');\n } else {\n layout && (layout[1] = 'like Chrome');\n data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28');\n }\n // Add the postfix of \".x\" or \"+\" for approximate versions.\n layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+'));\n // Obscure version for some Safari 1-2 releases.\n if (name == 'Safari' && (!version || parseInt(version) > 45)) {\n version = data;\n } else if (name == 'Chrome' && /\\bHeadlessChrome/i.test(ua)) {\n description.unshift('headless');\n }\n }\n // Detect Opera desktop modes.\n if (name == 'Opera' && (data = /\\bzbov|zvav$/.exec(os))) {\n name += ' ';\n description.unshift('desktop mode');\n if (data == 'zvav') {\n name += 'Mini';\n version = null;\n } else {\n name += 'Mobile';\n }\n os = os.replace(RegExp(' *' + data + '$'), '');\n }\n // Detect Chrome desktop mode.\n else if (name == 'Safari' && /\\bChrome\\b/.exec(layout && layout[1])) {\n description.unshift('desktop mode');\n name = 'Chrome Mobile';\n version = null;\n\n if (/\\bOS X\\b/.test(os)) {\n manufacturer = 'Apple';\n os = 'iOS 4.3+';\n } else {\n os = null;\n }\n }\n // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number.\n else if (/\\bSRWare Iron\\b/.test(name) && !version) {\n version = getVersion('Chrome');\n }\n // Strip incorrect OS versions.\n if (version && version.indexOf((data = /[\\d.]+$/.exec(os))) == 0 &&\n ua.indexOf('/' + data + '-') > -1) {\n os = trim(os.replace(data, ''));\n }\n // Ensure OS does not include the browser name.\n if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) {\n os = os.replace(RegExp(' *' + qualify(name) + ' *'), '');\n }\n // Add layout engine.\n if (layout && !/\\b(?:Avant|Nook)\\b/.test(name) && (\n /Browser|Lunascape|Maxthon/.test(name) ||\n name != 'Safari' && /^iOS/.test(os) && /\\bSafari\\b/.test(layout[1]) ||\n /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) {\n // Don't add layout details to description if they are falsey.\n (data = layout[layout.length - 1]) && description.push(data);\n }\n // Combine contextual information.\n if (description.length) {\n description = ['(' + description.join('; ') + ')'];\n }\n // Append manufacturer to description.\n if (manufacturer && product && product.indexOf(manufacturer) < 0) {\n description.push('on ' + manufacturer);\n }\n // Append product to description.\n if (product) {\n description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product);\n }\n // Parse the OS into an object.\n if (os) {\n data = / ([\\d.+]+)$/.exec(os);\n isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/';\n os = {\n 'architecture': 32,\n 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os,\n 'version': data ? data[1] : null,\n 'toString': function() {\n var version = this.version;\n return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : '');\n }\n };\n }\n // Add browser/OS architecture.\n if ((data = /\\b(?:AMD|IA|Win|WOW|x86_|x)64\\b/i.exec(arch)) && !/\\bi686\\b/i.test(arch)) {\n if (os) {\n os.architecture = 64;\n os.family = os.family.replace(RegExp(' *' + data), '');\n }\n if (\n name && (/\\bWOW64\\b/i.test(ua) ||\n (useFeatures && /\\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\\bWin64; x64\\b/i.test(ua)))\n ) {\n description.unshift('32-bit');\n }\n }\n // Chrome 39 and above on OS X is always 64-bit.\n else if (\n os && /^OS X/.test(os.family) &&\n name == 'Chrome' && parseFloat(version) >= 39\n ) {\n os.architecture = 64;\n }\n\n ua || (ua = null);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The platform object.\n *\n * @name platform\n * @type Object\n */\n var platform = {};\n\n /**\n * The platform description.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.description = ua;\n\n /**\n * The name of the browser's layout engine.\n *\n * The list of common layout engines include:\n * \"Blink\", \"EdgeHTML\", \"Gecko\", \"Trident\" and \"WebKit\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.layout = layout && layout[0];\n\n /**\n * The name of the product's manufacturer.\n *\n * The list of manufacturers include:\n * \"Apple\", \"Archos\", \"Amazon\", \"Asus\", \"Barnes & Noble\", \"BlackBerry\",\n * \"Google\", \"HP\", \"HTC\", \"LG\", \"Microsoft\", \"Motorola\", \"Nintendo\",\n * \"Nokia\", \"Samsung\" and \"Sony\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.manufacturer = manufacturer;\n\n /**\n * The name of the browser/environment.\n *\n * The list of common browser names include:\n * \"Chrome\", \"Electron\", \"Firefox\", \"Firefox for iOS\", \"IE\",\n * \"Microsoft Edge\", \"PhantomJS\", \"Safari\", \"SeaMonkey\", \"Silk\",\n * \"Opera Mini\" and \"Opera\"\n *\n * Mobile versions of some browsers have \"Mobile\" appended to their name:\n * eg. \"Chrome Mobile\", \"Firefox Mobile\", \"IE Mobile\" and \"Opera Mobile\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.name = name;\n\n /**\n * The alpha/beta release indicator.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.prerelease = prerelease;\n\n /**\n * The name of the product hosting the browser.\n *\n * The list of common products include:\n *\n * \"BlackBerry\", \"Galaxy S4\", \"Lumia\", \"iPad\", \"iPod\", \"iPhone\", \"Kindle\",\n * \"Kindle Fire\", \"Nexus\", \"Nook\", \"PlayBook\", \"TouchPad\" and \"Transformer\"\n *\n * @memberOf platform\n * @type string|null\n */\n platform.product = product;\n\n /**\n * The browser's user agent string.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.ua = ua;\n\n /**\n * The browser/environment version.\n *\n * @memberOf platform\n * @type string|null\n */\n platform.version = name && version;\n\n /**\n * The name of the operating system.\n *\n * @memberOf platform\n * @type Object\n */\n platform.os = os || {\n\n /**\n * The CPU architecture the OS is built for.\n *\n * @memberOf platform.os\n * @type number|null\n */\n 'architecture': null,\n\n /**\n * The family of the OS.\n *\n * Common values include:\n * \"Windows\", \"Windows Server 2008 R2 / 7\", \"Windows Server 2008 / Vista\",\n * \"Windows XP\", \"OS X\", \"Linux\", \"Ubuntu\", \"Debian\", \"Fedora\", \"Red Hat\",\n * \"SuSE\", \"Android\", \"iOS\" and \"Windows Phone\"\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'family': null,\n\n /**\n * The version of the OS.\n *\n * @memberOf platform.os\n * @type string|null\n */\n 'version': null,\n\n /**\n * Returns the OS string.\n *\n * @memberOf platform.os\n * @returns {string} The OS string.\n */\n 'toString': function() { return 'null'; }\n };\n\n platform.parse = parse;\n platform.toString = toStringPlatform;\n\n if (platform.version) {\n description.unshift(version);\n }\n if (platform.name) {\n description.unshift(name);\n }\n if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) {\n description.push(product ? '(' + os + ')' : 'on ' + os);\n }\n if (description.length) {\n platform.description = description.join(' ');\n }\n return platform;\n }\n\n /*--------------------------------------------------------------------------*/\n\n // Export platform.\n var platform = parse();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose platform on the global object to prevent errors when platform is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n root.platform = platform;\n\n // Define as an anonymous module so platform can be aliased through path mapping.\n define(function() {\n return platform;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for CommonJS support.\n forOwn(platform, function(value, key) {\n freeExports[key] = value;\n });\n }\n else {\n // Export to the global object.\n root.platform = platform;\n }\n}.call(this));\n","/*!\n* screenfull\n* v5.2.0 - 2021-11-03\n* (c) Sindre Sorhus; MIT License\n*/\n(function () {\n\t'use strict';\n\n\tvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\tvar isCommonjs = typeof module !== 'undefined' && module.exports;\n\n\tvar fn = (function () {\n\t\tvar val;\n\n\t\tvar fnMap = [\n\t\t\t[\n\t\t\t\t'requestFullscreen',\n\t\t\t\t'exitFullscreen',\n\t\t\t\t'fullscreenElement',\n\t\t\t\t'fullscreenEnabled',\n\t\t\t\t'fullscreenchange',\n\t\t\t\t'fullscreenerror'\n\t\t\t],\n\t\t\t// New WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullscreen',\n\t\t\t\t'webkitExitFullscreen',\n\t\t\t\t'webkitFullscreenElement',\n\t\t\t\t'webkitFullscreenEnabled',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t// Old WebKit\n\t\t\t[\n\t\t\t\t'webkitRequestFullScreen',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitCurrentFullScreenElement',\n\t\t\t\t'webkitCancelFullScreen',\n\t\t\t\t'webkitfullscreenchange',\n\t\t\t\t'webkitfullscreenerror'\n\n\t\t\t],\n\t\t\t[\n\t\t\t\t'mozRequestFullScreen',\n\t\t\t\t'mozCancelFullScreen',\n\t\t\t\t'mozFullScreenElement',\n\t\t\t\t'mozFullScreenEnabled',\n\t\t\t\t'mozfullscreenchange',\n\t\t\t\t'mozfullscreenerror'\n\t\t\t],\n\t\t\t[\n\t\t\t\t'msRequestFullscreen',\n\t\t\t\t'msExitFullscreen',\n\t\t\t\t'msFullscreenElement',\n\t\t\t\t'msFullscreenEnabled',\n\t\t\t\t'MSFullscreenChange',\n\t\t\t\t'MSFullscreenError'\n\t\t\t]\n\t\t];\n\n\t\tvar i = 0;\n\t\tvar l = fnMap.length;\n\t\tvar ret = {};\n\n\t\tfor (; i < l; i++) {\n\t\t\tval = fnMap[i];\n\t\t\tif (val && val[1] in document) {\n\t\t\t\tfor (i = 0; i < val.length; i++) {\n\t\t\t\t\tret[fnMap[0][i]] = val[i];\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})();\n\n\tvar eventNameMap = {\n\t\tchange: fn.fullscreenchange,\n\t\terror: fn.fullscreenerror\n\t};\n\n\tvar screenfull = {\n\t\trequest: function (element, options) {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tvar onFullScreenEntered = function () {\n\t\t\t\t\tthis.off('change', onFullScreenEntered);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenEntered);\n\n\t\t\t\telement = element || document.documentElement;\n\n\t\t\t\tvar returnPromise = element[fn.requestFullscreen](options);\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenEntered).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\texit: function () {\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tif (!this.isFullscreen) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar onFullScreenExit = function () {\n\t\t\t\t\tthis.off('change', onFullScreenExit);\n\t\t\t\t\tresolve();\n\t\t\t\t}.bind(this);\n\n\t\t\t\tthis.on('change', onFullScreenExit);\n\n\t\t\t\tvar returnPromise = document[fn.exitFullscreen]();\n\n\t\t\t\tif (returnPromise instanceof Promise) {\n\t\t\t\t\treturnPromise.then(onFullScreenExit).catch(reject);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t},\n\t\ttoggle: function (element, options) {\n\t\t\treturn this.isFullscreen ? this.exit() : this.request(element, options);\n\t\t},\n\t\tonchange: function (callback) {\n\t\t\tthis.on('change', callback);\n\t\t},\n\t\tonerror: function (callback) {\n\t\t\tthis.on('error', callback);\n\t\t},\n\t\ton: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.addEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\toff: function (event, callback) {\n\t\t\tvar eventName = eventNameMap[event];\n\t\t\tif (eventName) {\n\t\t\t\tdocument.removeEventListener(eventName, callback, false);\n\t\t\t}\n\t\t},\n\t\traw: fn\n\t};\n\n\tif (!fn) {\n\t\tif (isCommonjs) {\n\t\t\tmodule.exports = {isEnabled: false};\n\t\t} else {\n\t\t\twindow.screenfull = {isEnabled: false};\n\t\t}\n\n\t\treturn;\n\t}\n\n\tObject.defineProperties(screenfull, {\n\t\tisFullscreen: {\n\t\t\tget: function () {\n\t\t\t\treturn Boolean(document[fn.fullscreenElement]);\n\t\t\t}\n\t\t},\n\t\telement: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\treturn document[fn.fullscreenElement];\n\t\t\t}\n\t\t},\n\t\tisEnabled: {\n\t\t\tenumerable: true,\n\t\t\tget: function () {\n\t\t\t\t// Coerce to boolean in case of old WebKit\n\t\t\t\treturn Boolean(document[fn.fullscreenEnabled]);\n\t\t\t}\n\t\t}\n\t});\n\n\tif (isCommonjs) {\n\t\tmodule.exports = screenfull;\n\t} else {\n\t\twindow.screenfull = screenfull;\n\t}\n})();\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrÑ–bute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return e;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var t,\n e = {},\n r = Object.prototype,\n n = r.hasOwnProperty,\n o = Object.defineProperty || function (t, e, r) {\n t[e] = r.value;\n },\n i = \"function\" == typeof Symbol ? Symbol : {},\n a = i.iterator || \"@@iterator\",\n c = i.asyncIterator || \"@@asyncIterator\",\n u = i.toStringTag || \"@@toStringTag\";\n function define(t, e, r) {\n return Object.defineProperty(t, e, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), t[e];\n }\n try {\n define({}, \"\");\n } catch (t) {\n define = function define(t, e, r) {\n return t[e] = r;\n };\n }\n function wrap(t, e, r, n) {\n var i = e && e.prototype instanceof Generator ? e : Generator,\n a = Object.create(i.prototype),\n c = new Context(n || []);\n return o(a, \"_invoke\", {\n value: makeInvokeMethod(t, r, c)\n }), a;\n }\n function tryCatch(t, e, r) {\n try {\n return {\n type: \"normal\",\n arg: t.call(e, r)\n };\n } catch (t) {\n return {\n type: \"throw\",\n arg: t\n };\n }\n }\n e.wrap = wrap;\n var h = \"suspendedStart\",\n l = \"suspendedYield\",\n f = \"executing\",\n s = \"completed\",\n y = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var p = {};\n define(p, a, function () {\n return this;\n });\n var d = Object.getPrototypeOf,\n v = d && d(d(values([])));\n v && v !== r && n.call(v, a) && (p = v);\n var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n function defineIteratorMethods(t) {\n [\"next\", \"throw\", \"return\"].forEach(function (e) {\n define(t, e, function (t) {\n return this._invoke(e, t);\n });\n });\n }\n function AsyncIterator(t, e) {\n function invoke(r, o, i, a) {\n var c = tryCatch(t[r], t, o);\n if (\"throw\" !== c.type) {\n var u = c.arg,\n h = u.value;\n return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n invoke(\"next\", t, i, a);\n }, function (t) {\n invoke(\"throw\", t, i, a);\n }) : e.resolve(h).then(function (t) {\n u.value = t, i(u);\n }, function (t) {\n return invoke(\"throw\", t, i, a);\n });\n }\n a(c.arg);\n }\n var r;\n o(this, \"_invoke\", {\n value: function value(t, n) {\n function callInvokeWithMethodAndArg() {\n return new e(function (e, r) {\n invoke(t, n, e, r);\n });\n }\n return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(e, r, n) {\n var o = h;\n return function (i, a) {\n if (o === f) throw new Error(\"Generator is already running\");\n if (o === s) {\n if (\"throw\" === i) throw a;\n return {\n value: t,\n done: !0\n };\n }\n for (n.method = i, n.arg = a;;) {\n var c = n.delegate;\n if (c) {\n var u = maybeInvokeDelegate(c, n);\n if (u) {\n if (u === y) continue;\n return u;\n }\n }\n if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n if (o === h) throw o = s, n.arg;\n n.dispatchException(n.arg);\n } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n o = f;\n var p = tryCatch(e, r, n);\n if (\"normal\" === p.type) {\n if (o = n.done ? s : l, p.arg === y) continue;\n return {\n value: p.arg,\n done: n.done\n };\n }\n \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n }\n };\n }\n function maybeInvokeDelegate(e, r) {\n var n = r.method,\n o = e.iterator[n];\n if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n var i = tryCatch(o, e.iterator, r.arg);\n if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n var a = i.arg;\n return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n }\n function pushTryEntry(t) {\n var e = {\n tryLoc: t[0]\n };\n 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n }\n function resetTryEntry(t) {\n var e = t.completion || {};\n e.type = \"normal\", delete e.arg, t.completion = e;\n }\n function Context(t) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], t.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(e) {\n if (e || \"\" === e) {\n var r = e[a];\n if (r) return r.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) {\n var o = -1,\n i = function next() {\n for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n return next.value = t, next.done = !0, next;\n };\n return i.next = i;\n }\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), o(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n var e = \"function\" == typeof t && t.constructor;\n return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n }, e.mark = function (t) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n }, e.awrap = function (t) {\n return {\n __await: t\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n return this;\n }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n void 0 === i && (i = Promise);\n var a = new AsyncIterator(wrap(t, r, n, o), i);\n return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n return t.done ? t.value : a.next();\n });\n }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n return this;\n }), define(g, \"toString\", function () {\n return \"[object Generator]\";\n }), e.keys = function (t) {\n var e = Object(t),\n r = [];\n for (var n in e) r.push(n);\n return r.reverse(), function next() {\n for (; r.length;) {\n var t = r.pop();\n if (t in e) return next.value = t, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, e.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(e) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n },\n stop: function stop() {\n this.done = !0;\n var t = this.tryEntries[0].completion;\n if (\"throw\" === t.type) throw t.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(e) {\n if (this.done) throw e;\n var r = this;\n function handle(n, o) {\n return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n }\n for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n var i = this.tryEntries[o],\n a = i.completion;\n if (\"root\" === i.tryLoc) return handle(\"end\");\n if (i.tryLoc <= this.prev) {\n var c = n.call(i, \"catchLoc\"),\n u = n.call(i, \"finallyLoc\");\n if (c && u) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n } else if (c) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n } else {\n if (!u) throw new Error(\"try statement without catch or finally\");\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(t, e) {\n for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n var o = this.tryEntries[r];\n if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n var i = o;\n break;\n }\n }\n i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n var a = i ? i.completion : {};\n return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n },\n complete: function complete(t, e) {\n if (\"throw\" === t.type) throw t.arg;\n return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n },\n finish: function finish(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n }\n },\n \"catch\": function _catch(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.tryLoc === t) {\n var n = r.completion;\n if (\"throw\" === n.type) {\n var o = n.arg;\n resetTryEntry(r);\n }\n return o;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(e, r, n) {\n return this.delegate = {\n iterator: values(e),\n resultName: r,\n nextLoc: n\n }, \"next\" === this.method && (this.arg = t), y;\n }\n }, e;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","export default {\n api: 'https://api.eyeson.team',\n allowSafariSFU: true,\n screencapture: true\n};\n","export default {\n widescreen: false\n};\n","/*eslint no-console: 0*/\n\n/**\n * eyeson Logger implement debug|info|warn|error methods.\n **/\nexport default (function () {\n return {\n error: function (...args) {\n return console.error(...args);\n },\n warn: function (...args) {\n return console.warn(...args);\n },\n info: function (...args) {\n return console.log(...args);\n },\n debug: function (...args) {\n if (!console.debug) {\n return null;\n }\n return console.debug(...args);\n }\n };\n})();\n","/* eslint max-lines: off */\nimport Logger from './Logger.js';\n\n/**\n * eyeson Communications Api\n **/\nclass ComApi {\n constructor(uri, token) {\n this.uri = uri;\n this.token = token.replace(/\\W+/g, '');\n this.cache = { users: [] };\n this.errorCallback = null;\n this._handleError = this._handleError.bind(this);\n }\n\n _request(path, options = {}) {\n return fetch(new Request(this.uri + path), options).then(response => {\n const contentType = response.headers.get('content-type');\n\n if (\n contentType &&\n contentType.indexOf('application/json') !== -1 &&\n response.ok\n ) {\n return response.json();\n }\n\n // not json - e.g. broadcast stop\n if (response.ok) {\n return response.text();\n }\n\n throw new Error(`ComApiError: ${response.status}`);\n });\n }\n\n /**\n * NOTE: slightly adjusted from:\n * https://gist.github.com/ghinda/8442a57f22099bdb2e34\n **/\n /* eslint-disable */\n _objectToFormData(obj, form, namespace) {\n let fd = form || new FormData();\n let formKey = null;\n\n for (let property in obj) {\n if (!obj.hasOwnProperty(property)) {\n return;\n }\n if (namespace) {\n // adjusted, skip \"int props\" for layout api\n let prop = isNaN(parseInt(property)) ? property : '';\n formKey = namespace + '[' + prop + ']';\n } else {\n formKey = property;\n }\n // if the property is an object, but not a File, use recursivity.\n if (\n typeof obj[property] === 'object' &&\n !(obj[property] instanceof File)\n ) {\n this._objectToFormData(obj[property], fd, property);\n } else {\n // if it's a string or a File object\n fd.append(formKey, obj[property]);\n }\n }\n\n return fd;\n }\n /* eslint-enable */\n\n _post(path, data) {\n return this._request(path, {\n method: 'POST',\n body: this._objectToFormData(data)\n });\n }\n\n _put(path, data) {\n const formData = new FormData();\n /* eslint-disable guard-for-in */\n for (const key in data) {\n formData.append(key, data[key]);\n }\n /* eslint-enable */\n return this._request(path, {\n method: 'PUT',\n body: formData\n });\n }\n\n _handleError(error) {\n Logger.error('ComApi::handleError', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return false;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n /**\n * Fetch room details including the user and credentials from com-api.\n **/\n getRoom(callback) {\n return this._request(`/rooms/${this.token}`)\n .then(callback)\n .catch(error => {\n return callback ? callback({ error: error }) : { error: error };\n });\n }\n\n /**\n * Terminate meeting immediately for all users\n **/\n terminateMeeting() {\n return this._request(`/rooms/${this.token}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Retrieve user information. Will use cache on multiple requests.\n **/\n getUser(userId, callback) {\n const user = this.cache.users.find(cachedUser => cachedUser.id === userId);\n\n if (user) {\n callback(user);\n return null;\n }\n\n return this._request(`/rooms/${this.token}/users/${userId}`)\n .then(apiUser => {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n let extendedUser = this.addUserAttributes(apiUser, userId, userId);\n users.push(extendedUser);\n this.cache.users = users;\n callback(extendedUser);\n })\n .catch(this._handleError);\n }\n\n addUserAttributes(user, userId, clientId) {\n let largeAvatarUrl = user.avatar;\n\n try {\n largeAvatarUrl = `${user.avatar}?size=large`;\n } catch (error) {\n Logger.warn('ComApi::addUserAttributes missing', user);\n }\n\n return Object.assign(user, {\n id: userId,\n apiId: user.id,\n clientId: clientId,\n // sipId will be removed in future (2023)!\n sipId: clientId,\n largeAvatar: largeAvatarUrl\n });\n }\n\n /**\n * Remove user from current meeting.\n **/\n kickUser(userId) {\n return this._request(`/rooms/${this.token}/users/${userId}`, {\n method: 'DELETE'\n })\n .then(() => {\n const user = this.cache.users.find(\n cachedUser => cachedUser.id === userId\n );\n if (user) {\n let users = this.cache.users.filter(\n cachedUser => cachedUser.id !== userId\n );\n this.cache.users = users;\n }\n })\n .catch(this._handleError);\n }\n\n /**\n * Request a guest user from api.\n **/\n /* eslint-disable camelcase */\n requestUser(user, callback) {\n return this._post(`/guests/${this.token}`, {\n name: user.name,\n email: user.email,\n custom_fields: {\n locale: user.locale || 'en'\n }\n })\n .then(callback)\n .catch(error => callback({ error: error }));\n }\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n startBroadcast(data, platform) {\n return this._post(`/rooms/${this.token}/broadcasts`, {\n platform: platform,\n player_url: data.playerUrl || '',\n stream_url: data.streamUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Broadcast to a platform.\n **/\n /* eslint-disable camelcase */\n publishBroadcast(data, platform) {\n return this._put(`/rooms/${this.token}/broadcasts/${platform}`, {\n player_url: data.playerUrl\n });\n }\n /* eslint-enable camelcase */\n\n /**\n * Stop a broadcast from a platform.\n **/\n stopBroadcast(platform) {\n return this._request(`/rooms/${this.token}/broadcasts/${platform}`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Stop all broadcasts.\n **/\n stopAllBroadcasts() {\n return this._request(`/rooms/${this.token}/broadcasts`, {\n method: 'DELETE'\n });\n }\n\n /**\n * Start a recording.\n **/\n startRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'POST'\n });\n }\n\n /**\n * Stop a recording\n **/\n stopRecording() {\n return this._request(`/rooms/${this.token}/recording`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Set layout\n * params object either as { layout: 'auto' } or { users: [ id1, id2 ...] }\n **/\n setLayout(params) {\n return this._post(`/rooms/${this.token}/layout`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Set layer\n *\n * params object: {\n * insert: {\n * icon: user['avatar'],\n * title: \"#{user['name']}:\",\n * content: question.truncate(280)\n * }\n * }\n *\n **/\n setLayer(params) {\n return this._post(`/rooms/${this.token}/layers`, params).catch(\n this._handleError\n );\n }\n\n /**\n * Clear front most layer\n **/\n clearFrontLayer() {\n return this._request(`/rooms/${this.token}/layers/1`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Take a snapshot of the current podium\n **/\n takeSnapshot() {\n return this._request(`/rooms/${this.token}/snapshot`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n\n getSnapshot(snapshotId, callback) {\n return this._request(`/rooms/${this.token}/snapshots/${snapshotId}`)\n .then(callback)\n .catch(error => {\n if (callback) {\n callback({ error });\n return;\n }\n this._handleError(error);\n });\n }\n\n /**\n * Start a playback\n **/\n startPlayback(playback) {\n return this._post(`/rooms/${this.token}/playbacks`, {\n playback: playback\n }).catch(this._handleError);\n }\n\n /**\n * Stop a playback identified by play_id\n **/\n stopPlayback(playback) {\n return this._request(`/rooms/${this.token}/playbacks/${playback.play_id}`, {\n method: 'DELETE'\n }).catch(this._handleError);\n }\n\n /**\n * Lock meeting to freeze current participants\n */\n lockMeeting() {\n return this._request(`/rooms/${this.token}/lock`, {\n method: 'POST'\n }).catch(this._handleError);\n }\n}\n\nexport default ComApi;\n","/* eslint-disable */\n/**\n * Creates and returns a new, throttled version of the passed function, that,\n * when invoked repeatedly, will only actually call the original function at most\n * once per every wait milliseconds. Useful for rate-limiting events that occur\n * faster than you can keep up with.\n *\n * By default, throttle will execute the function as soon as you call it for the\n * first time, and, if you call it again any number of times during the wait\n * period, as soon as that period is over. If you'd like to disable the\n * leading-edge call, pass {leading: false}, and if you'd like to disable the\n * execution on the trailing-edge, pass {trailing: false}.\n *\n * @see http://underscorejs.org/#throttle\n **/\nexport default (func, wait, options) => {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n};\n/* eslint-enable */\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n Object.defineProperty(subClass, \"prototype\", {\n writable: false\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import Logger from './../Logger.js';\n\nclass BaseEvent {\n constructor(context) {\n this.context = context;\n }\n\n handle(msg) {\n Logger.error('BaseEvent::handle is not implemented', msg);\n }\n}\n\nexport default BaseEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StartPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.startPlayback(msg.playback);\n }\n}\n\nclass StopPlaybackEvent extends BaseEvent {\n handle(msg) {\n this.context._api.stopPlayback(msg.playback);\n }\n}\n\nexport { StartPlaybackEvent, StopPlaybackEvent };\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import BaseEvent from './BaseEvent.js';\n\nclass PublicEvent extends BaseEvent {\n handle(msg) {\n if (msg._src === 'client') {\n return;\n }\n\n Reflect.deleteProperty(msg, '_src');\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default PublicEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartAnnotationEvent extends PublicEvent {\n handle() {\n this.context.annotationLoop = window.setInterval(() => {\n this.context._api.createAnnotation(\n response => {\n return super.handle({ type: 'annotation', annotation: response });\n },\n () => {\n window.clearInterval(this.context.annotationLoop);\n }\n );\n }, 1000);\n }\n}\n\nclass StopAnnotationEvent extends PublicEvent {\n handle() {\n window.clearInterval(this.context.annotationLoop);\n this.context._api.stopAnnotation();\n }\n}\n\nexport { StartAnnotationEvent, StopAnnotationEvent };\n","import PublicEvent from './PublicEvent.js';\n\nclass StfuEvent extends PublicEvent {\n handle() {\n this.context._rtConnection.send({ type: 'stfu' });\n }\n}\n\nexport default StfuEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass IgnoreEvent extends BaseEvent {\n handle() {\n // do nothing.\n }\n}\n\nexport default IgnoreEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ForwardEvent extends BaseEvent {\n handle(msg) {\n this.context.listeners.forEach(callback => callback(msg));\n }\n}\n\nexport default ForwardEvent;\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator ||\n !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const 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 const 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 let 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(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 const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\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 if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = 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.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js 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/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 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'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/*\n * Copyright (c) 2017 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/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 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/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","/*\n * Copyright (c) 2016 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 */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","import screenfull from 'screenfull';\n\nclass FullscreenHelper {\n constructor() {\n this.onChange = this.onChange.bind(this);\n this.hasSupport = Boolean(screenfull.isEnabled);\n }\n\n toggle() {\n return this.isFullscreen() ? screenfull.exit() : screenfull.request();\n }\n\n canFullscreen() {\n return this.hasSupport;\n }\n\n isFullscreen() {\n return this.hasSupport && screenfull.isFullscreen;\n }\n\n onChange(callback) {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.on('change', () => callback(this.isFullscreen()));\n }\n\n off() {\n if (!this.hasSupport) {\n return;\n }\n\n screenfull.off('change');\n }\n}\n\nexport default FullscreenHelper;\n","/* eslint-disable max-lines */\nimport config from './config.js';\nimport Logger from './Logger.js';\nimport adapter from 'webrtc-adapter';\nimport platform from 'platform';\nimport FullscreenHelper from './FullscreenHelper.js';\n\nlet _canvasBlurSupport = null;\n\n/**\n * Feature Detector.\n **/\nexport default {\n environment: function () {\n return {\n canMix: this.canMix(),\n canPip: this.hasPipSupport(),\n canSFU: this.canSFU(),\n isPhone: this.isPhone(),\n inIframe: this.inIframe(),\n isIOSDevice: this.isIOSDevice(),\n canUseEyeson: this.canUseEyeson(),\n canFullscreen: this.canFullscreen(),\n hasMobileDevice: this.hasMobileDevice(),\n canToggleCamera: this.canToggleCamera(),\n canPresentFiles: this.canPresentFiles(),\n canScreenCapture: this.canScreenCapture(),\n canAdjustSettings: this.canAdjustDeviceSettings(),\n canStreamLocalMedia: this.canStreamLocalMedia(),\n isExperimentalBrowser: this.isExperimentalBrowser()\n };\n },\n\n platform: () => platform,\n\n /**\n * Test if browser should be able to use eyeson.\n * canDataChannel includes hasPeerConnection check\n **/\n canUseEyeson: function () {\n return (\n !this.isWebView() &&\n this.hasGetUserMedia() &&\n this.canDataChannel() &&\n this.isMinimumRequiredBrowser()\n );\n },\n\n hasGetUserMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getUserMedia' in navigator.mediaDevices\n );\n },\n\n hasGetDisplayMedia: function () {\n return (\n 'mediaDevices' in navigator && 'getDisplayMedia' in navigator.mediaDevices\n );\n },\n\n hasPeerConnection: function () {\n return 'RTCPeerConnection' in window;\n },\n\n hasCaptureStream: function () {\n return (\n 'captureStream' in HTMLMediaElement.prototype ||\n 'mozCaptureStream' in HTMLMediaElement.prototype\n );\n },\n\n hasCanvasCaptureSupport: function () {\n return (\n 'CanvasCaptureMediaStream' in window ||\n 'CanvasCaptureMediaStreamTrack' in window\n );\n },\n\n hasSenders: function () {\n return 'RTCRtpSender' in window;\n },\n\n /**\n * 07 Aug 2019 - Safari doesn't seem to fire the event properly.\n **/\n hasTrackOnUnmute: function () {\n if (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n ) {\n return false;\n }\n return 'onunmute' in MediaStreamTrack.prototype;\n },\n\n /**\n * https://caniuse.com/#feat=webp\n **/\n hasWebpSupport: function () {\n if (this.isChrome()) {\n return adapter.browserDetails.version >= 70;\n }\n if (this.isFF()) {\n return adapter.browserDetails.version >= 65;\n }\n\n return false;\n },\n /**\n * Test if user agent supports changing of audio output.\n **/\n canChangeAudioOutput: function () {\n if (!document) {\n return true;\n }\n return 'setSinkId' in HTMLMediaElement.prototype;\n },\n\n /**\n * Test if user agent supports changing the microphone.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeMicrophone: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports different microphones on multiple simultanious\n * getUserMedia streams.\n * Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038 (fixed since v101)\n **/\n canMultipleDifferentMicrophones: function () {\n return !(this.isFF() && this.browserVersion() < 101);\n },\n\n /**\n * Test if user agent supports remembering devices.\n * Safari bug: https://bugs.webkit.org/show_bug.cgi?id=175975 is\n * fixed since v12\n **/\n canChangeCamera: function () {\n let isOldSafari = false;\n if (adapter.browserDetails.browser === 'safari') {\n isOldSafari = this.browserVersion() < 12 && !this.isWorkingIOSBrowser();\n }\n return !this.isTestSuite() && !isOldSafari;\n },\n\n /**\n * Test if user agent supports screen capture feature.\n * on mobile hasGetDisplayMedia() is true, but still doesn't work:\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#Browser_compatibility\n * and https://caniuse.com/#feat=mdn-api_mediadevices_getdisplaymedia\n **/\n canScreenCapture: function () {\n if (\n !config.screencapture ||\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n this.hasMobileDevice()\n ) {\n return false;\n }\n return this.hasGetDisplayMedia() || (this.isFF() && this.hasGetUserMedia());\n },\n\n canPresentFiles: function () {\n if (\n this.isTestSuite() ||\n !this.canUseEyeson() ||\n (this.isFF() && adapter.browserDetails.version <= 60) ||\n this.isIPhone() ||\n (this.isIOSDevice() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser())\n ) {\n return false;\n }\n return true;\n },\n\n canStreamLocalMedia: function () {\n const audioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof audioContext !== 'function') {\n return false;\n }\n const proto = audioContext.prototype;\n const acMethods = [\n 'createGain',\n 'createMediaStreamSource',\n 'createMediaElementSource',\n 'createMediaStreamDestination'\n ].every(method => typeof proto[method] === 'function');\n return acMethods && this.hasCanvasCaptureSupport();\n },\n\n /**\n * Unfortunately we had issues with higher resolution constraints on\n * Safari (iOS and Mac).\n **/\n requiresLowerConstraints: function () {\n return (\n this.isSafari() &&\n this.browserVersion() < 13 &&\n !this.isWorkingIOSBrowser()\n );\n },\n\n browserName: function () {\n let name = adapter.browserDetails.browser.replace(/\\w\\S*/g, txt => {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n return name;\n },\n\n browserVersion: function () {\n if (adapter.browserDetails.browser === 'safari') {\n return adapter.extractVersion(navigator.userAgent, /Version\\/(\\d+)\\./, 1);\n }\n return adapter.browserDetails.version;\n },\n\n isEdge: function () {\n return adapter.browserDetails.browser === 'edge';\n },\n\n isFF: function () {\n return adapter.browserDetails.browser === 'firefox';\n },\n\n isChrome: function () {\n return adapter.browserDetails.browser === 'chrome';\n },\n\n isSafari: function () {\n return adapter.browserDetails.browser === 'safari';\n },\n\n isMinimumRequiredBrowser: function () {\n if (this.isChrome()) {\n return this.isMinimumRequiredChrome();\n }\n if (this.isFF()) {\n return this.isMinimumRequiredFF();\n }\n if (this.isSafari()) {\n return this.isMinimumRequiredSafari();\n }\n return false;\n },\n\n /**\n * 2021-01-18 Edge is not supported anymore due to PeerConnection\n * and other issues\n **/\n isMinimumRequiredEdge: function () {\n return false;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Firefox_version_history\n * A customer is on WinXP (hello 2019) and FF seems\n * to be locked at 52 with an extended support version on that OS.\n * May god have mercy on those poor souls.\n **/\n isMinimumRequiredFF: function () {\n if (!this.isFF()) {\n return false;\n }\n return adapter.browserDetails.version >= 52;\n },\n\n /**\n * https://en.wikipedia.org/wiki/Google_Chrome_version_history\n **/\n isMinimumRequiredChrome: function () {\n if (!this.isChrome()) {\n return false;\n }\n return adapter.browserDetails.version >= 70;\n },\n\n isMinimumRequiredSafari: function () {\n if (!this.isSafari()) {\n return false;\n }\n return this.browserVersion() >= 10 || this.isWorkingIOSBrowser();\n },\n\n isWorkingIOSBrowser: function () {\n // EdgiOS, FxiOS, CriOS\n const iOSBrowser = / [a-zA-Z]+iOS\\//.test(navigator.userAgent);\n const operaTouch = navigator.userAgent.indexOf(' OPT/') > -1;\n return (iOSBrowser || operaTouch) && this.hasGetUserMedia();\n },\n\n isExperimentalBrowser: function () {\n return ['safari', 'edge'].includes(adapter.browserDetails.browser);\n },\n\n /**\n * Unfortunately Safari on iOS pauses the local camera during PIP,\n * and afterwards the remote video is frozen.\n **/\n hasPipSupport: function () {\n if (!document) {\n return true;\n }\n\n return Boolean(\n 'webkitSupportsPresentationMode' in HTMLVideoElement.prototype ||\n ('pictureInPictureEnabled' in document &&\n document.pictureInPictureEnabled)\n );\n },\n\n /**\n * Detect non-working pip in iOS webview\n **/\n iOSPipCheck: function () {\n return new Promise(resolve => {\n const support = this.hasPipSupport();\n if (!support || !this.isIOSDevice()) {\n resolve(support);\n return;\n }\n const video = document.createElement('video');\n video.preload = 'none';\n video.src = 'about:blank';\n video.onsuspend = () => {\n const wkEnabled =\n video.webkitSupportsPresentationMode('picture-in-picture');\n resolve(wkEnabled);\n };\n });\n },\n\n /**\n * Check user agent if it is an Android device.\n **/\n isAndroidDevice: function () {\n return Boolean(navigator.userAgent.match(/Android/i));\n },\n\n /**\n * Check user agent if it is an iOS device.\n * This check includes detection of \"Desktop mode\" on mobile devices\n **/\n isIOSDevice: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !window.MSStream\n );\n },\n\n /**\n * Check user agent if it is an iPhone.\n * This check includes detection of \"Desktop mode\" on iPhone.\n * To distinguish between iPad and iPhone in \"Desktio mode\",\n * we have to additionally check for aspect ratio\n **/\n isIPhone: function () {\n // Resource: https://stackoverflow.com/a/58064481\n return (\n (/iPhone/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' &&\n navigator.maxTouchPoints > 1 &&\n window.screen.height / window.screen.width >= 1.5)) &&\n !window.MSStream\n );\n },\n\n /**\n * As a solution for mobile sites, our Android engineers recommend to\n * specifically detect “mobile†in the User-Agent string as well as\n * “android.â€\n *\n * https://webmasters.googleblog.com/2011/03/mo-better-to-also-detect-mobile-user.html\n **/\n isAndroidPhone: function () {\n const isAndroid = /(android)/i.test(navigator.userAgent);\n const isMobile = /(mobile)/i.test(navigator.userAgent);\n return isAndroid && isMobile;\n },\n\n isMacOS: function () {\n if (typeof navigator.userAgentData !== 'undefined') {\n return navigator.userAgentData.platform === 'macOS';\n }\n return navigator.platform.indexOf('Mac') === 0;\n },\n\n /**\n * Is the app running inside an iFrame.\n * https://stackoverflow.com/a/326076/980524\n **/\n inIframe: function () {\n try {\n return window.self !== window.top;\n } catch (error) {\n return true;\n }\n },\n\n /**\n * Phone vs. tablet\n **/\n isPhone: function () {\n return this.isIPhone() || this.isAndroidPhone();\n },\n\n /**\n * ...\n **/\n hasMobileDevice: function () {\n return this.isIOSDevice() || this.isAndroidDevice();\n },\n\n /**\n * Is the app running on a touch device.\n * https://stackoverflow.com/a/4819886/980524\n * Note: touch device, might be a laptop with a touch display or those\n * dell tablets we have laying around here.\n **/\n isTouchDevice: function () {\n return Boolean('ontouchstart' in window || navigator.maxTouchPoints);\n },\n\n /**\n * iOS doesn't propagate tap events to react when we have display tooltips.\n * This results in annoying \"double taps\" from the user.\n * But the tooltips aren't designed for touch devices anyway.\n **/\n canDisplayTooltips: function () {\n return !this.isIOSDevice() && !this.isTestSuite();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canAdjustDeviceSettings: function () {\n return !this.isIOSDevice();\n },\n\n /**\n * iOS doesn't handle stream switching properly, the remote stream freezes\n * sometimes when making changes.\n **/\n canToggleCamera: function () {\n return true;\n },\n\n /**\n * iPad file presentation has issues add cam to canvas\n **/\n canDrawCamera: function () {\n return !this.isIOSDevice();\n },\n\n canMix: function () {\n return (\n this.isChrome() &&\n this.canScreenCapture() &&\n this.hasCanvasCaptureSupport()\n );\n },\n\n /**\n * Browsers don't behave the same way when setting the .enabled property of\n * a MediaSTreamTrack to false.\n * In Chrome (as of May 2019) the activity indicator stays active even if\n * the track is disabled (enabled: false).\n * https://bugs.chromium.org/p/webrtc/issues/detail?id=5942\n * While in Firefox the indicator is turned off.\n */\n stopsDeviceActivityIndicatorOnDisable: function () {\n if (this.isFF()) {\n return true;\n }\n return false;\n },\n\n /**\n * Edge doesn't have this property and raises an error when trying to\n * access it.\n **/\n supportsBlurOnSVG: function () {\n return (\n typeof SVGElement !== 'undefined' &&\n typeof SVGElement.prototype.blur !== 'undefined'\n );\n },\n\n /**\n * Chrome will throw a SecurityException when trying to read the\n * `localStorage` property.\n **/\n hasLocalStorage: function () {\n try {\n const hasLocalStorage =\n typeof window.localStorage === 'object' && window.localStorage !== null;\n window.localStorage.setItem('eyeson.test', 'test');\n const canGet = window.localStorage.getItem('eyeson.test') === 'test';\n return hasLocalStorage && canGet;\n } catch (error) {\n Logger.debug('FeatureDetector::hasLocalStorage:', error.message);\n return false;\n }\n },\n\n canFullscreen: function () {\n return new FullscreenHelper().canFullscreen();\n },\n\n isFullscreen: function () {\n return new FullscreenHelper().isFullscreen();\n },\n\n /**\n * Check for SFU-mode support\n * VP8 codec required, in Safari available since v12.1\n **/\n canSFU: function () {\n let safariWithoutVP8 = false;\n if (this.isSafari()) {\n if (!config.allowSafariSFU) {\n return false;\n }\n if (this.isWorkingIOSBrowser()) {\n return true;\n }\n const uAVersion = navigator.userAgent.match(/Version\\/(\\d+).(\\d+)/);\n if (uAVersion && uAVersion.length > 1) {\n safariWithoutVP8 =\n Number(uAVersion[1]) < 12 ||\n (Number(uAVersion[1]) === 12 && Number(uAVersion[2]) < 1);\n }\n }\n return !safariWithoutVP8 && !this.isTestSuite();\n },\n\n canDataChannel: function () {\n return (\n this.hasPeerConnection() &&\n typeof RTCPeerConnection.prototype.createDataChannel === 'function' &&\n 'RTCDataChannel' in window\n );\n },\n\n /**\n * SDP SSRC updates for SFU mode switch\n * Safari has a bug of broken mediastream when all ssrc's change\n **/\n disallowAudioSyncSrcChange: function () {\n return this.isSafari() && this.canSFU();\n },\n\n canShare: function () {\n return Boolean(navigator.share);\n },\n\n /**\n * https://developer.chrome.com/multidevice/user-agent#webview_user_agent\n *\n * If you’re attempting to differentiate between the WebView and Chrome for\n * Android, you should look for the presence of the Version/_X.X_ string in\n * the WebView user-agent string.\n *\n * In the newer versions of WebView, you can differentiate the WebView by\n * looking for the wv field as highlighted below\n **/\n isWebView: function () {\n return /Version\\/|wv/i.test(navigator.userAgent) && this.isAndroidDevice();\n },\n\n /* eslint-disable no-process-env */\n /* global process */\n isTestSuite: function () {\n return (\n process.env.NODE_ENV === 'test' ||\n adapter.browserDetails.browser === 'test-suite'\n );\n },\n /* eslint-enable no-process-env */\n\n /**\n * mobile Safari is not able to display canvas stream in video\n * https://stackoverflow.com/a/63948310\n */\n canVirtualBackground: function () {\n return (\n !this.isIOSDevice() &&\n Boolean(window.WebAssembly) &&\n typeof WebAssembly.validate === 'function' &&\n (typeof WebAssembly.instantiateStreaming === 'function' ||\n typeof WebAssembly.instantiate === 'function') &&\n Boolean(window.CanvasRenderingContext2D) &&\n typeof window.ImageData === 'function' &&\n typeof window.requestAnimationFrame === 'function'\n );\n },\n\n // eslint-disable-next-line max-statements\n canvasBlurSupport: function () {\n if (_canvasBlurSupport !== null) {\n return _canvasBlurSupport;\n }\n const filterSupport =\n window.CanvasRenderingContext2D &&\n 'filter' in CanvasRenderingContext2D.prototype;\n if (!filterSupport) {\n _canvasBlurSupport = false;\n return _canvasBlurSupport;\n }\n let canvas1 = document.createElement('canvas');\n let canvas2 = document.createElement('canvas');\n canvas1.width = 10;\n canvas1.height = 10;\n canvas2.width = 10;\n canvas2.height = 10;\n let ctx1 = canvas1.getContext('2d');\n let ctx2 = canvas2.getContext('2d');\n ctx1.filter = 'blur(5px)';\n ctx1.fillStyle = '#000000';\n ctx1.fillRect(3, 3, 4, 4);\n ctx2.fillStyle = '#000000';\n ctx2.fillRect(3, 3, 4, 4);\n let data1 = ctx1.getImageData(5, 5, 1, 1);\n let data2 = ctx2.getImageData(5, 5, 1, 1);\n _canvasBlurSupport = data1.data[3] !== data2.data[3];\n return _canvasBlurSupport;\n },\n\n /**\n * We've noticed many issues with Safari and stereo on desktop and mobile.\n * Even weired ones like https://developer.apple.com/forums/thread/672037.\n * On Android issues occur when output device is changed, especially buetooth\n * devices are difficult.\n */\n canStereo: function () {\n return !(this.isSafari() || this.isAndroidDevice());\n },\n\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/displaySurface\n canChooseDisplaySurface: function () {\n return (\n this.hasGetDisplayMedia() &&\n navigator.mediaDevices.getSupportedConstraints().displaySurface\n );\n },\n\n hasPipCamSupport: function () {\n return this.isChrome() && this.hasPipSupport();\n },\n\n canMonitorSystemPressure: function () {\n /* eslint-disable no-undef */\n return (\n typeof window.PressureObserver === 'function' &&\n Array.isArray(PressureObserver.supportedSources) &&\n PressureObserver.supportedSources.includes('cpu')\n );\n /* eslint-enable no-undef */\n }\n};\n/* eslint-enable max-lines */\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","/**\n * Ninja Stream\n **/\nclass NinjaStream {\n constructor() {\n this._stream = this.createStream();\n }\n\n get stream() {\n return this._stream;\n }\n\n /**\n * Create a dummy stream from a canvas element.\n **/\n // eslint-disable-next-line max-statements\n createStream() {\n const width = 0;\n const height = 0;\n let canvas = Object.assign(document.createElement('canvas'), {\n width,\n height\n });\n canvas.id = 'eyeson-ninja-stream';\n canvas.getContext('2d').fillRect(0, 0, width, height);\n let stream = canvas.captureStream();\n let [track] = stream.getVideoTracks();\n // adjust FF to identify NinjaStream track\n if (\n window.CanvasCaptureMediaStream &&\n stream instanceof window.CanvasCaptureMediaStream\n ) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n }\n return stream;\n }\n}\n\nexport default NinjaStream;\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\n\n/**\n * Wrapper around localStorage API in order to prefix keys to be stored and\n * offer default values on demand. If no localStorage is provided by\n * the user-agent, we use a temporary fallbackStorage.\n **/\nexport default (function () {\n const prefix = 'eyeson.';\n const fallbackStorage = {};\n const hasLocalStorage = FeatureDetector.hasLocalStorage();\n\n return {\n store: function (key, value) {\n if (!hasLocalStorage) {\n fallbackStorage[key] = value;\n return true;\n }\n try {\n window.localStorage.setItem(prefix + key, JSON.stringify(value));\n } catch (error) {\n Logger.error('LocalStorage::store', error);\n return false;\n }\n return true;\n },\n // eslint-disable-next-line max-statements\n load: function (key, defaultValueParam) {\n let defaultValue = defaultValueParam;\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n defaultValue = Object.assign({}, defaultValue);\n }\n if (!hasLocalStorage) {\n return fallbackStorage[key] || defaultValue;\n }\n let storedValue = window.localStorage.getItem(prefix + key);\n if (!storedValue) {\n return defaultValue;\n }\n try {\n return JSON.parse(storedValue);\n } catch (error) {\n Logger.error('LocalStorage::load', key, error);\n return defaultValue;\n }\n }\n };\n})();\n","// https://github.com/YuzuJS/setImmediate/blob/modern-browsers-only/setImmediate.js\nconst immediate = (() => {\n const stack = [];\n const target = '*';\n const messageName = 'com.eyeson.immediate';\n const handleMessage = event => {\n if (event.source === window && event.data === messageName) {\n event.stopPropagation();\n const fn = stack.shift();\n if (fn) {\n fn();\n }\n }\n };\n window.addEventListener('message', handleMessage);\n return fn => {\n stack.push(fn);\n window.postMessage(messageName, target);\n };\n})();\n\nexport default immediate;\n","/* eslint-disable max-lines */\nimport FeatureDetector from '../FeatureDetector.js';\nimport Logger from '../Logger';\n\nconst CanvasMedia =\n window.CanvasCaptureMediaStream || window.CanvasCaptureMediaStreamTrack;\n\nexport const hasAudio = stream => {\n return Boolean(\n stream &&\n stream.getAudioTracks().length > 0 &&\n stream.getAudioTracks()[0].enabled\n );\n};\n\nexport const hasVideo = stream => {\n return Boolean(\n stream &&\n stream.getVideoTracks().length > 0 &&\n stream.getVideoTracks()[0].enabled\n );\n};\n\nexport const disableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = false));\n }\n return stream;\n};\n\nexport const enableAudio = stream => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = true));\n }\n return stream;\n};\n\nexport const toggleAudio = (stream, enabled) => {\n if (stream) {\n stream.getAudioTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\nexport const toggleVideo = (stream, enabled) => {\n if (stream) {\n stream.getVideoTracks().forEach(track => (track.enabled = enabled));\n }\n return stream;\n};\n\n// In order to be \"informed\" about track ending in compose_canvas where we\n// create offscreen/hidden video elements and need to clean them up afterwards,\n// we need to dispatch 'stopped' ourselves. The 'ended' event is not emitted\n// after stopping the track, as one might expect see:\n// https://stackoverflow.com/q/55953038/980524\nexport const stopTrack = track => {\n track.stop();\n return track.dispatchEvent(new Event('stopped'));\n};\n\nexport const stopStream = stream => {\n if (stream) {\n stream.getTracks().forEach(stopTrack);\n }\n};\n\nconst isScreenTrack = track => {\n return (\n /screen|monitor|window|web-contents-media-stream/i.test(track.label) ||\n track.type === 'screen-track' ||\n track.type === 'screen-video-track'\n );\n};\n\nconst isScreenPresentationTrack = track => {\n return isScreenTrack(track) && track.type !== 'screen-video-track';\n};\n\nexport const isScreenAsVideoTrack = track => {\n return isScreenTrack(track) && track.type === 'screen-video-track';\n};\n\nconst isCanvasTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id !== 'eyeson-ninja-stream' &&\n track.canvas.id !== 'eyeson-vbg-stream'\n );\n};\n\nexport const isNinjaStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-ninja-stream'\n );\n};\n\nexport const isVbgStreamTrack = track => {\n return Boolean(\n (track.type === 'canvas-track' || track instanceof CanvasMedia) &&\n track.canvas &&\n track.canvas.id === 'eyeson-vbg-stream'\n );\n};\n\nconst isCameraTrack = track => {\n return (\n !isCanvasTrack(track) && !isScreenTrack(track) && !isVbgStreamTrack(track)\n );\n};\n\nexport const getScreenTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenTrack);\n};\n\nexport const getScreenPresentationTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenPresentationTrack);\n};\n\nexport const getScreenAsVideoTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isScreenAsVideoTrack);\n};\n\nexport const getCameraTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCameraTrack);\n};\n\nexport const getVbgTracks = stream => {\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isVbgStreamTrack);\n};\n\nexport const stopCamera = stream => {\n getCameraTracks(stream).forEach(stopTrack);\n};\n\nexport const disableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = false));\n return stream;\n};\n\nexport const enableCamera = stream => {\n getCameraTracks(stream).forEach(track => (track.enabled = true));\n return stream;\n};\n\nexport const toggleCamera = (stream, enabled) => {\n getCameraTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const toggleVbgTrack = (stream, enabled) => {\n getVbgTracks(stream).forEach(track => (track.enabled = enabled));\n return stream;\n};\n\nexport const getCanvasTracks = stream => {\n // current FF implementation\n if (stream instanceof CanvasMedia) {\n return stream.getVideoTracks();\n }\n if (!stream) {\n return [];\n }\n return stream.getVideoTracks().filter(isCanvasTrack);\n};\n\nexport const isScreenStream = stream => {\n return hasVideo(stream) && stream.getVideoTracks().some(isScreenTrack);\n};\n\nexport const isScreenPresentationStream = stream => {\n return (\n hasVideo(stream) && stream.getVideoTracks().some(isScreenPresentationTrack)\n );\n};\n\nexport const isCanvasStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n\n return stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isVBGStream = stream => {\n if (!FeatureDetector.hasCanvasCaptureSupport() || !stream) {\n return false;\n }\n return hasVideo(stream) && stream.getVideoTracks().some(isVbgStreamTrack);\n};\n\nexport const isCameraStream = stream => {\n return (\n hasVideo(stream) &&\n !isScreenStream(stream) &&\n !isCanvasStream(stream) &&\n !isVBGStream(stream)\n );\n};\n\nexport const isCanvasPresentationStream = stream => {\n if (!stream) {\n return false;\n }\n return isCanvasStream(stream) && stream.getVideoTracks().some(isCanvasTrack);\n};\n\nexport const isPresentationStream = stream => {\n return isScreenPresentationStream(stream) || isCanvasStream(stream);\n};\n\nexport const hasCameraVideo = stream => {\n return getCameraTracks(stream).some(track => track.enabled);\n};\n\nexport const getFacingMode = stream => {\n const tracks = getCameraTracks(stream);\n if (tracks.length > 0) {\n const [track] = tracks;\n if (typeof track.getSettings === 'function') {\n const settings = track.getSettings();\n if (settings && 'facingMode' in settings) {\n return settings.facingMode;\n }\n }\n }\n return null;\n};\n\n// try to make FF's captureStream handling track based.\nexport const captureStream = canvas => {\n // NOTE: getContext is needed for firefox, otherwise we get an exception:\n // NS_ERROR_NOT_INITIALIZED when calling .captureStream on the canvas.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1257440\n canvas.getContext('2d');\n\n // 0 param is fps, but since that doesn't work cross browser, we use 0\n // and request frames manually.\n const stream = canvas.captureStream(20);\n const [track] = stream.getVideoTracks();\n if (!('requestFrame' in track)) {\n track.type = 'canvas-track';\n track.canvas = canvas;\n track.requestFrame = () => stream.requestFrame();\n }\n\n return stream;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeAudioTrack = () => {\n try {\n const ac = new (window.AudioContext || window.webkitAudioContext)();\n const { stream } = ac.createMediaStreamDestination();\n const [track] = stream.getAudioTracks();\n track.type = 'fake-audio';\n track.enabled = false;\n stopStream(stream);\n ac.close();\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeAudioTrack Unable to create audio track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nconst createFakeVideoTrack = () => {\n try {\n const canvas = document.createElement('canvas');\n // Firefox needs some kind of kickass\n canvas.getContext('2d').fillRect(0, 0, canvas.width, canvas.height);\n const stream = canvas.captureStream();\n const [track] = stream.getVideoTracks();\n track.type = 'fake-video';\n track.enabled = false;\n stopStream(stream);\n return track;\n } catch (error) {\n Logger.warn(\n 'StreamHelpers::createFakeVideoTrack Unable to create video track',\n error\n );\n }\n return null;\n};\n\n// eslint-disable-next-line max-statements\nexport const createExternalStream = (stream, audioOnly = false) => {\n if (\n stream &&\n stream instanceof MediaStream &&\n stream.getTracks().length > 0\n ) {\n const aTrack = stream\n .getAudioTracks()\n .find(track => track.readyState === 'live');\n const vTrack = stream\n .getVideoTracks()\n .find(track => track.readyState === 'live');\n const audioTrack = aTrack || createFakeAudioTrack();\n const videoTrack = vTrack || createFakeVideoTrack();\n const tracks = [];\n if (audioTrack) {\n tracks.push(audioTrack);\n }\n if (videoTrack && !audioOnly) {\n tracks.push(videoTrack);\n }\n return new MediaStream(tracks);\n }\n return false;\n};\n","import immediate from './immediate.js';\n\nconst throttledAnimationFrame = (fn, fps) => {\n let raf = null;\n let focus = true;\n let abort = false;\n let animationFrameThen = 0;\n const frameRate = 1000 / fps;\n const throttledRAF = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n raf = requestAnimationFrame(throttledRAF);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n fn();\n };\n const throttledImmediate = () => {\n const now = Date.now();\n const elapsed = now - animationFrameThen;\n if (elapsed <= frameRate) {\n immediate(throttledImmediate);\n return;\n }\n animationFrameThen = now - (elapsed % frameRate);\n if (!abort) {\n fn();\n }\n };\n const result = {\n requestAnimationFrame: () => {\n if (focus) {\n raf = requestAnimationFrame(throttledRAF);\n } else {\n if (abort) {\n abort = false;\n }\n immediate(throttledImmediate);\n }\n },\n cancelAnimationFrame: () => {\n abort = true;\n if (raf) {\n cancelAnimationFrame(raf);\n raf = null;\n }\n }\n };\n document.addEventListener('visibilitychange', () => {\n focus = document.visibilityState === 'visible';\n if (!focus && raf) {\n result.cancelAnimationFrame();\n result.requestAnimationFrame();\n }\n });\n return result;\n};\n\nexport default throttledAnimationFrame;\n","/**\n * importScript\n * lazy-load script files, promise-based\n */\nconst importScript = (url, integrity = null) => {\n return new Promise((resolve, reject) => {\n const src = new URL(url, location.href);\n const script = document.createElement('script');\n script.async = true;\n script.onload = () => {\n if (script.parentNode) {\n script.remove();\n }\n resolve(script);\n };\n script.onerror = () => {\n if (script.parentNode) {\n script.remove();\n }\n reject(new Error('Unable to initiate script ' + url));\n };\n if (integrity) {\n script.integrity = integrity.algo + '-' + integrity.hash;\n }\n script.src = src;\n document.head.append(script);\n });\n};\n\nexport default importScript;\n","const cacheStorageSupport = typeof window.CacheStorage === 'function';\n\nconst storeBlobURL = async (blobURL, path) => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const response = await fetch(blobURL);\n const blob = await response.blob();\n const cache = await caches.open('store');\n await cache.put(path, new Response(blob));\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nconst loadBlobURL = async path => {\n if (cacheStorageSupport) {\n try {\n const cache = await caches.open('store');\n const response = await cache.match(path);\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n return false;\n};\n\nconst deleteBlob = async path => {\n if (!cacheStorageSupport) {\n return;\n }\n try {\n const cache = await caches.open('store');\n await cache.delete(path);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n\nexport default {\n storeBlobURL,\n loadBlobURL,\n deleteBlob\n};\n","/* eslint-disable max-statements */\n/* eslint-disable no-bitwise */\n/* eslint-disable id-length */\n// https://github.com/davidenke/context-filter-polyfill/blob/master/src/filters/blur.filter.ts\n\nconst _mulTable = [\n 1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107,\n 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221,\n 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103,\n 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119,\n 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151,\n 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13,\n 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75,\n 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229,\n 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183,\n 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37,\n 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61,\n 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207,\n 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178,\n 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153,\n 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133,\n 66, 131, 65, 129, 1\n];\nconst _shgTable = [\n 0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18,\n 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20,\n 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21,\n 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20,\n 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22,\n 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18,\n 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22,\n 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24,\n 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24,\n 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22,\n 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23,\n 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25,\n 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25,\n 22, 25, 25, 25, 24, 25, 24, 25, 18\n];\n\nconst canvasBlur = () => {\n let _canvas = null;\n let _ctx = null;\n let _previous = false;\n let _r = null;\n let _g = null;\n let _b = null;\n let _vmin = null;\n let _vmax = null;\n\n const run = (imageBitmap, radius = 0) => {\n if (_previous && _canvas) {\n _previous = false;\n return _canvas;\n }\n _previous = true;\n const amount = parseFloat(radius);\n\n const { width, height } = imageBitmap;\n if (!_canvas) {\n _canvas = document.createElement('canvas');\n _ctx = _canvas.getContext('2d', { alpha: false, desynchronized: true });\n _canvas.width = width;\n _canvas.height = height;\n }\n _ctx.drawImage(imageBitmap, 0, 0);\n const imageData = _ctx.getImageData(0, 0, width, height);\n const { data } = imageData;\n\n // http://www.quasimondo.com/BoxBlurForCanvas/FastBlur.js\n const wm = width - 1;\n const hm = height - 1;\n const rad1 = amount + 1;\n\n const mulSum = _mulTable[amount];\n const shgSum = _shgTable[amount];\n\n if (!_r) {\n _r = new Uint32Array(data.length / 4);\n _g = new Uint32Array(data.length / 4);\n _b = new Uint32Array(data.length / 4);\n\n _vmin = new Uint32Array(width);\n _vmax = new Uint32Array(width);\n }\n\n let iterations = 2;\n let p = 0;\n let p1 = 0;\n let p2 = 0;\n\n while (iterations-- > 0) {\n let yw = 0;\n let yi = 0;\n\n for (let y = 0; y < height; y++) {\n let rsum = data[yw] * rad1;\n let gsum = data[yw + 1] * rad1;\n let bsum = data[yw + 2] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n p = yw + ((i > wm ? wm : i) << 2);\n rsum += data[p++];\n gsum += data[p++];\n bsum += data[p++];\n }\n\n for (let x = 0; x < width; x++) {\n _r[yi] = rsum;\n _g[yi] = gsum;\n _b[yi] = bsum;\n\n if (y === 0) {\n _vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n _vmax[x] = (p = x - amount) > 0 ? p << 2 : 0;\n }\n\n p1 = yw + _vmin[x];\n p2 = yw + _vmax[x];\n\n rsum += data[p1++] - data[p2++];\n gsum += data[p1++] - data[p2++];\n bsum += data[p1++] - data[p2++];\n\n yi++;\n }\n yw += width << 2;\n }\n\n for (let x = 0; x < width; x++) {\n let yp = x;\n let rsum = _r[yp] * rad1;\n let gsum = _g[yp] * rad1;\n let bsum = _b[yp] * rad1;\n\n for (let i = 1; i <= amount; i++) {\n yp += i > hm ? 0 : width;\n rsum += _r[yp];\n gsum += _g[yp];\n bsum += _b[yp];\n }\n\n yi = x << 2;\n\n for (let y = 0; y < height; y++) {\n data[yi] = (rsum * mulSum) >>> shgSum;\n data[yi + 1] = (gsum * mulSum) >>> shgSum;\n data[yi + 2] = (bsum * mulSum) >>> shgSum;\n\n if (x === 0) {\n _vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n _vmax[y] = (p = y - amount) > 0 ? p * width : 0;\n }\n\n p1 = x + _vmin[y];\n p2 = x + _vmax[y];\n\n rsum += _r[p1] - _r[p2];\n gsum += _g[p1] - _g[p2];\n bsum += _b[p1] - _b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n _ctx.putImageData(imageData, 0, 0);\n\n return _canvas;\n };\n\n const reset = () => {\n _canvas = null;\n _ctx = null;\n _previous = false;\n _r = null;\n _g = null;\n _b = null;\n _vmin = null;\n _vmax = null;\n };\n\n return { run, reset };\n};\n\nexport default canvasBlur;\n","/* eslint-disable max-lines */\n/* eslint-disable max-statements */\nimport FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport LocalStorage from './LocalStorage.js';\nimport throttledAnimationFrame from './utils/throttledAnimationFrame.js';\nimport importScript from './utils/importScript.js';\nimport { stopStream, stopTrack, getVbgTracks } from './utils/StreamHelpers.js';\nimport cacheStorage from './utils/cacheStorage.js';\nimport canvasBlur from './utils/canvasBlur.js';\n\nwindow.exports = window.exports || {};\n\nconst OffscreenCanvasSupport =\n typeof window.OffscreenCanvas === 'function' &&\n (() => {\n try {\n new OffscreenCanvas(1, 1).getContext('2d');\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n })();\nconst OffscreenCanvasBlurSupport =\n OffscreenCanvasSupport &&\n Boolean(window.OffscreenCanvasRenderingContext2D) &&\n 'filter' in OffscreenCanvasRenderingContext2D.prototype;\nconst ImageBitmapSupport = typeof window.createImageBitmap === 'function';\nconst TrackProcessorSupport =\n typeof window.MediaStreamTrackProcessor === 'function';\nconst SIMDSupport =\n window.WebAssembly &&\n WebAssembly.validate(\n new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 9, 1, 7,\n 0, 65, 0, 253, 15, 26, 11\n ])\n );\nconst EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nconst _max = Math.max;\n\nconst _frameRate = 20;\nconst _stateChange = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\nconst _segmentationModel = {\n id: 'selfie_landscape',\n name: 'selfie_segmentation_landscape',\n width: 256,\n height: 144,\n pixelCount: 36864\n};\n\nlet _tflite = null;\nlet _tfliteReady = false;\nlet _tfliteLoading = false;\nlet _inputMemoryOffset = null;\nlet _outputMemoryOffset = null;\n\nlet _localImageFile = null;\nlet _localImageFileBackup = null;\n\nconst initiateTFLite = async () => {\n if (_tflite) {\n return;\n }\n _tfliteLoading = true;\n _stateChange.dispatchEvent(new Event('change'));\n const loading = await Promise.all([\n SIMDSupport\n ? importScript('vendor/tflite/tflite-simd.js')\n : importScript('vendor/tflite/tflite.js'),\n fetch(`vendor/tflite/models/${_segmentationModel.name}.tflite`)\n ]);\n _tflite =\n await window.exports[\n SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule'\n ]();\n const model = await loading[1].arrayBuffer();\n const modelBufferOffset = _tflite._getModelBufferMemoryOffset();\n _tflite.HEAPU8.set(new Uint8Array(model), modelBufferOffset);\n _tflite._loadModel(model.byteLength);\n _inputMemoryOffset = _tflite._getInputMemoryOffset() / 4;\n _outputMemoryOffset = _tflite._getOutputMemoryOffset() / 4;\n _tfliteLoading = false;\n _tfliteReady = true;\n _stateChange.dispatchEvent(new Event('change'));\n};\n\nconst createOffscreenCanvas = (width, height, options = {}, type) => {\n const result = {\n canvas: null,\n ctx: null\n };\n const extra = type === 'blur' && OffscreenCanvasBlurSupport;\n if (OffscreenCanvasSupport && extra) {\n result.canvas = new OffscreenCanvas(width, height);\n result.ctx = result.canvas.getContext('2d', options);\n return result;\n }\n result.canvas = document.createElement('canvas');\n result.canvas.width = width;\n result.canvas.height = height;\n result.ctx = result.canvas.getContext(\n '2d',\n Object.assign({ desynchronized: true }, options)\n );\n return result;\n};\n\n(async () => {\n const virtualBackgroundType = LocalStorage.load('virtualBackgroundType');\n if (virtualBackgroundType === 'image:blob') {\n const url = await cacheStorage.loadBlobURL('/virtualBackgroundLocalImage');\n if (url) {\n _localImageFile = url;\n }\n }\n})();\n\nconst loadImage = (url, instance) => {\n return new Promise(resolve => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(true);\n }\n if (url === 'blob' && !_localImageFile) {\n resolve(null);\n return;\n }\n const img = new Image();\n img.onerror = () => resolve(null);\n img.onload = () => resolve(img);\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url === 'blob' && _localImageFile ? _localImageFile : url;\n }).then(img => {\n if (instance && instance.state === 'ready') {\n instance.emitLoading(false);\n }\n return img;\n });\n};\n\nconst checkImageLoad = url => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onerror = () => reject(new TypeError('Invalid image file'));\n img.onload = () => resolve();\n if (/^([\\w]+:)?\\/\\//.test(url) && url.indexOf(location.host) === -1) {\n img.crossOrigin = 'anonymous';\n }\n img.src = url;\n });\n};\n\nconst loadImageFile = (() => {\n let input = null;\n return callbackFN => {\n if (!input) {\n input = Object.assign(document.createElement('input'), {\n type: 'file',\n accept: 'image/*'\n });\n }\n input.onchange = ({ target: { files } }) => {\n if (files.length > 0) {\n const url = URL.createObjectURL(files[0]);\n checkImageLoad(url).then(() => {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = url;\n callbackFN();\n }, callbackFN);\n }\n input.onchange = null;\n input.value = '';\n };\n input.click();\n };\n})();\n\nconst createImageCanvas = (image, width, height) => {\n const hRatio = width / image.width;\n const vRatio = height / image.height;\n const ratio = _max(hRatio, vRatio);\n const imgWidth = image.width * ratio;\n const imgHeight = image.height * ratio;\n const centerShiftX = (width - imgWidth) / 2;\n const centerShiftY = (height - imgHeight) / 2;\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n canvas.ctx.drawImage(\n image,\n 0,\n 0,\n image.width,\n image.height,\n centerShiftX,\n centerShiftY,\n imgWidth,\n imgHeight\n );\n return canvas.canvas;\n};\n\nconst createGeneraliCanvas = (image, width, height) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(image, 15, 15);\n return canvas.canvas;\n};\n\nconst createGradientCanvas = (width, height, options) => {\n const canvas = createOffscreenCanvas(width, height, { alpha: false });\n const { ctx } = canvas;\n const gradient = ctx.createLinearGradient(\n options.startX,\n options.startY,\n options.endX,\n options.endY\n );\n gradient.addColorStop(0, options.color1);\n gradient.addColorStop(1, options.color2);\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n return canvas.canvas;\n};\n\nconst createBlurCanvas = (instance, width, height, blur) => {\n const length = blur * 2;\n const fullLength = length * 2;\n const bigWidth = width + fullLength;\n const bigHeight = height + fullLength;\n instance.blurCanvas = createOffscreenCanvas(\n bigWidth,\n bigHeight,\n {\n alpha: false\n },\n 'blur'\n );\n instance.imageCanvas = createOffscreenCanvas(bigWidth, bigHeight, {\n alpha: false\n });\n instance.blurCanvas.ctx.filter = `blur(${blur}px)`;\n};\n\nconst _allowedTypesCheck =\n /^(off|eyeson|generali:.*|color:.+|image:.+|blur:\\d+)/;\n\nconst setState = () => {\n if (_tfliteReady) {\n return 'ready';\n }\n if (_tfliteLoading) {\n return 'initialize';\n }\n return '';\n};\n\nclass VirtualBackgroundMixer {\n constructor(name = 'global') {\n Logger.info('VirtualBackgroundMixer::constructor', name);\n this.name = name;\n this.canvas = null;\n this.ctx = null;\n this.originalStream = null;\n this.outStream = null;\n this.video = null;\n this.reader = null;\n this.size = { width: 0, height: 0 };\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.playPromise = null;\n this.abort = false;\n this.paused = false;\n this.raf = throttledAnimationFrame(this.drawVideo.bind(this), 20);\n this.backgroundOld = null;\n this.backgroundType = null;\n this.backgroundValue = null;\n this.blurInit = false;\n this.blurCanvas = null;\n this.canvasBlur = canvasBlur();\n this.imageCanvas = null;\n this.state = setState();\n this.loadingListener = [];\n this.handleStateChange = () => {\n const state = setState();\n this.state = state;\n this.emitLoading(state === 'initialize');\n };\n _stateChange.addEventListener('change', this.handleStateChange);\n }\n\n static isTypeAllowed(type) {\n return _allowedTypesCheck.test(type);\n }\n\n static async checkExternalImage(type) {\n if (/^image:([\\w]+:)?\\/\\//i.test(type)) {\n const url = type.substring(6);\n await checkImageLoad(url);\n }\n }\n\n static loadLocalImage(callbackFN) {\n loadImageFile(callbackFN);\n }\n\n static getImageBlobOrFallback(isBlobAvailable = true) {\n if (_localImageFile && isBlobAvailable) {\n return 'image:blob';\n }\n return 'blur:8';\n }\n\n storeLocalImageFile() {\n if (_localImageFile) {\n _localImageFileBackup = _localImageFile;\n }\n }\n\n resetLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFile);\n }\n _localImageFile = _localImageFileBackup;\n _localImageFileBackup = null;\n }\n }\n\n saveLocalImageFile() {\n if (_localImageFileBackup) {\n if (_localImageFile && _localImageFile !== _localImageFileBackup) {\n URL.revokeObjectURL(_localImageFileBackup);\n }\n _localImageFileBackup = null;\n }\n }\n\n updateCache(type) {\n if (type === 'image:blob') {\n if (_localImageFile) {\n cacheStorage.storeBlobURL(\n _localImageFile,\n '/virtualBackgroundLocalImage'\n );\n }\n } else {\n cacheStorage.deleteBlob('/virtualBackgroundLocalImage');\n }\n }\n\n onLoading(listener) {\n this.loadingListener.push(listener);\n }\n\n offLoading(listener) {\n this.loadingListener = this.loadingListener.filter(fn => fn !== listener);\n }\n\n emitLoading(loading) {\n this.loadingListener.forEach(listener => listener(loading));\n }\n\n initiateStream(userMediaStream) {\n Logger.info('VirtualBackgroundMixer::initiate', this.name);\n initiateTFLite();\n const videoTracks = userMediaStream.getVideoTracks();\n if (videoTracks.length === 0) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'missing track'\n );\n return userMediaStream;\n }\n const [videoTrack] = videoTracks;\n const trackSettings = videoTrack.getSettings();\n if (\n videoTrack.readyState !== 'live' ||\n !trackSettings.width ||\n !trackSettings.height\n ) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n '0 width or height, or not ready',\n videoTrack.readyState,\n trackSettings.width,\n trackSettings.height\n );\n return userMediaStream;\n }\n if (this.originalStream) {\n Logger.warn(\n 'VirtualBackgroundMixer::initiate',\n this.name,\n 'existing originalStream!',\n this.originalStream.id,\n userMediaStream.id\n );\n if (this.originalStream.id !== userMediaStream.id) {\n this.stopOriginalStream();\n }\n this.terminate();\n }\n this.originalStream = userMediaStream;\n this.canvas = document.createElement('canvas');\n this.canvas.id = 'eyeson-vbg-stream';\n this.ctx = this.canvas.getContext('2d', { desynchronized: true });\n this.ctx.imageSmoothingEnabled = false;\n this.size.width = trackSettings.width;\n this.size.height = trackSettings.height;\n this.canvas.width = trackSettings.width;\n this.canvas.height = trackSettings.height;\n const canvasStream = this.canvas.captureStream(_frameRate);\n const [canvasTrack] = canvasStream.getVideoTracks();\n if (!canvasTrack.canvas) {\n canvasTrack.type = 'canvas-track';\n canvasTrack.canvas = this.canvas;\n }\n const settings = {};\n if (typeof canvasTrack.getSettings === 'function') {\n Object.assign(settings, canvasTrack.getSettings());\n }\n Object.assign(settings, trackSettings);\n canvasTrack.getSettings = () => settings;\n canvasTrack.srcLabel = videoTrack.label;\n canvasTrack.srcDeviceId = trackSettings.deviceId;\n this.outStream = new MediaStream([canvasTrack]);\n userMediaStream\n .getAudioTracks()\n .forEach(track => this.outStream.addTrack(track));\n this.start();\n return this.outStream;\n }\n\n start() {\n Logger.info('VirtualBackgroundMixer::start', this.name);\n let canvas = null;\n let video = null;\n const { width, height } = this.size;\n if (!width || !height) {\n Logger.warn(\n 'VirtualBackgroundMixer::start 0 width or height',\n this.name,\n width,\n height\n );\n return;\n }\n if (TrackProcessorSupport) {\n try {\n const [track] = this.originalStream.getVideoTracks();\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n this.reader = processor.readable.getReader();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!this.reader) {\n video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = this.originalStream;\n this.video = video;\n }\n this.segmentationMask = new ImageData(\n _segmentationModel.width,\n _segmentationModel.height\n );\n canvas = createOffscreenCanvas(\n _segmentationModel.width,\n _segmentationModel.height,\n { willReadFrequently: true }\n );\n this.segmentationMaskCanvas = canvas.canvas;\n this.segmentationMaskCtx = canvas.ctx;\n this.segmentationMaskCtx.imageSmoothingEnabled = false;\n if (video && !ImageBitmapSupport) {\n canvas = createOffscreenCanvas(width, height);\n this.videoCanvas = canvas.canvas;\n this.videoCtx = canvas.ctx;\n }\n this.abort = false;\n this.paused = false;\n this.blurInit = false;\n this.canvasBlur.reset();\n this.initBackground();\n if (this.reader) {\n Logger.info(\n 'VirtualBackgroundMixer::start::videoTrackProcessor',\n this.name\n );\n this.raf.requestAnimationFrame();\n } else {\n video.onloadeddata = () => {\n Logger.info(\n 'VirtualBackgroundMixer::start::video.loadeddata',\n this.name\n );\n this.raf.requestAnimationFrame();\n };\n this.playPromise = video.play();\n this.playPromise.catch(error => {\n Logger.error(\n 'VirtualBackgroundMixer::start::video.play',\n this.name,\n error\n );\n });\n }\n }\n\n // eslint-disable-next-line complexity\n async drawVideo() {\n let frame = null;\n if (this.abort) {\n return;\n }\n const {\n ctx,\n size,\n paused,\n segmentationMask,\n segmentationMaskCtx,\n segmentationMaskCanvas\n } = this;\n if (this.reader) {\n try {\n const { value } = await this.reader.read();\n if (value) {\n value.width = value.displayWidth;\n value.height = value.displayHeight;\n frame = value;\n }\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n if (!_tfliteReady || paused) {\n ctx.drawImage(frame || this.video, 0, 0);\n } else {\n if (!frame) {\n if (ImageBitmapSupport) {\n try {\n frame = await createImageBitmap(this.video);\n // eslint-disable-next-line no-empty\n } catch (error) {}\n } else {\n this.videoCtx.drawImage(this.video, 0, 0);\n frame = this.videoCanvas;\n }\n }\n if (this.abort) {\n return;\n }\n if (frame && frame.width > 0 && frame.height > 0) {\n segmentationMaskCtx.drawImage(\n frame,\n 0,\n 0,\n frame.width,\n frame.height,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const imageData = segmentationMaskCtx.getImageData(\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height\n );\n const { data } = imageData;\n const heap = _tflite.HEAPF32;\n const maskData = segmentationMask.data;\n const { pixelCount } = _segmentationModel;\n for (\n let heapIndex = 0, imgIndex = 0, index = 0, indexId = 0;\n index < pixelCount;\n index++\n ) {\n indexId = index * 3;\n heapIndex = _inputMemoryOffset + indexId;\n imgIndex = index * 4;\n heap[heapIndex] = data[imgIndex] / 255;\n heap[heapIndex + 1] = data[imgIndex + 1] / 255;\n heap[heapIndex + 2] = data[imgIndex + 2] / 255;\n }\n _tflite._runInference();\n for (\n let index = 0, indexOut = 0, person = 0.0;\n index < pixelCount;\n index++\n ) {\n person = heap[_outputMemoryOffset + index];\n // Sets only the alpha component of each pixel\n indexOut = index * 4;\n maskData[indexOut + 3] = 255 * person;\n }\n segmentationMaskCtx.putImageData(segmentationMask, 0, 0);\n ctx.globalCompositeOperation = 'copy';\n ctx.filter = 'blur(2px)';\n ctx.drawImage(\n segmentationMaskCanvas,\n 0,\n 0,\n _segmentationModel.width,\n _segmentationModel.height,\n 0,\n 0,\n size.width,\n size.height\n );\n ctx.globalCompositeOperation = 'source-in';\n ctx.filter = 'none';\n ctx.drawImage(frame, 0, 0);\n if (this.backgroundType) {\n this.drawBackground(frame);\n }\n }\n }\n if (!paused && this.paused) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n if (frame && typeof frame.close === 'function') {\n frame.close();\n }\n if (!this.abort) {\n this.raf.requestAnimationFrame();\n }\n }\n\n suspend() {\n const { ctx } = this;\n this.paused = true;\n if (ctx) {\n ctx.filter = 'none';\n ctx.globalCompositeOperation = 'source-over';\n }\n }\n\n resume() {\n this.paused = false;\n }\n\n drawBackground(frame) {\n const {\n backgroundType,\n ctx,\n blurCanvas,\n imageCanvas,\n backgroundValue,\n size\n } = this;\n if (!backgroundType || !ctx) {\n return;\n }\n ctx.globalCompositeOperation = 'destination-over';\n if (backgroundType === 'blur') {\n if (FeatureDetector.canvasBlurSupport()) {\n const length = Number(backgroundValue) * 2;\n const fullLength = length * 2;\n if (!this.blurInit) {\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n 0,\n 0,\n size.width + fullLength,\n size.height + fullLength\n );\n this.blurInit = true;\n }\n imageCanvas.ctx.drawImage(\n frame,\n 0,\n 0,\n size.width,\n size.height,\n length,\n length,\n size.width,\n size.height\n );\n blurCanvas.ctx.drawImage(imageCanvas.canvas, 0, 0);\n ctx.drawImage(\n blurCanvas.canvas,\n length,\n length,\n size.width,\n size.height,\n 0,\n 0,\n size.width,\n size.height\n );\n } else {\n const blurred = this.canvasBlur.run(frame, backgroundValue);\n ctx.drawImage(blurred, 0, 0);\n }\n } else if (backgroundType === 'color') {\n ctx.fillStyle = backgroundValue;\n ctx.fillRect(0, 0, size.width, size.height);\n } else if (imageCanvas) {\n ctx.drawImage(imageCanvas, 0, 0);\n } else {\n ctx.drawImage(frame, 0, 0);\n }\n }\n\n async initBackground() {\n const { backgroundType, backgroundValue } = this;\n const { width, height } = this.size;\n let done = false;\n if (!width || !height) {\n return;\n }\n if (backgroundType === 'eyeson') {\n this.imageCanvas = createGradientCanvas(width, height, {\n startX: 0,\n startY: 0,\n endX: width,\n endY: 50,\n color1: '#ff7676',\n color2: '#9e206c'\n });\n done = true;\n } else if (backgroundType === 'generali') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createGeneraliCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'image') {\n this.setBackgroundFallback();\n const image = await loadImage(backgroundValue, this);\n if (image) {\n this.backgroundType = 'image';\n this.backgroundValue = backgroundValue;\n this.imageCanvas = createImageCanvas(image, width, height);\n done = true;\n }\n } else if (backgroundType === 'blur') {\n this.blurInit = false;\n createBlurCanvas(this, width, height, Number(backgroundValue));\n this.canvasBlur.reset();\n done = true;\n } else {\n this.imageCanvas = null;\n done = true;\n }\n if (done) {\n this.backgroundOld = {\n type: backgroundType,\n value: backgroundValue\n };\n }\n }\n\n setBackgroundFallback() {\n const { backgroundOld } = this;\n if (backgroundOld) {\n this.backgroundType = backgroundOld.type;\n this.backgroundValue = backgroundOld.value;\n } else {\n if (!this.imageCanvas) {\n const { width, height } = this.size;\n this.blurInit = false;\n createBlurCanvas(this, width, height, 8);\n }\n this.backgroundType = 'blur';\n this.backgroundValue = '8';\n }\n }\n\n changeBackground(type) {\n Logger.info('VirtualBackgroundMixer::changeBackground', this.name, type);\n if (typeof type !== 'string') {\n return;\n }\n const colon = type.indexOf(':');\n if (colon === -1) {\n this.backgroundType = type === 'off' ? null : type;\n this.backgroundValue = null;\n } else {\n this.backgroundType = type.substring(0, colon);\n this.backgroundValue = type.substring(colon + 1);\n }\n if (!this.abort) {\n this.initBackground();\n }\n }\n\n stop() {\n Logger.info('VirtualBackgroundMixer::stop', this.name);\n this.abort = true;\n if (this.raf) {\n this.raf.cancelAnimationFrame();\n }\n if (this.video) {\n const { video, playPromise } = this;\n if (playPromise && video) {\n playPromise.then(() => video.pause());\n }\n this.video.onloadeddata = null;\n this.video = null;\n this.playPromise = null;\n }\n if (this.reader) {\n this.reader = null;\n }\n this.segmentationMaskCanvas = null;\n this.segmentationMaskCtx = null;\n this.segmentationMask = null;\n this.videoCanvas = null;\n this.videoCtx = null;\n this.backgroundOld = null;\n this.imageCanvas = null;\n this.blurCanvas = null;\n this.canvasBlur.reset();\n }\n\n stopOriginalStream() {\n Logger.info(\n 'VirtualBackgroundMixer::stopOriginalStream',\n this.name,\n this.originalStream\n );\n this.stop();\n stopStream(this.originalStream);\n }\n\n terminate() {\n Logger.info('VirtualBackgroundMixer::terminate', this.name);\n this.stop();\n if (this.outStream) {\n getVbgTracks(this.outStream).forEach(track => {\n stopTrack(track);\n Logger.info(\n 'VirtualBackgroundMixer::terminate stop track',\n this.name,\n track\n );\n });\n }\n this.originalStream = null;\n this.outStream = null;\n this.canvas = null;\n this.ctx = null;\n this.video = null;\n }\n\n destroy() {\n Logger.info('VirtualBackgroundMixer::destroy', this.name);\n _stateChange.removeEventListener('change', this.handleStateChange);\n this.loadingListener.length = 0;\n this.canvasBlur = null;\n }\n}\n\nexport default VirtualBackgroundMixer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport eyesonOptions from './options.js';\nimport LocalStorage from './LocalStorage.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst changedDevices = (listA, listB) => {\n if (listA.length !== listB.length) {\n return true;\n }\n for (\n let deviceA = null, found = false, { length } = listA, index = 0;\n index < length;\n index++\n ) {\n deviceA = listA[index];\n found = listB.find(deviceB => {\n return (\n deviceA.deviceId === deviceB.deviceId &&\n deviceA.groupId === deviceB.groupId &&\n deviceA.label === deviceB.label &&\n deviceA.kind === deviceB.kind\n );\n });\n if (!found) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * eyeson Device Manager used to handle cameras, microphones and speakers.\n **/\nclass DeviceManager {\n /* eslint-disable max-statements */\n constructor(options) {\n this.sinkId = 'default';\n this.options = options || { audio: true, video: true, eco: false };\n this.stream = null;\n this.cameras = [];\n this.listeners = [];\n this.speakers = [];\n this.microphones = [];\n this.constraints = {};\n this.terminationInProgress = false;\n this.virtualBackground = new VirtualBackgroundMixer('DeviceManager');\n this.virtualBackgroundType = 'off';\n\n DeviceManager.getSinkId().then(sinkId => (this.sinkId = sinkId));\n\n this.setStream = this.setStream.bind(this);\n this.handleError = this.handleError.bind(this);\n this.verifyStream = this.verifyStream.bind(this);\n this.storeConstraints = this.storeConstraints.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.initiateVirtualBackground = this.initiateVirtualBackground.bind(this);\n }\n /* eslint-enable max-statements */\n\n static getDevices() {\n if (!('mediaDevices' in navigator)) {\n return Promise.resolve([]);\n }\n return navigator.mediaDevices.enumerateDevices().then(devices => {\n // hack for safari ios and desktop because they hide existing devices to avoid fingerprinting: https://webkit.org/blog/7763/a-closer-look-into-webrtc/\n if (\n devices.length === 2 &&\n devices.every(\n device => device.kind === 'audioinput' && device.deviceId === ''\n )\n ) {\n return [\n { deviceId: '', groupId: '', kind: 'audioinput', label: '' },\n { deviceId: '', groupId: '', kind: 'videoinput', label: '' }\n ];\n }\n return devices;\n });\n }\n\n /**\n * Get constraints for specified options { audio: true, video: true }\n * If a specific device is chosen it has to be stored in localStorage or will\n * be ignored.\n **/\n static getConstraints(optionsParam) {\n const options = optionsParam || { audio: true, video: true };\n return DeviceManager.getDevices()\n .then(devices => {\n return DeviceManager.determineConstraintsForDevices(devices, options);\n })\n .catch(error => {\n Logger.error('DeviceManager::getConstraints ', error);\n });\n }\n\n /* eslint-disable max-statements, complexity */\n static determineConstraintsForDevices(devices, options) {\n const constraints = LocalStorage.load('mediaConstraints', options);\n const stereo = FeatureDetector.canStereo() && !options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n\n if (!('video' in constraints)) {\n constraints.video = true;\n }\n if (!('audio' in constraints)) {\n constraints.audio = audioConstraints;\n }\n\n if (constraints.video.deviceId) {\n const videoDeviceId = constraints.video.deviceId.exact;\n if (!devices.find(device => device.deviceId === videoDeviceId)) {\n constraints.video = options.video;\n }\n }\n if (constraints.audio.deviceId) {\n const audioDeviceId = constraints.audio.deviceId.exact;\n if (!devices.find(device => device.deviceId === audioDeviceId)) {\n constraints.audio = options.audio ? audioConstraints : false;\n }\n }\n\n if (options.video === false && !options.eco) {\n constraints.video = false;\n }\n if (options.video === true && constraints.video === false) {\n constraints.video = true;\n }\n if (\n (options.audio === true && constraints.audio === false) ||\n constraints.audio === true\n ) {\n constraints.audio = audioConstraints;\n }\n if (\n constraints.audio &&\n constraints.audio.channelCount !== audioConstraints.channelCount\n ) {\n constraints.audio.channelCount = audioConstraints.channelCount;\n }\n\n // In case we don't have a videoinput device but specify\n // video: true, we get NotFoundError in FF & DevicesNotFoundError in\n // Chrome.\n if (devices.filter(device => device.kind === 'videoinput').length === 0) {\n constraints.video = false;\n }\n\n DeviceManager.applyLastUsedDevices(constraints, devices);\n DeviceManager.applyWidescreen(constraints);\n\n return constraints;\n }\n /* eslint-enable max-statements, complexity */\n\n static applyLastUsedDevices(constraints, devices) {\n const videoId = LocalStorage.load('videoId');\n const audioId = LocalStorage.load('audioId');\n if (\n constraints.video === true &&\n videoId &&\n devices.find(device => device.deviceId === videoId)\n ) {\n constraints.video = { deviceId: { exact: videoId } };\n }\n if (\n constraints.audio &&\n audioId &&\n devices.find(device => device.deviceId === audioId)\n ) {\n constraints.audio.deviceId = { exact: audioId };\n }\n }\n\n static applyWidescreen(constraints) {\n const { widescreen } = eyesonOptions;\n if (widescreen) {\n if (constraints.video === true) {\n constraints.video = {};\n }\n if (constraints.video) {\n Object.assign(constraints.video, { width: 640, height: 360 });\n }\n } else if (\n typeof constraints.video === 'object' &&\n ('width' in constraints.video || 'height' in constraints.video)\n ) {\n Reflect.deleteProperty(constraints.video, 'width');\n Reflect.deleteProperty(constraints.video, 'height');\n }\n }\n\n /**\n * For now we handle the mobile options and constraints completely separately.\n * That way we can address the facingMode constraint.\n **/\n static getMobileConstraints(options) {\n let constraints = Object.assign({ audio: true, video: true }, options);\n DeviceManager.applyWidescreen(constraints);\n return Promise.resolve(constraints);\n }\n\n /**\n * Get sinkId.\n **/\n static getSinkId() {\n let sinkId = LocalStorage.load('sinkId', '');\n return DeviceManager.getDevices().then(devices => {\n if (!devices.find(device => device.deviceId === sinkId)) {\n sinkId = 'default';\n }\n return sinkId;\n });\n }\n\n /**\n * Return available devices in a friendly format.\n **/\n static fetchDevices() {\n return DeviceManager.getDevices().then(devices => {\n const speakers = devices.filter(device => device.kind === 'audiooutput');\n if (\n speakers.length > 0 &&\n speakers.findIndex(speaker => speaker.deviceId === 'default') === -1\n ) {\n speakers.unshift({\n deviceId: 'default',\n kind: 'audiooutput',\n groupId: 'default',\n label: 'System default'\n });\n }\n return {\n cameras: devices.filter(device => device.kind === 'videoinput'),\n microphones: devices.filter(device => device.kind === 'audioinput'),\n speakers: speakers\n };\n });\n }\n\n static fetchInputDevices() {\n return DeviceManager.getDevices().then(devices => {\n return devices.filter(device => device.kind.includes('input'));\n });\n }\n\n async setVirtualBackgroundType(type) {\n if (!VirtualBackgroundMixer.isTypeAllowed(type)) {\n Logger.warn(\n 'DeviceManage::setVirtualBackgroundType type not allowed',\n type\n );\n return;\n }\n await VirtualBackgroundMixer.checkExternalImage(type);\n const wasOff = this.virtualBackgroundType === 'off';\n const willBeOff = type === 'off';\n this.virtualBackgroundType = type;\n this.virtualBackground.changeBackground(type);\n if (this.stream && ((wasOff && !willBeOff) || (!wasOff && willBeOff))) {\n this.update();\n }\n }\n\n static getStoredVirtualBackgroundType(isBlobAvailable) {\n const type = LocalStorage.load('virtualBackgroundType', 'off');\n if (type === 'image:blob') {\n return VirtualBackgroundMixer.getImageBlobOrFallback(isBlobAvailable);\n }\n return type;\n }\n\n loadLocalImageForVirtualBackground(callbackFN) {\n VirtualBackgroundMixer.loadLocalImage(error => {\n if (!error) {\n this.setVirtualBackgroundType('image:blob');\n }\n callbackFN(error);\n });\n }\n\n /**\n * Sets cameras, microphones, and speakers and starts a video stream\n * with supplied options.\n **/\n start() {\n this.watchForNewDevices();\n\n return DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .then(() => DeviceManager.getConstraints(this.options))\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n stopStream() {\n if (!this.stream) {\n return;\n }\n if (this.virtualBackground.originalStream) {\n this.virtualBackground.stopOriginalStream();\n this.virtualBackground.terminate();\n } else {\n stopStream(this.stream);\n }\n this.stream = null;\n }\n\n /**\n * Stop the media stream. Since we call getUserMedia on gotDevices we don't\n * have a stream in that case.\n **/\n stop() {\n this.stopStream();\n }\n\n terminate() {\n navigator.mediaDevices.ondevicechange = null;\n this.terminationInProgress = true;\n window.setTimeout(() => {\n this.stop();\n this.virtualBackground.destroy();\n }, 10);\n }\n\n setDevices(devices) {\n const camHasChanged = changedDevices(this.cameras, devices.cameras);\n const micHasChanged = changedDevices(this.microphones, devices.microphones);\n const speakerHasChanged = changedDevices(this.speakers, devices.speakers);\n this.cameras = devices.cameras;\n this.microphones = devices.microphones;\n this.speakers = devices.speakers;\n this.options.audio =\n this.microphones.length > 0 ? this.options.audio : false;\n this.options.video = this.cameras.length > 0 ? this.options.video : false;\n if (camHasChanged || micHasChanged || speakerHasChanged) {\n this.emit(devices);\n }\n }\n\n watchForNewDevices() {\n navigator.mediaDevices.ondevicechange = () => {\n DeviceManager.fetchDevices()\n .then(devices => this.setDevices(devices))\n .catch(this.handleError);\n };\n }\n\n /**\n * Register listeners for changes on devices.\n **/\n onChange(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * Remove a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * Wrapper around mediaDevices getUserMedia. Ensures a running stream is\n * stopped and a new one started with newly defined constraints.\n **/\n update(constraints) {\n this.constraints = constraints || this.constraints;\n this.stop();\n\n this.watchForNewDevices();\n\n return navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n /**\n * Similar to update but instead of directly supplying constraints,\n * update with options.\n **/\n updateWithOptions(options, isMobile = false) {\n this.options = options || this.options;\n this.stop();\n\n this.watchForNewDevices();\n\n const constraintsFn = isMobile ? 'getMobileConstraints' : 'getConstraints';\n return DeviceManager[constraintsFn](this.options)\n .then(constraints => {\n this.constraints = constraints;\n return navigator.mediaDevices.getUserMedia({\n video: this.options.eco ? false : this.constraints.video,\n audio: this.constraints.audio || true\n });\n })\n .then(this.adjustAudioTrack)\n .then(this.initiateVirtualBackground)\n .then(this.setStream)\n .catch(this.handleError);\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n stream.getAudioTracks()[0].enabled = this.options.audio;\n }\n return stream;\n }\n\n initiateVirtualBackground(stream) {\n if (\n this.virtualBackgroundType !== 'off' &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return this.virtualBackground.initiateStream(stream);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n storeConstraints() {\n const { constraints } = this;\n const { video, audio } = constraints;\n Logger.debug('DeviceManager::storeConstraints', constraints);\n LocalStorage.store('mediaConstraints', constraints);\n LocalStorage.store('sinkId', this.sinkId);\n LocalStorage.store('virtualBackgroundType', this.virtualBackgroundType);\n if (video && video.deviceId && video.deviceId.exact) {\n LocalStorage.store('videoId', video.deviceId.exact);\n }\n if (audio && audio.deviceId && audio.deviceId.exact) {\n LocalStorage.store('audioId', audio.deviceId.exact);\n }\n this.virtualBackground.updateCache(this.virtualBackgroundType);\n }\n\n /**\n * Set active stream.\n *\n * NOTE: This can be called _after_ we have already stopped.\n **/\n // eslint-disable-next-line max-statements\n setStream(stream) {\n const firstRun = this.stream === null;\n this.stream = stream;\n if (this.terminationInProgress) {\n this.stop();\n return Promise.resolve();\n }\n const emitStreamUpdate = () => {\n this.emit({\n stream: this.stream,\n constraints: this.constraints,\n options: this.options\n });\n this.verifyStream();\n };\n if (firstRun) {\n return DeviceManager.fetchDevices().then(devices => {\n this.setDevices(devices);\n emitStreamUpdate();\n });\n }\n emitStreamUpdate();\n return Promise.resolve();\n }\n\n verifyStream() {\n if (\n this.constraints.video &&\n this.stream &&\n this.stream.getVideoTracks().length === 0 &&\n !this.options.eco\n ) {\n this.handleError({ name: 'EyesonCameraError' });\n }\n\n if (\n this.constraints.audio &&\n this.stream &&\n this.stream.getAudioTracks().length === 0\n ) {\n this.handleError({ name: 'EyesonMicrophoneError' });\n }\n }\n\n /**\n * Set video input selection.\n **/\n setVideoInput(deviceId) {\n let videoConstraints = {};\n Object.assign(videoConstraints, this.constraints.video, {\n deviceId: { exact: deviceId }\n });\n this.constraints.video = videoConstraints;\n return this.update();\n }\n\n /**\n * Set audio input selection.\n **/\n setAudioInput(deviceId, options = {}) {\n let audioConstraints = {};\n Object.assign(audioConstraints, this.constraints.audio, {\n deviceId: { exact: deviceId }\n });\n this.constraints.audio = audioConstraints;\n if (options.preventUpdate === true) {\n return Promise.resolve();\n }\n return this.update();\n }\n\n /**\n * Set and store audio output selection.\n **/\n setAudioOutput(sinkId) {\n this.sinkId = sinkId || 'default';\n LocalStorage.store('sinkId', this.sinkId);\n this.emit({ sinkId: this.sinkId });\n }\n\n handleError(error) {\n Logger.error('DeviceManager::', error);\n this.emit({ error: error, constraints: this.constraints });\n }\n\n /**\n * emit bound listeners about changes.\n **/\n emit(state) {\n this.listeners.forEach(listener => listener(state));\n }\n}\n\nexport default DeviceManager;\n/* eslint-enable max-lines */\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport NinjaStream from './NinjaStream.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport {\n stopTrack,\n captureStream,\n isCanvasPresentationStream,\n isScreenStream,\n isScreenPresentationStream,\n getScreenTracks,\n getScreenPresentationTracks,\n getCanvasTracks,\n getCameraTracks,\n toggleAudio,\n stopStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Options are basically what the user of MediaStreamBuilder \"wants\" to see in\n * the conference session. For example: no camera video -> options video: false\n * but we'd still have a media stream track with video because conference server\n * currently expects this behaviour and relies on mute_video command being\n * sent.\n **/\nclass MediaStreamBuilder {\n constructor(\n options = {\n eco: false,\n audio: true,\n video: true,\n screen: false,\n surface: null,\n screenStream: null,\n canvas: null,\n existingStream: null,\n micMixer: null,\n vbgMixer: null,\n isPresentation: false,\n virtualBackground: false,\n deviceMonitor: null\n }\n ) {\n this.options = options;\n this.tempStream = null;\n this.brokenTrackCallback = null;\n this.bindMethods();\n }\n\n bindMethods() {\n this.getMediaStream = this.getMediaStream.bind(this);\n this.addNinjaTrack = this.addNinjaTrack.bind(this);\n this.addCanvasTrack = this.addCanvasTrack.bind(this);\n this.addScreenTrack = this.addScreenTrack.bind(this);\n this.adjustAudioTrack = this.adjustAudioTrack.bind(this);\n this.adjustVideoTrack = this.adjustVideoTrack.bind(this);\n this.addScreenStreamTrack = this.addScreenStreamTrack.bind(this);\n this.initializeVirtualBackground =\n this.initializeVirtualBackground.bind(this);\n }\n\n /**\n * We always acquire a stream with at least audio enabled and adjust\n * the desired mute behaviour via the track.\n * Unless, we have no camera and microphones. In that case we use a\n * NinjaStream.\n * If the browser does not support updating the peerConnection\n * we acquire a audio and video stream and adjust the tracks accordingly.\n *\n * In case of replaceTrack support we stop the tracks before\n * acquiring a new stream. Since stopping a track also stops the source.\n * So, at least in Safari we'd stop the camera if the old and new track\n * use the same source.\n * Furthermore Safari on iOS behaves differently again. Camera muting\n * _sometimes_ freezes the remote stream video playback (audio fine).\n **/\n start() {\n Logger.debug('MediaStreamBuilder::start', this.options);\n const {\n existingStream,\n video,\n audio,\n screen,\n canvas,\n micMixer,\n screenStream\n } = this.options;\n if (\n FeatureDetector.isIOSDevice() &&\n existingStream &&\n typeof video === 'boolean' &&\n existingStream.active &&\n getCameraTracks(existingStream).length > 0 &&\n getCameraTracks(existingStream)[0].readyState !== 'ended'\n ) {\n // eslint-disable-next-line max-statements\n return new Promise(resolve => {\n const [vTrack] = getCameraTracks(existingStream);\n vTrack.enabled = video;\n vTrack.onended =\n video && this.brokenTrackCallback\n ? () => {\n Logger.error('iOS video track broken');\n existingStream.getTracks().forEach(track => track.stop());\n this.brokenTrackCallback();\n }\n : null;\n if (typeof audio === 'boolean') {\n toggleAudio(existingStream, audio);\n }\n if (canvas) {\n const newStream = new MediaStream(existingStream.getTracks());\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n newStream.addTrack(canvasTrack);\n resolve(newStream);\n return;\n }\n resolve(existingStream);\n });\n }\n\n if (FeatureDetector.isSafari() && screen && micMixer && !canvas) {\n return (\n screenStream ? Promise.resolve(screenStream) : this.getDisplayMedia()\n )\n .then(displayStream => {\n return DeviceManager.getConstraints().then(constraints => {\n const stream = new MediaStream();\n this.addScreenStreamTrack(stream, displayStream);\n this.tempStream = new MediaStream(displayStream.getTracks());\n return navigator.mediaDevices\n .getUserMedia({ audio: constraints.audio })\n .then(audioStream => {\n this.adjustAudioTrack(audioStream);\n audioStream\n .getTracks()\n .forEach(track => this.tempStream.addTrack(track));\n micMixer.mixScreenshareAudio(\n audioStream,\n displayStream,\n stream\n );\n if (micMixer.active) {\n micMixer.setMicOnlyStream(audioStream, displayStream);\n }\n return stream;\n });\n });\n })\n .then(stream => {\n this.tempStream = null;\n return stream;\n })\n .catch(error => {\n if (this.tempStream) {\n stopStream(this.tempStream);\n this.tempStream = null;\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n return DeviceManager.fetchInputDevices()\n .then(this.getMediaStream)\n .then(this.adjustVideoTrack)\n .then(this.adjustAudioTrack)\n .then(this.initializeVirtualBackground)\n .then(this.addCanvasTrack)\n .then(this.addScreenTrack)\n .then(this.addNinjaTrack)\n .then(stream => {\n this.tempStream = null;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.applyTempTracks();\n }\n return stream;\n })\n .catch(error => {\n this.cleanupTempStream();\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.discardTempTracks();\n }\n Logger.error('MediaStreamBuilder::start ', error, error.message);\n return Promise.reject(error);\n });\n }\n\n // eslint-disable-next-line max-statements\n getMediaStream(devices) {\n if (devices.length === 0) {\n this.options = { audio: false, video: false };\n this.tempStream = new NinjaStream().stream;\n return this.tempStream;\n }\n const { eco, video, existingStream } = this.options;\n const options = {\n video: FeatureDetector.hasCanvasCaptureSupport() || eco ? video : true,\n audio: true\n };\n if (video === false && !eco && FeatureDetector.isIOSDevice()) {\n options.video = true;\n }\n let { getConstraints } = DeviceManager;\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n stopStream(existingStream);\n }\n if (FeatureDetector.isPhone() || FeatureDetector.isIOSDevice()) {\n stopStream(existingStream);\n getConstraints = DeviceManager.getMobileConstraints;\n }\n return getConstraints(options).then(constraints => {\n return navigator.mediaDevices.getUserMedia(constraints).then(stream => {\n this.tempStream = stream;\n return stream;\n });\n });\n }\n\n /**\n * Adjust audio and video tracks according to the supplied options.\n * We stop the video track so the camera indicator isn't active.\n * We add a filler video track, unless we're in eco mode, which would result\n * in sdp with media section for video & recvonly. meaning we'd still\n * receive video.\n * In case of iOS we have the cam track that shouldn't get stopped to get turned\n * on again\n **/\n adjustVideoTrack(stream) {\n if (stream.getVideoTracks().length === 1) {\n const [vTrack] = stream.getVideoTracks();\n vTrack.enabled = this.options.video;\n if (this.options.video === false && !FeatureDetector.isIOSDevice()) {\n stopTrack(vTrack);\n }\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addVideoTrack(vTrack);\n }\n }\n return stream;\n }\n\n initializeVirtualBackground(stream) {\n const { screen, virtualBackground, vbgMixer } = this.options;\n if (\n !screen &&\n virtualBackground &&\n stream &&\n stream.getVideoTracks().length === 1\n ) {\n return vbgMixer.initiateStream(stream);\n }\n return stream;\n }\n\n adjustAudioTrack(stream) {\n if (stream.getAudioTracks().length === 1) {\n const [aTrack] = stream.getAudioTracks();\n aTrack.enabled = this.options.audio;\n if (this.options.deviceMonitor) {\n this.options.deviceMonitor.addAudioTrack(aTrack);\n }\n }\n return stream;\n }\n\n addCanvasTrack(stream) {\n const { canvas, existingStream } = this.options;\n if (canvas) {\n const canvasStream = captureStream(canvas);\n const [canvasTrack] = getCanvasTracks(canvasStream);\n stream.addTrack(canvasTrack);\n }\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n stream.addTrack(canvasTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n async addScreenTrack(stream) {\n let { screenStream } = this.options;\n const { screen, existingStream, micMixer } = this.options;\n if (screen && micMixer) {\n if (screenStream === null || typeof screenStream === 'undefined') {\n screenStream = await this.getDisplayMedia();\n }\n const outStream = new MediaStream();\n this.addScreenStreamTrack(outStream, screenStream);\n micMixer.mixScreenshareAudio(stream, screenStream, outStream);\n if (micMixer.active) {\n micMixer.setMicOnlyStream(stream, screenStream);\n }\n this.tempStream = new MediaStream(\n stream.getTracks().concat(screenStream.getTracks())\n );\n return outStream;\n }\n // this is crazy! for now, we loose screen audio if there was any\n if (isScreenPresentationStream(existingStream)) {\n const [screenTrack] = getScreenPresentationTracks(existingStream);\n stream.addTrack(screenTrack);\n }\n return stream;\n }\n\n addScreenStreamTrack(stream, screenStream) {\n const [screenTrack] = screenStream.getVideoTracks();\n // options required for SAFARI\n screenTrack.type = this.options.isPresentation\n ? 'screen-track'\n : 'screen-video-track';\n if (stream) {\n stream.addTrack(screenTrack);\n }\n }\n\n getDisplayMedia() {\n if (FeatureDetector.hasGetDisplayMedia()) {\n const stereo = FeatureDetector.canStereo() && !this.options.eco;\n const audioConstraints = { channelCount: stereo ? 2 : 1 };\n const videoConstraints = {\n // removed width constraint due to safari bug drawing a green line\n // width: { max: 1920 },\n height: { max: 1080 },\n frameRate: { max: 15 }\n };\n if (FeatureDetector.isChrome() && FeatureDetector.isMacOS()) {\n // disable audio processing to prevent down-mixing\n // unfortunately audio on entire screen (not supported on Mac) causes echo!\n audioConstraints.echoCancellation = false;\n }\n if (this.options.surface && FeatureDetector.canChooseDisplaySurface()) {\n videoConstraints.displaySurface = this.options.surface;\n }\n return navigator.mediaDevices.getDisplayMedia({\n audio: audioConstraints,\n video: videoConstraints,\n surfaceSwitching: 'include',\n selfBrowserSurface: 'include',\n systemAudio: 'include'\n });\n }\n return navigator.mediaDevices.getUserMedia({\n video: {\n mediaSource: 'screen',\n width: { max: 1920 },\n height: { max: 1040 },\n frameRate: { max: 15 }\n }\n });\n }\n\n addNinjaTrack(stream) {\n const { eco, video } = this.options;\n if (eco || !FeatureDetector.hasCanvasCaptureSupport()) {\n return stream;\n }\n if (stream.getVideoTracks().length === 0) {\n const [fillerTrack] = new NinjaStream().stream.getVideoTracks();\n fillerTrack.enabled = video;\n stream.addTrack(fillerTrack);\n }\n return stream;\n }\n\n // eslint-disable-next-line max-statements\n cleanupTempStream() {\n let { tempStream } = this;\n if (!tempStream) {\n return;\n }\n const { existingStream, screenStream } = this.options;\n if (isCanvasPresentationStream(existingStream)) {\n const [canvasTrack] = getCanvasTracks(existingStream);\n tempStream.removeTrack(canvasTrack);\n }\n if (isScreenStream(existingStream)) {\n const [screenTrack] = getScreenTracks(existingStream);\n tempStream.removeTrack(screenTrack);\n }\n if (isScreenPresentationStream(screenStream)) {\n const [screenTrack] = getScreenPresentationTracks(screenStream);\n tempStream.removeTrack(screenTrack);\n }\n stopStream(tempStream);\n this.tempStream = null;\n }\n\n onBrokenTrackError(callback) {\n this.brokenTrackCallback = callback;\n return this;\n }\n}\n\nexport default MediaStreamBuilder;\n","import Logger from './Logger.js';\nimport { stopStream, stopTrack } from './utils/StreamHelpers.js';\n\nclass MicMixer {\n constructor() {\n this.active = false;\n this.audioContext = null;\n this.acOut = null;\n this.micOnlyStream = null;\n this.originalStream = null;\n }\n\n setMicOnlyStream(audioStream, videoStream) {\n this.micOnlyStream = new MediaStream();\n const audioTracks = audioStream.getAudioTracks();\n const videoTracks = videoStream.getVideoTracks();\n if (audioTracks.length > 0) {\n this.micOnlyStream.addTrack(audioTracks[0]);\n }\n if (videoTracks.length > 0) {\n this.micOnlyStream.addTrack(videoTracks[0]);\n }\n return this.micOnlyStream;\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n getOriginalStream() {\n return this.originalStream;\n }\n\n stopOriginalStream() {\n stopStream(this.originalStream);\n }\n\n noMix(userMediaStream, outStream) {\n const audioTracks = userMediaStream.getAudioTracks();\n if (audioTracks.length > 0) {\n outStream.addTrack(audioTracks[0]);\n }\n }\n\n initMixScreenshareMix(userMediaStream, displayStream, outStream) {\n this.audioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n this.acOut = this.audioContext.createMediaStreamDestination();\n this.audioContext\n .createMediaStreamSource(displayStream)\n .connect(this.acOut);\n this.audioContext\n .createMediaStreamSource(userMediaStream)\n .connect(this.acOut);\n outStream.addTrack(this.acOut.stream.getAudioTracks()[0]);\n }\n\n mixScreenshareAudio(userMediaStream, displayStream, outStream) {\n this.originalStream = displayStream;\n const displayAudio = displayStream.getAudioTracks();\n if (displayAudio.length === 0) {\n this.noMix(userMediaStream, outStream);\n } else {\n try {\n this.initMixScreenshareMix(userMediaStream, displayStream, outStream);\n this.active = true;\n } catch (exc) {\n Logger.error('MicMixer::mixScreenshareAudio', exc);\n stopTrack(displayAudio[0]);\n this.noMix(userMediaStream, outStream);\n }\n }\n }\n\n destroy() {\n this.stopOriginalStream();\n this.micOnlyStream = null;\n this.originalStream = null;\n if (this.audioContext) {\n stopStream(this.acOut.stream);\n this.audioContext.close().then(() => {\n this.audioContext = null;\n this.acOut = null;\n this.active = false;\n });\n return;\n }\n this.active = false;\n }\n}\n\nexport default MicMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst adjustMediaStreamTracks = (stream, audio, video) => {\n stream.getAudioTracks().forEach(track => (track.enabled = audio));\n stream.getVideoTracks().forEach(track => (track.enabled = video));\n};\n\n/**\n * ChangeLocalStream (optimization after PodiumEvent).\n **/\nclass ChangeLocalStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio, video, screen = false, surface }) {\n Logger.debug('ChangeLocalStreamEvent::handle');\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream, vbgMixer } = _session;\n const wasScreenAsVideo = Boolean(_session.micMixer);\n\n if (\n FeatureDetector.isIOSDevice() ||\n (FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !wasScreenAsVideo &&\n !localStream.wasScreenAsVideo)\n ) {\n if (vbgMixer) {\n if (video) {\n vbgMixer.resume();\n } else {\n vbgMixer.suspend();\n }\n if (\n vbgMixer.originalStream &&\n vbgMixer.originalStream !== localStream\n ) {\n adjustMediaStreamTracks(vbgMixer.originalStream, audio, video);\n }\n }\n adjustMediaStreamTracks(localStream, audio, video);\n localStream.locallyChanged = true;\n _session.emit({ type: 'stream_update', localStream });\n return;\n }\n\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n }\n\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n\n new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(stream => {\n stream.locallyChanged = true;\n stream.wasScreenAsVideo = wasScreenAsVideo;\n _session.setStream(stream);\n })\n .catch(error => {\n Logger.error('ChangeLocalStreamEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n _session.emit({ type: 'stop_screen_video' });\n }\n });\n }\n}\n\nexport default ChangeLocalStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport ForwardEvent from './ForwardEvent.js';\nimport ChangeLocalStreamEvent from './ChangeLocalStreamEvent.js';\nimport {\n isPresentationStream,\n isCameraStream,\n isVBGStream,\n hasAudio,\n hasVideo\n} from './../utils/StreamHelpers.js';\n\nclass PodiumEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n // For dev\n Logger.debug('PodiumEvent::handle', msg);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const { localStream } = _session;\n\n if (\n !msg.hasPresenter &&\n isPresentationStream(localStream) &&\n !_session.stopPresentingSet\n ) {\n _session.emit({ type: 'stop_presenting' });\n }\n\n if (_session && !_session.externalStream) {\n this.scanMessageForLocalStreamOptimization(localStream, msg);\n }\n\n new ForwardEvent(this.context).handle(msg);\n }\n\n // Optimization to avoid streaming when not on video podium.\n // First, we need a localStream, then we avoid adjustments when we initially\n // join the room (isSource) and finally if we're not on the podium,\n // but have a local camera stream with video, we change our local stream.\n //\n // We only re-activate the camera in the opposite case if the current\n // localStream was locallyChanged (through this optimization) since we\n // want to avoid situations where a user doesn't expect to be on the video\n // podium and we suddenly turned on their camera.\n //\n // Last case: someone else is presenting (screen share or canvas presentation)\n // we're still on the video podium but not actively presenting.\n // eslint-disable-next-line max-statements\n scanMessageForLocalStreamOptimization(localStream, msg) {\n const { video, isSource, isPresenter, hasPresenter, hasDesktopSources } =\n msg;\n\n if (!localStream) {\n return;\n }\n\n if (\n isSource &&\n ((!video && (isCameraStream(localStream) || isVBGStream(localStream))) ||\n (video &&\n !hasVideo(localStream) &&\n localStream.locallyChanged &&\n !hasPresenter))\n ) {\n const options = {\n audio: hasAudio(localStream),\n video: video\n };\n if (localStream.wasScreenAsVideo) {\n options.video = false;\n options.screen = true;\n }\n new ChangeLocalStreamEvent(this.context).handle(options);\n }\n\n if (video && !isPresenter && hasDesktopSources) {\n new ChangeLocalStreamEvent(this.context).handle({\n audio: hasAudio(localStream),\n video: false\n });\n }\n }\n}\n\nexport default PodiumEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SnapshotEvent extends BaseEvent {\n handle() {\n this.context._api.takeSnapshot();\n }\n}\n\nexport default SnapshotEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayerEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayer(msg.params);\n }\n}\n\nexport default SetLayerEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SendChatEvent extends BaseEvent {\n handle(msg) {\n if (!this.context._session) {\n throw new Error('Session does not exist');\n }\n this.context._session.send({\n type: 'chat',\n content: msg.content\n });\n }\n}\n\nexport default SendChatEvent;\n","import Logger from '../Logger';\nimport PublicEvent from './PublicEvent';\n\nclass StopRtmpEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopBroadcast('generic')\n .then(() => super.handle({ type: msg.type }))\n .catch(error => Logger.warn(error));\n }\n}\n\nexport default StopRtmpEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SetLayoutEvent extends BaseEvent {\n handle(msg) {\n this.context._api.setLayout(msg.params);\n }\n}\n\nexport default SetLayoutEvent;\n","import BaseEvent from './BaseEvent';\n\nconst fixUrlEnd = url => {\n if (!url.endsWith('/')) {\n return url + '/';\n }\n return url;\n};\n\nclass StartRtmpEvent extends BaseEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n const streamUrl = fixUrlEnd(msg.url) + msg.key;\n _api.startBroadcast({ streamUrl }, 'generic').catch(error => {\n _session.emit({\n type: 'start_broadcast_error',\n platform: 'generic',\n error: error\n });\n });\n }\n}\n\nexport default StartRtmpEvent;\n","const EventTargetConstructorSupport = (() => {\n try {\n // eslint-disable-next-line no-new\n new EventTarget();\n return true;\n // eslint-disable-next-line no-empty\n } catch (error) {}\n return false;\n})();\n\nclass EventEmitter {\n constructor() {\n this.listeners = new Map();\n this.target = EventTargetConstructorSupport\n ? new EventTarget()\n : document.createElement('i');\n }\n\n onEvent(cb) {\n const fn = ({ detail }) => cb(detail);\n this.target.addEventListener('event', fn);\n this.listeners.set(cb, fn);\n }\n\n offEvent(cb) {\n const fn = this.listeners.get(cb);\n if (fn) {\n this.target.removeEventListener('event', fn);\n this.listeners.delete(cb);\n }\n }\n\n removeAllListeners() {\n const { listeners, target } = this;\n listeners.forEach(fn => target.removeEventListener('event', fn));\n listeners.clear();\n }\n\n emit(data) {\n const event = new CustomEvent('event', { detail: data });\n this.target.dispatchEvent(event);\n }\n}\n\nexport default EventEmitter;\n","import EventEmitter from './eventEmitter.js';\n\nclass Transport extends EventEmitter {\n constructor(options) {\n super();\n this.connection = null;\n this.options = options;\n this.wasOpen = false;\n }\n\n connect() {\n const { options } = this;\n this.wasOpen = false;\n const connection = new WebSocket(\n `${options.endpoint}?auth_token=${options.auth_token}`\n );\n connection.onopen = () => {\n this.wasOpen = true;\n this.emit({ type: 'connected' });\n };\n connection.onmessage = ({ data }) => {\n this.emit({ type: 'message', message: data });\n };\n connection.onerror = () => {\n this.emit({ type: 'transportError' });\n };\n connection.onclose = () => {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event\n this.destroy();\n };\n this.connection = connection;\n }\n\n isConnected() {\n const { connection } = this;\n if (connection) {\n return connection.readyState === WebSocket.OPEN;\n }\n return false;\n }\n\n send(message) {\n const { connection } = this;\n if (!connection) {\n return false;\n }\n connection.send(message);\n return true;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { connection, wasOpen } = this;\n if (connection) {\n this.connection = null;\n connection.onopen = null;\n connection.onmessage = null;\n connection.onerror = null;\n connection.onclose = null;\n if (connection.readyState <= WebSocket.OPEN) {\n connection.close();\n }\n this.emit({ type: 'disconnected', was_open: wasOpen });\n }\n this.removeAllListeners();\n }\n}\n\nexport default Transport;\n","// https://github.com/bluelovers/ws-string/blob/master/packages/crlf-normalize/src/index.ts\nconst R_CRLF = /\\r\\n|\\r(?!\\n)|\\n/g;\nconst CRLF = '\\r\\n';\nconst crlfNormalize = text => text.replace(R_CRLF, CRLF);\n\nexport default crlfNormalize;\n","// https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library\nconst parseJwtPayload = token => {\n try {\n return JSON.parse(atob(token.split('.')[1]));\n } catch (error) {\n return false;\n }\n};\n\nexport default parseJwtPayload;\n","const supportsRandomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function';\n\nconst uuid = () => {\n if (supportsRandomUUID) {\n return crypto.randomUUID();\n }\n let index = 0;\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, char => {\n const byte = bytes[index];\n index += 1;\n // eslint-disable-next-line no-bitwise\n return (char ^ (byte & (15 >> (char / 4)))).toString(16);\n });\n};\n\nexport default uuid;\n","/* eslint-disable max-lines */\nimport EventEmitter from './eventEmitter.js';\nimport Transport from './Transport.js';\nimport crlfNormalize from './crlfNormalize.js';\nimport parseJwtPayload from './parseJwtPayload.js';\nimport uuid from './uuid.js';\n\nconst checkUserAgentOptions = (options = {}) => {\n let failed = '';\n [\n 'client_id',\n 'conf_id',\n 'client_name',\n 'sessionDescriptionHandlerFactory',\n 'transportOptions'\n ].some(key => {\n if (!options[key]) {\n failed = key;\n return false;\n }\n return true;\n });\n if (!failed) {\n ['auth_token', 'endpoint'].some(key => {\n if (!options.transportOptions[key]) {\n failed = `transportOptions.${key}`;\n return false;\n }\n return true;\n });\n }\n if (failed) {\n throw new Error(`Invalid options - ${failed}`);\n }\n};\n\nconst slowdown = (fn, ms, ctx) => {\n const stack = [];\n let wait = false;\n const cb = (...args) => {\n if (wait) {\n stack.push(args);\n return;\n }\n wait = true;\n setTimeout(() => {\n wait = false;\n if (stack.length > 0) {\n const nextArgs = stack.shift();\n Reflect.apply(cb, null, nextArgs);\n }\n }, ms);\n Reflect.apply(fn, ctx, args);\n };\n return cb;\n};\n\nclass UserAgent extends EventEmitter {\n constructor(options) {\n super();\n checkUserAgentOptions(options);\n this.callId = null;\n this.sessionDescriptionHandler = null;\n this.options = options;\n this.initAuthToken();\n this.debouncedHandleSDPUpdate = slowdown(this.handleSdpUpdate, 250, this);\n }\n\n // eslint-disable-next-line max-statements\n async onMessage(message) {\n const obj = JSON.parse(message);\n const { type, data } = obj;\n this.verifySender(obj);\n if (type === 'call_accepted') {\n this.setCallId(data.call_id);\n await this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'accepted' });\n } else if (type === 'call_resumed') {\n this.sessionDescriptionHandler.setDescription(data.sdp);\n this.emit({ type: 'resumed' });\n } else if (type === 'call_rejected') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'reject',\n code: data.reject_code\n });\n this.terminate();\n } else if (type === 'call_terminated') {\n this.termination = true;\n this.setCallId(null);\n this.emit({\n type: 'terminated',\n reason: 'bye',\n code: data.term_code\n });\n this.terminate();\n } else if (type === 'sdp_update') {\n this.debouncedHandleSDPUpdate(data);\n } else {\n data.type = type;\n this.emit({ type: 'message', data });\n }\n }\n\n initAuthToken() {\n const { options } = this;\n const jwt = parseJwtPayload(options.transportOptions.auth_token);\n if (\n jwt === false ||\n jwt.client_id !== options.client_id ||\n jwt.conf_id !== options.conf_id ||\n !jwt.exp\n ) {\n throw new Error('Invalid auth token');\n }\n }\n\n setCallId(callId) {\n this.callId = callId;\n }\n\n verifySender(message) {\n const { options } = this;\n if (\n !(message.from === options.conf_id && message.to === options.client_id)\n ) {\n // throw new Error('Invalid message sender');\n // eslint-disable-next-line no-console\n console.error(new Error('Invalid message sender', message));\n }\n }\n\n async handleSdpUpdate(data) {\n const { callId } = this;\n const { sdp } = data;\n if (!callId || callId !== data.call_id) {\n throw new Error('Invalid call id');\n }\n this.emit({ type: 'sdp_update', sdp });\n const answerSdp =\n await this.sessionDescriptionHandler.updateDescription(sdp);\n if (sdp.type === 'offer' && answerSdp) {\n const desc = {\n type: answerSdp.type,\n sdp: crlfNormalize(answerSdp.sdp)\n };\n this.message('sdp_update', {\n call_id: callId,\n sdp: desc\n });\n }\n }\n\n message(type = 'message', data = {}) {\n const { options } = this;\n const message = JSON.stringify({\n type,\n msg_id: uuid(),\n from: options.client_id,\n to: options.conf_id,\n data\n });\n this.transport.send(message);\n }\n\n connect() {\n const { options } = this;\n const transport = new Transport(options.transportOptions);\n this.transport = transport;\n this.termination = false;\n this.emit({ type: 'transportCreated', transport });\n transport.onEvent(event => {\n const { type } = event;\n if (type === 'connected') {\n if (!this.sessionDescriptionHandler) {\n this.sessionDescriptionHandler =\n options.sessionDescriptionHandlerFactory(\n options.sessionDescriptionHandlerFactoryOptions\n );\n this.emit({ type: 'registered' });\n }\n } else if (type === 'message') {\n this.onMessage(event.message);\n } else if (type === 'disconnected') {\n if (!this.termination) {\n this.emit({\n type: 'terminated',\n reason: 'disconnect',\n code: event.was_open ? 0 : -1\n });\n }\n }\n });\n transport.connect();\n }\n\n // eslint-disable-next-line max-statements\n async call() {\n const { sessionDescriptionHandler, options } = this;\n if (!sessionDescriptionHandler) {\n throw new Error('Invalid sessionDescriptionHandler');\n }\n const description = await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_start', {\n sdp: desc,\n display_name: options.client_name,\n mute_video: options.mute_video\n });\n }\n\n resume(authToken) {\n if (!this.callId) {\n throw new Error('Session was already closed');\n }\n this.options.transportOptions.auth_token = authToken;\n try {\n this.initAuthToken();\n } catch (error) {\n this.emit({ type: 'terminated', reason: 'disconnect', code: -1 });\n return;\n }\n const onReconnect = seppEvent => {\n if (seppEvent.type === 'transportCreated') {\n this.offEvent(onReconnect);\n // eslint-disable-next-line max-statements\n this.transport.onEvent(async transportEvent => {\n if (transportEvent.type === 'connected') {\n const { transport, sessionDescriptionHandler } = this;\n if (!this.callId) {\n transport.destroy();\n throw new Error('Session was already closed');\n }\n try {\n const description =\n await sessionDescriptionHandler.getDescription();\n const desc = {\n type: description.type,\n sdp: crlfNormalize(description.sdp)\n };\n this.message('call_resume', {\n call_id: this.callId,\n sdp: desc\n });\n } catch (error) {\n transport.destroy();\n throw new Error('Unable to reconnect');\n }\n }\n });\n }\n };\n this.onEvent(onReconnect);\n this.connect();\n }\n\n // eslint-disable-next-line max-statements\n terminate() {\n const { sessionDescriptionHandler, transport, callId } = this;\n this.callId = null;\n if (sessionDescriptionHandler) {\n sessionDescriptionHandler.close();\n }\n if (transport) {\n if (transport.isConnected() && callId) {\n this.termination = true;\n this.message('call_terminate', {\n call_id: callId,\n term_code: 0\n });\n this.emit({ type: 'terminated', reason: 'terminate', code: 0 });\n }\n this.transport = null;\n transport.destroy();\n }\n }\n}\n\nexport default { UserAgent };\n","/**\n * This is where we keep the list of sip events we're interested in forwarding.\n **/\nexport default [\n 'chat',\n 'recording',\n 'memberlist',\n 'source_update',\n 'voice_activity'\n];\n","/**\n * Podium Facade.\n **/\nclass PodiumFacade {\n constructor(message, clientId) {\n const { src = [], psrc, asrc, vsrc, dsrc, dims } = message;\n this.clientId = clientId;\n this.sources = src;\n this.presenterIdx = psrc;\n this.audioSources = asrc;\n this.videoSources = vsrc;\n this.desktopSources = dsrc;\n this.dimensions = dims;\n this.userSourceIndex = src.indexOf(clientId);\n }\n\n get isSolo() {\n const uniqueSources = Array.from(new Set(this.sources));\n return uniqueSources.length === 1 && this.sources[0] === this.clientId;\n }\n\n get isSource() {\n return this.sources.includes(this.clientId);\n }\n\n get isPresenter() {\n return this.hasPresenter && this.presenter === this.clientId;\n }\n\n get presenter() {\n return this.hasPresenter && this.sources[this.presenterIdx];\n }\n\n get hasMedia() {\n return this.sources.some(source => /media/.test(source));\n }\n\n get hasPresenter() {\n return Number.isInteger(this.presenterIdx) && this.presenterIdx > -1;\n }\n\n get hasVideoSources() {\n return Boolean(this.videoSources);\n }\n\n get hasDesktopSources() {\n return Number.isInteger(this.desktopSources) && this.desktopSources > -1;\n }\n\n get hasAudioPosition() {\n return this.audioSources.includes(this.userSourceIndex);\n }\n\n get hasVideoPosition() {\n return this.videoSources.includes(this.userSourceIndex);\n }\n\n get hasMutedVideoPeers() {\n return (\n !this.hasDesktopSources &&\n this.videoSources.filter(source => source !== this.userSourceIndex)\n .length === 0\n );\n }\n\n get userDimensions() {\n const userVideoIndex = this.videoSources.indexOf(this.userSourceIndex);\n if (userVideoIndex > -1) {\n return this.dimensions[userVideoIndex];\n }\n return null;\n }\n}\n\nexport default PodiumFacade;\n","import Logger from './Logger.js';\nimport PodiumFacade from './PodiumFacade.js';\n\n/**\n * SipMessageTransformer\n **/\nclass SigMessageTransformer {\n constructor(clientId) {\n this.clientId = clientId;\n this.stamp = this.stamp.bind(this);\n this.default = this.default.bind(this);\n this.process = this.process.bind(this);\n this.sourceUpdate = this.sourceUpdate.bind(this);\n this.voiceActivity = this.voiceActivity.bind(this);\n }\n\n /**\n * Put a stamp with _src on the message.\n **/\n stamp(message) {\n return Object.assign({ _src: 'sig' }, message);\n }\n\n process(message) {\n /* eslint-disable camelcase */\n const transformation =\n {\n source_update: this.sourceUpdate,\n voice_activity: this.voiceActivity\n }[message.type] || this.default;\n /* eslint-enable camelcase */\n\n return transformation(this.stamp(message));\n }\n\n default(message) {\n Logger.debug('SipMessageTransformer::default', message);\n return message;\n }\n\n sourceUpdate(message) {\n Logger.debug('SipMessageTransformer::sourceUpdate', message);\n\n const podium = new PodiumFacade(message, this.clientId);\n\n const transformed = {\n type: 'podium',\n solo: podium.isSolo,\n audio: podium.hasAudioPosition,\n video: podium.hasVideoPosition,\n media: podium.hasMedia,\n sources: podium.sources,\n isSource: podium.isSource,\n presenter: podium.presenter,\n isPresenter: podium.isPresenter,\n hasPresenter: podium.hasPresenter,\n videoSources: podium.videoSources,\n userDimensions: podium.userDimensions,\n hasVideoSources: podium.hasVideoSources,\n hasDesktopSources: podium.hasDesktopSources,\n hasMutedVideoPeers: podium.hasMutedVideoPeers\n };\n\n return transformed;\n }\n\n voiceActivity(message) {\n Logger.debug('SipMessageTransformer::voiceActivity', message);\n\n // we rename the type here so we can use 'voice_activity' for passing to the\n // ui\n const transformed = Object.assign({\n type: 'voice_activity_raw',\n on: message.on,\n userId: message.cid\n });\n\n return transformed;\n }\n}\n\nexport default SigMessageTransformer;\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport 'webrtc-adapter';\nimport {\n stopTrack,\n getCanvasTracks,\n isCanvasPresentationStream\n} from './utils/StreamHelpers.js';\n\nconst _iceCheckingTimeout = 3000;\n\n/**\n * SessionDescriptionHandler\n */\nclass SessionDescriptionHandler {\n // eslint-disable-next-line max-statements\n constructor(options) {\n this.datachannel = null;\n this.peerConnection = null;\n this.localStream = null;\n this.remoteStream = null;\n this.connected = false;\n this.iceCheckingTimer = null;\n this.peerConnectionReady = null;\n this.options = options || {};\n this.connection = options.connection;\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.initPeerConnection();\n }\n\n /**\n * Gets the local description from the underlying media implementation\n */\n // eslint-disable-next-line max-statements\n async getDescription() {\n const { options, peerConnection } = this;\n Logger.debug('SessionDescriptionHandler::getDescription:', options);\n this.localStream = options.stream;\n const offer = await peerConnection.createOffer(options.RTCOfferOptions);\n options.SDPModifiers.active.forEach(modifier => {\n offer.sdp = modifier(offer.sdp);\n });\n await peerConnection.setLocalDescription(offer);\n await this.peerConnectionReady;\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug('SessionDescriptionHandler::getDescription offer', sdp);\n return { type: 'offer', sdp };\n }\n\n /**\n * Set the remote description to the underlying media implementation\n */\n async setDescription(sessionDescription) {\n const { datachannel } = this;\n Logger.debug(\n 'SessionDescriptionHandler::setDescription:',\n sessionDescription\n );\n if (sessionDescription && sessionDescription.sdp) {\n this.connection.seppMessaging = sessionDescription.sdp.includes(\n 'a=eyeson-sepp-messaging'\n );\n }\n await this.peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n if (datachannel.readyState === 'connecting') {\n await new Promise(resolve => {\n datachannel.onopen = () => {\n datachannel.onopen = null;\n resolve();\n };\n });\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateDescription(sessionDescription) {\n const { options, peerConnection } = this;\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription:',\n sessionDescription\n );\n if (sessionDescription.type === 'offer') {\n try {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n const answer = await peerConnection.createAnswer();\n options.SDPModifiers.active.forEach(modifier => {\n answer.sdp = modifier(answer.sdp);\n });\n await peerConnection.setLocalDescription(answer);\n this.options.remoteDescriptionUpdate(sessionDescription);\n let { sdp } = peerConnection.localDescription;\n options.SDPModifiers.passive.forEach(modifier => {\n sdp = modifier(sdp);\n });\n Logger.debug(\n 'SessionDescriptionHandler::updateDescription answer',\n sdp\n );\n return { type: 'answer', sdp };\n } catch (error) {\n Logger.error('SessionDescriptionHandler::updateDescription', error);\n }\n } else if (sessionDescription.type === 'answer') {\n await peerConnection.setRemoteDescription(\n new RTCSessionDescription(sessionDescription)\n );\n this.options.remoteDescriptionUpdate(sessionDescription);\n }\n return null;\n }\n\n close() {\n Logger.debug('SessionDescriptionHandler::close');\n clearTimeout(this.iceCheckingTimer);\n if (this.peerConnection) {\n this.stopAllTracks();\n this.peerConnection.close();\n this.peerConnection = null;\n if (\n this.datachannel &&\n ['connecting', 'open'].includes(this.datachannel.readyState)\n ) {\n this.datachannel.close();\n this.datachannel = null;\n }\n Logger.debug(\n 'SessionDescriptionHandler::close ' +\n 'Stopped streams and closed peerConnection.'\n );\n }\n }\n\n // eslint-disable-next-line max-statements\n initPeerConnection() {\n const { options } = this;\n const pcOptions = this.buildPeerConnectionOptions();\n Logger.debug(\n 'SessionDescriptionHandler::initPeerConnection with',\n pcOptions\n );\n let resolveReady = null;\n this.peerConnectionReady = new Promise(resolve => (resolveReady = resolve));\n try {\n const pc = new RTCPeerConnection(pcOptions);\n this.peerConnection = pc;\n options.stream.getTracks().forEach(track => {\n pc.addTrack(track, options.stream);\n });\n const channel = pc.createDataChannel('data', { negotiated: true, id: 0 });\n this.handleDatachannel(channel);\n pc.onicecandidate = ({ candidate }) => {\n if (!candidate) {\n resolveReady();\n return;\n }\n Logger.debug(\n 'SessionDescriptionHandler::gotIceCandidate',\n candidate.candidate\n );\n };\n pc.onicegatheringstatechange = () => {\n if (pc.iceGatheringState === 'complete') {\n resolveReady();\n }\n };\n if (options.sendOnly === true) {\n pc.addEventListener(\n 'connectionstatechange',\n this.handleConnectionStateChange\n );\n } else {\n pc.ontrack = this.handleOntrack.bind(this);\n }\n this.iceCheckingTimer = setTimeout(\n () => resolveReady(),\n _iceCheckingTimeout\n );\n } catch (error) {\n Logger.error(\n 'SessionDescriptionHandler::initPeerConnection failed:',\n error,\n this.connection.uaOptions\n );\n }\n }\n\n /**\n * Only signal (handleAccept) that we have a remote stream once ontrack\n * says so. Is called twice, once for audio and once for video track.\n */\n handleOntrack({ track, streams }) {\n const { options } = this;\n [this.remoteStream] = streams;\n Logger.debug('SessionDescriptionHandler::handleOntrack:', track.kind);\n track.onunmute = () => options.handleUnmute(track);\n options.handleAccept(this.remoteStream);\n }\n\n handleConnectionStateChange() {\n if (\n this.peerConnection.connectionState === 'connected' &&\n !this.connected\n ) {\n this.connected = true;\n this.options.handleAccept();\n }\n }\n\n handleDatachannel(channel) {\n this.datachannel = channel;\n this.connection.initDatachannel(channel);\n }\n\n /**\n * We need to re-format the iceServers here. SIP.js used to offer a\n * higher level api and we supplied the servers in a different format e.g:\n *\n * { stunServers: [\"stun:stun1.visocon.com:3478\"] }\n * { turnServers: [{ urls: [1,2,3], username: \"bob\", password: \"nob\" }] }\n *\n * We currently have the api set return the creds in that format.\n * The peerConnection however expects:\n *\n * {\n * \"iceServers\": [\n * { \"urls\": \"stun:stun1.visocon.com:3478\" },\n * { \"urls\": [1,2,3], \"username\": \"bob\", \"credential\": \"nob\" }\n * ]\n * }\n */\n buildPeerConnectionOptions() {\n const { options } = this;\n const iceServers = [{ urls: options.stun_servers }];\n options.turn_servers.forEach(turnServer => {\n turnServer.credential = turnServer.password;\n iceServers.push(turnServer);\n });\n const pcOptions = {\n sdpSemantics: 'unified-plan',\n iceServers\n };\n return pcOptions;\n }\n\n getLocalStream() {\n return this.localStream;\n }\n\n getRemoteStream() {\n return this.remoteStream;\n }\n\n setStream(newStream) {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n let oldStream = this.getLocalStream();\n this.localStream = newStream;\n\n this.stopUnusedTracks(oldStream, newStream);\n\n let [audioTrack] = newStream.getAudioTracks();\n // in case of multiple streams, the preferred video track is the\n // canvas presentation stream\n let [videoTrack] = isCanvasPresentationStream(newStream)\n ? getCanvasTracks(newStream)\n : newStream.getVideoTracks();\n\n if (!this.tracksExist()) {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n return;\n }\n const senders = this.peerConnection.getSenders();\n\n const audioSender = senders.find(\n sender => sender.track && sender.track.kind === 'audio'\n );\n const videoSender = senders.find(\n sender => sender.track && sender.track.kind === 'video'\n );\n Promise.all([\n audioSender ? audioSender.replaceTrack(audioTrack) : null,\n videoSender ? videoSender.replaceTrack(videoTrack) : null\n ])\n .then(() => {\n resolve({ newStream: newStream, remoteStream: this.remoteStream });\n })\n .catch(reject);\n });\n }\n\n stopUnusedTracks(oldStream, newStream) {\n if (this.connection.hasExternalStream) {\n return;\n }\n const unusedTracks = oldStream\n .getTracks()\n .filter(track => !newStream.getTracks().includes(track));\n unusedTracks.forEach(stopTrack);\n }\n\n tracksExist() {\n return Boolean(\n this.peerConnection.getSenders().find(sender => sender.track !== null)\n );\n }\n\n scaleResolution(factor) {\n // factor 0.5 => scaleResolutionDownBy 2\n try {\n const ratio = Math.max(1.0 / Math.max(factor, 0.1), 1.0);\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].scaleResolutionDownBy !== ratio) {\n params.encodings[0].scaleResolutionDownBy = ratio;\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::scaleResolution failed:', error);\n }\n }\n\n // eslint-disable-next-line max-statements\n limitFramerate(fps) {\n try {\n const videoSender = this.peerConnection\n .getSenders()\n .find(sender => sender.track.kind === 'video');\n const params = videoSender.getParameters();\n if (!params.encodings) {\n params.encodings = [{}];\n }\n if (params.encodings[0].maxFramerate !== fps) {\n if (fps) {\n params.encodings[0].maxFramerate = fps;\n } else {\n Reflect.deleteProperty(params.encodings[0], 'maxFramerate');\n }\n videoSender.setParameters(params);\n }\n } catch (error) {\n Logger.error('SessionDescriptionHandler::limitFramerate failed:', error);\n }\n }\n\n /**\n * Stop all tracks\n */\n stopAllTracks() {\n Logger.debug('SessionDescriptionHandler::stopAllTracks');\n let receivers = this.peerConnection.getReceivers\n ? this.peerConnection.getReceivers()\n : [];\n this.peerConnection\n .getSenders()\n .concat(receivers)\n .forEach(rtp => {\n if (rtp.track) {\n stopTrack(rtp.track);\n }\n });\n }\n}\n\nexport default SessionDescriptionHandler;\n/* eslint-enable max-lines */\n","import SEPP from './sepp/SEPP.js';\nimport Logger from './Logger.js';\nimport WHITELIST from './SigMessageWhitelist.js';\nimport SigMessageTransformer from './SigMessageTransformer.js';\nimport SessionDescriptionHandler from './SessionDescriptionHandler.js';\n\nconst maxMessageSize = 32 * 1024;\n\n/**\n * eyeson Sip Connection.\n *\n * Registers with provided sip credentials and handles events received.\n **/\nclass SigConnection {\n constructor(signaling, user) {\n this.listeners = [];\n this.messageListener = [];\n this.datachannel = null;\n this.uaOptions = this.initUserAgentOptions(signaling, user);\n this.clientId = this.uaOptions.client_id;\n this.userAgent = null;\n this.transformer = new SigMessageTransformer(this.clientId);\n this.seppMessaging = false;\n }\n\n initUserAgentOptions(signaling, user) {\n if (signaling.type !== 'sepp') {\n return {\n client_id: null\n };\n }\n const signalingOptions = signaling.options;\n const uaOptions = {\n client_id: signalingOptions.client_id,\n conf_id: signalingOptions.conf_id,\n client_name: user.name,\n mute_video: false,\n sessionDescriptionHandlerFactory: options => {\n return new SessionDescriptionHandler(options);\n },\n sessionDescriptionHandlerFactoryOptions: {\n stun_servers: signalingOptions.stun_servers,\n turn_servers: signalingOptions.turn_servers\n },\n transportOptions: {\n auth_token: signalingOptions.auth_token,\n endpoint: signalingOptions.endpoint\n }\n };\n return uaOptions;\n }\n\n /**\n * Connect and register to the configured WebSocket server.\n **/\n start() {\n return new Promise(resolve => {\n if (!this.uaOptions.client_id) {\n throw new TypeError('Invalid signaling data');\n }\n this.userAgent = new SEPP.UserAgent(this.uaOptions);\n resolve();\n });\n }\n\n /**\n * Start a session on current connection.\n **/\n startSession(options) {\n Object.assign(\n this.uaOptions.sessionDescriptionHandlerFactoryOptions,\n options\n );\n if (options.mediaOptions) {\n this.uaOptions.mute_video = !options.mediaOptions.video;\n }\n this.userAgent.onEvent(({ type, data }) => {\n if (type === 'registered') {\n // eslint-disable-next-line prefer-reflect\n this.userAgent.call();\n } else if (type === 'message') {\n this.handleMessage(data);\n }\n });\n this.userAgent.connect();\n return this.userAgent;\n }\n\n updateAuthAndRestartSession(roomData) {\n Logger.debug('updateAuthAndRestartSession', roomData);\n if (!roomData.error) {\n this.uaOptions.transportOptions.auth_token =\n roomData.signaling.options.auth_token;\n }\n this.userAgent.connect();\n }\n\n updateAuthAndResume(roomData) {\n Logger.debug('updateAuthAndResume', roomData);\n if (!this.userAgent) {\n Logger.warn('updateAuthAndResume', 'userAgent already gone');\n return;\n }\n if (roomData.error) {\n this.userAgent.resume(null);\n return;\n }\n this.userAgent.resume(roomData.signaling.options.auth_token);\n }\n\n initDatachannel(channel) {\n this.datachannel = channel;\n Logger.debug('SigConnection::initDatachannel', channel);\n channel.onmessage = event => {\n if (event.data === '{\"type\":\"ping\"}' && channel.readyState === 'open') {\n channel.send('{\"type\":\"pong\"}');\n return;\n }\n Logger.debug('SigConnection::dataChannelMessage', event.data);\n const message = JSON.parse(event.data);\n if (message.type === 'ack') {\n return;\n }\n this.handleMessage(message);\n };\n }\n\n /**\n * Stop listening for messages.\n **/\n // eslint-disable-next-line max-statements\n close() {\n const { datachannel, userAgent } = this;\n this.datachannel = null;\n this.userAgent = null;\n if (datachannel && datachannel.readyState === 'open') {\n datachannel.close();\n }\n if (userAgent) {\n userAgent.removeAllListeners();\n userAgent.terminate();\n }\n }\n\n /**\n * Parse, filter, transform and finally forward messages received from SIP\n * connection.\n **/\n onMessage(callback) {\n this.messageListener.push(callback);\n }\n\n handleMessage(message) {\n if (!WHITELIST.includes(message.type)) {\n Logger.debug(\n `SigConnection::handleMessage ignoring \"${message.type}\" message.`\n );\n return;\n }\n const transformedMessage = this.transformer.process(message);\n this.messageListener.forEach(cb => cb(transformedMessage));\n }\n\n /**\n * Transport a message over current connection.\n **/\n // eslint-disable-next-line max-statements\n send(msg) {\n if (this.seppMessaging) {\n this.sendSeppMessage(msg);\n return;\n }\n const { datachannel } = this;\n msg.cid = this.uaOptions.client_id;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (\n datachannel &&\n datachannel.readyState === 'open' &&\n data.length < maxMessageSize\n ) {\n Logger.debug('SigConnection::send datachannel', data);\n datachannel.send(data);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n\n // eslint-disable-next-line max-statements\n sendSeppMessage(msg) {\n const { userAgent } = this;\n if (userAgent && userAgent.callId) {\n msg.cid = this.uaOptions.client_id;\n msg.call_id = userAgent.callId;\n const data = JSON.stringify(msg);\n if (msg.type === 'chat' && data.length >= maxMessageSize) {\n Logger.error('SigConnection::send failed: chat message too long', msg);\n this.emit({ type: 'warning', name: 'chat_message_too_long' });\n return;\n }\n if (data.length < maxMessageSize) {\n Logger.debug('SigConnection::send sepp', msg);\n userAgent.message(msg.type, msg);\n return;\n }\n Logger.error('SigConnection::send failed', msg);\n }\n }\n\n onError(errorHandler) {\n this.listeners.push(errorHandler);\n return this;\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n}\n\nexport default SigConnection;\n","import eyesonOptions from '../options.js';\nimport Logger from '../Logger.js';\nimport PublicEvent from './PublicEvent.js';\nimport SigConnection from '../SigConnection.js';\n\nconst startSigConnection = (context, signaling, user) => {\n context.connection = new SigConnection(signaling, user);\n context._connection\n .onError(msg => context.send(msg))\n .start()\n .then(() => context.send({ type: 'connection', connectionStatus: 'ready' }))\n .catch(() =>\n context.send({ type: 'connection', connectionStatus: 'transport_error' })\n );\n};\n\nclass RoomReceived extends PublicEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n super.handle(msg);\n this.context.rtData = msg.content;\n\n if (msg.content.ready !== true) {\n Logger.debug('RoomReceived not ready:', msg.content);\n return;\n }\n\n const { user, room, signaling, links, options } = msg.content;\n\n // Update eyeson's public data\n this.context._eyeson.room = room;\n this.context._eyeson.user = this.context._api.addUserAttributes(\n user,\n user.id,\n signaling.options.client_id\n );\n this.context._eyeson.links = links;\n eyesonOptions.widescreen = Boolean(options.widescreen);\n\n if (this.context._connection) {\n Logger.debug('RoomReceived double room_ready');\n return;\n }\n startSigConnection(this.context, signaling, user);\n }\n}\n\nexport default RoomReceived;\n","import PublicEvent from './PublicEvent.js';\n\nclass FetchRoomEvent extends PublicEvent {\n handle() {\n this.context._api.getRoom(room => {\n return super.handle({ type: 'fetch_room', room });\n });\n }\n}\n\nexport default FetchRoomEvent;\n","import BaseEvent from './BaseEvent.js';\n\n/**\n * Deletes a file using the com api.\n **/\nclass DeleteFileEvent extends BaseEvent {\n handle(msg) {\n this.context._api.deleteFile(msg.file);\n }\n}\n\nexport default DeleteFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\n/**\n * Uploads a file using the com api.\n **/\n\nclass UploadFileEvent extends PublicEvent {\n handle(msg) {\n this.context._api.uploadFile(msg.file, this.addFile.bind(this));\n }\n\n addFile(response) {\n super.handle({\n type: 'add_file',\n file: response\n });\n }\n}\n\nexport default UploadFileEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass ReceiveChatEvent extends PublicEvent {\n handle(msg) {\n // remove domain part to support legacy SIP user\n const userId = msg.cid.split('@').shift();\n\n this.msg = msg;\n this.context._api.getUser(userId, this.forwardMessage.bind(this));\n }\n\n forwardMessage(user) {\n const timestamp = Date.parse(this.msg.ts || this.msg.created_at);\n super.handle({\n type: this.msg.type,\n user: user,\n timestamp: new Date(timestamp),\n content: this.msg.content\n });\n }\n}\n\nexport default ReceiveChatEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport DeviceManager from '../DeviceManager.js';\nimport MicMixer from '../MicMixer.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport { getScreenAsVideoTracks, stopStream } from '../utils/StreamHelpers.js';\n\nclass StartStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({\n audio = true,\n video = true,\n virtualBackground = false,\n screen = false,\n surface = null\n }) {\n Logger.debug(\n `StartStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.options.virtualBackground = virtualBackground;\n if (_session.vbgMixer) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n _session.vbgMixer.changeBackground(type);\n }\n if (\n _session.localStream &&\n !FeatureDetector.canMultipleDifferentMicrophones()\n ) {\n stopStream(_session.localStream);\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.video = false;\n options.screen = true;\n options.surface = surface;\n options.virtualBackground = false;\n options.micMixer = _session.micMixer;\n }\n return new MediaStreamBuilder(options)\n .start()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(() => _session.send({ type: 'mute_video', on: !(video || screen) }))\n .then(() => {\n if (_session.externalStream) {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n }\n })\n .catch(error => {\n Logger.error('StartStreamEvent', error);\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n });\n }\n}\n\nexport default StartStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport FeatureDetector from '../FeatureDetector.js';\nimport {\n toggleAudio,\n toggleVideo,\n toggleCamera,\n toggleVbgTrack,\n isNinjaStreamTrack,\n isScreenAsVideoTrack,\n getScreenAsVideoTracks,\n isCanvasPresentationStream\n} from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ChangeStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle({ audio = true, video = true, screen = false, surface }) {\n Logger.debug(\n `ChangeStreamEvent::handle audio: ${audio} video: ${video} screen: ${screen}`\n );\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n const changeStream = () => {\n // eslint-disable-next-line max-statements\n return new Promise((resolve, reject) => {\n if (\n FeatureDetector.stopsDeviceActivityIndicatorOnDisable() &&\n !screen\n ) {\n const [videoTrack] = _session.localStream.getVideoTracks();\n const [audioTrack] = _session.localStream.getAudioTracks();\n if (\n !(video && isNinjaStreamTrack(videoTrack)) &&\n videoTrack.readyState !== 'ended' &&\n audioTrack.readyState !== 'ended' &&\n !isScreenAsVideoTrack(videoTrack)\n ) {\n if (_session.vbgMixer && _session.vbgMixer.originalStream) {\n _session.vbgMixer[video ? 'start' : 'stop']();\n toggleVbgTrack(_session.localStream, video);\n toggleCamera(_session.vbgMixer.originalStream, video);\n } else {\n toggleCamera(_session.localStream, video);\n }\n toggleAudio(_session.localStream, audio);\n resolve(_session.localStream);\n return;\n }\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n const options = {\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n existingStream: _session.localStream,\n vbgMixer: _session.vbgMixer,\n deviceMonitor: _session.deviceMonitor\n };\n if (screen) {\n _session.micMixer = new MicMixer();\n options.screen = true;\n options.video = false;\n options.surface = surface;\n options.virtualBackground = false;\n options.vbgMixer = null;\n options.micMixer = _session.micMixer;\n }\n new MediaStreamBuilder(options)\n .onBrokenTrackError(() => {\n _session.emit({ type: 'broken_track_error' });\n })\n .start()\n .then(resolve)\n .catch(reject);\n });\n };\n\n if (_session.externalStream) {\n toggleAudio(_session.externalStream, audio);\n toggleVideo(_session.externalStream, video);\n _session.send({ type: 'mute_video', on: !video });\n return Promise.resolve();\n }\n\n return (\n changeStream()\n .then(stream => {\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n return stream;\n })\n .then(_session.setStream)\n .then(stream => {\n if (isCanvasPresentationStream(stream)) {\n _session.canvasMixer.setStream(stream);\n } else {\n _session.send({ type: 'mute_video', on: !(video || screen) });\n }\n })\n // eslint-disable-next-line max-statements\n .catch(err => {\n Logger.error(err);\n if (\n err instanceof Error &&\n [\n 'NotReadableError',\n 'DevicesNotFoundError',\n 'NotFoundError'\n ].includes(err.name)\n ) {\n _session.emit({ type: 'warning', name: 'error_' + err.name });\n }\n if (screen) {\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n let name = `error_Screen_${err.name}`;\n if (err.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${err.name}_Audio`;\n }\n _session.emit({ type: 'screen_capture_error', name });\n }\n })\n );\n }\n}\n\nexport default ChangeStreamEvent;\n","import Logger from '../Logger';\nimport BaseEvent from './BaseEvent';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from '../utils/StreamHelpers';\n\n/**\n * ChangeStreamEvent \"changes\" a stream with the given options.\n *\n * The MediaStream is only updated if the Browser turns off device activity\n * indicators on disable (i.e. setting the video tracks `.enabled` prop to\n * false). This is the case for Firefox (May 2019).\n *\n * For other Browsers, a totally new MediaStream is acquired. Although some\n * of its tracks might be re-used / kept alive.\n * See `.setStream` in SDH for more details of current implementation.\n **/\nclass ReplaceStreamEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const stream = createExternalStream(msg.stream);\n if (!stream) {\n Logger.error('ReplaceStreamEvent::handle invalid stream', msg.stream);\n return Promise.reject(new TypeError('Invalid stream'));\n }\n const { _session, _connection } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n\n _session.options.audio = hasAudio(stream);\n _session.options.video = hasVideo(stream);\n\n return _session\n .setStream(stream)\n .then(() => {\n _session.externalStream = stream;\n _connection.hasExternalStream = true;\n _session.send({ type: 'mute_video', on: !hasVideo(stream) });\n })\n .catch(err => {\n _session.externalStream = null;\n _connection.hasExternalStream = false;\n Logger.error(err);\n });\n }\n}\n\nexport default ReplaceStreamEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\n\nclass ToggleCameraEvent extends BaseEvent {\n handle({ facingMode }) {\n Logger.debug('ToggleCameraEvent::handle', facingMode);\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: { facingMode: facingMode },\n existingStream: _session.localStream,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(_session.setStream)\n .catch(Logger.error);\n }\n}\n\nexport default ToggleCameraEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass AcceptSessionEvent extends PublicEvent {\n handle(msg) {\n const {\n type,\n session: { sessionDescriptionHandler }\n } = msg;\n const localStream = sessionDescriptionHandler.getLocalStream();\n const remoteStream = sessionDescriptionHandler.getRemoteStream();\n super.handle({\n type,\n localStream,\n remoteStream\n });\n }\n}\n\nexport default AcceptSessionEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopRecordingEvent extends PublicEvent {\n handle(msg) {\n this.context._api.stopRecording(msg);\n }\n}\n\nexport default StopRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * VoiceActivityEvent\n **/\nclass VoiceActivityEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise(resolve => {\n this.context._api.getUser(id, resolve);\n });\n }\n\n handle(msg) {\n this.getUser(msg.userId).then(\n user => {\n this.context.send({ type: 'voice_activity', user: user, on: msg.on });\n },\n error => {\n Logger.error('VoiceActivityEvent::handle', error);\n }\n );\n }\n}\n\nexport default VoiceActivityEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StartRecordingEvent extends PublicEvent {\n handle(msg) {\n const { _api, _session } = this.context;\n\n _api\n .startRecording(msg)\n .catch(error => _session.emit({ type: 'recording_error', error: error }));\n }\n}\n\nexport default StartRecordingEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport { getScreenPresentationTracks } from '../utils/StreamHelpers.js';\nimport MicMixer from '../MicMixer.js';\n\nconst detectDisplaySurface = screenTrack => {\n if (screenTrack && typeof screenTrack.getSettings === 'function') {\n const settings = screenTrack.getSettings();\n if (\n Reflect.apply(Object.prototype.hasOwnProperty, settings, [\n 'displaySurface'\n ])\n ) {\n return settings.displaySurface;\n }\n }\n return '';\n};\n\nclass ScreenCaptureEvent extends BaseEvent {\n handle({ audio, screen = false, screenStream, surface }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n }\n _session.micMixer = new MicMixer();\n\n const onError = error => {\n Logger.error('ScreenCaptureEvent', error);\n if (screen) {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n _session.emit({ type: 'capture_error', name });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: false,\n screen: screen,\n surface: surface,\n screenStream: screenStream,\n existingStream: _session.localStream,\n micMixer: _session.micMixer,\n isPresentation: true,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n let present = 'screen';\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n });\n const displaySurface = detectDisplaySurface(screenTrack);\n if (displaySurface) {\n present = `screen-${displaySurface}`;\n }\n }\n _session.emit({ type: 'start_presenting', stream, present });\n })\n .catch(onError);\n }\n}\n\nexport default ScreenCaptureEvent;\n","import Logger from '../Logger.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport BaseEvent from './BaseEvent.js';\n\nclass StartPresentingEvent extends BaseEvent {\n streamVideo() {\n const { _session } = this.context;\n\n const onError = error => {\n Logger.error('StartPresentingEvent', error);\n if (!error.name.match(/notallowed|permission/i)) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(userMediaStream => {\n const stream = _session.videoPlayer.invokeStream(userMediaStream);\n return this.handle({ stream });\n })\n .catch(onError);\n }\n\n // eslint-disable-next-line max-statements\n async handle({ stream = null, present = '' }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n _session.vbgMixer.stopOriginalStream();\n _session.vbgMixer.terminate();\n }\n if (_session.videoPlayer && !_session.videoPlayer.isStreaming()) {\n this.streamVideo();\n } else {\n let presentationStream = stream || _session.localStream;\n if (_session.canvasMixer && _session.canvasMixer.stream) {\n // eslint-disable-next-line prefer-destructuring\n presentationStream = _session.canvasMixer.stream;\n }\n await _session.setStream(presentationStream);\n _session.send({ type: 'set_presenter', on: true });\n _session.send({ type: 'desktopstreaming', on: true });\n _session.emit({ type: 'presentation_started', present });\n }\n }\n}\n\nexport default StartPresentingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass StopPresentingEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.canvasMixer) {\n if (_session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.stopOriginalStream();\n _session.canvasMixer.vbgMixer.terminate();\n _session.canvasMixer.vbgMixer = null;\n }\n _session.canvasMixer.stop();\n _session.canvasMixer = null;\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n if (_session.videoPlayer) {\n _session.videoPlayer.destroy();\n _session.videoPlayer = null;\n }\n _session.send({ type: 'desktopstreaming', on: false });\n _session.send({ type: 'set_presenter', on: false });\n _session.emit({ type: 'presentation_ended' });\n _session.stopPresentingSet = true;\n }\n}\n\nexport default StopPresentingEvent;\n","import PublicEvent from './PublicEvent.js';\n\nclass StopBroadcastsEvent extends PublicEvent {\n handle(msg) {\n this.context._api\n .stopAllBroadcasts()\n .then(() => super.handle({ type: msg.type }));\n }\n}\n\nexport default StopBroadcastsEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass ClearFrontLayerEvent extends BaseEvent {\n handle() {\n this.context._api.clearFrontLayer();\n }\n}\n\nexport default ClearFrontLayerEvent;\n","import ComApi from '../ComApi.js';\nimport PublicEvent from './PublicEvent.js';\n\n/**\n * Request a user from guest token.\n * use same error if meeting is locked due to backwards compatibility for mobile apps\n * error 423 Locked = meeting locked\n **/\nclass RequestGuestUserEvent extends PublicEvent {\n handle(msg) {\n return new ComApi(msg.api, msg.token).requestUser(\n { name: msg.name, email: msg.email, locale: msg.locale },\n response => {\n if (!response.access_key) {\n let isLocked = response.locked;\n if (response.error && response.error.message === 'ComApiError: 423') {\n isLocked = true;\n }\n super.handle({\n type: 'error',\n content: 'Request guest user failed',\n locked: isLocked\n });\n return;\n }\n super.handle({ type: 'guest_user', token: response.access_key });\n }\n );\n }\n}\n\nexport default RequestGuestUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass SessionTerminationEvent extends BaseEvent {\n handle() {\n this.context._eyeson.destroy();\n }\n}\n\nexport default SessionTerminationEvent;\n","import Logger from './../Logger.js';\nimport BaseEvent from './BaseEvent.js';\n\n/**\n * We handle participants list update is separated in two actions: one to\n * add, one to remove. In order to keep it easy to handle, the user data is\n * fetched from api (or later received via websocket). Not to mess with\n * comApi current handling, we keep it here for a while.\n **/\nclass ParticipantListUpdateEvent extends BaseEvent {\n constructor(context) {\n super(context);\n this.getUser = this.getUser.bind(this);\n }\n\n getUser(id) {\n return new Promise((resolve, reject) => {\n if (!this.context._api) {\n reject(new Error('missing ComAPI'));\n return;\n }\n try {\n this.context._api.getUser(id, resolve);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n handle(msg) {\n (msg.add || []).forEach((user, idx, add) => {\n const id = user.cid;\n const { clientId } = this.context._connection;\n\n const initial = Boolean(add.find(addition => addition.cid === clientId));\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({\n type: 'add_user',\n user: apiUser,\n initial: initial\n });\n })\n .catch(error => Logger.error(error));\n });\n (msg.del || []).forEach(user => {\n const id = user;\n\n this.getUser(id)\n .then(apiUser => {\n this.context.send({ type: 'remove_user', userId: id, user: apiUser });\n })\n .catch(error => Logger.error(error));\n });\n this.context.send({ type: 'playback_update', playing: msg.media || [] });\n }\n}\n\nexport default ParticipantListUpdateEvent;\n","const toFixedNumber = number => Number(parseFloat(number).toFixed(2));\n\nconst scale = (width, height, max) => {\n const ratio = Math.min(max.width / width, max.height / height);\n const xScaled = toFixedNumber(width * ratio);\n const yScaled = toFixedNumber(height * ratio);\n\n return { width: xScaled, height: yScaled };\n};\n\nexport default scale;\n","/* eslint-disable */\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * @see https://davidwalsh.name/javascript-debounce-function\n **/\nexport default (func, wait, immediate) => {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n};\n/* eslint-enable */\n","/* eslint-disable max-lines */\nimport scale from './utils/scale.js';\nimport Logger from './Logger.js';\nimport debounce from './utils/debounce.js';\n\nimport {\n isVBGStream,\n getVbgTracks,\n getScreenPresentationTracks,\n getCameraTracks,\n getCanvasTracks,\n stopStream\n} from './utils/StreamHelpers';\nimport FeatureDetector from './FeatureDetector.js';\n\nconst FPS = 15;\nconst FPS_INTERVAL = 1000 / FPS;\nconst CAMERA_SMALL = { width: 220, height: 140 };\nconst CAMERA_MEDIUM = { width: 320, height: 240 };\nconst CAMERA_LARGE = { width: 420, height: 340 };\nconst CAMERA_NONE = { width: 0, height: 0 };\n\nconst supportsTrackProcessor =\n typeof window.MediaStreamTrackProcessor === 'function';\n\nconst defaultTrack = {\n getSettings: () => ({ width: 0, height: 0 }),\n addEventListener: () => null\n};\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\n// Note:\n// autoplay elements will stop playing in safari if not in viewport:\n// https://webkit.org/blog/6784/new-video-policies-for-ios/\n// that's the reason why we don't set autoplay\n// video.setAttribute('autoplay', '1');\n// but instead `.play` manually.\n// eslint-disable-next-line max-statements\nconst bindVideoToStream = stream => {\n const [track] = stream.getVideoTracks();\n if (!track) {\n return null;\n }\n if (supportsTrackProcessor) {\n // eslint-disable-next-line no-undef\n const processor = new MediaStreamTrackProcessor(track);\n return processor.readable.getReader();\n }\n const { width, height } = track.getSettings();\n const video = document.createElement('video');\n video.playsInline = true;\n video.muted = true;\n video.width = width;\n video.height = height;\n video.srcObject = stream;\n track.addEventListener('stopped', () => {\n video.srcObject = null;\n });\n video\n .play()\n .catch(error =>\n Logger.warn('bindVideoToStream: play', error, error.message)\n );\n return video;\n};\n\n/* eslint-disable max-statements, id-length */\nconst fitImage = (target, source) => {\n const sourceAspectRatio = source.width / source.height;\n const targetAspectRatio = target.width / target.height;\n\n let { width, height } = target;\n let x = 0;\n let y = 0;\n\n // Image's aspect ratio is less than target's we fit on height\n // and place the image centrally along width\n if (sourceAspectRatio < targetAspectRatio) {\n width = source.width * (height / source.height);\n x = (target.width - width) / 2;\n }\n // Image's aspect ratio is greater than target's we fit on width\n // and place the image centrally along height\n if (sourceAspectRatio > targetAspectRatio) {\n height = source.height * (width / source.width);\n y = (target.height - height) / 2;\n }\n\n return { x: x, y: y, width: width, height: height };\n};\n/* eslint-enable max-statements */\n\nconst initIOSSettings = mixer => {\n // neccessary to run calcSizesAndPositions and draw functions\n // without camera\n mixer.cameraStream = { getVideoTracks: () => [] };\n mixer.screenStream = { getVideoTracks: () => [] };\n};\n\nconst getCanvasCaptureTrackCanvas = stream => {\n if (stream && stream.getVideoTracks().length > 0) {\n const [track] = stream.getVideoTracks();\n if ('canvas' in track) {\n return track.canvas;\n }\n }\n return null;\n};\n\nclass CanvasMixer {\n /* eslint-disable max-statements */\n constructor(canvas, stream) {\n this.canvas = canvas;\n this.stream = stream;\n this.camera = null;\n this.screen = null;\n this.canvasTrack = null;\n this.context = this.canvas.getContext('2d', {\n alpha: false,\n desynchronized: true\n });\n this.xPos = 0;\n this.camSize = CAMERA_MEDIUM;\n this.isCanvasCapture = false;\n\n this.draw = this.draw.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n this.onError = this.onError.bind(this);\n this.onRedraw = this.onRedraw.bind(this);\n this.setStream = this.setStream.bind(this);\n this.setCamera = this.setCamera.bind(this);\n this.drawFrame = this.drawFrame.bind(this);\n this.calcSizesAndPositions = this.calcSizesAndPositions.bind(this);\n\n this.bouncedDraw = debounce(this.draw, FPS_INTERVAL);\n }\n /* eslint-enable max-statements */\n\n onError(errorCallback) {\n this.errorCallback = errorCallback;\n }\n\n onRedraw(redrawCallback) {\n this.redrawCallback = redrawCallback;\n }\n\n // eslint-disable-next-line max-statements\n start() {\n const [canvasTrack] = getCanvasTracks(this.stream);\n this.canvasTrack = canvasTrack;\n if (isIOSDevice) {\n initIOSSettings(this);\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'none');\n } else {\n this.setCamera({ horizontal: 'right', vertical: 'bottom' }, 'medium');\n this.setStream(this.stream);\n }\n this.draw();\n }\n\n stop() {\n if (this.stream) {\n stopStream(this.stream);\n this.stream = null;\n this.camera = null;\n this.screen = null;\n this.screenStream = null;\n this.cameraStream = null;\n this.canvasTrack = null;\n }\n }\n\n // eslint-disable-next-line max-statements\n setStream(newStream) {\n this.stream = newStream;\n this.cameraStream = new MediaStream(\n isVBGStream(newStream)\n ? getVbgTracks(newStream)\n : getCameraTracks(newStream)\n );\n this.screenStream = new MediaStream(\n getScreenPresentationTracks(this.stream)\n );\n const originalCanvas = getCanvasCaptureTrackCanvas(this.cameraStream);\n if (originalCanvas) {\n this.isCanvasCapture = true;\n this.camera = originalCanvas;\n } else {\n this.isCanvasCapture = false;\n this.camera = bindVideoToStream(this.cameraStream);\n }\n this.screen = bindVideoToStream(this.screenStream);\n this.calcSizesAndPositions();\n this.redrawQueued = true;\n }\n\n setCamera(position, size) {\n this.cameraPosition = position || this.cameraPosition;\n this.cameraSizeInWords = size || this.cameraSizeInWords;\n this.redrawQueued = true;\n }\n\n calcSizesAndPositions() {\n // Fetch the latest settings (width and height) from the track directly,\n // otherwise resized windows won't be positioned/scaled correctly...\n const [screenTrack = defaultTrack] = this.screenStream.getVideoTracks();\n const screenStreamSettings = screenTrack.getSettings();\n const fitScreen = fitImage(this.canvas, screenStreamSettings);\n const [cameraTrack = defaultTrack] = this.cameraStream.getVideoTracks();\n const cameraTrackSettings = cameraTrack.getSettings();\n\n this.camSize = {\n small: CAMERA_SMALL,\n medium: CAMERA_MEDIUM,\n large: CAMERA_LARGE,\n none: CAMERA_NONE\n }[this.cameraSizeInWords];\n\n const scaledCam = scale(\n cameraTrackSettings.width,\n cameraTrackSettings.height,\n this.camSize\n );\n\n this.sizes = {\n screen: { width: fitScreen.width, height: fitScreen.height },\n camera: { width: scaledCam.width, height: scaledCam.height }\n };\n /* eslint-disable id-length, camelcase */\n const camPosition = {\n x:\n this.cameraPosition.horizontal === 'right'\n ? this.canvas.width - this.sizes.camera.width\n : 0,\n y:\n this.cameraPosition.vertical === 'bottom'\n ? this.canvas.height - this.sizes.camera.height\n : 0\n };\n this.positions = {\n screen: { x: fitScreen.x, y: fitScreen.y },\n camera: { x: camPosition.x, y: camPosition.y }\n };\n /* eslint-enable id-length */\n }\n\n /* eslint-disable max-statements */\n async draw() {\n try {\n if (!this.stream || !this.stream.active) {\n return;\n }\n\n // Doing this on every draw due to resizeable windows while screensharing\n this.calcSizesAndPositions();\n\n // In case we need to report back a redraw - doc/image can re-render\n if (this.redrawCallback && this.redrawQueued) {\n this.redrawCallback();\n this.redrawQueued = false;\n }\n\n // Actual drawing code\n const t0 = performance.now();\n if (this.screen) {\n let screenFrame = this.screen;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.screen instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.screen.read();\n screenFrame = result.value;\n }\n this.drawFrame(\n screenFrame,\n this.positions.screen,\n this.sizes.screen,\n false,\n true\n );\n }\n let cameraFrame = this.camera;\n if (\n supportsTrackProcessor &&\n // eslint-disable-next-line no-undef\n this.camera instanceof ReadableStreamDefaultReader\n ) {\n const result = await this.camera.read();\n cameraFrame = result.value;\n }\n this.drawFrame(\n cameraFrame,\n this.positions.camera,\n this.sizes.camera,\n this.isCanvasCapture,\n false\n );\n const t1 = performance.now();\n if (t1 - t0 >= FPS_INTERVAL) {\n Logger.warn(`Mixer::drawFrame took ${t1 - t0}ms.`);\n }\n\n // Request a frame so remote end receives updates reliably\n try {\n if (this.canvasTrack) {\n this.canvasTrack.requestFrame();\n }\n } catch (error) {\n Logger.warn(`CanvasMixer draw requestFrame error - ${error.message}`);\n }\n\n // Request another draw if the stream is still active\n this.bouncedDraw();\n } catch (error) {\n Logger.error(error);\n this.errorCallback(error);\n }\n }\n /* eslint-enable max-statements */\n\n // eslint-disable-next-line max-statements\n drawFrame(video, pos, size, isCanvasCapture, isScreenStream) {\n // Pollute the canvas even if we don't have a stream, so we force a frame\n // update.\n const { context, canvas } = this;\n if (\n !video ||\n (!isCanvasCapture &&\n video instanceof HTMLVideoElement &&\n (!video.srcObject || !video.srcObject.active))\n ) {\n const imgData = context.createImageData(1, 1);\n context.putImageData(imgData, 0, 0);\n return;\n }\n\n // Clear prev drawn frames only for screen streams, otherwise old frames\n // show up if the window is resized (smaller).\n if (isScreenStream && !isCanvasCapture) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n context.drawImage(video, pos.x, pos.y, size.width, size.height);\n if (supportsTrackProcessor && typeof video.close === 'function') {\n video.close();\n }\n }\n}\n\nexport default CanvasMixer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport CanvasMixer from '../CanvasMixer.js';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport {\n getScreenPresentationTracks,\n stopTrack\n} from '../utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from '../VirtualBackgroundMixer.js';\nimport DeviceManager from '../DeviceManager.js';\n\nclass StartMixerEvent extends BaseEvent {\n handle({\n audio,\n video,\n canvas,\n screen = false,\n surface,\n onRedraw,\n changeStream = false,\n present = 'mixer'\n }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n // if (_session.micMixer) {\n // _session.micMixer.destroy();\n // _session.micMixer = null;\n // }\n const vbgType = DeviceManager.getStoredVirtualBackgroundType();\n const vbgMixer = new VirtualBackgroundMixer('canvasmixer');\n vbgMixer.changeBackground(vbgType);\n\n const onError = error => {\n Logger.error('StartMixerEvent', error);\n if (!_session.canvasMixer && vbgMixer) {\n vbgMixer.terminate();\n }\n if (!error.name.match(/notallowed|permission/i) && screen) {\n _session.emit({ type: 'capture_error', name: `error_${error.name}` });\n }\n _session.emit({ type: 'stop_presenting' });\n };\n\n new MediaStreamBuilder({\n audio: audio,\n video: video,\n virtualBackground: _session.options.virtualBackground,\n screen: screen,\n surface: surface,\n canvas: canvas,\n existingStream: _session.localStream,\n vbgMixer: vbgMixer,\n deviceMonitor: _session.deviceMonitor\n })\n .start()\n .then(stream => {\n // cleanup when screen capture is stopped via chrome's built-in/native\n // \"stop sharing\" button (a blue button on bottom of screen).\n const [screenTrack] = getScreenPresentationTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_presenting' });\n stopTrack(screenTrack);\n });\n }\n _session.canvasMixer = new CanvasMixer(canvas, stream);\n _session.canvasMixer.vbgMixer = vbgMixer;\n _session.canvasMixer.onError(onError);\n _session.canvasMixer.onRedraw(onRedraw);\n _session.canvasMixer.start();\n return stream;\n })\n .then(stream => {\n if (changeStream) {\n _session.emit({ type: 'start_presenting', stream, present });\n } else {\n _session.emit({ type: 'stream_update', presentationStream: stream });\n }\n })\n .catch(onError);\n }\n}\n\nclass UpdateMixerEvent extends BaseEvent {\n handle({ position, size }) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n _session.canvasMixer.setCamera(position, size);\n } catch (error) {\n Logger.error(error);\n }\n }\n}\n\nexport { StartMixerEvent, UpdateMixerEvent };\n","import FeatureDetector from './FeatureDetector.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\n\nconst videoFrameSupport =\n typeof HTMLVideoElement.prototype.requestVideoFrameCallback === 'function';\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass VideoPlayer {\n // eslint-disable-next-line max-statements\n constructor({\n canvas,\n file,\n onReady,\n onDuration,\n onTimeUpdate,\n onEnd,\n performAction\n }) {\n this.ac = null;\n this.acOut = null;\n this.gainNode = null;\n this.timer = null;\n this.canvas = canvas;\n this.url = URL.createObjectURL(file);\n this.ctx = canvas.getContext('2d');\n this.video = document.createElement('video');\n this.callback = { onReady, onDuration, onTimeUpdate, onEnd, performAction };\n this.errorCallback = null;\n this.boundDrawVideoFrame = this.drawVideoFrame.bind(this);\n this.boundInitCanvasStream = this.initCanvasStream.bind(this);\n this.isPlaying = false;\n this.blockTimeUpdate = false;\n this.micOnlyStream = null;\n this.userMediaStream = null;\n this.initTimeout = null;\n this.invokationTimer = null;\n this.initVideo();\n }\n\n drawVideoFrame() {\n this.ctx.drawImage(this.video, 0, 0);\n if (videoFrameSupport) {\n this.timer = this.video.requestVideoFrameCallback(\n this.boundDrawVideoFrame\n );\n } else {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n }\n\n // eslint-disable-next-line max-statements\n initVideo() {\n const { video } = this;\n video.playsInline = true;\n video.autoplay = Boolean(isIOSDevice);\n video.preload = '';\n video.onplaying = this.onVideoPlay.bind(this);\n video.onpause = this.onVideoPause.bind(this);\n video.onseeked = this.onVideoSeeked.bind(this);\n video.ontimeupdate = this.onVideoTimeUpdate.bind(this);\n video.onloadeddata = this.onVideoReady.bind(this);\n video.onerror = this.onVideoError.bind(this);\n video.onended = this.onVideoEnd.bind(this);\n this.initTimeout = setTimeout(() => this.onVideoError(), 6000);\n video.src = this.url;\n }\n\n // eslint-disable-next-line max-statements\n onVideoReady() {\n const { video, canvas } = this;\n clearTimeout(this.initTimeout);\n this.callback.onDuration(video.duration);\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n this.ac = new (window.AudioContext || window.webkitAudioContext)();\n this.gainNode = this.ac.createGain();\n this.ac.createMediaElementSource(video).connect(this.gainNode);\n this.gainNode.connect(this.ac.destination);\n if (videoFrameSupport) {\n this.timer = video.requestVideoFrameCallback(this.boundDrawVideoFrame);\n }\n this.callback.performAction(this.onVideoAction.bind(this));\n try {\n this.ctx.drawImage(video, 0, 0);\n } catch (error) {\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n return;\n }\n this.callback.onReady();\n if (video.autoplay) {\n setTimeout(() => {\n video.pause();\n video.currentTime = 0;\n });\n }\n }\n\n onVideoAction(type, value) {\n if (type === 'play') {\n return this.onPlayAction();\n } else if (type === 'pause') {\n return this.onPauseAction();\n } else if (type === 'time') {\n this.onTimeAction(value);\n } else if (type === 'volume') {\n this.onVolumeAction(value);\n }\n return Promise.resolve();\n }\n\n onPlayAction() {\n const { video } = this;\n if (video.paused && !this.isPlaying) {\n return video.play().then(\n () => video.paused,\n () => video.paused\n );\n }\n return Promise.resolve(video.paused);\n }\n\n onPauseAction() {\n const { video } = this;\n if (!video.paused && this.isPlaying) {\n video.pause();\n }\n return Promise.resolve(video.paused);\n }\n\n onTimeAction(time) {\n const { video } = this;\n this.blockTimeUpdate = true;\n if (time >= video.duration) {\n video.currentTime = video.duration - 0.1;\n } else {\n video.currentTime = time;\n }\n this.blockTimeUpdate = false;\n }\n\n onVolumeAction(volume) {\n if (this.gainNode) {\n this.gainNode.gain.value = volume;\n }\n }\n\n onVideoPlay() {\n this.isPlaying = true;\n if (!videoFrameSupport) {\n this.timer = requestAnimationFrame(this.boundDrawVideoFrame);\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n }\n\n onVideoPause() {\n // also triggered on onended\n this.isPlaying = false;\n if (!videoFrameSupport && this.timer) {\n cancelAnimationFrame(this.timer);\n }\n }\n\n onVideoSeeked() {\n if (!videoFrameSupport && !this.isPlaying) {\n this.ctx.drawImage(this.video, 0, 0);\n }\n }\n\n onVideoTimeUpdate() {\n if (!this.blockTimeUpdate) {\n this.callback.onTimeUpdate(this.video.currentTime);\n }\n }\n\n onVideoError() {\n const { video } = this;\n const error =\n video && video.error ? video.error : new TypeError('VideoPlayer failed');\n Logger.error('VideoPlayer failed', error);\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n }\n\n onVideoEnd() {\n this.callback.onEnd();\n }\n\n initCanvasStream() {\n this.ctx.drawImage(this.video, 0, 0);\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n\n // eslint-disable-next-line max-statements\n invokeStream(userMediaStream) {\n const canvasStream = this.canvas.captureStream(25);\n const [canvasStreamTrack] = canvasStream.getVideoTracks();\n // Firefox issue, track is no CanvasCaptureMediaStreamTrack\n if (!canvasStreamTrack.canvas) {\n canvasStreamTrack.type = 'canvas-track';\n canvasStreamTrack.canvas = this.canvas;\n }\n const outStream = new MediaStream([canvasStreamTrack]);\n this.acOut = this.ac.createMediaStreamDestination();\n this.gainNode.connect(this.acOut);\n this.ac.createMediaStreamSource(userMediaStream).connect(this.acOut);\n this.acOut.stream\n .getAudioTracks()\n .forEach(track => outStream.addTrack(track));\n this.userMediaStream = userMediaStream;\n this.micOnlyStream = new MediaStream(\n userMediaStream.getAudioTracks().concat(canvasStreamTrack)\n );\n if (!this.isPlaying) {\n this.invokationTimer = requestAnimationFrame(this.boundInitCanvasStream);\n }\n return outStream;\n }\n\n isStreaming() {\n return Boolean(this.micOnlyStream);\n }\n\n getMicOnlyStream() {\n return this.micOnlyStream;\n }\n\n onError(callback) {\n this.errorCallback = callback;\n }\n\n // eslint-disable-next-line max-statements\n destroy() {\n const { video } = this;\n clearTimeout(this.initTimeout);\n if (this.url) {\n URL.revokeObjectURL(this.url);\n this.url = null;\n }\n if (this.timer) {\n if (videoFrameSupport) {\n video.cancelVideoFrameCallback(this.timer);\n } else {\n cancelAnimationFrame(this.timer);\n }\n this.timer = null;\n }\n if (this.invokationTimer) {\n cancelAnimationFrame(this.invokationTimer);\n this.invokationTimer = null;\n }\n if (this.userMediaStream) {\n stopStream(this.userMediaStream);\n this.userMediaStream = null;\n }\n if (this.micOnlyStream) {\n stopStream(this.micOnlyStream);\n this.micOnlyStream = null;\n }\n if (this.acOut) {\n stopStream(this.acOut.stream);\n this.acOut = null;\n }\n if (this.ac) {\n this.gainNode.disconnect();\n this.ac.close().then(() => {\n this.ac = null;\n this.gainNode = null;\n });\n }\n if (video) {\n video.pause();\n video.onplaying = null;\n video.onpause = null;\n video.ontimeupdate = null;\n video.onloadeddata = null;\n video.onseeked = null;\n video.onerror = null;\n video.onended = null;\n this.video = null;\n }\n this.callback = null;\n this.errorCallback = null;\n this.ctx = null;\n this.canvas = null;\n this.boundDrawVideoFrame = null;\n }\n}\n\nexport default VideoPlayer;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent.js';\nimport VideoPlayer from '../VideoPlayer.js';\n\nclass StartMediaEvent extends BaseEvent {\n handle(message) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n const onError = error => {\n Logger.error('StartMediaEvent', error);\n const name =\n error && (error instanceof MediaError || error instanceof DOMException)\n ? 'error_VideoError'\n : 'error_TypeError';\n _session.emit({ type: 'warning', name: name });\n _session.emit({ type: 'stop_presenting' });\n };\n\n try {\n _session.videoPlayer = new VideoPlayer(message);\n _session.videoPlayer.onError(onError);\n } catch (error) {\n onError(error);\n }\n }\n}\n\nexport { StartMediaEvent };\n","import BaseEvent from './BaseEvent.js';\n\nclass LockMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.lockMeeting();\n }\n}\n\nexport default LockMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass TerminateMeetingEvent extends BaseEvent {\n handle() {\n this.context._api.terminateMeeting();\n }\n}\n\nexport default TerminateMeetingEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass KickUserEvent extends BaseEvent {\n handle(msg) {\n this.context._api.kickUser(msg.userId);\n }\n}\n\nexport default KickUserEvent;\n","import BaseEvent from './BaseEvent.js';\n\nclass VirtualBackgroundEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n handle(msg) {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.vbgMixer) {\n if (msg.state === 'suspend') {\n _session.vbgMixer.suspend();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.suspend();\n }\n } else if (msg.state === 'resume') {\n _session.vbgMixer.resume();\n if (_session.canvasMixer && _session.canvasMixer.vbgMixer) {\n _session.canvasMixer.vbgMixer.resume();\n }\n }\n }\n }\n}\n\nexport default VirtualBackgroundEvent;\n","import Logger from '../Logger.js';\nimport BaseEvent from './BaseEvent';\nimport MediaStreamBuilder from '../MediaStreamBuilder.js';\nimport MicMixer from '../MicMixer.js';\nimport { getScreenAsVideoTracks } from '../utils/StreamHelpers.js';\n\nconst destroySessionMicMixer = session => {\n if (session.micMixer) {\n session.micMixer.destroy();\n session.micMixer = null;\n }\n};\n\nconst getScreenErrorName = error => {\n let name = `error_Screen_${error.name}`;\n if (error.message.indexOf('not start audio') > -1) {\n name = `error_Screen_${error.name}_Audio`;\n }\n return name;\n};\n\nclass ScreenVideoChangeEvent extends BaseEvent {\n // eslint-disable-next-line max-statements\n async handle({ surface }) {\n let screenStream = null;\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n try {\n const mediaStreamBuilder = new MediaStreamBuilder({ surface });\n screenStream = await mediaStreamBuilder.getDisplayMedia();\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n _session.emit({ type: 'warning', name: getScreenErrorName(error) });\n return;\n }\n destroySessionMicMixer(_session);\n _session.micMixer = new MicMixer();\n const options = {\n audio: _session.localStream.getAudioTracks()[0].enabled,\n video: false,\n screen: true,\n surface,\n micMixer: _session.micMixer,\n screenStream\n };\n try {\n const stream = await new MediaStreamBuilder(options).start();\n const [screenTrack] = getScreenAsVideoTracks(stream);\n if (screenTrack) {\n screenTrack.addEventListener('ended', () => {\n _session.emit({ type: 'stop_screen_video' });\n });\n }\n _session.setStream(stream);\n } catch (error) {\n Logger.error('ScreenVideoChangeEvent', error);\n destroySessionMicMixer(_session);\n _session.emit({\n type: 'screen_capture_error',\n name: getScreenErrorName(error)\n });\n _session.emit({ type: 'screen_video_ended' });\n }\n }\n}\n\nexport default ScreenVideoChangeEvent;\n","import BaseEvent from './BaseEvent';\n\nclass ScreenVideoStoppedEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.micMixer) {\n _session.micMixer.destroy();\n _session.micMixer = null;\n }\n _session.emit({ type: 'screen_video_ended' });\n }\n}\n\nexport default ScreenVideoStoppedEvent;\n","import FeatureDetector from './FeatureDetector.js';\n\nconst isIOSDevice = FeatureDetector.isIOSDevice();\n\nclass DeviceMonitor {\n constructor() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n this.audioTrack = null;\n this.videoTrack = null;\n this.audioEnded = null;\n this.videoEnded = null;\n this.boundOnAudioEnd = this.onAudioEnd.bind(this);\n this.boundOnVideoEnd = this.onVideoEnd.bind(this);\n this.listeners = [];\n }\n\n addAudioTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempAudioTrack = track;\n }\n }\n\n addVideoTrack(track) {\n if (!isIOSDevice && track && track.readyState !== 'ended') {\n this.tempVideoTrack = track;\n }\n }\n\n applyTempTracks() {\n this.clearTracks();\n if (this.tempAudioTrack) {\n this.audioTrack = this.tempAudioTrack;\n this.tempAudioTrack = null;\n this.audioTrack.addEventListener('ended', this.boundOnAudioEnd);\n }\n if (this.tempVideoTrack) {\n this.videoTrack = this.tempVideoTrack;\n this.tempVideoTrack = null;\n this.videoTrack.addEventListener('ended', this.boundOnVideoEnd);\n }\n }\n\n discardTempTracks() {\n this.tempAudioTrack = null;\n this.tempVideoTrack = null;\n }\n\n onAudioEnd() {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n return;\n }\n this.audioEnded = setTimeout(() => {\n if (this.videoEnded) {\n clearTimeout(this.videoEnded);\n this.emit({ type: 'all_devices_ended' });\n } else {\n this.emit({ type: 'audio_device_ended' });\n }\n }, 1000);\n }\n\n onVideoEnd() {\n this.videoEnded = setTimeout(() => {\n if (!this.audioEnded) {\n this.emit({ type: 'video_device_ended' });\n }\n }, 1000);\n }\n\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n clearTracks() {\n clearTimeout(this.audioEnded);\n clearTimeout(this.videoEnded);\n if (this.audioTrack) {\n this.audioTrack.removeEventListener('ended', this.boundOnAudioEnd);\n this.audioTrack = null;\n }\n if (this.videoTrack) {\n this.videoTrack.removeEventListener('ended', this.boundOnVideoEnd);\n this.videoTrack = null;\n }\n this.audioEnded = null;\n this.videoEnded = null;\n }\n\n destroy() {\n this.listeners.length = 0;\n this.discardTempTracks();\n this.clearTracks();\n }\n}\n\nexport default DeviceMonitor;\n","import FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport eyesonOptions from './options.js';\nimport Logger from './Logger.js';\nimport { stopStream } from './utils/StreamHelpers.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceManager from './DeviceManager.js';\nimport DeviceMonitor from './DeviceMonitor.js';\n\nclass PipCam {\n constructor(session) {\n this.video = null;\n this.stream = null;\n this.canvasStream = null;\n this.vbgMixer = null;\n this.deviceMonitor = null;\n this.session = session;\n this.isActive = false;\n this.startTimer = null;\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n const { session } = this;\n if (!FeatureDetector.hasPipCamSupport()) {\n session.emit({ type: 'pip_cam_warning_unsupported' });\n return;\n }\n try {\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n this.initFakeStream();\n await this.initVideoAndPip();\n await this.initCamera();\n clearTimeout(this.startTimer);\n this.isActive = true;\n session.emit({ type: 'pip_cam', active: true });\n } catch (error) {\n this.onError(error);\n }\n }\n\n onError(error) {\n const { session } = this;\n clearTimeout(this.startTimer);\n Logger.error('PipCam error', error);\n if (session) {\n session.emit({ type: 'pip_cam_error' });\n session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n // eslint-disable-next-line max-statements\n async updateCamera() {\n if (!this.isActive) {\n return;\n }\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n this.startTimer = setTimeout(\n () => this.onError(new Error('Starting timeout 5s')),\n 5000\n );\n try {\n video.srcObject = canvasStream;\n await video.play();\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n await this.initCamera();\n clearTimeout(this.startTimer);\n } catch (error) {\n this.onError(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n initFakeStream() {\n const { widescreen } = eyesonOptions;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d', { alpha: false });\n canvas.width = 640;\n canvas.height = widescreen ? 360 : 480;\n ctx.fillStyle = '#404040';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n // https://aydos.com/svgedit/\n const path = new Path2D(\n widescreen\n ? 'M320 180c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n : 'M320 240c31 0 56-25 56-56s-25-56-56-56-56 25-56 56 25 56 56 56zm0 28c-37 0-112 19-112 56v28h224v-28c0-37-75-56-112-56z'\n );\n ctx.fillStyle = '#212121';\n ctx.fill(path);\n this.canvasStream = canvas.captureStream();\n }\n\n async initVideoAndPip() {\n const video = document.createElement('video');\n this.video = video;\n video.muted = true;\n video.playsInline = true;\n video.onleavepictureinpicture = () => this.onExitPip();\n video.onpause = ({ target }) => this.onVideoPause(target);\n video.srcObject = this.canvasStream;\n await video.play();\n await video.requestPictureInPicture();\n }\n\n // eslint-disable-next-line max-statements\n async initCamera() {\n const { virtualBackground } = this.session.options;\n if (virtualBackground) {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer('PipCam');\n this.vbgMixer.changeBackground(type);\n }\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(event => this.onDeviceEvent(event));\n\n const options = {\n audio: false,\n video: true,\n virtualBackground: virtualBackground,\n vbgMixer: this.vbgMixer,\n deviceMonitor: this.deviceMonitor\n };\n this.stream = await new MediaStreamBuilder(options).start();\n this.video.srcObject = this.stream;\n await this.video.play();\n }\n\n onExitPip() {\n if (this.session) {\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n\n onVideoPause(video) {\n // eslint-disable-next-line no-empty-function\n setTimeout(() => video.play().catch(() => {}));\n }\n\n onDeviceEvent({ type }) {\n if (type.endsWith('_ended')) {\n clearTimeout(this.startTimer);\n if (this.session) {\n this.session.emit({ type: 'pip_cam_warning_video_ended' });\n this.session.emit({ type: 'stop_pip_cam' });\n } else {\n this.stop();\n }\n }\n }\n\n // eslint-disable-next-line max-statements\n async stop() {\n const { video, stream, canvasStream, vbgMixer, deviceMonitor } = this;\n clearTimeout(this.startTimer);\n if (video) {\n video.onpause = null;\n video.onleavepictureinpicture = null;\n if (document.pictureInPictureElement === video) {\n try {\n await document.exitPictureInPicture();\n // eslint-disable-next-line no-empty\n } catch (error) {}\n }\n video.srcObject = null;\n this.video = null;\n }\n if (deviceMonitor) {\n deviceMonitor.destroy();\n this.deviceMonitor = null;\n }\n if (vbgMixer) {\n vbgMixer.stopOriginalStream();\n vbgMixer.terminate();\n this.vbgMixer = null;\n }\n if (stream) {\n stopStream(stream);\n this.stream = null;\n }\n if (canvasStream) {\n stopStream(canvasStream);\n this.canvasStream = null;\n }\n if (this.isActive) {\n if (this.session) {\n this.session.emit({ type: 'pip_cam', active: false });\n }\n this.isActive = false;\n }\n }\n\n async destroy() {\n await this.stop();\n this.session = null;\n }\n}\n\nexport default PipCam;\n","import BaseEvent from './BaseEvent.js';\nimport PipCam from '../PipCam.js';\n\nclass StartPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: _session.pipCam.isActive });\n return;\n }\n _session.pipCam = new PipCam(_session);\n _session.pipCam.start();\n }\n}\n\nclass StopPipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (!_session.pipCam) {\n _session.emit({ type: 'pip_cam', active: false });\n return;\n }\n _session.pipCam.destroy();\n _session.pipCam = null;\n }\n}\n\nclass UpdatePipCamEvent extends BaseEvent {\n handle() {\n const { _session } = this.context;\n if (!_session) {\n throw new Error('Session does not exist');\n }\n if (_session.pipCam) {\n _session.pipCam.updateCamera();\n }\n }\n}\n\nexport { StartPipCamEvent, StopPipCamEvent, UpdatePipCamEvent };\n","import PublicEvent from './PublicEvent.js';\nimport ChangeStreamEvent from './ChangeStreamEvent.js';\nimport { hasAudio, hasVideo } from '../utils/StreamHelpers.js';\nimport Logger from '../Logger.js';\nimport DeviceManager from '../DeviceManager.js';\nimport LocalStorage from '../LocalStorage.js';\nimport FeatureDetector from '../FeatureDetector.js';\n\nclass AudioDeviceEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n const video = hasVideo(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AudioDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass VideoDeviceEndEvent extends PublicEvent {\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n } catch (error) {\n Logger.error('VideoDeviceEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nclass AllDevicesEndEvent extends PublicEvent {\n // eslint-disable-next-line max-statements\n async handle(msg) {\n const { _session } = this.context;\n try {\n const audio = hasAudio(_session.localStream);\n await new ChangeStreamEvent(this.context).handle({ audio, video: false });\n const tracks = _session.localStream.getAudioTracks();\n if (tracks && tracks.length > 0) {\n const [track] = tracks;\n const devices = await DeviceManager.fetchInputDevices();\n const { deviceId } = track.getSettings();\n const found = devices.find(device => device.deviceId === deviceId);\n if (!FeatureDetector.canMultipleDifferentMicrophones()) {\n const mediaConstraints = LocalStorage.load('mediaConstraints');\n mediaConstraints.audio = { deviceId: { exact: deviceId } };\n LocalStorage.store('mediaConstraints', mediaConstraints);\n LocalStorage.store('audioId', deviceId);\n }\n if (found) {\n msg.newAudioDevice = found.label;\n }\n }\n } catch (error) {\n Logger.error('AllDevicesEndEvent', error);\n }\n super.handle(msg);\n }\n}\n\nexport { AudioDeviceEndEvent, VideoDeviceEndEvent, AllDevicesEndEvent };\n","import Logger from './Logger.js';\n\nimport {\n StopPlaybackEvent,\n StartPlaybackEvent\n} from './events/PlaybackEvents.js';\n\nimport {\n StartAnnotationEvent,\n StopAnnotationEvent\n} from './events/AnnotationEvents.js';\n\nimport StfuEvent from './events/StfuEvent.js';\nimport IgnoreEvent from './events/IgnoreEvent.js';\nimport PublicEvent from './events/PublicEvent.js';\nimport PodiumEvent from './events/PodiumEvent.js';\nimport ForwardEvent from './events/ForwardEvent.js';\nimport SnapshotEvent from './events/SnapshotEvent.js';\nimport SetLayerEvent from './events/SetLayerEvent.js';\nimport SendChatEvent from './events/SendChatEvent.js';\nimport StopRtmpEvent from './events/StopRtmpEvent.js';\nimport SetLayoutEvent from './events/SetLayoutEvent.js';\nimport StartRtmpEvent from './events/StartRtmpEvent.js';\nimport RoomReceivedEvent from './events/RoomReceivedEvent.js';\nimport FetchRoomEvent from './events/FetchRoomEvent.js';\nimport DeleteFileEvent from './events/DeleteFileEvent.js';\nimport UploadFileEvent from './events/UploadFileEvent.js';\nimport ReceiveChatEvent from './events/ReceiveChatEvent.js';\nimport StartStreamEvent from './events/StartStreamEvent.js';\nimport ChangeStreamEvent from './events/ChangeStreamEvent.js';\nimport ReplaceStreamEvent from './events/ReplaceStreamEvent.js';\nimport ToggleCameraEvent from './events/ToggleCameraEvent.js';\nimport AcceptSessionEvent from './events/AcceptSessionEvent.js';\nimport StopRecordingEvent from './events/StopRecordingEvent.js';\nimport VoiceActivityEvent from './events/VoiceActivityEvent.js';\nimport StartRecordingEvent from './events/StartRecordingEvent.js';\nimport StartScreenCaptureEvent from './events/ScreenCaptureEvent.js';\nimport StartPresentingEvent from './events/StartPresentingEvent.js';\nimport StopPresentingEvent from './events/StopPresentingEvent.js';\nimport StopBroadcastsEvent from './events/StopBroadcastsEvent.js';\nimport ClearFrontLayerEvent from './events/ClearFrontLayerEvent.js';\nimport RequestGuestUserEvent from './events/RequestGuestUserEvent.js';\nimport SessionTerminationEvent from './events/SessionTerminationEvent.js';\nimport ParticipantListUpdateEvent from './events/ParticipantListUpdateEvent.js';\nimport { StartMixerEvent, UpdateMixerEvent } from './events/MixerEvents.js';\nimport { StartMediaEvent } from './events/MediaEvents.js';\nimport LockMeetingEvent from './events/LockMeetingEvent.js';\nimport TerminateMeetingEvent from './events/TerminateMeetingEvent.js';\nimport KickUserEvent from './events/KickUserEvent.js';\nimport VirtualBackgroundEvent from './events/VirtualBackgroundEvent.js';\nimport ScreenVideoChangeEvent from './events/ScreenVideoChangeEvent.js';\nimport ScreenVideoStoppedEvent from './events/ScreenVideoStoppedEvent.js';\nimport {\n StartPipCamEvent,\n StopPipCamEvent,\n UpdatePipCamEvent\n} from './events/PipCamEvents.js';\nimport {\n AudioDeviceEndEvent,\n VideoDeviceEndEvent,\n AllDevicesEndEvent\n} from './events/DeviceEndEvents.js';\n\n/**\n * Event Handler uses the connection credentials for the room and\n * the user to setup a (monitored) connection, start a session and\n * listen for any events.\n **/\nclass EventHandler {\n constructor() {\n this.listeners = [];\n this._eyeson = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n\n this.send = this.send.bind(this);\n }\n\n /* eslint-disable max-statements */\n destroy() {\n if (this._monitor) {\n this._monitor.destroy();\n }\n if (this._connection) {\n this._connection.close();\n }\n if (this._rtConnection) {\n this._rtConnection.close();\n }\n if (this._session) {\n if (this._session.vbgMixer) {\n this._session.vbgMixer.stopOriginalStream();\n this._session.vbgMixer.terminate();\n this._session.vbgMixer.destroy();\n }\n this._session.end();\n }\n this._api = null;\n this._session = null;\n this._monitor = null;\n this._connection = null;\n this._rtConnection = null;\n }\n /* eslint-enable max-statements */\n\n set connection(con) {\n if (this._connection) {\n Logger.error(\n 'A connection is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._connection = con;\n this._connection.onMessage(this.send);\n }\n\n get connection() {\n return null;\n }\n\n set rtConnection(con) {\n if (this._rtConnection) {\n Logger.error(\n 'A real-time connection is already set. If you are trying to start' +\n ' a new session you have the close the current before.'\n );\n return;\n }\n this._rtConnection = con;\n this._rtConnection.onMessage(this.send);\n }\n\n get rtConnection() {\n return null;\n }\n\n set monitor(mon) {\n if (this._monitor) {\n Logger.error(\n 'A monitor is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._monitor = mon;\n this._monitor.onEvent(this.send);\n }\n\n get monitor() {\n return this._monitor;\n }\n\n set session(ses) {\n if (this._session) {\n Logger.error(\n 'A session is already set. If you are trying to start a new' +\n ' session you have to end the current one first.'\n );\n return;\n }\n this._session = ses;\n this._session.onEvent(this.send);\n }\n\n get session() {\n return null;\n }\n\n set api(api) {\n this._api = api;\n }\n\n get api() {\n return null;\n }\n\n set rtData(data) {\n this._rtData = data;\n }\n\n get rtData() {\n return null;\n }\n\n set eyeson(eyeson) {\n this._eyeson = eyeson;\n }\n\n get eyeson() {\n return null;\n }\n\n /**\n * Register a new listener.\n **/\n onReceive(callback) {\n Logger.debug('EventHandler::onReceive');\n this.listeners.push(callback);\n }\n\n /**\n * Unregisters a listener.\n **/\n removeListener(callback) {\n this.listeners = this.listeners.filter(listener => listener !== callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n /* eslint-disable camelcase */\n send(msg) {\n if (!msg.silenced) {\n Logger.debug('EventHandler::send', msg);\n }\n new ({\n stfu: ForwardEvent,\n chat: ReceiveChatEvent,\n accept: AcceptSessionEvent,\n podium: PodiumEvent,\n snapshot: SnapshotEvent,\n send_chat: SendChatEvent,\n set_layer: SetLayerEvent,\n set_layout: SetLayoutEvent,\n fetch_room: FetchRoomEvent,\n room_ready: RoomReceivedEvent,\n room_setup: RoomReceivedEvent,\n memberlist: ParticipantListUpdateEvent,\n upload_file: UploadFileEvent,\n delete_file: DeleteFileEvent,\n request_stfu: StfuEvent,\n change_stream: ChangeStreamEvent,\n replace_stream: ReplaceStreamEvent,\n toggle_camera: ToggleCameraEvent,\n stop_playback: StopPlaybackEvent,\n playback_update: ForwardEvent,\n start_playback: StartPlaybackEvent,\n start_stream: StartStreamEvent,\n stop_recording: StopRecordingEvent,\n start_screen_capture: StartScreenCaptureEvent,\n stop_broadcasts: StopBroadcastsEvent,\n start_recording: StartRecordingEvent,\n stop_presenting: StopPresentingEvent,\n start_presenting: StartPresentingEvent,\n stop_annotation: StopAnnotationEvent,\n start_annotation: StartAnnotationEvent,\n clear_front_layer: ClearFrontLayerEvent,\n request_guest_user: RequestGuestUserEvent,\n voice_activity_raw: VoiceActivityEvent,\n start_mixer: StartMixerEvent,\n update_mixer: UpdateMixerEvent,\n lock_meeting: LockMeetingEvent,\n terminate_meeting: TerminateMeetingEvent,\n kick_user: KickUserEvent,\n session_termination: SessionTerminationEvent,\n start_media: StartMediaEvent,\n change_screen_video: ScreenVideoChangeEvent,\n stop_screen_video: ScreenVideoStoppedEvent,\n stop_rtmp: StopRtmpEvent,\n start_rtmp: StartRtmpEvent,\n suspend_virtual_background: VirtualBackgroundEvent,\n audio_device_ended: AudioDeviceEndEvent,\n video_device_ended: VideoDeviceEndEvent,\n all_devices_ended: AllDevicesEndEvent,\n start_pip_cam: StartPipCamEvent,\n stop_pip_cam: StopPipCamEvent,\n update_pip_cam: UpdatePipCamEvent,\n\n capture_error: ForwardEvent,\n voice_activity: ForwardEvent,\n options_update: ForwardEvent,\n ext_not_installed: ForwardEvent,\n broadcasts_update: ForwardEvent,\n presentation_ended: ForwardEvent,\n\n recording: IgnoreEvent,\n ext_cancel: IgnoreEvent,\n ext_installed: IgnoreEvent,\n message_status: IgnoreEvent,\n moderator_info: IgnoreEvent\n }[msg.type] || PublicEvent)(this).handle(msg);\n }\n /* eslint-enable camelcase */\n}\n\nexport default EventHandler;\n","import FeatureDetector from './FeatureDetector.js';\n\n/**\n * Add 'Visoweb' identifier to origin field of sdp. Believe this is still\n * relevant for some remotes.\n **/\nconst addOriginToSDP = sdp => {\n return sdp.replace('o=-', 'o=Visoweb');\n};\n\n/**\n * Add session attribute to disable sfu mode from the client.\n **/\n// eslint-disable-next-line max-statements\nconst addSessionAttributes = sdp => {\n // double check config.allowSafariSFU on runtime\n const splitSDP = sdp.split('\\r\\n');\n const tLineIdx = splitSDP.findIndex(line => line.startsWith('t='));\n let addIndex = 1;\n if (FeatureDetector.canSFU()) {\n // insert sfuLine after tLine (timing), delete 0 elements\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=sfu-capable');\n addIndex++;\n if (FeatureDetector.disallowAudioSyncSrcChange()) {\n splitSDP.splice(tLineIdx + addIndex, 0, 'a=disallow-audio-ssrc-change');\n addIndex++;\n }\n }\n if (FeatureDetector.canDataChannel()) {\n splitSDP.splice(\n tLineIdx + addIndex,\n 0,\n 'a=eyeson-datachan-capable',\n 'a=eyeson-datachan-keepalive',\n 'a=eyeson-sepp-messaging'\n );\n }\n return splitSDP.join('\\r\\n');\n};\n\n// eslint-disable-next-line max-statements\nconst addStereo = sdp => {\n const stereo = FeatureDetector.canStereo();\n const codecMatch = sdp.match(/^a=rtpmap:(\\d+) opus/m);\n if (codecMatch) {\n const fmtpRegExp = new RegExp(`^a=fmtp:${codecMatch[1]} (.+)$`, 'm');\n const fmtpMatch = sdp.match(fmtpRegExp);\n if (fmtpMatch) {\n const options = {};\n fmtpMatch[1].split(';').forEach(entry => {\n const [key, value] = entry.split('=');\n options[key] = value;\n });\n options['stereo'] = stereo ? '1' : '0';\n // options['sprop-stereo'] = '1';\n const result = Object.entries(options)\n .map(([key, value]) => `${key}=${value}`)\n .join(';');\n return sdp.replace(fmtpRegExp, `a=fmtp:${codecMatch[1]} ${result}`);\n }\n }\n return sdp;\n};\n\nconst sendOnly = sdp => {\n const lines = sdp.split('\\r\\n');\n let doIt = false;\n lines.forEach((line, row) => {\n if (line.startsWith('m=audio') || line.startsWith('m=video')) {\n doIt = true;\n } else if (line.startsWith('m=application')) {\n doIt = false;\n } else if (line === 'a=sendrecv' && doIt) {\n lines[row] = 'a=sendonly';\n }\n });\n return lines.join('\\r\\n');\n};\n\nconst getModifiers = options => {\n const modifiers = {\n active: [addStereo],\n passive: [addOriginToSDP, addSessionAttributes]\n };\n if (options.sendOnly === true) {\n modifiers.active.push(sendOnly);\n }\n return modifiers;\n};\n\nexport { getModifiers };\n","/* eslint-disable max-lines */\nimport Logger from './Logger.js';\nimport { getModifiers } from './SDPModifiers.js';\nimport DeviceManager from './DeviceManager.js';\nimport FeatureDetector from './FeatureDetector.js';\nimport MediaStreamBuilder from './MediaStreamBuilder.js';\nimport VirtualBackgroundMixer from './VirtualBackgroundMixer.js';\nimport DeviceMonitor from './DeviceMonitor.js';\nimport {\n hasVideo,\n hasAudio,\n createExternalStream\n} from './utils/StreamHelpers.js';\n\n/**\n * Conference Session is starting a session from active connection,\n * delegating events to registered listeners.\n **/\nclass ConferenceSession {\n /* eslint-disable max-statements */\n constructor(connection, comApi, options = {}) {\n this.options = options;\n this.options.RTCConstraints = Object.assign(\n {},\n this.defaultRTCConstraints,\n { offerToReceiveVideo: !this.options.eco }\n );\n this.accepted = false;\n this.listeners = [];\n this.restarting = false;\n this.connection = connection;\n this.comApi = comApi;\n this.sipSession = null;\n this.startAttempts = 0;\n this.maxStartAttempts = 3;\n this.tryAuthUpdate = true;\n this.tryResume = true;\n this.tryWaitResume = true;\n this.resumeTimer = null;\n this.waitResumeTimer = null;\n\n this.end = this.end.bind(this);\n this.emit = this.emit.bind(this);\n this.setStream = this.setStream.bind(this);\n this.endSession = this.endSession.bind(this);\n this.initSession = this.initSession.bind(this);\n this.handleFailed = this.handleFailed.bind(this);\n this.handleAccept = this.handleAccept.bind(this);\n this.handleUnmute = this.handleUnmute.bind(this);\n this.restartSession = this.restartSession.bind(this);\n this.tryRecoveryFrom = this.tryRecoveryFrom.bind(this);\n this.terminateSession = this.terminateSession.bind(this);\n this.remoteDescriptionUpdate = this.remoteDescriptionUpdate.bind(this);\n }\n /* eslint-enable max-statements */\n\n get peerConnection() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.peerConnection;\n }\n return null;\n }\n\n get localStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.localStream;\n }\n return null;\n }\n\n get remoteStream() {\n if (this.sipSession && this.sipSession.sessionDescriptionHandler) {\n return this.sipSession.sessionDescriptionHandler.remoteStream;\n }\n return null;\n }\n\n get defaultRTCConstraints() {\n return { offerToReceiveAudio: true, offerToReceiveVideo: true };\n }\n\n /**\n * Request stream and invoke session start.\n **/\n start() {\n if (this.options.stream) {\n this.initExternalStream();\n return;\n }\n this.initDeviceMonitor();\n this.initVirtualBackground();\n new MediaStreamBuilder(this.options)\n .start()\n .then(this.initSession)\n .catch(this.handleFailed);\n }\n\n initExternalStream() {\n const audioOnly = !hasVideo(this.options.stream) && this.options.eco;\n const stream = createExternalStream(this.options.stream, audioOnly);\n if (!stream) {\n this.handleFailed({ name: 'invalid_stream' });\n return;\n }\n this.externalStream = stream;\n this.options.audio = hasAudio(stream);\n this.options.video = hasVideo(stream);\n this.initSession(this.externalStream);\n }\n\n initVirtualBackground() {\n const type = DeviceManager.getStoredVirtualBackgroundType();\n this.vbgMixer = new VirtualBackgroundMixer();\n this.vbgMixer.changeBackground(type);\n this.options.vbgMixer = this.vbgMixer;\n }\n\n initDeviceMonitor() {\n this.deviceMonitor = new DeviceMonitor();\n this.deviceMonitor.onEvent(msg => this.emit(msg));\n this.options.deviceMonitor = this.deviceMonitor;\n }\n\n buildSessionOptions(stream) {\n const { options } = this;\n if (options.sendOnly === true) {\n options.RTCConstraints = {};\n }\n return {\n stream: stream,\n sendOnly: options.sendOnly,\n SDPModifiers: getModifiers({\n sendOnly: options.sendOnly\n }),\n connection: this.connection,\n handleAccept: this.handleAccept,\n handleUnmute: this.handleUnmute,\n RTCConstraints: options.RTCConstraints,\n remoteDescriptionUpdate: this.remoteDescriptionUpdate,\n mediaOptions: { audio: options.audio, video: options.video }\n };\n }\n\n /**\n * Init session and start stream.\n **/\n // eslint-disable-next-line max-statements\n initSession(stream) {\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n const options = this.buildSessionOptions(stream);\n this.sipSession = this.connection.startSession(options);\n this.onUnmute(stream);\n this.sipSession.onEvent(event => {\n if (event.type === 'accepted') {\n this.adjustVideoPodium();\n } else if (event.type === 'resumed') {\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n this.tryResume = true;\n this.tryAuthUpdate = true;\n this.tryWaitResume = true;\n } else if (event.type === 'terminated') {\n this.handleTermination(event.reason, event.code);\n }\n });\n if (this.externalStream) {\n this.connection.hasExternalStream = true;\n }\n\n if (window) {\n window.addEventListener(\n FeatureDetector.isIOSDevice() ? 'pagehide' : 'beforeunload',\n this.endSession\n );\n }\n }\n\n /**\n * End a conference session.\n **/\n end() {\n this.listeners = [];\n this.endSession();\n this.accepted = false;\n this.sipSession = null;\n this.connection = null;\n }\n\n /**\n * Before terminating the session, remove all listeners and stop all\n * streams.\n **/\n endSession() {\n Logger.debug('ConferenceSession::endSession');\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if (this.sipSession) {\n this.sipSession.removeAllListeners();\n this.terminateSession();\n }\n if (this.connection) {\n this.connection.close();\n }\n if (this.deviceMonitor) {\n this.deviceMonitor.destroy();\n }\n }\n /* eslint-enable max-statements */\n\n /**\n * Depending on the state of the session, this function may send a CANCEL\n * request, a non-2xx final response, a BYE request, or even no request at\n * all.\n * https://sipjs.com/api/0.7.0/session/#terminateoptions\n **/\n terminateSession() {\n Logger.debug('ConferenceSession::terminateSession');\n try {\n this.sipSession.terminate();\n } catch (error) {\n Logger.error(error);\n }\n }\n\n /**\n * Replace the active stream with newStream and emit 'stream_update' with the\n * new stream.\n *\n * In case of an error (as will be the case in current EDGE (May 2019))\n * report back the current streams.\n **/\n // eslint-disable-next-line max-statements\n async setStream(newStream) {\n if (!this.sipSession) {\n return null;\n }\n try {\n const { sessionDescriptionHandler } = this.sipSession;\n const streams = await sessionDescriptionHandler.setStream(newStream);\n this.stopPresentingSet = false;\n if (this.micMixer && this.micMixer.active) {\n streams.newStream = this.micMixer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n if (this.videoPlayer && this.videoPlayer.isStreaming()) {\n streams.newStream = this.videoPlayer.getMicOnlyStream();\n sessionDescriptionHandler.localStream = streams.newStream;\n }\n this.onUnmute(streams.newStream);\n this.emit({\n type: 'stream_update',\n localStream: streams.newStream,\n stream: streams.remoteStream\n });\n return streams.newStream;\n } catch (error) {\n Logger.error('ConferenceSession::setStream', error);\n this.emit({\n type: 'stream_update',\n localStream: this.localStream,\n stream: this.remoteStream\n });\n return this.localStream;\n }\n }\n\n /**\n * Trigger local track unmuted event.\n * Used to prevent iOS issue black video after incoming call.\n */\n onUnmute(stream) {\n if (stream) {\n stream.getTracks().forEach(track => {\n track.onunmute = () =>\n this.emit({ type: 'local_track_unmuted', track: track });\n });\n }\n }\n\n /**\n * Register a session monitor.\n **/\n setMonitor(monitor) {\n this.monitor = monitor;\n }\n\n /**\n * Forward accept event, build expected message format.\n **/\n handleAccept(remoteStream) {\n if (this.monitor) {\n this.monitor.observe(this.peerConnection);\n }\n if (!this.accepted) {\n this.emit({ type: 'accept', session: this.sipSession });\n this.accepted = true;\n }\n if (remoteStream) {\n this.emit({ type: 'stream_update', stream: remoteStream });\n }\n }\n\n handleUnmute(track) {\n this.emit({ type: 'track_unmuted', track: track });\n }\n\n remoteDescriptionUpdate(sdpWrapper) {\n Logger.debug('ConferenceSession::remoteDescriptionUpdate', sdpWrapper.sdp);\n let sfu = false;\n\n const splitSDP = sdpWrapper.sdp.split('\\r\\n');\n const sfuLine = splitSDP.find(line => line.startsWith('a=sfu-mode'));\n\n if (sfuLine) {\n sfu = sfuLine.includes('on');\n }\n\n this.emit({ type: 'remote_description_update', update: { sfu: sfu } });\n }\n\n /**\n * Once we have accepted the session, we need to adjust the video podium,\n * according to the current options.\n **/\n adjustVideoPodium() {\n this.send({ type: 'mute_video', on: !this.options.video });\n }\n\n /**\n * On Termination log to debug what happened.\n **/\n // eslint-disable-next-line max-statements\n handleTermination(reason, code) {\n Logger.debug('ConfSession::handleTermination', reason, code);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n if ((reason === 'bye' && code === 200) || reason === 'terminate') {\n this.handleExit();\n } else if (reason === 'disconnect') {\n if (code === -1) {\n if (this.tryAuthUpdate) {\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data =>\n this.connection.updateAuthAndRestartSession(data)\n );\n return;\n } else if (this.tryWaitResume && this.connection) {\n this.tryWaitResume = false;\n this.waitResumeTimer = setTimeout(() => {\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n }, 5000);\n this.resumeTimer = setTimeout(() => {\n this.handleFailed({ name: 503 });\n }, 15000);\n return;\n }\n this.handleFailed({ name: 503 });\n } else {\n if (this.tryResume && this.connection) {\n this.tryResume = false;\n this.tryAuthUpdate = false;\n this.comApi.getRoom(data => {\n if (this.connection) {\n this.connection.updateAuthAndResume(data);\n }\n });\n this.resumeTimer = setTimeout(\n () => this.handleFailed({ name: 410 }),\n 10000\n );\n return;\n }\n this.handleFailed({ name: 410 });\n }\n } else {\n this.handleFailed({ name: code });\n }\n if (!this.restarting) {\n this.emit({ type: 'session_termination' });\n }\n }\n\n /**\n * Forward exit event\n **/\n handleExit() {\n this.emit({ type: 'exit', reason: 'bye' });\n }\n\n /**\n * Forward failed event unless we attempt a recovery.\n **/\n handleFailed(reason) {\n Logger.warn('ConferenceSession::handleFailed: ', reason);\n clearTimeout(this.resumeTimer);\n clearTimeout(this.waitResumeTimer);\n let key = 'Desert';\n if (reason && reason.name) {\n key = reason.name;\n }\n\n if (this.tryRecoveryFrom(key)) {\n return;\n }\n\n const name =\n {\n NotFoundError: 'devices',\n NotAllowedError: 'permission',\n DevicesNotFoundError: 'devices',\n PermissionDeniedError: 'permission',\n NotReadableError: 'not_readable',\n 403: 'session_in_use',\n 410: 'abrupt_disconnect',\n 413: 'request_too_large',\n 426: 'ice_error',\n 486: 'session_in_use',\n 607: 'meeting_locked'\n }[key] || 'session_failed';\n\n this.emit({\n type: 'error',\n name: name,\n code: this.errorCodeName(key, name)\n });\n }\n\n errorCodeName(key, name) {\n if (\n [\n 'permission',\n 'devices',\n 'not_readable',\n 'meeting_locked',\n 'session_in_use',\n 'transport_error'\n ].includes(name)\n ) {\n return '';\n }\n return String(key);\n }\n\n /**\n * Conference session may recover from `failure` if a recovery for that\n * `failure` is known and its condition applies.\n **/\n tryRecoveryFrom(failure) {\n Logger.debug('ConferenceSession::tryRecoveryFrom: ', failure);\n\n const recovery = {\n 404: {\n condition: () => this.startAttempts < this.maxStartAttempts,\n action: () => this.restartSession()\n }\n }[failure];\n\n if (this.startAttempts >= this.maxStartAttempts) {\n this.restarting = false;\n return false;\n }\n\n return Boolean(recovery && recovery.condition() && recovery.action());\n }\n\n /**\n * End the previously started session, but keep already registered listeners.\n **/\n restartSession() {\n Logger.debug('ConferenceSession::restartSession: ', this.startAttempts);\n this.restarting = true;\n this.startAttempts += 1;\n\n setTimeout(() => {\n this.endSession();\n this.start();\n }, 1000);\n\n return true;\n }\n\n /**\n * Register event listeners.\n **/\n onEvent(callback) {\n this.listeners.push(callback);\n }\n\n /**\n * On receiving an event, notify all registered listeners.\n **/\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n /**\n * Transport a message over the connection.\n **/\n send(msg) {\n return this.connection.send(msg);\n }\n}\n\nexport default ConferenceSession;\n\n/* eslint-enable max-lines */\n","import Logger from '../Logger.js';\n\nconst Status = {\n NO_CONNECTION: 3,\n BAD: 2,\n OK: 1,\n GOOD: 0\n};\n\nconst calculateStatus = (\n packetLossRate = 0,\n jitter = 0,\n roundTripTime = 0,\n nackRate = 0\n) => {\n if (\n roundTripTime > 1 ||\n packetLossRate > 0.2 ||\n jitter > 0.5 ||\n nackRate > 0.2\n ) {\n return Status.BAD;\n }\n if (\n roundTripTime > 0.3 ||\n packetLossRate > 0.1 ||\n jitter > 0.3 ||\n nackRate > 0.1\n ) {\n return Status.OK;\n }\n return Status.GOOD;\n};\n\nconst getOldestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time < result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst getNewestHistoryEntry = history => {\n let [result] = history;\n const { length } = history;\n for (let index = 1; index < length; index++) {\n if (history[index].time > result.time) {\n result = history[index];\n }\n }\n return result;\n};\n\nconst addHistory = (history, entry) => {\n if (history.length < 3) {\n history.push(Object.assign({}, entry));\n return;\n }\n Object.assign(getOldestHistoryEntry(history), entry);\n};\n\n// eslint-disable-next-line max-statements\nconst getHistoryAverage = history => {\n const { length } = history;\n const result = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n bitrateSend: 0,\n bitrateRecv: 0,\n status: Status.GOOD\n };\n const newest = getNewestHistoryEntry(history);\n for (const entry of history) {\n result.jitter += entry.jitter;\n result.packetLoss += entry.packetLoss;\n result.roundTripTime += entry.roundTripTime;\n result.nack += entry.nack;\n result.bitrateSend += entry.bitrateSend;\n result.bitrateRecv += entry.bitrateRecv;\n }\n result.jitter = newest.jitter === null ? null : result.jitter / length;\n result.packetLoss =\n newest.packetLoss === null ? null : result.packetLoss / length;\n result.roundTripTime =\n newest.roundTripTime === null ? null : result.roundTripTime / length;\n result.nack = newest.nack === null ? null : result.nack / length;\n result.bitrateSend /= length;\n result.bitrateRecv /= length;\n result.status = calculateStatus(\n result.packetLoss,\n result.jitter,\n result.roundTripTime,\n result.nack\n );\n return result;\n};\n\nclass ConnectionStatistics {\n constructor() {\n this.peerConnection = null;\n this.timer = null;\n this.listeners = [];\n this.history = [];\n this.entry = {\n jitter: 0,\n packetLoss: 0,\n roundTripTime: 0,\n nack: 0,\n time: 0,\n bitrateSend: 0,\n bitrateRecv: 0\n };\n this.lastStat = {\n time: null,\n bytesSent: null,\n bytesReceived: null,\n audio: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null\n },\n in: {\n packetsReceived: null\n }\n },\n video: {\n out: {\n packetsSent: null,\n packetsLost: null,\n bytesSent: null,\n nackCount: null\n },\n in: {\n bytesReceived: null\n }\n }\n };\n this.boundPrintStats = this.printStats.bind(this);\n }\n\n init(peerConnection) {\n this.peerConnection = peerConnection;\n }\n\n // eslint-disable-next-line max-statements\n async printStats() {\n const { peerConnection, entry, lastStat, history } = this;\n const stats = await peerConnection.getStats();\n const now = Date.now();\n let statsCurrentRoundTripTime = null;\n Object.keys(entry).forEach(key => {\n entry[key] = 0;\n });\n entry.jitter = null;\n entry.packetLoss = null;\n entry.roundTripTime = null;\n entry.nack = null;\n entry.time = now;\n\n // eslint-disable-next-line max-statements, complexity\n stats.forEach(report => {\n if (report.type === 'inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const received = Math.max(\n report.bytesReceived - lastStat[kind].in.bytesReceived,\n 0\n );\n entry.bitrateRecv += (received * 8) / diff;\n }\n lastStat[kind].in.bytesReceived = report.bytesReceived;\n } else if (report.type === 'outbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat.time) {\n const diff = (now - lastStat.time) / 1000.0;\n const sent = report.bytesSent - lastStat[kind].out.bytesSent;\n entry.bitrateSend += (sent * 8) / diff;\n }\n lastStat[kind].out.bytesSent = report.bytesSent;\n } else if (report.type === 'remote-inbound-rtp') {\n const kind = report.kind || report.mediaType;\n if (lastStat[kind]) {\n const outbound = stats.get(report.localId);\n const hasRTT = typeof report.roundTripTime !== 'undefined';\n const hasJitter = typeof report.jitter !== 'undefined';\n const hasPacketLoss = typeof report.packetsLost !== 'undefined';\n const hasNackCount = typeof outbound.nackCount !== 'undefined';\n if (lastStat.time) {\n const lost = report.packetsLost - lastStat[kind].out.packetsLost;\n const packets =\n outbound.packetsSent - lastStat[kind].out.packetsSent;\n const packetLossRate = packets > 0 ? lost / packets : 0;\n entry.jitter = hasJitter\n ? Math.max(entry.jitter, packets > 0 ? report.jitter : 0)\n : null;\n entry.packetLoss = hasPacketLoss\n ? Math.max(entry.packetLoss, packetLossRate)\n : null;\n entry.roundTripTime = hasRTT\n ? Math.max(entry.roundTripTime, report.roundTripTime)\n : null;\n if (kind === 'video') {\n const nack = outbound.nackCount - lastStat[kind].out.nackCount;\n const nackRate = packets > 0 ? nack / packets : 0;\n entry.nack = hasNackCount ? Math.max(entry.nack, nackRate) : null;\n }\n }\n if (kind === 'video') {\n lastStat[kind].out.nackCount = outbound.nackCount;\n }\n lastStat[kind].out.packetsSent = outbound.packetsSent;\n lastStat[kind].out.packetsLost = report.packetsLost;\n }\n } else if (\n report.type === 'candidate-pair' &&\n report.state === 'succeeded' &&\n 'currentRoundTripTime' in report\n ) {\n statsCurrentRoundTripTime = report.currentRoundTripTime;\n }\n });\n if (entry.roundTripTime === null && statsCurrentRoundTripTime !== null) {\n entry.roundTripTime = statsCurrentRoundTripTime;\n }\n addHistory(history, entry);\n const average = getHistoryAverage(history);\n if (navigator.onLine === false) {\n average.status = Status.BAD;\n }\n if (\n ['disconnected', 'failed', 'closed'].includes(\n peerConnection.iceConnectionState\n )\n ) {\n average.status = Status.NO_CONNECTION;\n }\n this.emit(average);\n lastStat.time = now;\n }\n\n getCurrentStatistics() {\n return getHistoryAverage(this.history);\n }\n\n onUpdate(listener) {\n const { listeners, timer } = this;\n if (listeners.length === 0 && timer === null) {\n this.timer = setInterval(this.boundPrintStats, 1000);\n this.peerConnection.addEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n window.addEventListener('offline', this.boundPrintStats);\n }\n listeners.push(listener);\n }\n\n emit(statistics) {\n this.listeners.forEach(listener => {\n try {\n listener(statistics);\n } catch (err) {\n Logger.error('ConnectionStatistics::emit', err);\n }\n });\n }\n\n destroy() {\n clearInterval(this.timer);\n window.removeEventListener('offline', this.boundPrintStats);\n if (this.peerConnection) {\n this.peerConnection.removeEventListener(\n 'iceconnectionstatechange',\n this.boundPrintStats\n );\n this.peerConnection = null;\n }\n this.timer = null;\n this.history.length = 0;\n this.listeners.length = 0;\n }\n}\n\nConnectionStatistics.Status = Status;\n\nexport default ConnectionStatistics;\n","import Logger from './Logger.js';\nimport ConnectionStatistics from './utils/ConnectionStatistics.js';\n/**\n * Connection Monitor informs about on and offline and ice state changes.\n * I.e. when the connection to the conf server (from a webRTC point of view)\n * is breaking up or degrading.\n **/\nclass ConnectionMonitor {\n constructor() {\n this.pc = null;\n this.statistics = new ConnectionStatistics();\n this.listeners = [];\n this.disconnectTimer = null;\n this.prevIceState = 'initial';\n this.onOffline = this.onOffline.bind(this);\n this.handleIceStateChange = this.handleIceStateChange.bind(this);\n this.handleConnectionStateChange =\n this.handleConnectionStateChange.bind(this);\n this.addEventListeners();\n }\n\n addEventListeners() {\n window.addEventListener('offline', this.onOffline);\n }\n\n onOffline() {\n this.emit({ type: 'offline' });\n }\n\n observe(peerConnection) {\n if (this.pc) {\n return;\n }\n this.pc = peerConnection;\n this.pc.oniceconnectionstatechange = this.handleIceStateChange;\n this.pc.onconnectionstatechange = this.handleConnectionStateChange;\n this.statistics.init(peerConnection);\n this.emit({ type: 'statistics_ready', statistics: this.statistics });\n }\n\n destroy() {\n const { pc, statistics } = this;\n clearTimeout(this.disconnectTimer);\n if (statistics) {\n statistics.destroy();\n this.statistics = null;\n }\n if (pc) {\n pc.onconnectionstatechange = null;\n pc.oniceconnectionstatechange = null;\n this.pc = null;\n }\n window.removeEventListener('offline', this.onOffline);\n }\n\n onEvent(listener) {\n this.listeners.push(listener);\n }\n\n emit(msg) {\n this.listeners.forEach(listener => listener(msg));\n }\n\n handleConnectionStateChange(event) {\n if (event.currentTarget) {\n Logger.warn(\n 'connectionStateChange: ',\n event.currentTarget.connectionState\n );\n }\n }\n\n /* eslint-disable max-statements */\n handleIceStateChange(event) {\n // event doesn't have a current target in EDGE\n if (!event.currentTarget) {\n return;\n }\n\n const { iceConnectionState: currentIceState } = event.currentTarget;\n\n if (currentIceState === 'disconnected') {\n this.emit({ type: 'warning', name: 'ice_disconnected' });\n // As of Chrome 76 failed is no longer emitted\n // https://bugs.chromium.org/p/chromium/issues/detail?id=982793&q=ice%20failed&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified\n //\n // We use a 2 seconds delay to re-check the connection.\n clearTimeout(this.disconnectTimer);\n this.disconnectTimer = window.setTimeout(() => {\n if (this.pc && this.pc.iceConnectionState !== 'connected') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Goldfinger' });\n }\n }, 2000);\n }\n\n if (currentIceState === 'failed') {\n this.emit({ type: 'error', name: 'ice_failed', code: 'Thunderball' });\n }\n\n if (\n this.prevIceState === 'disconnected' &&\n ['completed', 'connected'].includes(currentIceState)\n ) {\n this.emit({ type: 'clear_warning', name: 'ice_disconnected' });\n }\n\n this.prevIceState = currentIceState;\n }\n /* eslint-enable max-statements */\n}\n\nexport default ConnectionMonitor;\n","var adapters = {\n logger: self.console,\n WebSocket: self.WebSocket\n};\n\nvar logger = {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now());\n adapters.logger.log(\"[ActionCable]\", ...messages);\n }\n }\n};\n\nconst now = () => (new Date).getTime();\n\nconst secondsSince = time => (now() - time) / 1e3;\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this);\n this.connection = connection;\n this.reconnectAttempts = 0;\n }\n start() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n addEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`);\n }\n }\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n logger.log(\"ConnectionMonitor stopped\");\n }\n }\n isRunning() {\n return this.startedAt && !this.stoppedAt;\n }\n recordPing() {\n this.pingedAt = now();\n }\n recordConnect() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n logger.log(\"ConnectionMonitor recorded connect\");\n }\n recordDisconnect() {\n this.disconnectedAt = now();\n logger.log(\"ConnectionMonitor recorded disconnect\");\n }\n startPolling() {\n this.stopPolling();\n this.poll();\n }\n stopPolling() {\n clearTimeout(this.pollTimeout);\n }\n poll() {\n this.pollTimeout = setTimeout((() => {\n this.reconnectIfStale();\n this.poll();\n }), this.getPollInterval());\n }\n getPollInterval() {\n const {staleThreshold: staleThreshold, reconnectionBackoffRate: reconnectionBackoffRate} = this.constructor;\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10));\n const jitterMax = this.reconnectAttempts === 0 ? 1 : reconnectionBackoffRate;\n const jitter = jitterMax * Math.random();\n return staleThreshold * 1e3 * backoff * (1 + jitter);\n }\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`);\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`);\n } else {\n logger.log(\"ConnectionMonitor reopening\");\n this.connection.reopen();\n }\n }\n }\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt;\n }\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold;\n }\n disconnectedRecently() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n }\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout((() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`);\n this.connection.reopen();\n }\n }), 200);\n }\n }\n}\n\nConnectionMonitor.staleThreshold = 6;\n\nConnectionMonitor.reconnectionBackoffRate = .15;\n\nvar INTERNAL = {\n message_types: {\n welcome: \"welcome\",\n disconnect: \"disconnect\",\n ping: \"ping\",\n confirmation: \"confirm_subscription\",\n rejection: \"reject_subscription\"\n },\n disconnect_reasons: {\n unauthorized: \"unauthorized\",\n invalid_request: \"invalid_request\",\n server_restart: \"server_restart\"\n },\n default_mount_path: \"/cable\",\n protocols: [ \"actioncable-v1-json\", \"actioncable-unsupported\" ]\n};\n\nconst {message_types: message_types, protocols: protocols} = INTERNAL;\n\nconst supportedProtocols = protocols.slice(0, protocols.length - 1);\n\nconst indexOf = [].indexOf;\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this);\n this.consumer = consumer;\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ConnectionMonitor(this);\n this.disconnected = true;\n }\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n }\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`);\n return false;\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`);\n if (this.webSocket) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n }\n close({allowReconnect: allowReconnect} = {\n allowReconnect: true\n }) {\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isOpen()) {\n return this.webSocket.close();\n }\n }\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`);\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error);\n } finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`);\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n }\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol;\n }\n }\n isOpen() {\n return this.isState(\"open\");\n }\n isActive() {\n return this.isState(\"open\", \"connecting\");\n }\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0;\n }\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0;\n }\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase();\n }\n }\n }\n return null;\n }\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this);\n this.webSocket[`on${eventName}`] = handler;\n }\n }\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {};\n }\n }\n}\n\nConnection.reopenDelay = 500;\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) {\n return;\n }\n const {identifier: identifier, message: message, reason: reason, reconnect: reconnect, type: type} = JSON.parse(event.data);\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`);\n return this.close({\n allowReconnect: reconnect\n });\n\n case message_types.ping:\n return this.monitor.recordPing();\n\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier);\n return this.subscriptions.notify(identifier, \"connected\");\n\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`);\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close(event) {\n logger.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error() {\n logger.log(\"WebSocket onerror event\");\n }\n};\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key];\n object[key] = value;\n }\n }\n return object;\n};\n\nclass Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer;\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n perform(action, data = {}) {\n data.action = action;\n return this.send(data);\n }\n send(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n }\n unsubscribe() {\n return this.consumer.subscriptions.remove(this);\n }\n}\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions;\n this.pendingSubscriptions = [];\n }\n guarantee(subscription) {\n if (this.pendingSubscriptions.indexOf(subscription) == -1) {\n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`);\n this.pendingSubscriptions.push(subscription);\n } else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`);\n }\n this.startGuaranteeing();\n }\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`);\n this.pendingSubscriptions = this.pendingSubscriptions.filter((s => s !== subscription));\n }\n startGuaranteeing() {\n this.stopGuaranteeing();\n this.retrySubscribing();\n }\n stopGuaranteeing() {\n clearTimeout(this.retryTimeout);\n }\n retrySubscribing() {\n this.retryTimeout = setTimeout((() => {\n if (this.subscriptions && typeof this.subscriptions.subscribe === \"function\") {\n this.pendingSubscriptions.map((subscription => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`);\n this.subscriptions.subscribe(subscription);\n }));\n }\n }), 500);\n }\n}\n\nclass Subscriptions {\n constructor(consumer) {\n this.consumer = consumer;\n this.guarantor = new SubscriptionGuarantor(this);\n this.subscriptions = [];\n }\n create(channelName, mixin) {\n const channel = channelName;\n const params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n const subscription = new Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n }\n add(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.subscribe(subscription);\n return subscription;\n }\n remove(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n }\n reject(identifier) {\n return this.findAll(identifier).map((subscription => {\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n return subscription;\n }));\n }\n forget(subscription) {\n this.guarantor.forget(subscription);\n this.subscriptions = this.subscriptions.filter((s => s !== subscription));\n return subscription;\n }\n findAll(identifier) {\n return this.subscriptions.filter((s => s.identifier === identifier));\n }\n reload() {\n return this.subscriptions.map((subscription => this.subscribe(subscription)));\n }\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription => this.notify(subscription, callbackName, ...args)));\n }\n notify(subscription, callbackName, ...args) {\n let subscriptions;\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [ subscription ];\n }\n return subscriptions.map((subscription => typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined));\n }\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription);\n }\n }\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`);\n this.findAll(identifier).map((subscription => this.guarantor.forget(subscription)));\n }\n sendCommand(subscription, command) {\n const {identifier: identifier} = subscription;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n }\n}\n\nclass Consumer {\n constructor(url) {\n this._url = url;\n this.subscriptions = new Subscriptions(this);\n this.connection = new Connection(this);\n }\n get url() {\n return createWebSocketURL(this._url);\n }\n send(data) {\n return this.connection.send(data);\n }\n connect() {\n return this.connection.open();\n }\n disconnect() {\n return this.connection.close({\n allowReconnect: false\n });\n }\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n }\n}\n\nfunction createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url();\n }\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n}\n\nfunction createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url);\n}\n\nfunction getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`);\n if (element) {\n return element.getAttribute(\"content\");\n }\n}\n\nexport { Connection, ConnectionMonitor, Consumer, INTERNAL, Subscription, SubscriptionGuarantor, Subscriptions, adapters, createConsumer, createWebSocketURL, getConfig, logger };\n","import Logger from './Logger.js';\nimport { createConsumer } from '@rails/actioncable';\n\n/**\n * Registers with provided token and room.\n **/\nclass ActionCableConnection {\n constructor(uri) {\n this.channels = {};\n this.onMessageHandler = this.defaultMessageHandler;\n\n this.onReceived = this.onReceived.bind(this);\n this.offMessage = this.offMessage.bind(this);\n this.onConnected = this.onConnected.bind(this);\n this.startSession = this.startSession.bind(this);\n this.onDisconnected = this.onDisconnected.bind(this);\n\n this.cable = createConsumer(uri);\n }\n\n startSession() {\n this.channels.RoomChannel = this.cable.subscriptions.create(\n { channel: 'RoomChannel' },\n {\n connected: this.onConnected,\n received: this.onReceived,\n disconnected: this.onDisconnected\n }\n );\n this.channels.UserChannel = this.cable.subscriptions.create(\n { channel: 'UserChannel' },\n { received: this.onReceived }\n );\n }\n\n onConnected() {\n if (this.disconnectTimestamp) {\n this.handleReconnect();\n }\n Logger.debug('ActionCableConnection::onConnected');\n }\n\n handleReconnect() {\n this.onMessageHandler({ type: 'reconnect' });\n }\n\n onReceived(msg) {\n Logger.debug('ActionCableConnection::onReceived', msg);\n msg._src = 'actioncable';\n this.onMessageHandler(msg);\n }\n\n onDisconnected() {\n Logger.debug('ActionCableConnection::onDisconnected');\n this.disconnectTimestamp = Date.now();\n this.onMessageHandler({ type: 'disconnect' });\n }\n\n onMessage(onMessageHandler) {\n if (typeof onMessageHandler !== 'function') {\n return;\n }\n this.onMessageHandler = onMessageHandler;\n }\n\n offMessage() {\n this.onMessageHandler = this.defaultMessageHandler;\n }\n\n defaultMessageHandler(msg) {\n Logger.debug('ActionCableConnection::defaultMessageHandler: ', msg);\n }\n\n /**\n * msg has the format { channel: 'xyz', type: 'abc' }\n **/\n send({ channel = 'RoomChannel', type = 'ping' }) {\n const subscription = this.channels[channel];\n\n if (!subscription) {\n Logger.warn(\n 'ActionCableConnection::send no subscription found! ',\n channel\n );\n return;\n }\n\n subscription.perform(type);\n }\n\n close() {\n this.cable.disconnect();\n this.offMessage();\n this.channels = {};\n this.cable = null;\n }\n}\n\nexport default ActionCableConnection;\n","import config from './config.js';\nimport options from './options.js';\nimport ComApi from './ComApi.js';\nimport Logger from './Logger.js';\nimport throttle from './utils/throttle.js';\nimport EventHandler from './EventHandler.js';\nimport ConferenceSession from './ConferenceSession.js';\nimport ConnectionMonitor from './ConnectionMonitor.js';\nimport ActionCableConnection from './ActionCableConnection.js';\n\n/**\n * Initial connection status change updater.\n **/\nconst updateStatus = (eyeson, status) =>\n eyeson.core.eventHandler.send({\n type: 'connection',\n connectionStatus: status\n });\n\nconst keepRoomAlive = eyeson => {\n eyeson.core.keepRoomAlive = setInterval(() => {\n eyeson.core.rtConnection.send({ type: 'user_joins' });\n }, 30000);\n};\n\n/**\n * Remove this once WSS messages arrive reliably.\n **/\nconst pollingFallback = eyeson => {\n let counter = 1;\n eyeson.core.pollingFallbackInterval = setInterval(() => {\n const { core } = eyeson;\n if (counter === 200) {\n Logger.debug(\n 'eyeson::pollingFallback: max count exceeded, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n if (core.eventHandler._connection) {\n Logger.debug(\n 'eyeson::pollingFallback: connection set, clearing interval.'\n );\n clearInterval(core.pollingFallbackInterval);\n return;\n }\n\n core.comApi.getRoom(data => {\n if (data.ready === true) {\n Logger.debug('eyeson::pollingFallback: room ready');\n core.eventHandler.send({ type: 'room_ready', content: data });\n return;\n }\n Logger.debug('eyeson::pollingFallback: room not ready', counter);\n counter += 1;\n });\n }, 5000);\n};\n\n/**\n * Load initial room data.\n **/\nconst loadInitialInfos = eyeson => {\n const { core } = eyeson;\n const { broadcasts } = core.eventHandler._rtData;\n if (broadcasts) {\n core.eventHandler.send({\n type: 'broadcasts_update',\n broadcasts: broadcasts\n });\n }\n};\n\n/**\n * Join a session and listen to any events. eventHandler keeps all the\n * stuff.\n **/\n// eslint-disable-next-line max-statements\nconst joinSession = (eyeson, mediaOptions) => {\n const { core } = eyeson;\n if (!core.eventHandler._connection) {\n Logger.error(\n 'You tried to join a session that is not yet available. ' +\n 'Before calling join, a connection status of connected has ' +\n 'to be received.'\n );\n return;\n }\n\n const session = new ConferenceSession(\n core.eventHandler._connection,\n core.comApi,\n mediaOptions\n );\n session.setMonitor(core.eventHandler.monitor);\n core.eventHandler.session = session;\n\n session.start();\n loadInitialInfos(eyeson);\n clearInterval(core.keepRoomAlive);\n eyeson.session = session;\n};\n\n/**\n * Initialise our connections.\n **/\nconst prepareConnection = eyeson => {\n const { core } = eyeson;\n updateStatus(eyeson, 'fetch_room');\n\n core.eventHandler.eyeson = eyeson;\n\n core.comApi.onError(() =>\n core.eventHandler.send({ type: 'warning', name: 'error:comapi' })\n );\n\n // eslint-disable-next-line max-statements\n core.comApi.getRoom(data => {\n if (data.error) {\n Logger.warn('eyeson::prepareConnection', data.error);\n updateStatus(eyeson, 'access_denied');\n return;\n }\n updateStatus(eyeson, 'received_room');\n\n core.rtConnection = new ActionCableConnection(data.links.websocket);\n core.eventHandler.rtConnection = core.rtConnection;\n core.rtConnection.startSession();\n\n core.eventHandler.monitor = new ConnectionMonitor();\n core.eventHandler.api = core.comApi;\n keepRoomAlive(eyeson);\n pollingFallback(eyeson);\n });\n};\n\n/****** The following represents the public API, adapt with caution! *********/\nclass eyesonClass {\n /****** Public data ********************************************************/\n constructor() {\n /**\n * The room, user and links to be updated when fetched from the ComAPI.\n */\n this.config = config;\n this.core = { eventHandler: new EventHandler() };\n this.room = {};\n this.user = {};\n this.links = {};\n this.options = options;\n }\n /****** Public helper methods **********************************************/\n\n /**\n * Attach event listener\n **/\n onEvent(listener) {\n if (typeof listener !== 'function') {\n Logger.error(\n 'A listener to eyeson events has to be of type function.' +\n ' The argument passed to onEvent is of type ' +\n typeof listener +\n '.'\n );\n return;\n }\n this.core.eventHandler.onReceive(listener);\n }\n\n /**\n * Remove event listener\n **/\n offEvent(listener) {\n this.core.eventHandler.removeListener(listener);\n }\n\n /**\n * Prepare required core connections.\n **/\n connect(token) {\n Logger.debug('eyeson::connect', token);\n this.core.comApi = new ComApi(this.config.api, token);\n prepareConnection(this);\n }\n\n /**\n * Join a session with supplied mediaOptions (audio/video).\n **/\n join(mediaOptions) {\n Logger.debug('eyeson::join', mediaOptions);\n joinSession(this, mediaOptions);\n }\n\n /**\n * Start an eyeson room meeting.\n **/\n start(token, mediaOptions = { audio: true, video: true }) {\n Logger.debug('eyeson::start');\n const joinOnConnect = event => {\n if (event.connectionStatus !== 'ready') {\n return;\n }\n this.offEvent(joinOnConnect);\n this.join(mediaOptions);\n };\n this.onEvent(joinOnConnect);\n this.connect(token);\n }\n\n /**\n * Destroy and cleanup a session.\n **/\n destroy() {\n const { core } = this;\n Logger.debug('eyeson::destroy');\n clearInterval(core.keepRoomAlive);\n clearInterval(core.pollingFallbackInterval);\n core.eventHandler.destroy();\n core.eventHandler = new EventHandler();\n }\n\n /**\n * Receive an event from client.\n **/\n send(msg) {\n msg._src = 'client';\n return this.core.eventHandler.send(msg);\n }\n\n /**\n * When invoked repeatedly, will only actually call the original function at\n * most once per every wait milliseconds.\n **/\n throttledSend(msg) {\n if (!this._throttledSend) {\n this._throttledSend = throttle(message => this.send(message), 500);\n }\n\n return this._throttledSend(msg);\n }\n\n /**\n * Create a new instance\n */\n createInstance() {\n // eslint-disable-next-line new-cap\n return new eyesonClass();\n }\n}\n\n// eslint-disable-next-line new-cap\nconst instance = new eyesonClass();\n\nexport default instance;\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import Logger from '../Logger.js';\n\nclass GiphyApi {\n constructor(roomUrl) {\n this.roomUrl = roomUrl;\n }\n\n search(query) {\n return this.request(`${this.roomUrl}/search?q=${query}`).then(\n ({ data }) => data\n );\n }\n\n random() {\n return this.request(`${this.roomUrl}/random`).then(({ data }) => data);\n }\n\n trending() {\n return this.request(`${this.roomUrl}/trending?limit=9`).then(({ data }) =>\n this.staff().then(staffGifs => [...data, ...staffGifs])\n );\n }\n\n staff() {\n return this.request(`${this.roomUrl}/staff`).then(({ data }) => data);\n }\n\n randomForQuery(query) {\n return new Promise((res, rej) => {\n this.search(query)\n .then(data => {\n if (!Array.isArray(data)) {\n return [];\n }\n return data.filter(img => img.images.original_mp4.mp4_size >= 40000);\n })\n .then(largerGifs => {\n if (largerGifs.length === 0) {\n throw new TypeError('No data found');\n }\n res(largerGifs[Math.floor(Math.random() * largerGifs.length)]);\n })\n .catch(rej);\n });\n }\n\n request(url) {\n return fetch(new Request(url))\n .then(response => response.json())\n .catch(error => {\n Logger.warn('GiphyApi', url, error);\n return { data: [] };\n });\n }\n}\n\nexport default GiphyApi;\n","import Logger from './Logger.js';\n\nconst updateInterval = 100;\n\n/**\n * Sound Meter that generates a number correlated to audio volume. The meter\n * itself displays nothing, but it makes the instantaneous and time-decaying\n * volumes available for inspection. It also reports on the fraction of samples\n * that were at or near the top of the measurement range.\n **/\nclass SoundMeter {\n // eslint-disable-next-line max-statements\n constructor() {\n this.level = 0;\n this.instant = 0;\n this.silenceDuration = 0;\n this.intervalCounter = 0;\n this.track = null;\n this.context = null;\n this.source = null;\n this.analyser = null;\n this.volumes = null;\n this.listener = [];\n this.timer = null;\n this.errorTimer = null;\n this.boundOnTrackEnded = this.onTrackEnded.bind(this);\n this.initError = false;\n this.init();\n }\n\n /**\n * Initialize audio context and prepare script processor to read input\n * channel data.\n **/\n init() {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (typeof AudioContext === 'undefined') {\n Logger.error(\n 'AudioContext is not available. Probably the current' +\n ' user agent does not support this feature. Use the feature detector' +\n ' to hide not supported elements. Any call on onUpdate will not' +\n ' send values.'\n );\n return;\n }\n this.context = new AudioContext();\n\n this.context.onstatechange = ({ target }) => {\n if (target.state === 'suspended') {\n Logger.error('SoundMeter::init AudioContext: ', target.state);\n }\n };\n }\n\n /**\n * Connect to a media stream.\n **/\n // eslint-disable-next-line max-statements\n connectToSource(stream) {\n if (!this.context) {\n return this;\n }\n if (!stream || stream.getAudioTracks().length < 1) {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n Logger.debug('SoundMeter::connectToSource', stream);\n [this.track] = stream.getAudioTracks();\n if (this.track.readyState !== 'live') {\n this.initError = true;\n this.onTrackEnded();\n return this;\n }\n this.track.addEventListener('ended', this.boundOnTrackEnded);\n this.source = this.context.createMediaStreamSource(stream);\n const analyser = this.context.createAnalyser();\n analyser.fftSize = 512;\n analyser.minDecibels = -127;\n analyser.maxDecibels = 0;\n analyser.smoothingTimeConstant = 0.5;\n this.source.connect(analyser);\n this.analyser = analyser;\n this.volumes = new Uint8Array(analyser.frequencyBinCount);\n if (!this.running && this.listener.length > 0) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n return this;\n }\n\n /**\n * Read audio level. Avoids triggering a re-render of the device-dialog\n * when the change is below 1% which wouldn't be noticable anyways.\n *\n * NOTE: When an USB Microphone is abruptly disconnected. The\n * intervalCounter reacts: when switching to a different mic, it seems to\n * take a bit to not return 0.00 for the audio level.\n **/\n // eslint-disable-next-line max-statements\n analyse() {\n const { analyser, volumes, level } = this;\n if (!analyser) {\n return;\n }\n analyser.getByteFrequencyData(volumes);\n let volumeSum = 0;\n for (const volume of volumes) {\n volumeSum += volume;\n }\n const averageVolume = volumeSum / volumes.length;\n const instant = Math.min(Math.round((averageVolume * 100) / 127), 100);\n\n // Handle microphone disconnect\n if (level === 0 && instant === 0 && this.intervalCounter === 10) {\n this.silenceDuration++;\n if (this.silenceDuration > 30 && !this.errorTimer) {\n this.errorTimer = setTimeout(() => {\n this.emit({ warning: 'MicrophoneSilenceWarning' });\n this.resetSilenceCounter();\n }, 1000);\n }\n }\n\n if (level !== instant) {\n // Clear a MicrophoneError once we get a signal, intervalCounter might be\n // too low sometimes.\n if (this.silenceDuration > 0) {\n this.resetSilenceCounter();\n }\n const diff = Math.abs(level - instant);\n if (diff >= 1) {\n this.level = instant;\n this.emit({ value: instant });\n }\n }\n if (this.intervalCounter < 10) {\n this.intervalCounter++;\n }\n }\n\n resetSilenceCounter() {\n clearTimeout(this.errorTimer);\n this.errorTimer = null;\n this.silenceDuration = 0;\n }\n\n /**\n * Stop read interval and disconnect from stream.\n **/\n // eslint-disable-next-line max-statements\n stop() {\n this.offUpdate();\n if (this.track) {\n this.track.removeEventListener('ended', this.boundOnTrackEnded);\n this.track = null;\n }\n if (this.analyser) {\n this.analyser.disconnect();\n this.analyser = null;\n }\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n this.volumes = null;\n if (this.context && this.context.stop && this.context.state !== 'closed') {\n this.context.onstatechange = null;\n this.context.close();\n this.context = null;\n }\n }\n\n onUpdate(listener) {\n this.listener.push(listener);\n if (this.initError) {\n this.onTrackEnded();\n return;\n }\n if (!this.running && this.context && this.track) {\n this.running = true;\n this.timer = setInterval(() => this.analyse(), updateInterval);\n }\n }\n\n offUpdate() {\n clearTimeout(this.errorTimer);\n this.listener.length = 0;\n if (this.running) {\n clearInterval(this.timer);\n this.running = false;\n }\n }\n\n onTrackEnded() {\n this.emit({ error: 'EyesonMicrophoneError' });\n this.stop();\n }\n\n emit(message) {\n this.listener.forEach(fn => fn(message));\n }\n}\n\nexport default SoundMeter;\n","import Logger from './Logger.js';\nimport FeatureDetector from './FeatureDetector.js';\n\n// sampleRate in Herz (Hz) to perform the check\nconst sampleRate = 1;\n\n// https://developer.chrome.com/docs/web-platform/compute-pressure/\nclass SystemPressureMonitor {\n constructor() {\n this._listener = [];\n this._monitor = null;\n this._running = false;\n this.state = null;\n }\n\n onUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener.push(listener);\n }\n }\n\n offUpdate(listener) {\n if (typeof listener === 'function') {\n this._listener = this._listener.filter(fn => fn !== listener);\n } else {\n this._listener.length = 0;\n }\n }\n\n _emit(records) {\n // states are 'nominal', 'fair', 'serious', 'critical'\n // https://github.com/w3c/compute-pressure#design-considerations\n const { state } = records[records.length - 1];\n if (state === this.state) {\n return;\n }\n this.state = state;\n Logger.debug('SystemPressureMonitor::emit', state);\n this._listener.forEach(fn => {\n try {\n fn(state);\n } catch (error) {\n Logger.error('SystemPressureMonitor::emit', error);\n }\n });\n }\n\n // eslint-disable-next-line max-statements\n async start() {\n if (FeatureDetector.canMonitorSystemPressure() === false) {\n Logger.error('SystemPressureMonitor is not supported');\n return;\n }\n try {\n if (!this._monitor) {\n // eslint-disable-next-line no-undef\n this._monitor = new PressureObserver(this._emit.bind(this), {\n sampleRate\n });\n }\n if (!this._running) {\n await this._monitor.observe('cpu');\n this._running = true;\n }\n if (this.state === null) {\n this._emit([{ state: 'nominal' }]);\n }\n Logger.debug('SystemPressureMonitor::start');\n } catch (error) {\n Logger.error('SystemPressureMonitor::start', error);\n }\n }\n\n stop() {\n if (this._monitor && this._running) {\n this._monitor.disconnect();\n this._running = false;\n }\n }\n\n destroy() {\n this.stop();\n this.offUpdate();\n this.state = null;\n this._monitor = null;\n }\n}\n\nexport default SystemPressureMonitor;\n","import eyeson from './src/eyeson.js';\n\nimport Logger from './src/Logger.js';\nimport MicMixer from './src/MicMixer.js';\nimport GiphyApi from './src/utils/GiphyApi.js';\nimport debounce from './src/utils/debounce.js';\nimport throttle from './src/utils/throttle.js';\nimport immediate from './src/utils/immediate.js';\nimport SoundMeter from './src/SoundMeter.js';\nimport LocalStorage from './src/LocalStorage.js';\nimport DeviceManager from './src/DeviceManager.js';\nimport FeatureDetector from './src/FeatureDetector.js';\nimport FullscreenHelper from './src/FullscreenHelper.js';\nimport MediaStreamBuilder from './src/MediaStreamBuilder.js';\nimport * as StreamHelpers from './src/utils/StreamHelpers.js';\nimport ConnectionStatistics from './src/utils/ConnectionStatistics.js';\nimport SystemPressureMonitor from './src/SystemPressureMonitor.js';\n\nexport {\n Logger,\n MicMixer,\n GiphyApi,\n debounce,\n throttle,\n immediate,\n SoundMeter,\n LocalStorage,\n StreamHelpers,\n DeviceManager,\n FeatureDetector,\n FullscreenHelper,\n MediaStreamBuilder,\n ConnectionStatistics,\n SystemPressureMonitor,\n};\n\nexport default eyeson;\n"],"names":["root","factory","exports","module","define","amd","self","objectTypes","window","this","freeExports","freeModule","nodeType","freeGlobal","g","global","maxSafeInteger","Math","pow","reOpera","objectProto","Object","prototype","hasOwnProperty","toString","capitalize","string","String","charAt","toUpperCase","slice","format","trim","test","forOwn","object","callback","key","call","getClassOf","value","qualify","replace","reduce","array","accumulator","index","length","each","platform","parse","ua","context","isCustomContext","nav","navigator","userAgent","data","isSpecialCasedOS","property","type","likeChrome","objectClass","airRuntimeClass","enviroClass","javaClass","java","phantomClass","rhino","environment","alpha","beta","doc","document","opera","operamini","operaClass","arch","description","prerelease","useFeatures","version","layout","result","guess","RegExp","pattern","exec","label","name","guesses","getName","product","getProduct","manufacturer","getManufacturer","os","split","cleanupOS","getOS","getVersion","patterns","push","unshift","indexOf","parseFloat","runtime","flash","system","Capabilities","phantom","major","minor","patch","documentMode","toFixed","lang","System","getProperty","require","join","e","process","browser","versions","electron","node","nw","appMinorVersion","external","parseInt","family","architecture","cpuClass","isCommonjs","fn","val","fnMap","i","l","ret","eventNameMap","change","fullscreenchange","error","fullscreenerror","screenfull","request","element","options","Promise","resolve","reject","onFullScreenEntered","off","bind","on","returnPromise","documentElement","requestFullscreen","then","catch","exit","isFullscreen","onFullScreenExit","exitFullscreen","toggle","onchange","onerror","event","eventName","addEventListener","removeEventListener","raw","defineProperties","get","Boolean","fullscreenElement","enumerable","isEnabled","fullscreenEnabled","SDPUtils","random","substring","localCName","generateIdentifier","splitLines","blob","map","line","splitSections","part","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","parseCandidate","parts","candidate","foundation","component","protocol","toLowerCase","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","undefined","writeCandidate","sdp","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","id","direction","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","find","existingFeedback","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","stream","track","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","_typeof","_regeneratorRuntime","__esModule","t","r","n","o","defineProperty","Symbol","a","iterator","c","asyncIterator","u","toStringTag","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","arg","h","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","displayName","isGeneratorFunction","constructor","mark","setPrototypeOf","__proto__","awrap","async","reverse","pop","prev","stop","rval","handle","complete","finish","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","getter","definition","prop","nmd","paths","children","_classCallCheck","instance","Constructor","_toPropertyKey","input","hint","prim","toPrimitive","res","Number","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","api","allowSafariSFU","screencapture","widescreen","_console","console","apply","arguments","warn","_console2","info","_console3","log","debug","_console4","ComApi","token","cache","users","errorCallback","_handleError","path","fetch","Request","response","contentType","headers","ok","json","text","concat","status","form","namespace","fd","FormData","formKey","File","append","_objectToFormData","_request","body","formData","Logger","userId","_this","user","cachedUser","apiUser","extendedUser","addUserAttributes","clientId","largeAvatarUrl","avatar","assign","apiId","sipId","largeAvatar","_this2","_post","email","custom_fields","locale","player_url","playerUrl","stream_url","streamUrl","_put","snapshotId","_this3","playback","play_id","func","wait","args","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","setTimeout","_setPrototypeOf","_inherits","subClass","superClass","_assertThisInitialized","ReferenceError","_possibleConstructorReturn","_getPrototypeOf","BaseEvent","msg","StartPlaybackEvent","_BaseEvent","_super","_createSuper","_api","startPlayback","StopPlaybackEvent","_BaseEvent2","_super2","stopPlayback","_get","Reflect","receiver","base","desc","getOwnPropertyDescriptor","PublicEvent","_src","deleteProperty","listeners","StartAnnotationEvent","_PublicEvent","annotationLoop","setInterval","createAnnotation","annotation","clearInterval","StopAnnotationEvent","_PublicEvent2","stopAnnotation","StfuEvent","_rtConnection","send","IgnoreEvent","ForwardEvent","_arrayLikeToArray","arr","len","arr2","Array","_unsupportedIterableToArray","minLen","from","_slicedToArray","isArray","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","wrapPeerConnectionEvent","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","has","unwrappedCb","delete","size","disableLog","bool","disableWarnings","deprecated","oldMethod","newMethod","isObject","compactObject","isObj","isEmptyObject","walkStats","stats","resultSet","endsWith","filterStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","shimGetUserMedia","browserDetails","mediaDevices","constraintsToChrome_","mandatory","optional","cc","ideal","exact","min","max","oldname_","oc","mix","advanced","shimConstraints_","constraints","audio","remap","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","devices","dev","some","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","DOMException","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","splice","origAddStream","addStream","origRemoveStream","removeStream","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","successCallbackWrapper_","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","RTCSessionDescription","signalingState","oldStream","nativeMethod","methodObj","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","streamid","shimPeerConnection","webkitRTCPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","code","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","encodings","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","all","finally","shimCreateAnswer","origCreateAnswer","createAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","toJSON","sdpMid","sdpMLineIndex","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","mLine","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","getMaxMessageSize","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","adapter","shimChrome","shimFirefox","shimSafari","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","commonShim","browserShim","adapterFactory","FullscreenHelper","onChange","hasSupport","_canvasBlurSupport","canMix","canPip","hasPipSupport","canSFU","isPhone","inIframe","isIOSDevice","canUseEyeson","canFullscreen","hasMobileDevice","canToggleCamera","canPresentFiles","canScreenCapture","canAdjustSettings","canAdjustDeviceSettings","canStreamLocalMedia","isExperimentalBrowser","isWebView","hasGetUserMedia","canDataChannel","isMinimumRequiredBrowser","hasGetDisplayMedia","hasPeerConnection","hasCaptureStream","HTMLMediaElement","hasCanvasCaptureSupport","hasSenders","hasTrackOnUnmute","isSafari","browserVersion","isWorkingIOSBrowser","hasWebpSupport","isChrome","isFF","canChangeAudioOutput","canChangeMicrophone","isOldSafari","isTestSuite","canMultipleDifferentMicrophones","canChangeCamera","config","isIPhone","audioContext","every","requiresLowerConstraints","browserName","txt","isEdge","isMinimumRequiredChrome","isMinimumRequiredFF","isMinimumRequiredSafari","isMinimumRequiredEdge","iOSBrowser","operaTouch","HTMLVideoElement","pictureInPictureEnabled","iOSPipCheck","support","createElement","preload","src","onsuspend","wkEnabled","webkitSupportsPresentationMode","isAndroidDevice","maxTouchPoints","MSStream","screen","isAndroidPhone","isAndroid","isMobile","isMacOS","userAgentData","top","isTouchDevice","canDisplayTooltips","canDrawCamera","stopsDeviceActivityIndicatorOnDisable","supportsBlurOnSVG","SVGElement","blur","hasLocalStorage","localStorage","setItem","canGet","getItem","safariWithoutVP8","uAVersion","disallowAudioSyncSrcChange","canShare","share","canVirtualBackground","WebAssembly","validate","instantiateStreaming","instantiate","CanvasRenderingContext2D","ImageData","requestAnimationFrame","canvasBlurSupport","canvas1","canvas2","ctx1","getContext","ctx2","fillStyle","fillRect","data1","getImageData","data2","canStereo","canChooseDisplaySurface","displaySurface","hasPipCamSupport","canMonitorSystemPressure","PressureObserver","supportedSources","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","NinjaStream","_stream","createStream","canvas","captureStream","CanvasCaptureMediaStream","fallbackStorage","FeatureDetector","store","load","defaultValueParam","defaultValue","storedValue","stack","messageName","CanvasMedia","CanvasCaptureMediaStreamTrack","hasAudio","enabled","hasVideo","disableAudio","enableAudio","toggleAudio","toggleVideo","stopTrack","stopStream","isScreenTrack","isScreenPresentationTrack","isScreenAsVideoTrack","isCanvasTrack","isNinjaStreamTrack","isVbgStreamTrack","isCameraTrack","getScreenTracks","getScreenPresentationTracks","getScreenAsVideoTracks","getCameraTracks","getVbgTracks","stopCamera","disableCamera","enableCamera","toggleCamera","toggleVbgTrack","getCanvasTracks","isScreenStream","isScreenPresentationStream","isCanvasStream","isVBGStream","isCameraStream","isCanvasPresentationStream","isPresentationStream","hasCameraVideo","getFacingMode","settings","requestFrame","createExternalStream","audioOnly","aTrack","vTrack","audioTrack","ac","createMediaStreamDestination","close","createFakeAudioTrack","videoTrack","createFakeVideoTrack","source","stopPropagation","postMessage","fps","raf","focus","abort","animationFrameThen","throttledRAF","elapsed","throttledImmediate","immediate","_requestAnimationFrame","cancelAnimationFrame","_cancelAnimationFrame","visibilityState","integrity","URL","location","href","script","onload","parentNode","remove","algo","hash","head","cacheStorageSupport","CacheStorage","storeBlobURL","_ref","_callee","blobURL","_context","caches","open","put","Response","t0","_x","_x2","loadBlobURL","_ref2","_callee2","_context2","createObjectURL","_x3","deleteBlob","_ref3","_callee3","_context3","_x4","_mulTable","_shgTable","_canvas","_ctx","_previous","_r","_g","_b","_vmin","_vmax","run","imageBitmap","amount","desynchronized","drawImage","imageData","wm","hm","rad1","mulSum","shgSum","Uint32Array","iterations","p1","p2","yw","yi","rsum","gsum","bsum","x","yp","putImageData","OffscreenCanvasSupport","OffscreenCanvas","OffscreenCanvasBlurSupport","OffscreenCanvasRenderingContext2D","ImageBitmapSupport","createImageBitmap","TrackProcessorSupport","MediaStreamTrackProcessor","SIMDSupport","Uint8Array","EventTargetConstructorSupport","EventTarget","_max","_stateChange","_segmentationModel","_tflite","_tfliteReady","_tfliteLoading","_inputMemoryOffset","_outputMemoryOffset","_localImageFile","_localImageFileBackup","initiateTFLite","loading","model","modelBufferOffset","importScript","arrayBuffer","_getModelBufferMemoryOffset","HEAPU8","_loadModel","_getInputMemoryOffset","_getOutputMemoryOffset","createOffscreenCanvas","ctx","LocalStorage","cacheStorage","loadImage","state","emitLoading","img","Image","host","crossOrigin","checkImageLoad","loadImageFile","callbackFN","accept","files","revokeObjectURL","click","createImageCanvas","image","hRatio","vRatio","ratio","imgWidth","imgHeight","centerShiftX","centerShiftY","createGeneraliCanvas","createGradientCanvas","gradient","createLinearGradient","startX","startY","endX","endY","addColorStop","color1","color2","createBlurCanvas","fullLength","bigWidth","bigHeight","blurCanvas","imageCanvas","_allowedTypesCheck","setState","VirtualBackgroundMixer","originalStream","outStream","reader","segmentationMaskCanvas","segmentationMaskCtx","segmentationMask","videoCanvas","videoCtx","playPromise","paused","throttledAnimationFrame","drawVideo","backgroundOld","backgroundType","backgroundValue","blurInit","canvasBlur","loadingListener","handleStateChange","_checkExternalImage","_initBackground","_drawVideo","listener","userMediaStream","videoTracks","trackSettings","stopOriginalStream","terminate","imageSmoothingEnabled","canvasTrack","srcLabel","srcDeviceId","start","_this$size","processor","readable","getReader","playsInline","muted","srcObject","willReadFrequently","initBackground","onloadeddata","play","frame","_yield$this$reader$re","heap","maskData","pixelCount","heapIndex","imgIndex","_index","person","read","displayWidth","displayHeight","t1","HEAPF32","_runInference","globalCompositeOperation","drawBackground","blurred","_callee4","_this$size2","_image","_context4","setBackgroundFallback","_this$size3","pause","_this4","_callee5","_context5","changedDevices","listA","listB","_ret","_loop","_deviceA","_found","deviceB","groupId","deviceA","found","DeviceManager","sinkId","eco","cameras","speakers","microphones","terminationInProgress","virtualBackground","virtualBackgroundType","getSinkId","setStream","handleError","verifyStream","storeConstraints","adjustAudioTrack","initiateVirtualBackground","_setVirtualBackgroundType","wasOff","willBeOff","isTypeAllowed","checkExternalImage","changeBackground","update","loadLocalImage","setVirtualBackgroundType","watchForNewDevices","fetchDevices","setDevices","getConstraints","ondevicechange","destroy","camHasChanged","micHasChanged","speakerHasChanged","emit","_this5","_this6","initiateStream","updateCache","_this7","firstRun","emitStreamUpdate","videoConstraints","audioConstraints","preventUpdate","device","optionsParam","getDevices","determineConstraintsForDevices","channelCount","videoDeviceId","audioDeviceId","applyLastUsedDevices","applyWidescreen","videoId","audioId","eyesonOptions","findIndex","speaker","isBlobAvailable","getImageBlobOrFallback","MediaStreamBuilder","surface","screenStream","existingStream","micMixer","vbgMixer","isPresentation","deviceMonitor","tempStream","brokenTrackCallback","bindMethods","_addScreenTrack","getMediaStream","addNinjaTrack","addCanvasTrack","addScreenTrack","adjustVideoTrack","addScreenStreamTrack","initializeVirtualBackground","_this$options","active","onended","canvasStream","displayStream","audioStream","mixScreenshareAudio","setMicOnlyStream","fetchInputDevices","applyTempTracks","cleanupTempStream","discardTempTracks","_this$options2","getMobileConstraints","addVideoTrack","_this$options3","addAudioTrack","_this$options4","_this$options5","_getScreenPresentatio","_getScreenPresentatio2","screenTrack","echoCancellation","surfaceSwitching","selfBrowserSurface","systemAudio","_this$options6","fillerTrack","_this$options7","MicMixer","acOut","micOnlyStream","videoStream","audioTracks","createMediaStreamSource","connect","displayAudio","noMix","initMixScreenshareMix","exc","adjustMediaStreamTracks","ChangeLocalStreamEvent","_ref$screen","_session","localStream","wasScreenAsVideo","resume","suspend","locallyChanged","PodiumEvent","hasPresenter","stopPresentingSet","scanMessageForLocalStreamOptimization","isSource","isPresenter","hasDesktopSources","SnapshotEvent","takeSnapshot","SetLayerEvent","setLayer","SendChatEvent","content","StopRtmpEvent","stopBroadcast","SetLayoutEvent","setLayout","StartRtmpEvent","_this$context","startBroadcast","EventEmitter","detail","clear","CustomEvent","_EventEmitter","Transport","connection","wasOpen","WebSocket","endpoint","auth_token","onopen","onmessage","onclose","OPEN","was_open","removeAllListeners","R_CRLF","atob","supportsRandomUUID","crypto","randomUUID","bytes","getRandomValues","char","byte","UserAgent","_call","_handleSdpUpdate","_onMessage","failed","transportOptions","checkUserAgentOptions","callId","sessionDescriptionHandler","initAuthToken","debouncedHandleSDPUpdate","ms","_len","_key","nextArgs","slowdown","handleSdpUpdate","verifySender","setCallId","call_id","setDescription","termination","reason","reject_code","term_code","jwt","parseJwtPayload","client_id","conf_id","exp","to","answerSdp","updateDescription","crlfNormalize","msg_id","uuid","transport","onEvent","sessionDescriptionHandlerFactory","sessionDescriptionHandlerFactoryOptions","onMessage","display_name","client_name","mute_video","authToken","onReconnect","seppEvent","offEvent","transportEvent","isConnected","PodiumFacade","_message$src","psrc","asrc","vsrc","dsrc","dims","sources","presenterIdx","audioSources","videoSources","desktopSources","dimensions","userSourceIndex","Set","presenter","isInteger","userVideoIndex","SigMessageTransformer","stamp","sourceUpdate","voiceActivity","source_update","voice_activity","podium","solo","isSolo","hasAudioPosition","hasVideoPosition","hasMedia","userDimensions","hasVideoSources","hasMutedVideoPeers","cid","SessionDescriptionHandler","datachannel","peerConnection","remoteStream","connected","iceCheckingTimer","peerConnectionReady","handleConnectionStateChange","initPeerConnection","_updateDescription","_setDescription","_getDescription","offer","RTCOfferOptions","SDPModifiers","modifier","localDescription","passive","sessionDescription","seppMessaging","remoteDescriptionUpdate","answer","stopAllTracks","pcOptions","buildPeerConnectionOptions","resolveReady","negotiated","handleDatachannel","onicecandidate","onicegatheringstatechange","iceGatheringState","sendOnly","ontrack","handleOntrack","uaOptions","onunmute","handleUnmute","handleAccept","initDatachannel","stun_servers","turn_servers","turnServer","credential","getLocalStream","stopUnusedTracks","tracksExist","audioSender","videoSender","replaceTrack","hasExternalStream","factor","rtp","SigConnection","signaling","messageListener","initUserAgentOptions","transformer","signalingOptions","SEPP","mediaOptions","handleMessage","roomData","WHITELIST","transformedMessage","sendSeppMessage","errorHandler","RoomReceived","rtData","ready","_msg$content","room","links","_eyeson","_connection","connectionStatus","startSigConnection","FetchRoomEvent","getRoom","DeleteFileEvent","deleteFile","file","UploadFileEvent","uploadFile","addFile","ReceiveChatEvent","getUser","forwardMessage","ts","created_at","StartStreamEvent","_ref$audio","_ref$video","_ref$virtualBackgroun","_ref$surface","getStoredVirtualBackgroundType","ChangeStreamEvent","onBrokenTrackError","canvasMixer","ReplaceStreamEvent","ToggleCameraEvent","AcceptSessionEvent","session","getRemoteStream","StopRecordingEvent","stopRecording","VoiceActivityEvent","StartRecordingEvent","startRecording","ScreenCaptureEvent","present","detectDisplaySurface","StartPresentingEvent","_handle","videoPlayer","invokeStream","_ref$stream","_ref$present","presentationStream","isStreaming","streamVideo","StopPresentingEvent","StopBroadcastsEvent","stopAllBroadcasts","ClearFrontLayerEvent","clearFrontLayer","RequestGuestUserEvent","requestUser","access_key","isLocked","locked","SessionTerminationEvent","ParticipantListUpdateEvent","add","initial","addition","del","playing","toFixedNumber","number","callNow","FPS_INTERVAL","CAMERA_SMALL","CAMERA_MEDIUM","CAMERA_LARGE","CAMERA_NONE","supportsTrackProcessor","defaultTrack","bindVideoToStream","_track$getSettings","CanvasMixer","camera","xPos","camSize","isCanvasCapture","draw","onRedraw","setCamera","drawFrame","calcSizesAndPositions","bouncedDraw","debounce","_draw","redrawCallback","mixer","cameraStream","horizontal","vertical","originalCanvas","getCanvasCaptureTrackCanvas","redrawQueued","position","cameraPosition","cameraSizeInWords","sourceAspectRatio","targetAspectRatio","_this$screenStream$ge3","screenStreamSettings","fitScreen","_this$cameraStream$ge3","cameraTrackSettings","small","medium","large","none","scaledCam","scale","sizes","camPosition","positions","screenFrame","cameraFrame","_result","performance","ReadableStreamDefaultReader","clearRect","imgData","createImageData","StartMixerEvent","_ref$changeStream","changeStream","vbgType","UpdateMixerEvent","videoFrameSupport","requestVideoFrameCallback","VideoPlayer","onReady","onDuration","onTimeUpdate","onEnd","performAction","gainNode","timer","boundDrawVideoFrame","drawVideoFrame","boundInitCanvasStream","initCanvasStream","isPlaying","blockTimeUpdate","initTimeout","invokationTimer","initVideo","autoplay","onplaying","onVideoPlay","onpause","onVideoPause","onseeked","onVideoSeeked","ontimeupdate","onVideoTimeUpdate","onVideoReady","onVideoError","onVideoEnd","duration","videoWidth","videoHeight","createGain","createMediaElementSource","destination","onVideoAction","currentTime","onPlayAction","onPauseAction","onTimeAction","onVolumeAction","time","volume","gain","canvasStreamTrack","cancelVideoFrameCallback","disconnect","StartMediaEvent","MediaError","LockMeetingEvent","lockMeeting","TerminateMeetingEvent","terminateMeeting","KickUserEvent","kickUser","VirtualBackgroundEvent","destroySessionMicMixer","getScreenErrorName","ScreenVideoChangeEvent","mediaStreamBuilder","_getScreenAsVideoTrac","_getScreenAsVideoTrac2","ScreenVideoStoppedEvent","DeviceMonitor","tempAudioTrack","tempVideoTrack","audioEnded","videoEnded","boundOnAudioEnd","onAudioEnd","boundOnVideoEnd","clearTracks","PipCam","isActive","startTimer","_destroy","_stop","_initCamera","_initVideoAndPip","_updateCamera","_start","initFakeStream","initVideoAndPip","initCamera","Path2D","fill","onleavepictureinpicture","onExitPip","requestPictureInPicture","onDeviceEvent","pictureInPictureElement","exitPictureInPicture","_callee6","_context6","StartPipCamEvent","pipCam","StopPipCamEvent","UpdatePipCamEvent","_BaseEvent3","_super3","updateCamera","AudioDeviceEndEvent","_tracks","mediaConstraints","newAudioDevice","VideoDeviceEndEvent","_handle2","AllDevicesEndEvent","_PublicEvent3","_handle3","_tracks2","_track$getSettings2","EventHandler","_monitor","end","con","mon","ses","_rtData","eyeson","silenced","stfu","chat","snapshot","send_chat","set_layer","set_layout","fetch_room","room_ready","RoomReceivedEvent","room_setup","memberlist","upload_file","delete_file","request_stfu","change_stream","replace_stream","toggle_camera","stop_playback","playback_update","start_playback","start_stream","stop_recording","start_screen_capture","StartScreenCaptureEvent","stop_broadcasts","start_recording","stop_presenting","start_presenting","stop_annotation","start_annotation","clear_front_layer","request_guest_user","voice_activity_raw","start_mixer","update_mixer","lock_meeting","terminate_meeting","kick_user","session_termination","start_media","change_screen_video","stop_screen_video","stop_rtmp","start_rtmp","suspend_virtual_background","audio_device_ended","video_device_ended","all_devices_ended","start_pip_cam","stop_pip_cam","update_pip_cam","capture_error","options_update","ext_not_installed","broadcasts_update","presentation_ended","recording","ext_cancel","ext_installed","message_status","moderator_info","addOriginToSDP","addSessionAttributes","splitSDP","tLineIdx","startsWith","addIndex","addStereo","stereo","codecMatch","fmtpRegExp","fmtpMatch","entry","_entry$split2","entries","doIt","row","getModifiers","modifiers","ConferenceSession","comApi","RTCConstraints","defaultRTCConstraints","accepted","restarting","sipSession","startAttempts","maxStartAttempts","tryAuthUpdate","tryResume","tryWaitResume","resumeTimer","waitResumeTimer","endSession","initSession","handleFailed","restartSession","tryRecoveryFrom","terminateSession","_setStream","initExternalStream","initDeviceMonitor","initVirtualBackground","buildSessionOptions","startSession","onUnmute","adjustVideoPodium","handleTermination","getMicOnlyStream","monitor","observe","sdpWrapper","sfu","sfuLine","handleExit","updateAuthAndRestartSession","updateAuthAndResume","NotFoundError","NotAllowedError","NotReadableError","errorCodeName","failure","recovery","condition","action","Status","NO_CONNECTION","BAD","OK","GOOD","addHistory","history","getOldestHistoryEntry","getHistoryAverage","_step","jitter","packetLoss","roundTripTime","nack","bitrateSend","bitrateRecv","newest","getNewestHistoryEntry","_iterator","_createForOfIteratorHelper","packetLossRate","nackRate","calculateStatus","ConnectionStatistics","lastStat","bytesSent","bytesReceived","out","packetsSent","packetsLost","in","packetsReceived","nackCount","boundPrintStats","printStats","_printStats","statsCurrentRoundTripTime","average","mediaType","diff","received","localId","hasRTT","hasJitter","hasPacketLoss","hasNackCount","lost","packets","currentRoundTripTime","onLine","statistics","ConnectionMonitor","disconnectTimer","prevIceState","onOffline","handleIceStateChange","addEventListeners","oniceconnectionstatechange","onconnectionstatechange","init","currentTarget","currentIceState","adapters","logger","messages","getTime","secondsSince","visibilityDidChange","reconnectAttempts","isRunning","startedAt","stoppedAt","startPolling","staleThreshold","stopPolling","recordPing","pingedAt","recordConnect","disconnectedAt","recordDisconnect","poll","pollTimeout","reconnectIfStale","getPollInterval","reconnectionBackoffRate","connectionIsStale","refreshedAt","disconnectedRecently","reopen","isOpen","INTERNAL","message_types","welcome","ping","confirmation","rejection","disconnect_reasons","unauthorized","invalid_request","server_restart","default_mount_path","protocols","supportedProtocols","Connection","consumer","subscriptions","disconnected","webSocket","getState","uninstallEventHandlers","installEventHandlers","allowReconnect","reopenDelay","getProtocol","isState","isProtocolSupported","states","events","handler","identifier","reconnect","reload","confirmSubscription","notify","notifyAll","willAttemptReconnect","Subscription","mixin","properties","extend","perform","command","unsubscribe","SubscriptionGuarantor","pendingSubscriptions","guarantee","subscription","startGuaranteeing","forget","stopGuaranteeing","retrySubscribing","retryTimeout","subscribe","Subscriptions","guarantor","channelName","ensureActiveConnection","findAll","sendCommand","callbackName","Consumer","_url","createWebSocketURL","createConsumer","querySelector","getAttribute","getConfig","ActionCableConnection","onMessageHandler","defaultMessageHandler","onReceived","offMessage","onConnected","onDisconnected","cable","RoomChannel","UserChannel","disconnectTimestamp","handleReconnect","_ref$channel","_ref$type","updateStatus","core","eventHandler","prepareConnection","rtConnection","websocket","keepRoomAlive","counter","pollingFallbackInterval","pollingFallback","eyesonClass","onReceive","removeListener","setMonitor","broadcasts","loadInitialInfos","joinSession","joinOnConnect","_throttledSend","throttle","_toConsumableArray","iter","GiphyApi","roomUrl","query","staff","staffGifs","_ref4","rej","search","images","original_mp4","mp4_size","largerGifs","floor","SoundMeter","level","instant","silenceDuration","intervalCounter","analyser","volumes","errorTimer","boundOnTrackEnded","onTrackEnded","initError","onstatechange","_stream$getAudioTrack2","createAnalyser","fftSize","minDecibels","maxDecibels","smoothingTimeConstant","frequencyBinCount","running","analyse","getByteFrequencyData","volumeSum","averageVolume","round","warning","resetSilenceCounter","abs","offUpdate","SystemPressureMonitor","_listener","_running","records","_emit","sampleRate"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0b7fb48c1c7e896624d2ea9a9354619a826b44ea..1963762385820b8edc6089bbd2760fbf6f174833 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "eyeson", - "version": "1.8.7", + "version": "1.8.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "eyeson", - "version": "1.8.7", + "version": "1.8.8", "license": "MIT", "dependencies": { "@rails/actioncable": "*", @@ -26,7 +26,7 @@ "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "jest-websocket-mock": "^2.3.0", - "prettier": "^2.3.1", + "prettier": "^3.0.2", "source-map-explorer": "^2.5.2", "terser-webpack-plugin": "^5.2.5", "webpack": "^5.63.0", @@ -56,12 +56,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -78,9 +78,9 @@ } }, "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -88,15 +88,15 @@ "@babel/generator": "^7.22.10", "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -163,9 +163,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", + "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -428,23 +428,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -456,9 +456,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz", + "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -804,9 +804,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", + "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -885,12 +885,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -987,9 +987,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1019,9 +1019,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1067,9 +1067,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1098,9 +1098,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1145,12 +1145,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", + "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1162,13 +1162,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5" }, @@ -1227,9 +1227,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1243,9 +1243,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1259,13 +1259,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", + "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.22.5" @@ -1294,9 +1294,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1310,9 +1310,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.22.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", + "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1358,13 +1358,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1695,9 +1695,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1721,9 +1721,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.10", @@ -1732,8 +1732,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1742,9 +1742,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1786,9 +1786,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1845,9 +1845,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1995,9 +1995,9 @@ } }, "node_modules/@jest/console": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz", - "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2082,15 +2082,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz", - "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.3", - "@jest/reporters": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2099,18 +2099,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.3", - "jest-haste-map": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-resolve-dependencies": "^29.6.3", - "jest-runner": "^29.6.3", - "jest-runtime": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", "pretty-format": "^29.6.3", "slash": "^3.0.0", @@ -2199,12 +2199,12 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz", - "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.3", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.6.3" @@ -2214,22 +2214,22 @@ } }, "node_modules/@jest/expect": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz", - "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.6.3", - "jest-snapshot": "^29.6.3" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", - "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2239,9 +2239,9 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz", - "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -2256,13 +2256,13 @@ } }, "node_modules/@jest/globals": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz", - "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.3", - "@jest/expect": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", "jest-mock": "^29.6.3" }, @@ -2271,15 +2271,15 @@ } }, "node_modules/@jest/reporters": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz", - "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2295,7 +2295,7 @@ "istanbul-reports": "^3.1.3", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2410,12 +2410,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz", - "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.3", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2425,14 +2425,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz", - "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.3", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2440,9 +2440,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.3.tgz", - "integrity": "sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2453,7 +2453,7 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", "jest-util": "^29.6.3", "micromatch": "^4.0.4", @@ -2877,15 +2877,15 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.4.tgz", - "integrity": "sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==", + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3513,12 +3513,12 @@ "dev": true }, "node_modules/babel-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.3.tgz", - "integrity": "sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.3", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -3851,9 +3851,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001522", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", - "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "version": "1.0.30001524", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", "dev": true, "funding": [ { @@ -4226,9 +4226,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.500", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", - "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", + "version": "1.4.504", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz", + "integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==", "dev": true }, "node_modules/emittery": { @@ -4347,15 +4347,15 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", + "@eslint/js": "8.48.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -4700,14 +4700,14 @@ } }, "node_modules/expect": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", - "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.3", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3" }, @@ -4875,16 +4875,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -5651,15 +5652,15 @@ } }, "node_modules/jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz", - "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.3", + "@jest/core": "^29.6.4", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.3" + "jest-cli": "^29.6.4" }, "bin": { "jest": "bin/jest.js" @@ -5691,14 +5692,14 @@ } }, "node_modules/jest-circus": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz", - "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.3", - "@jest/expect": "^29.6.3", - "@jest/test-result": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5706,10 +5707,10 @@ "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "p-limit": "^3.1.0", "pretty-format": "^29.6.3", @@ -5792,19 +5793,19 @@ } }, "node_modules/jest-cli": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz", - "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.6.3", - "@jest/test-result": "^29.6.3", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.3", + "jest-config": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", "prompts": "^2.0.1", @@ -5896,26 +5897,26 @@ } }, "node_modules/jest-config": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz", - "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.3", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.3", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.3", - "jest-environment-node": "^29.6.3", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-runner": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", "micromatch": "^4.0.4", @@ -6011,9 +6012,9 @@ } }, "node_modules/jest-diff": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", - "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -6194,13 +6195,13 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.3.tgz", - "integrity": "sha512-nMJz/i27Moit9bv8Z323/13Melj4FEQH93yRu7GnilvBmPBMH4EGEkEfBTJXYuubyzhMO7w/VHzljIDV+Q/SeQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", + "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", @@ -6221,13 +6222,13 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz", - "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.6.3", @@ -6247,9 +6248,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.3.tgz", - "integrity": "sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -6260,7 +6261,7 @@ "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -6285,13 +6286,13 @@ } }, "node_modules/jest-matcher-utils": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", - "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.3", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", "pretty-format": "^29.6.3" }, @@ -6500,14 +6501,14 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz", - "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", @@ -6520,13 +6521,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz", - "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.3" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6603,30 +6604,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz", - "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.3", - "@jest/environment": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.3", - "jest-haste-map": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", "jest-leak-detector": "^29.6.3", "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-runtime": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", "jest-util": "^29.6.3", - "jest-watcher": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -6705,17 +6706,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz", - "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", - "@jest/globals": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -6723,12 +6724,12 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-message-util": "^29.6.3", "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" @@ -6808,9 +6809,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz", - "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -6818,16 +6819,16 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.3", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.3", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3", "natural-compare": "^1.4.0", @@ -7128,12 +7129,12 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz", - "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.3", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -7227,9 +7228,9 @@ } }, "node_modules/jest-worker": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.3.tgz", - "integrity": "sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -7340,6 +7341,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -7370,6 +7377,15 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8000,15 +8016,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -9085,9 +9101,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "peer": true, "bin": { @@ -9661,12 +9677,12 @@ } }, "@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" } }, @@ -9677,9 +9693,9 @@ "dev": true }, "@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", @@ -9687,15 +9703,15 @@ "@babel/generator": "^7.22.10", "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" } }, @@ -9743,9 +9759,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz", + "integrity": "sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -9933,20 +9949,20 @@ } }, "@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", "dev": true, "requires": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" } }, "@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.5", @@ -9955,9 +9971,9 @@ } }, "@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz", + "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -10187,9 +10203,9 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.11.tgz", + "integrity": "sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.5", @@ -10238,12 +10254,12 @@ } }, "@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } @@ -10304,9 +10320,9 @@ } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10324,9 +10340,9 @@ } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10354,9 +10370,9 @@ } }, "@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10373,9 +10389,9 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10402,24 +10418,24 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.11.tgz", + "integrity": "sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5" } @@ -10454,9 +10470,9 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10464,9 +10480,9 @@ } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10474,13 +10490,13 @@ } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.11.tgz", + "integrity": "sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.22.5" @@ -10497,9 +10513,9 @@ } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10507,9 +10523,9 @@ } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.22.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.12.tgz", + "integrity": "sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -10537,13 +10553,13 @@ } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } @@ -10781,9 +10797,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" @@ -10801,9 +10817,9 @@ } }, "@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", "dev": true, "requires": { "@babel/code-frame": "^7.22.10", @@ -10812,16 +10828,16 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", @@ -10851,9 +10867,9 @@ } }, "@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true }, "@eslint/eslintrc": { @@ -10891,9 +10907,9 @@ } }, "@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true }, "@humanwhocodes/config-array": { @@ -11003,9 +11019,9 @@ "dev": true }, "@jest/console": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz", - "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -11068,15 +11084,15 @@ } }, "@jest/core": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz", - "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "requires": { - "@jest/console": "^29.6.3", - "@jest/reporters": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -11085,18 +11101,18 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.3", - "jest-haste-map": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-resolve-dependencies": "^29.6.3", - "jest-runner": "^29.6.3", - "jest-runtime": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", "pretty-format": "^29.6.3", "slash": "^3.0.0", @@ -11155,40 +11171,40 @@ } }, "@jest/environment": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz", - "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.3", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.6.3" } }, "@jest/expect": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz", - "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "requires": { - "expect": "^29.6.3", - "jest-snapshot": "^29.6.3" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" } }, "@jest/expect-utils": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz", - "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "requires": { "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz", - "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -11200,27 +11216,27 @@ } }, "@jest/globals": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz", - "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "requires": { - "@jest/environment": "^29.6.3", - "@jest/expect": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", "jest-mock": "^29.6.3" } }, "@jest/reporters": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz", - "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -11236,7 +11252,7 @@ "istanbul-reports": "^3.1.3", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -11315,33 +11331,33 @@ } }, "@jest/test-result": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz", - "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "requires": { - "@jest/console": "^29.6.3", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz", - "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "requires": { - "@jest/test-result": "^29.6.3", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.3.tgz", - "integrity": "sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -11352,7 +11368,7 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", "jest-util": "^29.6.3", "micromatch": "^4.0.4", @@ -11711,15 +11727,15 @@ "dev": true }, "@types/node": { - "version": "20.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.4.tgz", - "integrity": "sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==", + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", "dev": true }, "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", "dev": true }, "@types/stack-utils": { @@ -12211,12 +12227,12 @@ "dev": true }, "babel-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.3.tgz", - "integrity": "sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "requires": { - "@jest/transform": "^29.6.3", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -12457,9 +12473,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001522", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", - "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", + "version": "1.0.30001524", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", "dev": true }, "chalk": { @@ -12734,9 +12750,9 @@ } }, "electron-to-chromium": { - "version": "1.4.500", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", - "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", + "version": "1.4.504", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz", + "integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==", "dev": true }, "emittery": { @@ -12819,15 +12835,15 @@ } }, "eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", + "@eslint/js": "8.48.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -13050,14 +13066,14 @@ "dev": true }, "expect": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz", - "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "requires": { - "@jest/expect-utils": "^29.6.3", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3" } @@ -13196,12 +13212,13 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, @@ -13763,15 +13780,15 @@ } }, "jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz", - "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "requires": { - "@jest/core": "^29.6.3", + "@jest/core": "^29.6.4", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.3" + "jest-cli": "^29.6.4" } }, "jest-changed-files": { @@ -13786,14 +13803,14 @@ } }, "jest-circus": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz", - "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "requires": { - "@jest/environment": "^29.6.3", - "@jest/expect": "^29.6.3", - "@jest/test-result": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -13801,10 +13818,10 @@ "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "p-limit": "^3.1.0", "pretty-format": "^29.6.3", @@ -13865,19 +13882,19 @@ } }, "jest-cli": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz", - "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "requires": { - "@jest/core": "^29.6.3", - "@jest/test-result": "^29.6.3", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.3", + "jest-config": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", "prompts": "^2.0.1", @@ -13936,26 +13953,26 @@ } }, "jest-config": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz", - "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.3", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.3", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.3", - "jest-environment-node": "^29.6.3", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-runner": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", "micromatch": "^4.0.4", @@ -14017,9 +14034,9 @@ } }, "jest-diff": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz", - "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -14153,13 +14170,13 @@ } }, "jest-environment-jsdom": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.3.tgz", - "integrity": "sha512-nMJz/i27Moit9bv8Z323/13Melj4FEQH93yRu7GnilvBmPBMH4EGEkEfBTJXYuubyzhMO7w/VHzljIDV+Q/SeQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", + "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", "dev": true, "requires": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", @@ -14169,13 +14186,13 @@ } }, "jest-environment-node": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz", - "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.6.3", @@ -14189,9 +14206,9 @@ "dev": true }, "jest-haste-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.3.tgz", - "integrity": "sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -14203,7 +14220,7 @@ "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -14219,13 +14236,13 @@ } }, "jest-matcher-utils": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz", - "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.6.3", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", "pretty-format": "^29.6.3" }, @@ -14374,14 +14391,14 @@ "dev": true }, "jest-resolve": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz", - "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.6.3", "jest-validate": "^29.6.3", @@ -14442,40 +14459,40 @@ } }, "jest-resolve-dependencies": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz", - "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "requires": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.3" + "jest-snapshot": "^29.6.4" } }, "jest-runner": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz", - "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "requires": { - "@jest/console": "^29.6.3", - "@jest/environment": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.3", - "jest-haste-map": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", "jest-leak-detector": "^29.6.3", "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-runtime": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", "jest-util": "^29.6.3", - "jest-watcher": "^29.6.3", - "jest-worker": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -14532,17 +14549,17 @@ } }, "jest-runtime": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz", - "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "requires": { - "@jest/environment": "^29.6.3", - "@jest/fake-timers": "^29.6.3", - "@jest/globals": "^29.6.3", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -14550,12 +14567,12 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.3", + "jest-haste-map": "^29.6.4", "jest-message-util": "^29.6.3", "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.3", - "jest-snapshot": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" @@ -14613,9 +14630,9 @@ } }, "jest-snapshot": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz", - "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -14623,16 +14640,16 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.3", - "@jest/transform": "^29.6.3", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.3", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.3", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.3", + "jest-matcher-utils": "^29.6.4", "jest-message-util": "^29.6.3", "jest-util": "^29.6.3", "natural-compare": "^1.4.0", @@ -14852,12 +14869,12 @@ } }, "jest-watcher": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz", - "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "requires": { - "@jest/test-result": "^29.6.3", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -14929,9 +14946,9 @@ } }, "jest-worker": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.3.tgz", - "integrity": "sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "requires": { "@types/node": "*", @@ -15012,6 +15029,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -15036,6 +15059,15 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -15496,9 +15528,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true }, "pretty-format": { @@ -16272,9 +16304,9 @@ "dev": true }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "peer": true }, diff --git a/package.json b/package.json index eda39c96bbad9bd95158acb3bb60d1a38f42ea9b..5876f7e72d28c092f9c2d0a5728a663b8f1003fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eyeson", - "version": "1.8.7", + "version": "1.8.8", "description": "Easily connect to video meetings in modern browsers.", "keywords": [ "video", @@ -34,7 +34,7 @@ "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", "jest-websocket-mock": "^2.3.0", - "prettier": "^2.3.1", + "prettier": "^3.0.2", "source-map-explorer": "^2.5.2", "terser-webpack-plugin": "^5.2.5", "webpack": "^5.63.0", diff --git a/src/VirtualBackgroundMixer.js b/src/VirtualBackgroundMixer.js index 09a3c4ce16300e67970e664d6d5911d30200fe5a..d5908b7fd15417ac7b5be7aaf180cb367dc24eb6 100644 --- a/src/VirtualBackgroundMixer.js +++ b/src/VirtualBackgroundMixer.js @@ -81,9 +81,10 @@ const initiateTFLite = async () => { : importScript('vendor/tflite/tflite.js'), fetch(`vendor/tflite/models/${_segmentationModel.name}.tflite`) ]); - _tflite = await window.exports[ - SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule' - ](); + _tflite = + await window.exports[ + SIMDSupport ? 'createTFLiteSIMDModule' : 'createTFLiteModule' + ](); const model = await loading[1].arrayBuffer(); const modelBufferOffset = _tflite._getModelBufferMemoryOffset(); _tflite.HEAPU8.set(new Uint8Array(model), modelBufferOffset); diff --git a/src/sepp/SEPP.js b/src/sepp/SEPP.js index 58c1625c5020de17d56067c427e6840ae3465022..b24756f4f66fb3ac3412609791aba71d9b154024 100644 --- a/src/sepp/SEPP.js +++ b/src/sepp/SEPP.js @@ -139,9 +139,8 @@ class UserAgent extends EventEmitter { throw new Error('Invalid call id'); } this.emit({ type: 'sdp_update', sdp }); - const answerSdp = await this.sessionDescriptionHandler.updateDescription( - sdp - ); + const answerSdp = + await this.sessionDescriptionHandler.updateDescription(sdp); if (sdp.type === 'offer' && answerSdp) { const desc = { type: answerSdp.type,