{"version":3,"sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/webpack/bootstrap","webpack://[name]/external {\"root\":\"Sortable\",\"commonjs2\":\"sortablejs\",\"commonjs\":\"sortablejs\",\"amd\":\"sortablejs\"}","webpack://[name]/external {\"root\":\"Inputmask\",\"commonjs2\":\"inputmask\",\"commonjs\":\"inputmask\",\"amd\":\"inputmask\"}","webpack://[name]/external {\"root\":\"noUiSlider\",\"commonjs2\":\"nouislider\",\"commonjs\":\"nouislider\",\"amd\":\"nouislider\"}","webpack://[name]/./node_modules/recordrtc/RecordRTC.js","webpack://[name]/./src/icheck.js","webpack://[name]/./src/select2.js","webpack://[name]/./src/inputmask.js","webpack://[name]/./src/jquery-bar-rating.js","webpack://[name]/./src/jquery-ui-datepicker.js","webpack://[name]/./src/images/datepicker.svg","webpack://[name]/./src/nouislider.js","webpack://[name]/./src/select2-tagbox.js","webpack://[name]/./src/sortablejs.js","webpack://[name]/./src/ck-editor.js","webpack://[name]/./src/easy-autocomplete.js","webpack://[name]/./src/pretty-checkbox.js","webpack://[name]/./src/bootstrap-slider.js","webpack://[name]/./src/microphone.js","webpack://[name]/./src/emotionsratings.js","webpack://[name]/./src/images/barrating.svg","webpack://[name]/./src/images/nouislider.svg","webpack://[name]/./src/images/tagbox.svg","webpack://[name]/./src/images/sortablejs.svg","webpack://[name]/./src/images/editor.svg","webpack://[name]/external {\"root\":\"Slider\",\"commonjs2\":\"bootstrap-slider\",\"commonjs\":\"bootstrap-slider\",\"amd\":\"bootstrap-slider\"}","webpack://[name]/(webpack)/buildin/global.js","webpack://[name]/./node_modules/process/browser.js","webpack://[name]/./src/images/microphone.svg","webpack://[name]/./src/bootstrapdatepicker.js"],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__0__","__WEBPACK_EXTERNAL_MODULE__1__","__WEBPACK_EXTERNAL_MODULE__2__","__WEBPACK_EXTERNAL_MODULE__24__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","RecordRTC","mediaStream","config","RecordRTCConfiguration","type","self","this","initRecorder","initCallback","Recorder","GetRecorderType","mediaRecorder","record","setState","disableLogs","console","log","constructor","stopRecording","callback","state","resumeRecording","setTimeout","warn","stop","_callback","warningLog","__blob","keys","forEach","blob","bytesToSize","size","url","URL","createObjectURL","e","autoWriteToDisk","getDataURL","dataURL","parameter","DiskStorage","Store","readFile","_blob","postMessage","FileReaderSync","readAsDataURL","_mediaRecorder","Worker","navigator","mozGetUserMedia","reader","FileReader","onload","event","target","result","webWorker","_function","Blob","toString","worker","revokeObjectURL","processInWebWorker","onmessage","data","handleRecordingDuration","counter","recordingDuration","onRecordingStopped","onStateChanged","WARNING","returnObject","startRecording","config2","version","clearRecordedData","pauseRecording","pause","resume","setRecordingDuration","getBlob","toURL","getInternalRecorder","save","fileName","invokeSaveAsDialog","getFromDisk","setAdvertisementArray","arrayOfWebPImages","advertisement","length","push","duration","image","bufferSize","sampleRate","buffer","reset","getState","destroy","disableLogsCache","Storage","AudioContextConstructor","close","prop","recorderType","audio","video","WhammyRecorder","CanvasRecorder","WebAssemblyRecorder","GifRecorder","StereoAudioRecorder","MediaStreamRecorder","getTracks","MediaRecorder","mimeType","split","bitsPerSecond","recorder","isChrome","isEdge","isOpera","ReadableStream","isMediaRecorderCompatible","isTypeSupported","Array","MultiStreamRecorder","isSafari","MRecordRTC","addStream","_mediaStream","mediaType","gif","audioRecorder","numberOfAudioChannels","timeSlice","onTimeStamp","newStream","videoTrack","isFirefox","MediaStream","addTrack","videoRecorder","canvas","frameInterval","workerPath","webAssemblyPath","frameRate","bitrate","isSingleRecorder","gifRecorder","quality","blobURL","output","callback00","webkitURL","_audioDataURL","_videoDataURL","writeToDisk","args","Fetch","_type","replace","options","audioDataURL","videoDataURL","gifDataURL","audioBlob","videoBlob","gifBlob","that","global","userAgent","getUserMedia","error","arguments","document","documentElement","appendChild","createElement","captureStream","mozCaptureStream","obj","getContext","play","drawImage","toDataURL","style","HTMLVideoElement","location","protocol","href","hash","screen","width","height","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","lastTime","element","currTime","Date","getTime","timeToCall","Math","max","id","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msCancelAnimationFrame","clearTimeout","AudioContext","webkitAudioContext","mozAudioContext","webkitGetUserMedia","indexOf","msSaveBlob","msSaveOrOpenBlob","opera","toLowerCase","test","isElectron","bytes","parseInt","floor","pow","toPrecision","file","fileExtension","splitted","fileFullName","round","random","hyperlink","download","body","click","dispatchEvent","MouseEvent","view","bubbles","cancelable","process","versions","electron","stream","kind","filter","setSrcObject","srcObject","mozSrcObject","webkitMediaStream","track","getSeekableBlob","inputBlob","EBML","Error","Reader","decoder","Decoder","tools","fileReader","decode","read","refinedMetadataBuf","makeMetadataSeekable","metadatas","cues","slice","metadataSize","newBlob","readAsArrayBuffer","appVersion","verOffset","ix","nAgt","fullVersion","parseFloat","majorVersion","substring","isNaN","arrayOfBlobs","updateTimeStamp","timestamps","getMimeType","secondObject","clearRecordedDataCB","getArrayOfBlobs","allStates","recorderHints","canRecordMimeType","ondataavailable","recordingCallback","getNativeBlob","onstart","onpause","onresume","onstop","onerror","looper","manuallyStopped","timeslice","start","getAllStates","checkForInactiveTracks","active","ended","isMediaStreamActive","jsAudioNode","leftchannel","rightchannel","recording","recordingLength","desiredSampRate","mergeLeftRightBuffers","mergeAudioBuffers","cb","interleaved","leftBuffers","rightBuffers","internalInterleavedLength","interpolateArray","newSampleRate","oldSampleRate","fitCount","newData","springFactor","Number","tmp","before","toFixed","after","ceil","atPoint","linearInterpolate","mergeBuffers","channelBuffer","rLength","Float64Array","offset","lng","set","writeUTFBytes","string","setUint8","charCodeAt","leftChannel","rightChannel","inputIndex","index","interleave","interleavedLength","ArrayBuffer","DataView","setUint32","setUint16","setInt16","noWorker","workerURL","terminate","resetVariables","isAudioProcessStarted","isPaused","byteLength","context","audioInput","createMediaStreamSource","legalBufferValues","JSON","stringify","createJavaScriptNode","createScriptProcessor","connect","intervalsBasedBuffers","left","right","onaudioprocess","disconnect","onAudioProcessStarted","inputBuffer","getChannelData","chLeft","Float32Array","chRight","createMediaStreamDestination","destination","htmlElement","html2canvas","isCanvasSupportsStreamCapturing","item","globalCanvas","mediaStreamRecorder","isRecording","_isChrome","webkitRTCPeerConnection","chrome","chromeVersion","matchArray","match","useWhammyRecorder","HTMLCanvasElement","CanvasRenderingContext2D","canvasMediaStream","webkitCaptureStream","mdStream","whammy","frames","drawCanvasFrame","getWebPImages","nodeName","framesLength","frame","idx","framesRemaining","onEncodingCallback","webp","compile","isPausedRecording","newCanvas","grabMouse","showMousePointer","onrendered","Whammy","Video","drawFrames","paused","isStopDrawing","dropBlackFrames","_frames","_framesToCheck","_pixTolerance","_frameTolerance","localCanvas","context2d","resultFrames","checkUntilNotBlack","endCheckFrame","sampleColor","maxColorDifference","sqrt","pixTolerance","frameTolerance","doNotCheckNext","functionToLoop","loop","f","matchPixCount","endPixCheck","maxPixCount","finishImage","Image","imageData","getImageData","pix","currentColor","g","b","src","concat","cloneNode","onloadedmetadata","muted","_this","WhammyVideo","whammyInWebWorker","getClusterData","clusterTimecode","clusterCounter","clusterFrames","map","block","flags","keyframe","invisible","lacing","discardable","trackNum","timecode","String","fromCharCode","join","makeSimpleBlock","numToBuffer","num","parts","Uint8Array","reverse","bitsToBuffer","bits","substr","getStrLength","unpadded","webm","info","checkFrames","frameNumber","clusterDuration","cluster","generateEBML","json","ebml","len","zeroes","sizeToString","padded","riff","VP8","RIFF","WEBP","frameStart","parseWebP","parseRIFF","chunks","atob","add","init","indexedDB","open","db","dbName","request","onError","onsuccess","setVersion","createObjectStore","putInDB","onupgradeneeded","dataBase","dataStoreName","transaction","getFromStore","portionName","objectStore","put","GIFEncoder","script","isHTMLObject","isLoadedMetaData","offsetWidth","offsetHeight","gifEncoder","setRepeat","setDelay","setQuality","onGifRecordingStarted","now","lastAnimationFrame","drawVideoFrame","time","clearedRecordedData","undefined","lastFrameTime","onGifPreview","addFrame","bin","autoplay","playsInline","MultiStreamsMixer","arrayOfMediaStreams","elementClass","videos","isStopDrawingFrames","opacity","position","zIndex","top","className","useGainNode","drawVideosToCanvas","videosLength","fullcanvas","remaining","x","y","onRender","getVideo","volume","resetVideoStreams","streams","startDrawingFrames","appendStreams","audioSource","audioContext","audioDestination","releaseStreams","gainNode","audioSources","source","clearRect","getMixedStream","mixedVideoStream","capturedStream","videoStream","getMixedVideoStream","mixedAudioStream","createGain","gain","audioTracksLength","getMixedAudioStream","mixer","tracks","previewStream","addStreams","getMixer","finished","cameraStream","controller","cvs","first","onplaying","ctx","frameTimeout","cameraTimer","setInterval","clearInterval","onVideoProcessStarted","_controlledReadableStream","enqueue","WritableStream","realtime","arrayOfBuffers","fetch","then","arrayBuffer","addEventListener","timebaseDen","pipeTo","write","RecordRTCPromisesHandler","recordRTC","Promise","resolve","reject","escValue","val","Survey","$","widget","checkboxClass","radioClass","widgetIsLoaded","fn","iCheck","isFit","question","getType","isDefaultRender","afterRender","el","rootWidget","$el","getIndexByValue","arr","isArray","find","hide","frozeUpdating","makeChoicesICheck","inputs","on","generatedVisibleRows","row","rows","fullName","oldValue","splice","uncheckIcheck","cEl","parentElement","classList","remove","select","values","qValue","visibleChoices","inEl","removeAttr","parent","hasClass","visibleChoicesChangedCallback","valueChangedCallback","willUnmount","JsonObject","metaData","addProperty","category","CustomWidgetCollection","Instance","addCustomWidget","activatedBy","select2","activatedByChanged","removeProperty","default","choices","dependsOn","visibleIf","renderAs","addClass","htmlTemplate","select2Config","settings","parse","is","$otherElement","cssClasses","other","isSettingValue","comment","updateComment","isOtherSelected","show","updateValueHandler","trigger","newOption","Option","append","updateChoices","empty","placeholder","showOptionsCaption","optionsCaption","allowClear","theme","disabled","isReadOnly","ajax","keepIncorrectValues","text","choice","clearIncorrectValues","querySelector","nextElementSibling","marginBottom","readOnlyChangedCallback","registerFunctionOnPropertyValueChanged","renderedValue","removeData","preventDefault","$select2","off","numericGroupSeparator","numericRadixPoint","numericAutoGroup","numericDigits","numericDigitsOptional","numericPlaceholder","autoUnmask","clearIncomplete","inputMask","inputFormat","findProperty","properties","visible","addProperties","applyInputMask","surveyElement","mask","option","groupSeparator","radixPoint","autoGroup","digits","digitsOptional","prefix","suffix","onblur","inputmask","getemptymask","customWidgetData","editorValue","oninput","isNeedRender","onfocusout","onchange","isComplete","unmaskedvalue","updateHandler","input","items","editor","inputId","SvgRegistry","registerIconFromSvg","title","iconName","barrating","defaultJSON","$customSelect","$questionInput","contentContainer","renderCustomSelect","format","css","selectedIndex","renderBarrating","ratingTheme","initialRating","showValues","showSelectedRating","readonly","onSelect","valueChangingByWidget","parents","__barratingOnPropertyChangedCallback","sender","onPropertyChanged","pdfQuestionType","bootstrapDP","datepicker","noConflict","isSelecting","extend","setDateIntoQuestion","placeHolder","attr","dateFormat","minDate","maxDate","renderedMin","renderedMax","dateText","fixFocusIE","onClose","inst","beforeShow","pickerWidget","updateDate","isEmpty","keyup","keyCode","_clearDate","disableInput","blur","categoryIndex","paddingBottom","paddingLeft","paddingRight","paddingTop","children","orientation","marginLeft","slider","rangeMin","rangeMax","step","tooltips","pips","pipsMode","pipsValues","pVal","pipValue","density","pipsDensity","to","pipText","pipsText","range","min","direction","updateSliderProperties","elems","getElementsByClassName","display","getStart","currentStart","updateOptions","setAttribute","noUiSlider","registerFunctionOnPropertiesValueChanged","removeAttribute","unRegisterFunctionOnPropertiesValueChanged","pdfRender","_","point","SurveyHelper","createPoint","mergeRects","apply","bricks","xLeft","unitWidth","yTop","unitHeight","FlatQuestion","CONTENT_GAP_VERT_SCALE","rect","createTextFieldRect","textboxBrick","TextFieldBrick","defaultValue","fixStyles","border","tags","allowAddNewTag","maxSelectedChoices","maximumSelectionLength","survey","checkbox","otherPlaceHolder","hasSelectAll","isAllSelected","selectAllItemValue","isAllItemSelected","_propertyValueChangedFnSelect2","params","selectAll","select2Val","clearValue","unRegisterFunctionOnPropertyValueChanged","rootStyle","areaStyle","itemStyle","useDefaultTheme","cssText","resultEl","emptyEl","sourceEl","boxSizing","innerHTML","emptyText","addChoiceToWidget","inResults","srcEl","newEl","innerText","dataset","getChoicesNotInResults","res","hasValueInResults","isUpdatingQuestionValue","notInResults","ItemValue","getItemByValue","getChoicesInResults","animation","group","from","maxAnswersCount","onSort","evt","CKEDITOR","editorConfig","language","toolbarCanCollapse","instances","removeAllListeners","readOnly","isValueChanging","setData","getData","setReadOnly","loc","LocalizableString","flatHtml","repository","generateFlats","htmlBricks","easyAutocomplete","classesString","questionRootClasses","cssRoot","questionRoot","overflow","adjustWidth","list","sort","enabled","method","aStr","bStr","inputStr","onChooseEvent","selectedData","getSelectedItemData","choicesByUrl","valueName","phrase","getValue","supportedTypes","radiogroup","rootClass","inputType","states","stateClass","addOn","boolean","iconClass","isFitByType","supportedType","itemInputs","questionType","checkboxType","radiogroupType","booleanType","inChangeHandler","changeHandler","targetValue","targetChecked","checked","questionValue","createValueCopy","valueIndex","itemWidth","colCount","locText","locTitle","choiceItem","indeterminate","controlRoot","stateRoot","icon","label","hasHtml","html","textContent","renderedText","insertAdjacentHTML","itemRoot","newValue","checkedItems","inputItem","readOnlyHandler","Slider","inputEl","valueObj","disable","enable","bootstrapSlider","setValue","buttonStartEl","getElementsByTagName","buttonStopEl","audioEl","successCallback","mystream","audioBitsPerSecond","errorCallback","alert","processAudio","audioVideoWebMURL","recordedBlob","dataUri","parentNode","removeChild","onclick","doNothingHandler","getAudioTracks","mediaDevices","emotionsRating","emotions","emotionSize","bgEmotion","color","emotionColor","count","emotionsCount","onUpdate","initWidget","Function","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","array","noop","nextTick","browser","env","argv","addListener","once","removeListener","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","enableOnReadonly","todayHighlight","weekStart","clearBtn","autoclose","autoClose","daysOfWeekDisabled","daysOfWeekHighlighted","disableTouchKeyboard","startDate","getFullYear","endDate","newDate","toUTCString"],"mappings":"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","file":"surveyjs-widgets.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"sortablejs\"), require(\"inputmask\"), require(\"nouislider\"), require(\"bootstrap-slider\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"surveyjs-widgets\", [\"sortablejs\", \"inputmask\", \"nouislider\", \"bootstrap-slider\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"surveyjs-widgets\"] = factory(require(\"sortablejs\"), require(\"inputmask\"), require(\"nouislider\"), require(\"bootstrap-slider\"));\n\telse\n\t\troot[\"surveyjs-widgets\"] = factory(root[\"Sortable\"], root[\"Inputmask\"], root[\"noUiSlider\"], root[\"Slider\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__, __WEBPACK_EXTERNAL_MODULE__1__, __WEBPACK_EXTERNAL_MODULE__2__, __WEBPACK_EXTERNAL_MODULE__24__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 28);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","module.exports = __WEBPACK_EXTERNAL_MODULE__1__;","module.exports = __WEBPACK_EXTERNAL_MODULE__2__;","'use strict';\r\n\r\n// Last time updated: 2021-03-09 3:20:22 AM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.6.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\" method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.6.2'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.6.2';\r\n\r\nif (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (typeof define === 'function' && define.amd) {\r\n define('RecordRTC', [], function() {\r\n return RecordRTC;\r\n });\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n if (fileExtension.indexOf(';') !== -1) {\r\n // extended mimetype, e.g. 'video/webm;codecs=vp8,opus'\r\n fileExtension = fileExtension.split(';')[0];\r\n }\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\r\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\r\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * numberOfAudioChannels * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('MultiStreamsMixer', [], function() {\r\n return MultiStreamsMixer;\r\n });\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.6.2';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024, realtime: true}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n config.realtime = config.realtime || true;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n var finished;\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n var first = true;\r\n video.srcObject = stream;\r\n video.muted = true;\r\n video.height = config.height;\r\n video.width = config.width;\r\n video.volume = 0;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n var cameraTimer = setInterval(function f() {\r\n if (finished) {\r\n clearInterval(cameraTimer);\r\n controller.close();\r\n }\r\n\r\n if (first) {\r\n first = false;\r\n if (config.onVideoProcessStarted) {\r\n config.onVideoProcessStarted();\r\n }\r\n }\r\n\r\n ctx.drawImage(video, 0, 0);\r\n if (controller._controlledReadableStream.state !== 'closed') {\r\n try {\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n } catch (e) {}\r\n }\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n finished = false;\r\n\r\n // is it safe to use @latest ?\r\n\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: config.realtime\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (finished) {\r\n console.error('Got image, but recorder is finished!');\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate(callback) {\r\n if (!worker) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Wait for null event data to indicate that the encoding is complete\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === null) {\r\n worker.terminate();\r\n worker = null;\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n worker.postMessage(null);\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n finished = true;\r\n\r\n var recorder = this;\r\n\r\n terminate(function() {\r\n recorder.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(recorder.blob);\r\n });\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n","function escValue(val) {\n if (typeof val === \"string\") {\n return (val || \"\").replace(/(['])/g, \"\\\\$1\");\n }\n return val;\n}\n\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n className: \"iradio_square-blue\",\n checkboxClass: \"iradio_square-blue\",\n radioClass: \"iradio_square-blue\",\n name: \"icheck\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.iCheck;\n },\n isFit: function (question) {\n var t = question.getType();\n return t === \"radiogroup\" || t === \"checkbox\" || t === \"matrix\";\n },\n isDefaultRender: true,\n afterRender: function (question, el) {\n var rootWidget = this;\n var $el = $(el);\n\n $el.find(\".sv-item__decorator\").hide();\n\n $el.find(\"input\").data({\n iCheck: undefined,\n });\n function getIndexByValue(arr, value) {\n if (!Array.isArray(arr)) return -1;\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == value) return i;\n if (!!arr[i] && arr[i].toString().toLowerCase() == value) return i;\n }\n return -1;\n }\n var frozeUpdating = false;\n var makeChoicesICheck = function () {\n var inputs = $el.find(\"input\");\n inputs.iCheck({\n checkboxClass:\n question.checkboxClass ||\n rootWidget.checkboxClass ||\n rootWidget.className,\n radioClass:\n question.radioClass ||\n rootWidget.radioClass ||\n rootWidget.className,\n });\n inputs.on(\"ifChecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"matrix\") {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.fullName === event.target.name) {\n row.value = event.target.value;\n }\n });\n } else if (question.getType() === \"checkbox\") {\n var oldValue = question.value || [];\n var index = getIndexByValue(oldValue, event.target.value);\n if (index === -1) {\n question.value = oldValue.concat([event.target.value]);\n }\n } else {\n question.value = event.target.value;\n }\n });\n\n inputs.on(\"ifUnchecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"checkbox\") {\n var oldValue = (question.value || []).slice();\n var index = getIndexByValue(oldValue, event.target.value);\n if (index >= 0) {\n oldValue.splice(index, 1);\n question.value = oldValue;\n }\n }\n });\n };\n function uncheckIcheck(cEl) {\n cEl.iCheck(\"uncheck\");\n cEl[0].parentElement.classList.remove(\"checked\");\n }\n var select = function () {\n frozeUpdating = true;\n if (question.getType() !== \"matrix\") {\n var values = question.value;\n if (!Array.isArray(values)) {\n values = [values];\n }\n if (question.getType() == \"checkbox\") {\n var qValue = question.value;\n question.visibleChoices.forEach(function (item) {\n var inEl = $el.find(\n \"input[value='\" + escValue(item.value) + \"']\"\n );\n if (!inEl) return;\n var isChecked = getIndexByValue(qValue, item.value) > -1;\n if (isChecked) {\n inEl.iCheck(\"check\");\n } else {\n var cEl = inEl[0];\n var wasChecked = !!cEl[\"checked\"];\n if (wasChecked) {\n inEl.removeAttr(\"checked\");\n if (!inEl.parent().hasClass(\"checked\"))\n setTimeout(function () {\n uncheckIcheck(inEl);\n });\n else uncheckIcheck(inEl);\n }\n }\n });\n } else {\n values.forEach(function (value) {\n $el\n .find(\"input[value='\" + escValue(value) + \"']\")\n .iCheck(\"check\");\n });\n }\n } else {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.value) {\n $(el)\n .find(\n \"input[name='\" +\n row.fullName +\n \"'][value='\" +\n escValue(row.value) +\n \"']\"\n )\n .iCheck(\"check\");\n }\n });\n }\n frozeUpdating = false;\n };\n makeChoicesICheck();\n\n question.visibleChoicesChangedCallback = function () {\n makeChoicesICheck();\n $el.find(\".sv-item__decorator\").hide();\n };\n question.valueChangedCallback = select;\n select();\n },\n willUnmount: function (question, el) {\n var $el = $(el);\n $el.find(\"input\").iCheck(\"destroy\");\n question.visibleChoicesChangedCallback = null;\n },\n };\n\n Survey.JsonObject.metaData.addProperty(\"radiogroup\", {\n name: \"radioClass\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"checkbox\", {\n name: \"checkboxClass\",\n category: \"general\",\n });\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"type\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n activatedBy: \"property\",\n name: \"select2\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n isFit: function (question) {\n if (widget.activatedBy == \"property\")\n return (\n question[\"renderAs\"] === \"select2\" &&\n question.getType() === \"dropdown\"\n );\n if (widget.activatedBy == \"type\")\n return question.getType() === \"dropdown\";\n if (widget.activatedBy == \"customtype\")\n return question.getType() === \"select2\";\n return false;\n },\n activatedByChanged: function (activatedBy) {\n if (!this.widgetIsLoaded()) return;\n widget.activatedBy = activatedBy;\n Survey.JsonObject.metaData.removeProperty(\"dropdown\", \"renderAs\");\n if (activatedBy == \"property\") {\n Survey.JsonObject.metaData.addProperty(\"dropdown\", {\n name: \"renderAs\",\n category: \"general\",\n default: \"default\",\n choices: [\"select2\", \"default\"],\n });\n Survey.JsonObject.metaData.addProperty(\"dropdown\", {\n dependsOn: \"renderAs\",\n category: \"general\",\n name: \"select2Config\",\n visibleIf: function (obj) {\n return obj.renderAs == \"select2\";\n },\n });\n }\n if (activatedBy == \"customtype\") {\n Survey.JsonObject.metaData.addClass(\"select2\", [], null, \"dropdown\");\n Survey.JsonObject.metaData.addProperty(\"select2\", {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n }\n },\n htmlTemplate:\n \"
\",\n afterRender: function (question, el) {\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n if (!settings) settings = {};\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n var $otherElement = $(el).find(\"textarea\");\n $otherElement.addClass(question.cssClasses.other);\n $otherElement.bind(\"input propertychange\", function () {\n if (isSettingValue) return;\n question.comment = $otherElement.val();\n });\n\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n var isSettingValue = false;\n var updateValueHandler = function () {\n if (isSettingValue) return;\n isSettingValue = true;\n if ($el.find('option[value=\"' + (question.value || \"\") + '\"]').length) {\n $el.val(question.value).trigger(\"change\");\n } else {\n if (\n question.value !== null &&\n question.value !== undefined &&\n !question.isOtherSelected\n ) {\n var newOption = new Option(\n question.value, //TODO if question value is object then need to improve\n question.value,\n true,\n true\n );\n $el.append(newOption).trigger(\"change\");\n }\n }\n updateComment();\n isSettingValue = false;\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (!settings.placeholder && question.showOptionsCaption) {\n settings.placeholder = question.optionsCaption;\n settings.allowClear = true;\n }\n if (!settings.theme) {\n settings.theme = \"classic\";\n }\n settings.disabled = question.isReadOnly;\n if (settings.ajax) {\n $el.select2(settings);\n question.keepIncorrectValues = true;\n } else {\n var data = [];\n if (!!settings.placeholder || question.showOptionsCaption) {\n data.push({ id: \"\", text: \"\" });\n }\n settings.data = data.concat(\n question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n })\n );\n question.clearIncorrectValues();\n $el.select2(settings);\n }\n // fixed width accrording to https://stackoverflow.com/questions/45276778/select2-not-responsive-width-larger-than-container\n if (!!el.querySelector(\".select2\")) {\n el.querySelector(\".select2\").style.width = \"100%\";\n }\n if (!!el.nextElementSibling) {\n el.nextElementSibling.style.marginBottom = \"1px\";\n }\n updateValueHandler();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n function () {\n updateChoices();\n }\n );\n updateChoices();\n $el.on(\"change\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:select\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:opening\", function (e) {\n if ($(this).data(\"unselecting\")) {\n $(this).removeData(\"unselecting\");\n e.preventDefault();\n }\n });\n $el.on(\"select2:unselecting\", function (e) {\n $(this).data(\"unselecting\", true);\n setTimeout(function () {\n question.renderedValue = null;\n updateComment();\n }, 1);\n });\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(\"select2\")) {\n $select2\n .off(\"select2:select\")\n .off(\"select2:unselecting\")\n .off(\"select2:opening\")\n .select2(\"destroy\");\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","import Inputmask from \"inputmask\";\n\nfunction init(Survey) {\n var widget = {\n name: \"maskedit\",\n numericGroupSeparator: \",\",\n numericRadixPoint: undefined,\n numericAutoGroup: true,\n numericDigits: 2,\n numericDigitsOptional: false,\n numericPlaceholder: \"0\",\n autoUnmask: true,\n clearIncomplete: true,\n widgetIsLoaded: function () {\n return typeof Inputmask != \"undefined\";\n },\n isFit: function (question) {\n if (question.getType() == \"multipletext\") return true;\n return (\n question.getType() == \"text\" &&\n (question.inputMask != \"none\" || question.inputFormat)\n );\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (Survey.JsonObject.metaData.findProperty(\"text\", \"inputMask\")) return;\n var properties = [\n {\n name: \"autoUnmask:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"clearIncomplete:boolean\",\n category: \"general\",\n default: true,\n },\n { name: \"inputFormat\", category: \"general\" },\n {\n name: \"inputMask\",\n category: \"general\",\n default: \"none\",\n choices: [\n \"none\",\n \"datetime\",\n \"currency\",\n \"decimal\",\n \"email\",\n \"phone\",\n \"ip\",\n ],\n },\n {\n name: \"numericDigits\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"options\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"prefix\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"suffix\",\n category: \"general\",\n visible: false,\n },\n ];\n Survey.JsonObject.metaData.addProperties(\"text\", properties);\n Survey.JsonObject.metaData.addProperties(\n \"matrixdropdowncolumn\",\n properties\n );\n Survey.JsonObject.metaData.addProperties(\"multipletextitem\", properties);\n },\n applyInputMask: function (surveyElement, el) {\n var rootWidget = this;\n var mask =\n surveyElement.inputMask !== \"none\"\n ? surveyElement.inputMask\n : surveyElement.inputFormat;\n var options = {};\n if (typeof surveyElement.options === \"object\") {\n for (var option in surveyElement.options) {\n options[option] = surveyElement.options[option];\n }\n }\n options.autoUnmask = typeof surveyElement.autoUnmask !== \"undefined\"\n ? surveyElement.autoUnmask\n : rootWidget.autoUnmask;\n options.clearIncomplete = typeof surveyElement.clearIncomplete !== \"undefined\"\n ? surveyElement.clearIncomplete\n : rootWidget.clearIncomplete;\n if (surveyElement.inputMask !== \"none\") {\n options.inputFormat = surveyElement.inputFormat;\n }\n if (\n surveyElement.inputMask === \"currency\" ||\n surveyElement.inputMask === \"decimal\"\n ) {\n options.groupSeparator = rootWidget.numericGroupSeparator;\n options.radixPoint = rootWidget.numericRadixPoint;\n options.autoGroup = rootWidget.numericAutoGroup;\n }\n if (surveyElement.inputMask === \"currency\") {\n options.digits = surveyElement.numericDigits || rootWidget.numericDigits;\n options.digitsOptional = rootWidget.numericDigitsOptional;\n options.prefix = surveyElement.prefix || \"\";\n options.suffix = surveyElement.suffix || \"\";\n options.placeholder = rootWidget.numericPlaceholder;\n }\n // if (surveyElement.inputMask == \"datetime\") {\n // mask = surveyElement.inputFormat;\n // }\n if (surveyElement.inputMask === \"phone\" && !!surveyElement.inputFormat) {\n mask = surveyElement.inputFormat;\n }\n\n Inputmask(mask, options).mask(el);\n\n el.onblur = function () {\n if (!el.inputmask) return;\n if (surveyElement.value === el.inputmask.getemptymask()) {\n surveyElement.value = \"\";\n }\n };\n\n var customWidgetData =\n surveyElement.getType() === \"multipletextitem\"\n ? surveyElement.editorValue.customWidgetData\n : surveyElement.customWidgetData;\n el.oninput = function () {\n customWidgetData.isNeedRender = true;\n };\n\n var pushValueHandler = function () {\n if (!el.inputmask) return;\n if (el.inputmask.isComplete()) {\n surveyElement.value = options.autoUnmask\n ? el.inputmask.unmaskedvalue()\n : el.value;\n } else {\n surveyElement.value = null;\n }\n };\n el.onfocusout = el.onchange = pushValueHandler;\n\n var updateHandler = function () {\n el.value =\n surveyElement.value === undefined || surveyElement.value === null\n ? \"\"\n : surveyElement.value;\n };\n surveyElement.valueChangedCallback = updateHandler;\n updateHandler();\n },\n afterRender: function (question, el) {\n if (question.getType() != \"multipletext\") {\n var input = el.querySelector(\"input\") || el;\n this.applyInputMask(question, input);\n } else {\n for (var i = 0; i < question.items.length; i++) {\n var item = question.items[i];\n if (item.inputMask != \"none\" || item.inputFormat) {\n var input = el.querySelector(\"#\" + item.editor.inputId);\n if (input) {\n this.applyInputMask(item, input);\n }\n }\n }\n }\n },\n willUnmount: function (question, el) {\n var input = el.querySelector(\"input\") || el;\n if (!!input && !!input.inputmask) {\n input.inputmask.remove();\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-barrating\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/barrating.svg'), \"\");\n $ = $ || window.$;\n var widget = {\n name: \"barrating\",\n title: \"Bar rating\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.barrating;\n },\n defaultJSON: { choices: [1, 2, 3, 4, 5] },\n isFit: function (question) {\n return question.getType() === \"barrating\";\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"barrating\",\n [\n { name: \"hasOther\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"optionsCaption\", visible: false },\n { name: \"otherErrorText\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"select2Config\", visible: false },\n ],\n null,\n \"dropdown\"\n );\n Survey.JsonObject.metaData.addProperty(\"barrating\", {\n name: \"showValues:boolean\",\n default: false,\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"barrating\", {\n name: \"ratingTheme\",\n category: \"general\",\n default: \"css-stars\",\n choices: [\n \"fontawesome-stars\",\n \"css-stars\",\n \"bars-pill\",\n \"bars-1to10\",\n \"bars-movie\",\n \"bars-reversed\",\n \"bars-horizontal\",\n \"fontawesome-stars-o\",\n ],\n });\n },\n afterRender: function (question, el) {\n var $customSelect;\n var $questionInput;\n var contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()[0]\n : $(el).parent()[0];\n var renderCustomSelect = function () {\n $customSelect = $(\"\");\n question.visibleChoices.forEach(function (choice) {\n $customSelect.append(\n ''.format(choice.value, choice.text)\n );\n });\n $questionInput = $(contentContainer).find(\n '[id=\"{0}\"]'.format(question.inputId)\n );\n\n $questionInput.css(\"display\", \"none\");\n $questionInput.after($customSelect);\n $customSelect[0].selectedIndex = -1;\n };\n var removeCustomSelect = function () {\n $questionInput.css(\"display\", \"\");\n $customSelect.barrating(\"destroy\");\n $customSelect.remove();\n };\n var renderBarrating = function () {\n $customSelect.barrating(\"show\", {\n theme: question.ratingTheme,\n initialRating: question.value,\n showValues: question.showValues,\n showSelectedRating: false,\n readonly: question.isReadOnly,\n onSelect: function (value, text) {\n valueChangingByWidget = true;\n question.value = value;\n valueChangingByWidget = false;\n },\n });\n };\n renderCustomSelect();\n renderBarrating();\n if (!!$customSelect.parents()[0])\n $customSelect.parents()[0].style.marginBottom = \"3px\";\n var valueChangingByWidget = false;\n\n question.valueChangedCallback = function () {\n if (\n !valueChangingByWidget &&\n $(contentContainer).find(\"select.sv-widget-select\")[0].value !==\n question.value\n ) {\n $(contentContainer)\n .find(\"select.sv-widget-select\")\n .barrating(\"set\", question.value);\n }\n };\n question.__barratingOnPropertyChangedCallback = function (\n sender,\n options\n ) {\n if (options.name === \"ratingTheme\" || options.name === \"showValues\") {\n $customSelect.barrating(\"destroy\");\n renderBarrating();\n }\n };\n question.onPropertyChanged.add(\n question.__barratingOnPropertyChangedCallback\n );\n question.readOnlyChangedCallback = function () {\n removeCustomSelect();\n renderCustomSelect();\n renderBarrating();\n };\n question.visibleChoicesChangedCallback = function () {\n renderBarrating();\n };\n },\n willUnmount: function (question, el) {\n var $contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()\n : $(el).parent();\n var $el = $contentContainer.find(\"select.sv-widget-select\");\n $el.barrating(\"destroy\");\n $el.remove();\n question.valueChangedCallback = undefined;\n question.onPropertyChanged.remove(\n question.__barratingOnPropertyChangedCallback\n );\n question.__barratingOnPropertyChangedCallback = undefined;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-datepicker\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/datepicker.svg'), \"\");\n $ = $ || window.$;\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: \"datepicker\",\n title: \"Date picker\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.datepicker && !$.fn.datepicker.noConflict;\n },\n isFit: function (question) {\n return question.getType() === \"datepicker\";\n },\n htmlTemplate: \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"datepicker\",\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"dateFormat\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"config\",\n category: \"general\",\n visible: false,\n default: null,\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"maxDate\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"minDate\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"disableInput:boolean\",\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.addClass(question.css.text.root);\n var isSelecting = false;\n var config = $.extend(true, {}, question.config || {});\n if (!!question.placeHolder) {\n $el.attr(\"placeholder\", question.placeHolder);\n }\n if (config.dateFormat === undefined) {\n config.dateFormat = !!question.dateFormat\n ? question.dateFormat\n : undefined;\n }\n if (config.option === undefined) {\n config.option = {\n minDate: null,\n maxDate: null,\n };\n }\n if (!!question.minDate) {\n config.minDate = question.minDate;\n }\n if (!!question.maxDate) {\n config.maxDate = question.maxDate;\n }\n if (!!question.renderedMin) {\n config.minDate = new Date(question.renderedMin);\n }\n if (!!question.renderedMax) {\n config.maxDate = new Date(question.renderedMax);\n }\n config.disabled = question.isReadOnly;\n if (config.onSelect === undefined) {\n config.onSelect = function (dateText) {\n isSelecting = true;\n setDateIntoQuestion();\n isSelecting = false;\n this.fixFocusIE = true;\n };\n }\n config.fixFocusIE = false;\n config.onClose = function (dateText, inst) {\n this.fixFocusIE = true;\n };\n config.beforeShow = function (input, inst) {\n var result = !!navigator.userAgent.match(/Trident\\/7\\./)\n ? !this.fixFocusIE\n : true;\n this.fixFocusIE = false;\n return result;\n };\n function setDateIntoQuestion() {\n question.value = $el.datepicker('getDate');\n }\n var pickerWidget = $el.datepicker(config).on(\"change\", function (e) {\n setDateIntoQuestion();\n });\n\n $el.keyup(function (e) {\n if (e.keyCode == 8 || e.keyCode == 46) {\n $.datepicker._clearDate(this);\n }\n });\n if(question.disableInput) {\n $el.attr(\"readOnly\", \"true\");\n }\n\n question.readOnlyChangedCallback = function () {\n $el.datepicker(\"option\", \"disabled\", question.isReadOnly);\n };\n function updateDate() {\n if (!question.isEmpty()) {\n var val = question.value;\n if(typeof val === \"string\") {\n val = new Date(val);\n }\n pickerWidget.datepicker(\"setDate\", val);\n } else {\n pickerWidget.datepicker(\"setDate\", null);\n }\n }\n question.registerFunctionOnPropertyValueChanged(\n \"dateFormat\",\n function () {\n question.dateFormat &&\n pickerWidget.datepicker(\n \"option\",\n \"dateFormat\",\n question.dateFormat\n );\n updateDate();\n }\n );\n question.valueChangedCallback = function () {\n if (!isSelecting) {\n updateDate();\n $el.blur();\n }\n };\n question.valueChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.datepicker(\"destroy\");\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","module.exports = \"\"","import noUiSlider from \"nouislider\";\n\nfunction init(Survey) {\n const iconId = \"icon-nouislider\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/nouislider.svg'), \"\");\n var widget = {\n name: \"nouislider\",\n title: \"noUiSlider\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof noUiSlider != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"nouislider\";\n },\n htmlTemplate:\n \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"nouislider\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperties(\"nouislider\", [\n {\n name: \"step:number\",\n category: \"slider\",\n categoryIndex: 1,\n default: 1,\n },\n {\n name: \"rangeMin:number\",\n category: \"slider\",\n default: 0,\n },\n {\n name: \"rangeMax:number\",\n category: \"slider\",\n default: 100,\n },\n {\n name: \"pipsMode\",\n category: \"slider\",\n default: \"positions\",\n },\n {\n name: \"pipsValues:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsText:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsDensity:number\",\n category: \"slider\",\n default: 5,\n },\n {\n name: \"orientation\",\n category: \"slider\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"]\n },\n {\n name: \"direction:string\",\n category: \"slider\",\n default: \"ltr\",\n },\n {\n name: \"tooltips:boolean\",\n category: \"slider\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n el.style.paddingBottom = \"19px\";\n el.style.paddingLeft = \"20px\";\n el.style.paddingRight = \"20px\";\n el.style.paddingTop = \"44px\";\n el = el.children[0];\n el.style.marginBottom = \"60px\";\n if (question.orientation === \"vertical\") {\n el.style.height = \"250px\";\n el.style.marginLeft = \"60px\";\n }\n var slider = noUiSlider.create(el, {\n start: question.rangeMin <= question.value && question.value <= question.rangeMax ? \n question.value : (question.rangeMin + question.rangeMax) / 2,\n connect: [true, false],\n step: question.step,\n tooltips: question.tooltips,\n pips: {\n mode: question.pipsMode || \"positions\",\n values: question.pipsValues.map(function (pVal) {\n var pipValue = pVal;\n if (pVal.value !== undefined) {\n pipValue = pVal.value;\n }\n return parseInt(pipValue);\n }),\n density: question.pipsDensity || 5,\n format: {\n to: function (pVal) {\n var pipText = pVal;\n question.pipsText.map(function (el) {\n if (el.text !== undefined && pVal === el.value) {\n pipText = el.text;\n }\n });\n return pipText;\n },\n },\n },\n range: {\n min: question.rangeMin,\n max: question.rangeMax,\n },\n orientation: question.orientation,\n direction: question.direction,\n });\n slider.on(\"change\", function () {\n question.value = Number(slider.get());\n });\n question.updateSliderProperties = function () {\n const elems = document.getElementsByClassName(\"noUi-pips\");\n if (elems.length > 0) elems[elems.length - 1].style.display = \"none\";\n if (elems.length > 1) elems[elems.length - 2].style.display = \"none\";\n var getStart = function(currentStart) {\n return question.rangeMin + Math.round((currentStart - question.rangeMin) / question.step) * question.step;\n }\n slider.updateOptions(\n { step: question.step,\n start: question.rangeMin <= question.value && question.value <= question.rangeMax ? \n getStart(question.value) : getStart((question.rangeMin + question.rangeMax) / 2),\n range: {\n min: question.rangeMin,\n max: question.rangeMax\n }\n }, true);\n slider.pips(\n { mode: question.pipsMode || \"positions\",\n values: question.pipsValues.map(function (pVal) {\n var pipValue = pVal;\n if (pVal.value !== undefined) {\n pipValue = pVal.value;\n }\n return parseInt(pipValue);\n }),\n density: question.pipsDensity || 5,\n format: {\n to: function (pVal) {\n var pipText = pVal;\n question.pipsText.map(function (el) {\n if (el.text !== undefined && pVal === el.value) {\n pipText = el.text;\n }\n });\n return pipText;\n },\n },\n });\n };\n var updateValueHandler = function () {\n slider.set(question.value);\n };\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n }\n updateValueHandler();\n question.noUiSlider = slider;\n question.registerFunctionOnPropertiesValueChanged(\n [\"pipsValues\", \"step\", \"rangeMin\", \"rangeMax\", \"pipsMode\", \"pipsDensity\"],\n question.updateSliderProperties\n );\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n } else {\n el.removeAttribute(\"disabled\");\n }\n };\n },\n willUnmount: function (question, el) {\n if (!!question.noUiSlider) {\n question.noUiSlider.destroy();\n question.noUiSlider = null;\n }\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n \n if (!question.updateSliderProperties) return;\n question.unRegisterFunctionOnPropertiesValueChanged(\n [\"pipsValues\", \"step\", \"rangeMin\", \"rangeMax\", \"pipsMode\", \"pipsDensity\"],\n question.updateSliderProperties\n );\n question.updateSliderProperties = undefined\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === \"nouislider\") {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n var textboxBrick = new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n options.question.value || options.question.defaultValue || \"\",\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n );\n options.bricks.push(textboxBrick);\n }\n },\n };\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-tagbox\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/tagbox.svg'), \"\");\n $ = $ || window.$;\n var widget = {\n name: \"tagbox\",\n title: \"Tag box\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n defaultJSON: {\n choices: [\"Item 1\", \"Item 2\", \"Item 3\"],\n },\n htmlTemplate:\n \"
\",\n isFit: function (question) {\n return question.getType() === \"tagbox\";\n },\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"tagbox\",\n [\n { name: \"hasOther:boolean\", visible: false },\n { name: \"hasSelectAll:boolean\", visible: false },\n { name: \"hasNone:boolean\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"selectAllText\", visible: false },\n { name: \"noneText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"placeholder\",\n category: \"general\",\n default: \"\",\n });\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"allowAddNewTag:boolean\",\n category: \"general\",\n default: false,\n });\n },\n fixStyles: function (el) {\n el.parentElement.querySelector(\".select2-search__field\").style.border =\n \"none\";\n },\n afterRender: function (question, el) {\n var self = this;\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n\n self.willUnmount(question, el);\n\n if (!settings) settings = {};\n settings.placeholder = question.placeholder;\n settings.tags = question.allowAddNewTag;\n if (question.allowAddNewTag) {\n question.keepIncorrectValues = true;\n }\n settings.disabled = question.isReadOnly;\n settings.theme = \"classic\";\n if (!!question.maxSelectedChoices) {\n settings.maximumSelectionLength = question.maxSelectedChoices;\n }\n\n $el.select2(settings);\n\n var $otherElement = $(el).find(\"textarea\");\n if (\n !!question.survey &&\n !!question.survey.css &&\n !!question.survey.css.checkbox\n ) {\n $otherElement.addClass(question.survey.css.checkbox.other);\n }\n $otherElement.placeholder = question.otherPlaceHolder;\n $otherElement.bind(\"input propertychange\", function () {\n question.comment = $otherElement.val();\n });\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n\n self.fixStyles(el);\n var question;\n var updateValueHandler = function () {\n if (question.hasSelectAll && question.isAllSelected) {\n $el\n .val([question.selectAllItemValue.value].concat(question.value))\n .trigger(\"change\");\n } else {\n $el.val(question.value).trigger(\"change\");\n }\n self.fixStyles(el);\n updateComment();\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (settings.ajax) {\n $el.select2(settings);\n } else {\n settings.data = question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n });\n $el.select2(settings);\n }\n updateValueHandler();\n };\n var isAllItemSelected = function (value) {\n return (\n question.hasSelectAll && value === question.selectAllItemValue.value\n );\n };\n question._propertyValueChangedFnSelect2 = function () {\n updateChoices();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question.valueChangedCallback = updateValueHandler;\n $el.on(\"select2:select\", function (e) {\n if (isAllItemSelected(e.params.data.id)) {\n question.selectAll();\n } else {\n question.value = (question.value || []).concat(e.params.data.id);\n }\n updateComment();\n });\n $el.on(\"select2:unselect\", function (e) {\n const select2Val = e.params.data.id;\n if (isAllItemSelected(select2Val)) {\n question.clearValue();\n } else {\n const val = [].concat(question.renderedValue);\n if (Array.isArray(val)) {\n for (var i = 0; i < val.length; i++) {\n if (val[i] == select2Val || (!!val[i] && val[i].toString() == select2Val)) {\n val.splice(i, 1);\n question.renderedValue = val;\n break;\n }\n }\n }\n }\n updateComment();\n });\n updateChoices();\n },\n willUnmount: function (question, el) {\n if (!question._propertyValueChangedFnSelect2) return;\n\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(\"select2\")) {\n $select2.off(\"select2:select\").select2(\"destroy\");\n }\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n question.unRegisterFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question._propertyValueChangedFnSelect2 = undefined;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","import Sortable from \"sortablejs\";\n\nfunction init(Survey) {\n const iconId = \"icon-sortablejs\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/sortablejs.svg'), \"\");\n var widget = {\n name: \"sortablelist\",\n title: \"Sortable list\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof Sortable != \"undefined\";\n },\n defaultJSON: { choices: [\"Item 1\", \"Item 2\", \"Item 3\"] },\n rootStyle: \"width:100%:\",\n areaStyle:\n \"border: 1px solid #1ab394; width:100%; min-height:50px; margin-top:10px;\",\n itemStyle: \"background-color:#1ab394;color:#fff;margin:5px;padding:10px;\",\n isFit: function (question) {\n return question.getType() === \"sortablelist\";\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"sortablelist\",\n [\n { name: \"hasOther\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"hasNone\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"checkboxClass\", visible: false },\n { name: \"hasSelectAll\", visible: false },\n { name: \"noneText\", visible: false },\n { name: \"selectAllText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"emptyText\",\n default: \"Move items here.\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"useDefaultTheme:switch\",\n default: true,\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"maxAnswersCount:number\",\n default: -1,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var self = this;\n\n if (!question.useDefaultTheme) {\n self.rootStyle = \"\";\n self.itemStyle = \"\";\n self.areaStyle = \"\";\n }\n el.style.cssText = self.rootStyle;\n el.className = \"sjs-sortablejs-root\";\n var source, result;\n var resultEl = document.createElement(\"div\");\n var emptyEl = document.createElement(\"span\");\n var sourceEl = document.createElement(\"div\");\n\n resultEl.style.cssText = self.areaStyle;\n resultEl.style.boxSizing = \"border-box\";\n resultEl.className = \"sjs-sortablejs-result\";\n\n emptyEl.innerHTML = question.emptyText;\n resultEl.appendChild(emptyEl);\n\n sourceEl.style.cssText = self.areaStyle;\n sourceEl.style.boxSizing = \"border-box\";\n sourceEl.className = \"sjs-sortablejs-source\";\n el.appendChild(resultEl);\n el.appendChild(sourceEl);\n var hasValueInResults = function (val) {\n var res = question.value;\n if (!Array.isArray(res)) return false;\n for (var i = 0; i < res.length; i++) {\n if (res[i] == val) return true;\n }\n return false;\n };\n var addChoiceToWidget = function (choice, inResults) {\n var srcEl = inResults ? resultEl : sourceEl;\n var newEl = document.createElement(\"div\");\n newEl.className = \"sjs-sortablejs-item\";\n newEl.style.cssText = self.itemStyle;\n newEl.innerText = choice.text;\n newEl.dataset[\"value\"] = choice.value;\n srcEl.appendChild(newEl);\n choice.onPropertyChanged.add(function (sender, options) {\n newEl.innerText = sender.text;\n });\n };\n var getChoicesNotInResults = function () {\n var res = [];\n question.visibleChoices.forEach(function (choice) {\n if (!hasValueInResults(choice.value)) {\n res.push(choice);\n }\n });\n return res;\n };\n var getChoicesInResults = function () {\n var res = [];\n var val = question.value;\n if (!Array.isArray(val)) return res;\n for (var i = 0; i < val.length; i++) {\n var item = Survey.ItemValue.getItemByValue(\n question.visibleChoices,\n val[i]\n );\n if (!!item) {\n res.push(item);\n }\n }\n return res;\n };\n var isUpdatingQuestionValue = false;\n var updateValueHandler = function () {\n if (isUpdatingQuestionValue) return;\n resultEl.innerHTML = \"\";\n resultEl.appendChild(emptyEl);\n sourceEl.innerHTML = \"\";\n var notInResults = getChoicesNotInResults();\n var inResults = getChoicesInResults();\n emptyEl.style.display = inResults.length > 0 ? \"none\" : \"\";\n inResults.forEach(function (choice) {\n addChoiceToWidget(choice, true);\n });\n notInResults.forEach(function (choice) {\n addChoiceToWidget(choice, false);\n });\n };\n result = question.resultEl = Sortable.create(resultEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: {\n name: question.name,\n put: function (to, from) {\n return (\n to.options.group && from.options.group && to.options.group.name === from.options.group.name &&\n (question.maxAnswersCount < 0 ||\n to.el.children.length <= question.maxAnswersCount)\n );\n },\n },\n onSort: function (evt) {\n var result = [];\n if (resultEl.children.length === 1) {\n emptyEl.style.display = \"\";\n } else {\n emptyEl.style.display = \"none\";\n for (var i = 0; i < resultEl.children.length; i++) {\n if (typeof resultEl.children[i].dataset.value === \"undefined\")\n continue;\n result.push(resultEl.children[i].dataset.value);\n }\n }\n isUpdatingQuestionValue = true;\n question.value = result;\n isUpdatingQuestionValue = false;\n },\n });\n source = question.sourceEl = Sortable.create(sourceEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: question.name,\n });\n question.valueChangedCallback = updateValueHandler;\n question.onPropertyChanged.add(function (sender, options) {\n if (options.name == \"emptyText\") {\n emptyEl.innerHTML = question.emptyText;\n }\n });\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n result.options.disabled = true;\n source.options.disabled = true;\n } else {\n result.options.disabled = false;\n source.options.disabled = false;\n }\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n updateValueHandler\n );\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.resultEl.destroy();\n question.sourceEl.destroy();\n question.readOnlyChangedCallback = null;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey) {\n const iconId = \"icon-editor\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader!./images/editor.svg'), \"\");\n var widget = {\n name: \"editor\",\n title: \"Editor\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof CKEDITOR != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"editor\";\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"editor\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperty(\"editor\", {\n name: \"height\",\n default: 300,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var name = question.inputId;\n CKEDITOR.editorConfig = function (config) {\n config.language = \"es\";\n config.height = question.height;\n config.toolbarCanCollapse = true;\n };\n el.name = name;\n\n if (CKEDITOR.instances[name]) {\n CKEDITOR.instances[name].removeAllListeners();\n CKEDITOR.remove(CKEDITOR.instances[name]);\n }\n\n var editor = CKEDITOR.replace(el);\n CKEDITOR.instances[name].config.readOnly = question.isReadOnly;\n\n var isValueChanging = false;\n var updateValueHandler = function () {\n if (isValueChanging || typeof question.value === \"undefined\") return;\n editor.setData(question.value);\n };\n editor.on(\"change\", function () {\n isValueChanging = true;\n question.value = editor.getData();\n isValueChanging = false;\n });\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n editor.setReadOnly(true);\n } else {\n editor.setReadOnly(false);\n }\n };\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n CKEDITOR.instances[question.inputId].destroy(false);\n },\n pdfRender: function (survey, options) {\n if (options.question.getType() === \"editor\") {\n const loc = new Survey.LocalizableString(survey, true);\n loc.text = options.question.value || options.question.defaultValue;\n options.question[\"locHtml\"] = loc;\n if (\n options.question.renderAs === \"standard\" ||\n options.question.renderAs === \"image\"\n ) {\n options.question[\"renderAs\"] = options.question.renderAs;\n } else options.question[\"renderAs\"] = \"auto\";\n const flatHtml = options.repository.create(\n survey,\n options.question,\n options.controller,\n \"html\"\n );\n return new Promise(function (resolve) {\n flatHtml.generateFlats(options.point).then(function (htmlBricks) {\n options.bricks = htmlBricks;\n resolve();\n });\n });\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n name: \"autocomplete\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.easyAutocomplete;\n },\n isFit: function (question) {\n return question.getType() === \"text\";\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (\n Survey.JsonObject.metaData.findProperty(\"text\", \"choices\") !== null ||\n Survey.JsonObject.metaData.findProperty(\"text\", \"choicesByUrl\") !== null\n ) {\n return;\n }\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"choices:itemvalues\",\n category: \"choices\",\n categoryIndex: 1,\n });\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"choicesByUrl:restfull\",\n className: \"ChoicesRestfull\",\n category: \"choicesByUrl\",\n categoryIndex: 2,\n });\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"config\",\n category: \"general\",\n default: null,\n });\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\"input\") ? $(el) : $(el).find(\"input\");\n\n var getCssSelectorFromClassesString = function (classesString) {\n if (!classesString) return \"\";\n var cssSelector = classesString.replace(/(^\\s*)|(\\s+)/g, \".\"); // replace whitespaces with '.'\n return cssSelector;\n };\n\n var questionRootClasses = getCssSelectorFromClassesString(\n question.cssRoot\n );\n\n var questionRoot = $el.parents(questionRootClasses)[0];\n if (!!questionRootClasses && !!questionRoot) {\n questionRoot.style.overflow = \"visible\";\n }\n\n var config = question.config;\n var options =\n config && typeof config == \"string\" ? JSON.parse(config) : config;\n if (!options) options = {};\n\n options.data = (question.choices || []).map(function (item) {\n return item.text;\n });\n if (options.adjustWidth === undefined) {\n options.adjustWidth = false;\n }\n if (!options.list) {\n options.list = {\n sort: {\n enabled: true,\n method: (aStr, bStr) => {\n const inputStr = $el.val().toLowerCase();\n const aIndex = aStr.toLowerCase().indexOf(inputStr);\n const bIndex = bStr.toLowerCase().indexOf(inputStr);\n return aIndex - bIndex;\n }\n },\n match: {\n enabled: true,\n },\n onChooseEvent: function () {\n var selectedData = $el.getSelectedItemData();\n if(!!selectedData && typeof selectedData === \"object\" \n && !!question.choicesByUrl && !!question.choicesByUrl.valueName) {\n selectedData = selectedData[question.choicesByUrl.valueName];\n }\n question.value = selectedData;\n },\n };\n }\n if (!options.placeholder) {\n options.placeholder = question.placeholder;\n }\n\n if (!!question.choicesByUrl) {\n options.url = function (phrase) {\n return question.choicesByUrl.url;\n };\n options.getValue = question.choicesByUrl.valueName;\n // options.ajaxSettings = {\n // dataType: \"jsonp\"\n // };\n }\n $el.easyAutocomplete(options);\n\n $el[0].oninput = function () {\n question.customWidgetData.isNeedRender = true;\n };\n var updateHandler = function () {\n $el[0].value =\n typeof question.value === \"undefined\" ? \"\" : question.value;\n };\n question.valueChangedCallback = updateHandler;\n updateHandler();\n },\n willUnmount: function (question, el) {\n // var $el = $(el).find(\"input\");\n // $el.autocomplete(\"destroy\");\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"type\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","function init(Survey) {\n var widget = {\n settings: {\n supportedTypes: [\"radiogroup\", \"checkbox\", \"boolean\"],\n radiogroup: {\n rootClass: \"pretty p-default p-round\",\n inputType: \"radio\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n checkbox: {\n rootClass: \"pretty p-default\",\n inputType: \"checkbox\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n boolean: {\n rootClass: \"pretty p-icon p-default p-has-indeterminate\",\n inputType: \"checkbox\",\n states: [\n { stateClass: \"state p-success\", addOn: \"\" },\n {\n stateClass: \"state p-success p-is-indeterminate\",\n iconClass: \"icon mdi mdi-minus\",\n addOn: \"\",\n },\n ],\n },\n },\n name: \"pretty-checkbox\",\n activatedBy: \"property\",\n widgetIsLoaded: function () {\n return true;\n },\n htmlTemplate: \"
\",\n isFit: function (question) {\n var isFitByType =\n widget.settings.supportedTypes.indexOf(question.getType()) !== -1;\n\n if (widget.activatedBy === \"property\") {\n return question[\"renderAs\"] === \"prettycheckbox\" && isFitByType;\n } else if (widget.activatedBy === \"type\") {\n return isFitByType;\n }\n\n return false;\n },\n activatedByChanged: function (value) {\n if (this.widgetIsLoaded()) {\n widget.activatedBy = value;\n widget.settings.supportedTypes.forEach(function (supportedType) {\n Survey.JsonObject.metaData.removeProperty(supportedType, \"renderAs\");\n\n if (value === \"property\") {\n Survey.JsonObject.metaData.addProperty(supportedType, {\n name: \"renderAs\",\n category: \"general\",\n default: \"default\",\n choices: [\"default\", \"prettycheckbox\"],\n });\n }\n });\n }\n },\n isDefaultRender: false,\n afterRender: function (question, element) {\n var itemInputs = {};\n var questionType = question.getType();\n var options = this.settings[questionType];\n var checkboxType = questionType === \"checkbox\";\n var radiogroupType = questionType === \"radiogroup\";\n var booleanType = questionType === \"boolean\";\n\n var inChangeHandler = false;\n var changeHandler = function (event) {\n inChangeHandler = true;\n try {\n var target = arguments[0].target;\n var targetValue = target.value;\n var targetChecked = target.checked;\n\n if (checkboxType) {\n var questionValue = question.createValueCopy() || [];\n var valueIndex = questionValue.indexOf(targetValue);\n if (targetChecked) {\n if (valueIndex === -1) {\n questionValue.push(targetValue);\n }\n } else {\n if (valueIndex !== -1) {\n questionValue.splice(valueIndex, 1);\n }\n }\n\n question.value = questionValue;\n } else if (radiogroupType) {\n question.value = targetValue;\n } else {\n question.value = targetChecked;\n }\n } finally {\n inChangeHandler = false;\n }\n };\n\n var itemWidth =\n question.colCount > 0 ? 100 / question.colCount + \"%\" : \"\";\n\n var choices = booleanType\n ? [{ locText: question.locTitle, value: !!question.value }]\n : question.visibleChoices;\n choices.forEach(function (choiceItem, index) {\n var input = document.createElement(\"input\");\n input.type = options.inputType;\n input.name = question.name + (checkboxType ? \"\" + index : \"\");\n input.onchange = changeHandler;\n input.value = choiceItem.value;\n\n if (booleanType && question.value === null) {\n input.indeterminate = question.defaultValue === \"indeterminate\";\n }\n\n var controlRoot = document.createElement(\"div\");\n controlRoot.className = options.rootClass;\n controlRoot.appendChild(input);\n\n options.states.forEach(function (state) {\n var stateRoot = document.createElement(\"div\");\n stateRoot.className = state.stateClass;\n if (!!state.iconClass) {\n var icon = document.createElement(\"i\");\n icon.className = state.iconClass;\n stateRoot.appendChild(icon);\n }\n\n var label = document.createElement(\"label\");\n if (choiceItem.locText.hasHtml) {\n label.innerHTML = choiceItem.locText.html;\n } else {\n label.textContent = choiceItem.locText.renderedText;\n }\n stateRoot.appendChild(label);\n\n controlRoot.appendChild(stateRoot);\n if (!!state.addOn) {\n stateRoot.insertAdjacentHTML(\"afterbegin\", state.addOn);\n }\n });\n\n var itemRoot = document.createElement(\"div\");\n itemRoot.className = \"sv_cw_pretty_checkbox_\" + questionType;\n itemRoot.style.display = \"inline-block\";\n itemRoot.style.width = itemWidth;\n itemRoot.appendChild(controlRoot);\n\n element.appendChild(itemRoot);\n\n itemInputs[choiceItem.value] = input;\n });\n\n var updateValueHandler = function (newValue) {\n if (!inChangeHandler) {\n var checkedItems = newValue || [];\n if (radiogroupType || booleanType) {\n checkedItems = [newValue && newValue.toString()];\n }\n\n Object.values(itemInputs).forEach(function (inputItem) {\n if (checkedItems.indexOf(inputItem.value) !== -1) {\n inputItem.setAttribute(\"checked\", undefined);\n } else {\n inputItem.removeAttribute(\"checked\");\n }\n });\n }\n };\n var readOnlyHandler = function () {\n Object.values(itemInputs).forEach(function (inputItem) {\n if (question.isReadOnly) {\n inputItem.setAttribute(\"disabled\", true);\n } else {\n inputItem.removeAttribute(\"disabled\");\n }\n });\n };\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = readOnlyHandler;\n updateValueHandler(question.value);\n readOnlyHandler();\n },\n willUnmount: function (question, el) {\n question.valueChangedCallback = undefined;\n question.readOnlyChangedCallback = undefined;\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"property\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","var Slider = require(\"bootstrap-slider\");\n\nfunction init(Survey) {\n var widget = {\n name: \"bootstrapslider\",\n title: \"Bootstrap Slider\",\n iconName: \"icon-bootstrap-slider\",\n widgetIsLoaded: function () {\n return typeof Slider !== \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"bootstrapslider\";\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"bootstrapslider\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperties(\"bootstrapslider\", [\n {\n name: \"step:number\",\n default: 1,\n category: \"general\",\n },\n {\n name: \"rangeMin:number\",\n default: 0,\n category: \"general\",\n },\n {\n name: \"rangeMax:number\",\n default: 100,\n category: \"general\",\n },\n {\n name: \"orientation\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"],\n category: \"general\"\n },\n ]);\n Survey.JsonObject.metaData.addProperty(\"bootstrapslider\", {\n name: \"config\",\n default: null,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n el.style.paddingTop = \"20px\";\n el.style.paddingBottom = \"17px\";\n el.style.paddingLeft = \"10px\";\n var inputEl = document.createElement(\"input\");\n inputEl.id = question.id;\n inputEl.type = \"text\";\n inputEl.setAttribute(\"data-slider-id\", question.name + \"_\" + question.id);\n inputEl.setAttribute(\"data-slider-min\", question.rangeMin);\n inputEl.setAttribute(\"data-slider-max\", question.rangeMax);\n inputEl.setAttribute(\"data-slider-step\", question.step);\n if(question.orientation == \"vertical\") {\n inputEl.setAttribute(\"data-slider-orientation\", \"vertical\");\n }\n inputEl.setAttribute(\"data-slider-step\", question.step);\n inputEl.setAttribute(\n \"data-slider-value\",\n question.value || question.rangeMin\n );\n el.appendChild(inputEl);\n\n var config = question.config || {};\n\n if (config.id === undefined) {\n config.id = question.name + \"_\" + question.id;\n }\n\n if (config.min === undefined) {\n config.min = question.rangeMin;\n }\n\n if (config.max === undefined) {\n config.max = question.rangeMax;\n }\n\n if (config.step === undefined) {\n config.step = question.step;\n }\n\n if (config.enabled === undefined) {\n config.enabled = !question.isReadOnly;\n }\n\n if (config.value === undefined) {\n config.value = question.value || question.rangeMin;\n }\n\n var slider = new Slider(inputEl, config);\n\n slider.on(\"change\", function (valueObj) {\n question.value = slider.getValue();\n });\n var updateValueHandler = function () {\n slider.setValue(question.value || question.rangeMin);\n };\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n slider.disable();\n } else {\n slider.enable();\n }\n };\n question.bootstrapSlider = slider;\n question.valueChangedCallback = updateValueHandler;\n },\n willUnmount: function (question, el) {\n question.bootstrapSlider && question.bootstrapSlider.destroy();\n question.bootstrapSlider = null;\n question.readOnlyChangedCallback = null;\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === \"bootstrapslider\") {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n var textboxBrick = new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n (\n options.question.value ||\n options.question.defaultValue ||\n \"\"\n ).toString(),\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n );\n options.bricks.push(textboxBrick);\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","import RecordRTC from \"recordrtc\";\n\nfunction init(Survey) {\n const iconId = \"icon-microphone\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/microphone.svg'), \"\");\n var widget = {\n name: \"microphone\",\n title: \"Microphone\",\n iconName: iconId,\n widgetIsLoaded: function() {\n return typeof RecordRTC != \"undefined\";\n },\n isFit: function(question) {\n return question.getType() === \"microphone\";\n },\n htmlTemplate:\n \"
\" +\n \"\" +\n \" \" +\n \" \" +\n \"
\",\n activatedByChanged: function(activatedBy) {\n Survey.JsonObject.metaData.addClass(\"microphone\", [], null, \"empty\");\n },\n\n afterRender: function(question, el) {\n var rootWidget = this;\n var buttonStartEl = el.getElementsByTagName(\"button\")[0];\n var buttonStopEl = el.getElementsByTagName(\"button\")[1];\n var audioEl = el.getElementsByTagName(\"audio\")[0];\n\n ////////// RecordRTC logic\n\n var successCallback = function(stream) {\n var options = {\n type: \"audio\",\n mimeType: \"audio/webm\",\n audioBitsPerSecond: 44100,\n sampleRate: 44100,\n bufferSize: 16384,\n numberOfAudioChannels: 1\n };\n console.log(\"successCallback\");\n question.survey.mystream = stream;\n question.survey.recordRTC = RecordRTC(\n question.survey.mystream,\n options\n );\n if (typeof question.survey.recordRTC != \"undefined\") {\n console.log(\"startRecording\");\n question.survey.recordRTC.startRecording();\n }\n };\n\n var errorCallback = function() {\n alert(\"No microphone\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n\n var processAudio = function(audioVideoWebMURL) {\n console.log(\"processAudio\");\n var recordedBlob = question.survey.recordRTC.getBlob();\n\n var fileReader = new FileReader();\n fileReader.onload = function(event) {\n var dataUri = event.target.result;\n console.log(\"dataUri: \" + dataUri);\n question.value = dataUri;\n audioEl.src = dataUri;\n\n console.log(\"cleaning\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n fileReader.readAsDataURL(recordedBlob);\n };\n\n var startRecording = function() {\n // erase previous data\n question.value = undefined;\n\n // if recorder open on another question\t- try to stop recording\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n\n var mediaConstraints = {\n video: false,\n audio: true\n };\n\n navigator.mediaDevices\n .getUserMedia(mediaConstraints)\n .then(successCallback.bind(this), errorCallback.bind(this));\n };\n\n var stopRecording = function() {\n console.log(\"stopRecording\");\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(processAudio.bind(this));\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n };\n\n ////////////// end RTC logic //////////////////\n\n if (!question.isReadOnly) {\n buttonStartEl.onclick = startRecording;\n } else {\n buttonStartEl.parentNode.removeChild(buttonStartEl);\n }\n\n if (!question.isReadOnly) {\n buttonStopEl.onclick = stopRecording;\n } else {\n buttonStopEl.parentNode.removeChild(buttonStopEl);\n }\n\n audioEl.src = question.value;\n\n var updateValueHandler = function() {};\n\n var doNothingHandler = function() {};\n\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function(question, el) {\n console.log(\"unmount microphone no record \");\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n question.value = undefined;\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n }\n }\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n\n var widget = {\n name: \"emotionsratings\",\n title: \"Emotions Ratings\",\n iconName: \"icon-emotionsratings\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.emotionsRating;\n },\n defaultJSON: {\n choices: [1, 2, 3, 4, 5],\n },\n isFit: function (question) {\n return question.getType() === \"emotionsratings\";\n },\n isDefaultRender: false,\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"emotionsratings\",\n [\n {\n name: \"hasOther\",\n visible: false,\n },\n {\n name: \"otherText\",\n visible: false,\n },\n {\n name: \"optionsCaption\",\n visible: false,\n },\n {\n name: \"otherErrorText\",\n visible: false,\n },\n {\n name: \"storeOthersAsComment\",\n visible: false,\n },\n {\n name: \"renderAs\",\n visible: false,\n },\n ],\n null,\n \"dropdown\"\n );\n Survey.JsonObject.metaData.addProperties(\"emotionsratings\", [\n {\n name: \"emotions:itemvalues\",\n category: \"emotions\",\n categoryIndex: 1,\n default: [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"],\n },\n {\n name: \"emotionSize:number\",\n category: \"emotions\",\n default: 30,\n },\n {\n name: \"emotionsCount:number\",\n category: \"emotions\",\n default: 5,\n },\n {\n name: \"bgEmotion\",\n category: \"emotions\",\n default: \"happy\",\n },\n {\n name: \"emotionColor\",\n category: \"emotions\",\n default: \"#FF0066\",\n },\n ]);\n },\n afterRender: function (question, el) {\n var emotions = (question.emotions || []).map(function (item) {\n return item.value;\n });\n if (emotions.length === 0) {\n emotions = [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"];\n }\n var options = {\n emotionSize: question.emotionSize,\n bgEmotion: question.bgEmotion,\n emotions: emotions,\n initialRating: question.value,\n color: question.emotionColor,\n count: question.emotionsCount,\n onUpdate: function (value) {\n question.value = value;\n },\n };\n initWidget();\n\n question.valueChangedCallback = initWidget;\n question.readOnlyChangedCallback = initWidget;\n\n function initWidget() {\n el.innerHTML = \"
\";\n $(el).off();\n options.initialRating = question.value || 0;\n options.disabled = question.isReadOnly;\n $(el).find(\"div\").emotionsRating(options);\n }\n },\n willUnmount: function (question, el) {\n el.innerHTML = null;\n $(el).off();\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = __WEBPACK_EXTERNAL_MODULE__24__;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","module.exports = \"\"","function init(Survey, $) {\n const iconId = \"icon-datepicker\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/datepicker.svg'), \"\");\n $ = $ || window.$;\n\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: \"bootstrapdatepicker\",\n title: \"Date picker\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.bootstrapDP;\n },\n isFit: function (question) {\n return question.getType() === \"bootstrapdatepicker\";\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"bootstrapdatepicker\",\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n Survey.JsonObject.metaData.addProperties(\"bootstrapdatepicker\", [\n {\n // Can take a string or an Object.\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#format\n name: \"dateFormat\",\n category: \"general\",\n default: \"mm/dd/yyyy\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"startDate\",\n category: \"general\",\n default: \"\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"endDate\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"todayHighlight:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"weekStart:number\",\n category: \"general\",\n default: 0,\n },\n {\n name: \"clearBtn:boolean\",\n category: \"general\",\n default: false,\n },\n {\n name: \"autoClose:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"daysOfWeekDisabled:string\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"daysOfWeekHighlighted:string\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"disableTouchKeyboard:boolean\",\n category: \"general\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n const options = {\n enableOnReadonly: false,\n format: question.dateFormat,\n todayHighlight: question.todayHighlight,\n weekStart: question.weekStart,\n clearBtn: question.clearBtn,\n autoclose: question.autoClose,\n daysOfWeekDisabled: question.daysOfWeekDisabled,\n daysOfWeekHighlighted: question.daysOfWeekHighlighted,\n disableTouchKeyboard: question.disableTouchKeyboard,\n };\n if (!!question.startDate || !!question.renderedMin) {\n options.startDate = !!question.startDate\n ? question.startDate\n : question.renderedMin;\n }\n var renderedMax = question.renderedMax;\n if (!!renderedMax && new Date(renderedMax).getFullYear() >= 2999) {\n renderedMax = undefined;\n }\n if (!!question.endDate || !!renderedMax) {\n options.endDate = !!question.endDate ? question.endDate : renderedMax;\n }\n const pickerWidget = $el.bootstrapDP(options).on(\"change\", function (e) {\n var newDate = pickerWidget.bootstrapDP(\"getUTCDate\");\n var newValue = newDate && newDate.toUTCString();\n if (question.value != newValue) {\n question.value = newValue;\n }\n });\n\n question.valueChangedCallback = function () {\n pickerWidget.bootstrapDP(\n \"setUTCDate\",\n !!question.value ? new Date(question.value) : \"\"\n );\n };\n question.valueChangedCallback();\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n $el.prop(\"readonly\", true);\n } else {\n $el.removeAttr(\"readonly\");\n }\n };\n question.readOnlyChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.bootstrapDP(\"destroy\");\n question.readOnlyChangedCallback = undefined;\n question.valueChangedCallback = undefined;\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n"],"sourceRoot":""}