{"version":3,"file":"uploader.min.js","sources":["../src/uploader.js"],"sourcesContent":["/* jshint ignore:start */\ndefine(['jquery', 'core/log', 'filter_poodll/upskin_plain'], function ($, log, upskin_plain) {\n\n    \"use strict\"; // jshint ;_;\n\n    log.debug('Universal Uploader: initialising');\n\n    return {\n\n        config: null,\n\n        //for making multiple instances\n        clone: function () {\n            return $.extend(true, {}, this);\n        },\n\n        init: function (element, config, upskin) {\n            this.config = config;\n            if (upskin) {\n                this.upskin = upskin;\n            } else {\n                this.upskin = upskin_plain.clone();\n                this.upskin.init(config, element, false, false);\n            }\n            this.upskin.initControls();\n            this.registerEvents();\n        },\n\n        registerEvents: function () {\n            var that = this;\n            //whteboard does not have a hermes\n           if(this.config.hermes) {\n                this.config.hermes.on('fetch_upload_url', function (e) {\n                    that.fetchNewUploadDetails();\n                });\n           }\n        },\n\n        fetchNewUploadDetails: function () {\n\n            //The REST API we are calling\n            var functionname = 'local_cpapi_fetch_upload_details';\n\n            //fetch the Posturl. We need this.\n            //set up our ajax request\n            var xhr = new XMLHttpRequest();\n            var that = this;\n\n            //set up our handler for the response\n            xhr.onreadystatechange = function (e) {\n                if (this.readyState === 4) {\n                    if (xhr.status == 200) {\n\n                        //get a yes or forgetit or tryagain\n                        var payload = xhr.responseText;\n                        var payloadobject = JSON.parse(payload);\n                        if (payloadobject) {\n\n                            //returnCode > 0  indicates an error\n                            if (payloadobject.returnCode > 0) {\n                                //We alert the iframe host that something did not go right\n                                var messageObject = {};\n                                messageObject.id = that.config.id;\n                                messageObject.type = \"error\";\n                                messageObject.code = payloadobject.returnCode;\n                                messageObject.message = payloadobject.returnMessage;\n                                that.config.hermes.postMessage(messageObject);\n                                return;\n                                //if all good, then lets do the embed\n                            } else {\n                                that.config.allowedURL = payloadobject.allowedURL;\n                                that.config.posturl = payloadobject.postURL;\n                                that.config.filename = payloadobject.filename;\n                                that.config.s3filename = payloadobject.s3filename;\n                                that.config.s3root = payloadobject.s3root;\n                                that.config.cloudfilename = payloadobject.shortfilename;\n                                that.config.cloudroot = payloadobject.shortroot;\n                            }\n\n                        } else {\n                            log.debug('error:' + payloadobject.message);\n\n                        }\n                    } else {\n                        log.debug('Not 200 response:' + xhr.status);\n                    }\n                }\n            };\n\n            //log.debug(params);\n            var xhrparams = \"wstoken=\" + this.config.wstoken\n                + \"&wsfunction=\" + functionname\n                + \"&moodlewsrestformat=\" + this.config.moodlewsrestformat\n                + \"&mediatype=\" + this.config.mediatype\n                + '&parent=' + this.config.parent\n                + '&appid=' + this.config.appid\n                + '&owner=' + this.config.owner\n                + '&region=' + this.config.region\n                + '&expiredays=' + this.config.expiredays\n                + '&transcode=' + this.config.transcode\n                + '&transcoder=' + this.config.transcoder\n                + '&transcribe=' + this.config.transcribe\n                + '&subtitle=' + this.config.subtitle\n                + '&transcribelanguage=' + this.config.language\n                + '&transcribevocab=' + this.config.transcribevocab\n                + '&notificationurl=' + this.config.notificationurl\n                + '&sourcemimetype=' + this.config.sourcemimetype;\n\n            var serverurl = M.cfg.wwwroot + \"/webservice/rest/server.php\";\n            xhr.open(\"POST\", serverurl, true);\n            xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n            xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n            xhr.send(xhrparams);\n        },\n\n        uploadBlob: function (blob, filetype) {\n            this.uploadFile(blob, filetype);\n            return;\n        },\n        //extract filename from the text returned as response to upload\n        extractFilename: function (returntext) {\n            var searchkey = \"success<filename>\";\n            var start = returntext.indexOf(searchkey);\n            if (start < 1) {\n                return false;\n            }\n            var end = returntext.indexOf(\"</filename>\");\n            var filename = returntext.substring(start + (searchkey.length), end);\n            return filename;\n        },\n\n        //fetch file extension from the filetype\n        fetchFileExtension: function (filetype) {\n            var ext = \"\";\n            //in the case of a string like this:\n            // \"audio/webm;codecs=opus\" we do not the codecs\n            if(filetype.indexOf(';')>0){\n                filetype = filetype.split(';')[0];\n            }\n            switch (filetype) {\n                case \"image/jpeg\":\n                    ext = \"jpg\";\n                    break;\n                case \"image/png\":\n                    ext = \"png\";\n                    break;\n                case \"audio/wav\":\n                    ext = \"wav\";\n                    break;\n                case \"audio/ogg\":\n                    ext = \"ogg\";\n                    break;\n                case \"audio/mpeg3\":\n                    ext = \"mp3\";\n                    break;\n                case \"audio/mp3\":\n                    ext = \"mp3\";\n                    break;\n                case \"audio/webm\":\n                    ext = \"webm\";\n                    break;\n                case \"audio/wma\":\n                    ext = \"wma\";\n                    break;\n                case \"audio/x-mpeg-3\":\n                    ext = \"mp3\";\n                    break;\n                case \"audio/mp4\":\n                case \"audio/m4a\":\n                case \"audio/x-m4a\":\n                    ext = \"m4a\";\n                    break;\n                case \"audio/3gpp\":\n                    ext = \"3gpp\";\n                    break;\n                case \"video/mpeg3\":\n                    ext = \"3gpp\";\n                    break;\n                case \"video/m4v\":\n                    ext = \"m4v\";\n                    break;\n                case \"video/mp4\":\n                    ext = \"mp4\";\n                    break;\n                case \"video/mov\":\n                case \"video/quicktime\":\n                    ext = \"mov\";\n                    break;\n                case \"video/x-matroska\":\n                case \"video/webm\":\n                    ext = \"webm\";\n                    break;\n                case \"video/wmv\":\n                    ext = \"wmv\";\n                    break;\n                case \"video/ogg\":\n                    ext = \"ogg\";\n                    break;\n            }\n            //if we get here we have an unknown mime type, just guess based on the mediatype\n            if(ext===\"\"){\n                if(filetype.indexOf('video')>-1){\n                    ext = \"mp4\";\n                }else{\n                    ext = \"mp3\";\n                }\n            }\n            return ext;\n        },\n\n        pokeFilename: function (filename, uploader) {\n\n            var upc = '';\n            if (typeof uploader.config.updatecontrol !== 'undefined' && uploader.config.updatecontrol !== '') {\n                upc = $('[id=\"' + uploader.config.updatecontrol + '\"]');\n                //the code below used to work until odd chars in question id annoyed jquery 3\n                //upc = $('#' + uploader.config.updatecontrol);\n            }\n            if (upc.length < 1) {\n                upc = $('[id=\"' + uploader.config.updatecontrol + '\"]', window.parent.document);\n            }\n            if (upc.length > 0) {\n                upc.get(0).value = filename;\n            } else {\n                log.debug('upload failed #2');\n                uploader.upskin.showMessage(M.util.get_string('recui_uploaderror', 'filter_poodll'), 'recui_uploaderror');\n                return false;\n            }\n            upc.trigger('change');\n            return true;\n        },\n\n        alertRecorderSuccess: function (widgetid) {\n            if (this.config.hasOwnProperty('onuploadsuccess')) {\n                this.config.onuploadsuccess(widgetid);\n            }\n        },\n\n        alertRecorderFailure: function (widgetid) {\n            if (this.config.hasOwnProperty('onuploadfailure')) {\n                this.config.onuploadfailure(widgetid);\n            }\n        },\n\n        //We can detect conversion by pinging the s3 out filename\n        //this is only done in the iFrame\n        completeAfterProcessing: function (uploader, filename, waitms) {\n\n            //alert the skin that we are awaiting processing\n            this.upskin.showMessage(M.util.get_string('recui_awaitingconversion', 'filter_poodll'), 'recui_awaitingconversion');\n\n            //this will always be true ...\n            if (uploader.config.iframeembed) {\n                filename = uploader.config.s3root + uploader.config.s3filename;\n            }\n\n            //We alert the iframe host that a file is now awaiting conversion\n            var messageObject = {};\n            messageObject.type = \"awaitingprocessing\";\n            messageObject.mediaurl = filename;\n            messageObject.mediafilename = uploader.config.s3filename;\n            messageObject.sourcefilename = uploader.config.sourcefilename;\n            messageObject.sourcemimetype = uploader.config.sourcemimetype;\n            messageObject.s3root = uploader.config.s3root;\n            messageObject.id = uploader.config.id;\n            messageObject.updatecontrol = uploader.config.updatecontrol;\n            if (uploader.config.transcribe) {\n                messageObject.transcripturl = filename + '.txt';\n                messageObject.transcriptfilename = uploader.config.s3filename + '.txt';\n            }\n            uploader.config.hermes.postMessage(messageObject);\n\n            //we commence a series of ping and retries until the recorded file is available\n            var that = this;\n            $.ajax({\n                url: uploader.config.s3root + uploader.config.s3filename,\n                method: 'HEAD',\n                cache: false,\n                error: function () {\n                    //We get here if its a 404 or 403. So settimout here and wait for file to arrive\n                    //we increment the timeout period each time to prevent bottlenecks\n                    log.debug('403 errors are normal here, till the file arrives back from conversion');\n                    setTimeout(function () {\n                        that.completeAfterProcessing(uploader, filename, waitms + 500);\n                    }, waitms);\n                },\n                success: function (data, textStatus, xhr) {\n                    switch (xhr.status) {\n                        case 200:\n                            that.doUploadCompleteCallback(uploader, filename);\n                            break;\n                        default:\n                            setTimeout(function () {\n                                that.completeAfterProcessing(uploader, filename, waitms + 500);\n                            }, waitms);\n                    }\n\n                }\n            });\n        },\n\n        doUploadCompleteCallback: function (uploader, filename) {\n\n            //in the case of an iframeembed we need a full URL not just a filename\n            if (uploader.config.iframeembed) {\n                filename = uploader.config.s3root + uploader.config.s3filename;\n            }\n\n            //For callbackjs and for postmessage we need an array of stuff\n            var callbackObject = new Array();\n            callbackObject[0] = uploader.config.widgetid;\n            callbackObject[1] = \"filesubmitted\";\n            callbackObject[2] = filename;\n            callbackObject[3] = uploader.config.updatecontrol;\n            callbackObject[4] = uploader.config.s3filename;\n\n            //alert the skin that we were successful\n            this.upskin.showMessage(M.util.get_string('recui_uploadsuccess', 'filter_poodll'), 'recui_uploadsuccess');\n\n            //invoke callbackjs if we have one, otherwise just update the control(default behav.)\n            if (!uploader.config.iframeembed) {\n                if (uploader.config.callbackjs && uploader.config.callbackjs != '') {\n                    if (typeof(uploader.config.callbackjs) === 'function') {\n                        uploader.config.callbackjs(callbackObject);\n                    } else {\n                        //this was the old rubbish way, where the callback was a function name\n                        this.executeFunctionByName(uploader.config.callbackjs, window, callbackObject);\n                    }\n                } else {\n                    //by default we just poke the filename\n                    uploader.pokeFilename(filename, uploader);\n                }\n            } else {\n                //in the case of an iframeembed we will also post a message to the host, they can choose to handle it or not\n                //The callback object above scan prob. be phased out. But not all integrations will use iframes either.\n                var messageObject = {};\n                messageObject.type = \"filesubmitted\";\n                messageObject.mediaurl = uploader.config.s3root + uploader.config.s3filename;\n                messageObject.mediafilename = uploader.config.s3filename;\n                messageObject.sourcefilename = uploader.config.sourcefilename;\n                messageObject.sourcemimetype = uploader.config.sourcemimetype;\n                messageObject.s3root = uploader.config.s3root;\n                messageObject.id = uploader.config.id;\n                messageObject.updatecontrol = uploader.config.updatecontrol;\n                if (uploader.config.transcribe) {\n                    messageObject.transcripturl = uploader.config.s3root + uploader.config.s3filename + '.txt';\n                    messageObject.transcriptfilename = uploader.config.s3filename + '.txt';\n                }\n\n                uploader.config.hermes.postMessage(messageObject);\n            }\n        },\n\n        //after an upload handle the filename poke and callback call\n        postProcessUpload: function (e, uploader) {\n            var xhr = e.currentTarget;\n            if (xhr.readyState == 4) {\n\n                uploader.upskin.deactivateProgressSession();\n\n                //deactivate premature leaving\n                $(window).off('beforeunload', this.preventPrematureLeaving);\n\n                if (xhr.status == 200) {\n                    var filename = uploader.config.filename;\n                    if (!filename) {\n                        filename = uploader.extractFilename(xhr.responseText);\n                    }\n                    if (!filename) {\n                        log.debug('upload failed #1');\n                        log.debug(xhr);\n                        return;\n                    }\n\n                    //Alert any listeners about the upload complete\n                    //in an iframeembed we only  do this after conversion is complete. so we run a poll to check compl.\n                    //in standard Moodle we have a placeholder file to deal with any slow conversions. so we don't poll\n                    if (uploader.config.iframeembed) {\n                        this.completeAfterProcessing(uploader, filename, 1000);\n                    } else {\n                        this.doUploadCompleteCallback(uploader, filename);\n                    }\n\n                    //alert the recorder that this was successful\n                    this.alertRecorderSuccess(uploader.config.widgetid);\n\n                } else {\n                    log.debug('upload failed #3');\n                    log.debug(xhr);\n                    uploader.upskin.showMessage(M.util.get_string('recui_uploaderror', 'filter_poodll'), 'recui_uploaderror');\n\n                    //alert the recorder that this failed\n                    this.alertRecorderFailure(uploader.config.widgetid);\n\n                } //end of if status 200\n            }//end of if ready state 4\n\n        },\n\n        preventPrematureLeaving: function(){\n            return M.util.get_string('recui_waitwaitstilluploading', 'filter_poodll');\n        },\n\n        // upload Media file to wherever\n        uploadFile: function (filedata, sourcemimetype) {\n\n            var xhr = new XMLHttpRequest();\n            var config = this.config;\n            var uploader = this;\n\n            //get the file extension from the filetype\n            var sourceext = this.fetchFileExtension(sourcemimetype);\n\n            //is this an iframe embed\n            if (typeof config.iframeembed == 'undefined') {\n                config.iframeembed = false;\n            }\n\n            //are we using s3\n            var using_s3 = config.using_s3;\n\n            //Handle UI display of this upload\n            this.upskin.initProgressSession(xhr);\n\n            //Add a page unload check ..\n            $(window).on('beforeunload', this.preventPrematureLeaving);\n\n            //alert user that we are now uploading\n            this.upskin.showMessage(M.util.get_string('recui_uploading', 'filter_poodll'), 'recui_uploading');\n\n            //init sourcemimetype and sourcefilename\n            uploader.config.sourcemimetype = sourcemimetype;\n            uploader.config.sourcefilename = uploader.config.s3filename;\n\n            xhr.onreadystatechange = function (e) {\n                if (using_s3 && this.readyState === 4) {\n                    if (config.iframeembed) {\n                        uploader.update_filenames(uploader, sourceext);\n                    } else {\n                        //ping Moodle and inform that we have a new file\n                        uploader.postprocess_s3_upload(uploader);\n                    }\n                }\n                uploader.postProcessUpload(e, uploader);\n\n            };\n\n            if (using_s3) {\n                xhr.open(\"put\", config.posturl, true);\n                xhr.setRequestHeader(\"Content-Type\", 'application/octet-stream');\n                xhr.send(filedata);\n            } else {\n\n                //We NEED to redo this bit of code ..\n                //its duplicating!!!\n                if (!(filedata instanceof Blob)) {\n                    log.debug('filedata is not blob');\n                    var params = \"datatype=uploadfile\";\n                    //We must URI encode the filedata, because otherwise the \"+\" characters get turned into spaces\n                    //spent hours tracking that down ...justin 20121012\n                    params += \"&paramone=\" + encodeURIComponent(filedata);\n                    params += \"&paramtwo=\" + sourceext;\n                    params += \"&paramthree=\" + config.mediatype;\n                    params += \"&requestid=\" + config.widgetid;\n                    params += \"&contextid=\" + config.p2;\n                    params += \"&component=\" + config.p3;\n                    params += \"&filearea=\" + config.p4;\n                    params += \"&itemid=\" + config.p5;\n\n                    xhr.open(\"POST\", config.posturl, true);\n                    xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n                    xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n                    //xhr.setRequestHeader(\"Content-length\", params.length);\n                    //xhr.setRequestHeader(\"Connection\", \"close\");\n                    xhr.send(params);\n                } else {\n                    log.debug('filedata is blob');\n                    //we have to base64 string the blob  before sending it\n                    var reader = new window.FileReader();\n                    reader.readAsDataURL(filedata);\n                    reader.onloadend = function () {\n                        var base64filedata = reader.result;\n                        //log.debug(params);\n                        var params = \"datatype=uploadfile\";\n                        //We must URI encode the filedata, because otherwise the \"+\" characters get turned into spaces\n                        //spent hours tracking that down ...justin 20121012\n                        params += \"&paramone=\" + encodeURIComponent(base64filedata);\n                        params += \"&paramtwo=\" + sourceext;\n                        params += \"&paramthree=\" + config.mediatype;\n                        params += \"&requestid=\" + config.widgetid;\n                        params += \"&contextid=\" + config.p2;\n                        params += \"&component=\" + config.p3;\n                        params += \"&filearea=\" + config.p4;\n                        params += \"&itemid=\" + config.p5;\n\n                        xhr.open(\"POST\", config.posturl, true);\n                        xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n                        xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n                        // xhr.setRequestHeader(\"Content-length\", params.length);\n                        // xhr.setRequestHeader(\"Connection\", \"close\");\n                        xhr.send(params);\n                    };//end of fileread on load end\n                }//end of if blob\n            }//end of if using_s3\n\n            //now we post a message that an upload has begun\n            var messageObject = {};\n            messageObject.type = \"uploadcommenced\";\n            messageObject.sourcefilename = this.config.sourcefilename;\n            messageObject.sourcemimetype = this.config.sourcemimetype;\n            messageObject.id = this.config.id;\n            this.config.hermes.postMessage(messageObject);\n\n        },\n\n        // upload Media file to wherever\n        uploadMultiPartFile: function (filedata, sourcemimetype) {\n\n            var xhr = new XMLHttpRequest();\n            var config = this.config;\n            var uploader = this;\n\n            //get the file extension from the filetype\n            var sourceext = this.fetchFileExtension(sourcemimetype);\n\n            //is this an iframe embed\n            if (typeof config.iframeembed == 'undefined') {\n                config.iframeembed = false;\n            }\n\n            //are we using s3\n            var using_s3 = config.using_s3;\n\n            //Handle UI display of this upload\n            this.upskin.initProgressSession(xhr);\n\n            //Add a page unload check ..\n            $(window).on('beforeunload', this.preventPrematureLeaving);\n\n            //alert user that we are now uploading\n            this.upskin.showMessage(M.util.get_string('recui_uploading', 'filter_poodll'), 'recui_uploading');\n\n            //init sourcemimetype and sourcefilename\n            uploader.config.sourcemimetype = sourcemimetype;\n            uploader.config.sourcefilename = uploader.config.s3filename;\n\n            xhr.onreadystatechange = function (e) {\n                if (using_s3 && this.readyState === 4) {\n                    if (config.iframeembed) {\n                        uploader.update_filenames(uploader, sourceext);\n                    } else {\n                        //ping Moodle and inform that we have a new file\n                        uploader.postprocess_s3_upload(uploader);\n                    }\n                }\n                uploader.postProcessUpload(e, uploader);\n\n            };\n\n            if (using_s3) {\n                xhr.open(\"put\", config.posturl, true);\n                xhr.setRequestHeader(\"Content-Type\", 'application/octet-stream');\n                xhr.send(filedata);\n            }//end of if using_s3\n        },\n\n        update_filenames: function (uploader, sourceext) {\n            var config = uploader.config;\n\n            //now its a bit hacky, but\n            // only now do we know the true final file extension (ext) and mimetype of unconv. media\n            // so we want to save that and if the user is NOT transcoding,\n            //we want to change the s3filename from the default mp4/mp3 to whatever the mimetype inidicates, ie sourceext\n\n            switch (config.mediatype) {\n                case 'audio':\n                    //source info\n                    uploader.config.sourcefilename = config.s3filename.replace('.mp3', '.' + sourceext);\n                    if (!config.transcode) {\n                        uploader.config.s3filename = uploader.config.sourcefilename;\n                        //do we need this, I think its old and noone uses it.\n                        uploader.config.cloudfilename = uploader.config.s3filename;\n                    }\n                    break;\n                case 'video':\n                    uploader.config.sourcefilename = config.s3filename.replace('.mp4', '.' + sourceext);\n                    if (!config.transcode) {\n                        uploader.config.s3filename = uploader.config.sourcefilename;\n                    }\n                    break;\n            }\n        },\n\n        postprocess_s3_upload: function (uploader) {\n            var config = uploader.config;\n            const formData = new FormData();\n            formData.append(\"datatype\", \"handles3upload\");\n            formData.append(\"contextid\", config.p2);\n            formData.append(\"component\", config.p3);\n            formData.append(\"filearea\", config.p4);\n            formData.append(\"itemid\", config.p5);\n            formData.append(\"filename\", config.filename);\n            formData.append(\"mediatype\", config.mediatype);\n            //navigator beacon polyfill\n            if (!navigator.sendBeacon) {\n                navigator.sendBeacon = function (url, thedata) {\n                    window.fetch(url, {method: 'POST', body: thedata, credentials: 'include'});\n                };\n            }\n            //we use navigator beacon over xhr because there are times believe it or not, when a page load happens and that kills\n            //the request. causing lost files\n            navigator.sendBeacon(M.cfg.wwwroot + '/filter/poodll/poodllfilelib.php', formData);\n\n        },\n\n        //function to call the callback function with arguments\n        executeFunctionByName: function (functionName, context, args) {\n\n            //var args = Array.prototype.slice.call(arguments).splice(2);\n            var namespaces = functionName.split(\".\");\n            var func = namespaces.pop();\n            for (var i = 0; i < namespaces.length; i++) {\n                context = context[namespaces[i]];\n            }\n            return context[func].call(this, args);\n        },\n\n        dataURItoBlob: function (dataURI, mimetype) {\n            var byteString = atob(dataURI.split(',')[1]);\n            var ab = new ArrayBuffer(byteString.length);\n            var ia = new Uint8Array(ab);\n            for (var i = 0; i < byteString.length; i++) {\n                ia[i] = byteString.charCodeAt(i);\n            }\n            return new Blob([ab], {type: mimetype});\n        },//end of dataURItoBlob\n\n        //some recorder skins call this directly, so we just pass it through to the upskin\n        Output: function (msg) {\n            this.upskin.showMessage(msg, 'recorderskinmsg');\n        }\n    };//end of returned object\n});//total end\n"],"names":["define","$","log","upskin_plain","debug","config","clone","extend","this","init","element","upskin","initControls","registerEvents","that","hermes","on","e","fetchNewUploadDetails","xhr","XMLHttpRequest","onreadystatechange","readyState","status","payload","responseText","payloadobject","JSON","parse","returnCode","messageObject","id","type","code","message","returnMessage","postMessage","allowedURL","posturl","postURL","filename","s3filename","s3root","cloudfilename","shortfilename","cloudroot","shortroot","xhrparams","wstoken","moodlewsrestformat","mediatype","parent","appid","owner","region","expiredays","transcode","transcoder","transcribe","subtitle","language","transcribevocab","notificationurl","sourcemimetype","serverurl","M","cfg","wwwroot","open","setRequestHeader","send","uploadBlob","blob","filetype","uploadFile","extractFilename","returntext","start","indexOf","end","substring","length","fetchFileExtension","ext","split","pokeFilename","uploader","upc","updatecontrol","window","document","get","value","trigger","showMessage","util","get_string","alertRecorderSuccess","widgetid","hasOwnProperty","onuploadsuccess","alertRecorderFailure","onuploadfailure","completeAfterProcessing","waitms","iframeembed","mediaurl","mediafilename","sourcefilename","transcripturl","transcriptfilename","ajax","url","method","cache","error","setTimeout","success","data","textStatus","doUploadCompleteCallback","callbackObject","Array","callbackjs","executeFunctionByName","postProcessUpload","currentTarget","deactivateProgressSession","off","preventPrematureLeaving","filedata","sourceext","using_s3","initProgressSession","update_filenames","postprocess_s3_upload","Blob","reader","FileReader","readAsDataURL","onloadend","base64filedata","result","params","encodeURIComponent","p2","p3","p4","p5","uploadMultiPartFile","replace","formData","FormData","append","navigator","sendBeacon","thedata","fetch","body","credentials","functionName","context","args","namespaces","func","pop","i","call","dataURItoBlob","dataURI","mimetype","byteString","atob","ab","ArrayBuffer","ia","Uint8Array","charCodeAt","Output","msg"],"mappings":"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"}