{"version":3,"file":"kendo.upload.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendoupload","js","this","$","undefined$1","kendo","window","Widget","ui","antiForgeryTokens","logToConsole","rFileExtension","NS","SELECT","UPLOAD","SUCCESS","ERROR","COMPLETE","CANCEL","CLEAR","PAUSE","RESUME","PROGRESS","REMOVE","INVALIDMAXFILESIZE","INVALIDMINFILESIZE","INVALIDFILEEXTENSION","HOVER_STATE","FOCUS_STATE","PROGRESSBAR_SELECTOR","TABINDEX","headerStatusIconName","Upload","extend","init","element","options","that","progressbars","fn","call","name","multiple","directory","localization","activeInput","wrapper","closest","length","_wrapInput","_activeInput","toggle","enabled","ns","_ns","guid","on","_onParentFormSubmit","bind","_onParentFormReset","_initUploadModule","_toggleDropZone","_onUploadButtonKeydown","_onFileAction","_onClearSelected","_onUploadSelected","_onKeyDown","_focusout","val","_onInputChange","target","events","showFileList","template","files","async","autoRetryAfter","bufferChunkSize","maxAutoRetries","removeVerb","autoUpload","withCredentials","accept","useArrayBuffer","select","cancel","retry","remove","pause","resume","clearSelectedFiles","uploadSelectedFiles","dropFilesHere","invalidFiles","statusUploading","statusUploaded","statusWarning","statusFailed","headerStatusUploading","headerStatusPaused","headerStatusUploaded","uploadSuccess","uploadFail","invalidMaxFileSize","invalidMinFileSize","invalidFileExtension","validation","allowedExtensions","maxFileSize","minFileSize","dropZone","saveUrl","_module","_supportsFormData","formDataUploadModule","iframeUploadModule","_async","initialFiles","_renderInitialFiles","syncUploadModule","setOptions","off","attr","_supportsMultiple","enable","disable","toggleClass","prop","focus","trigger","destroy","customDropZone","document","add","forEach","progressbar","fileEntry","onPause","pauseIcon","find","htmlEncode","icon","parent","onResume","playIcon","upload","onSaveSelected","getFiles","filesData","allFiles","listItems","i","data","j","push","clearAllFiles","each","index","file","_removeFileByDomElement","removeAllFiles","removeFileByUid","uid","_removeFileByUid","clearFileByUid","shouldSendRemoveRequest","clearFile","callback","_removeFile","removeFile","fileData","hasClass","onCancel","onRemove","_hideHeaderUploadstatus","_updateHeaderUploadStatus","_addInput","sourceInput","nodeType","input","clone","insertAfter","prefix","hide","removeAttr","e","preventDefault","addClass","removeClass","_adjustFocusState","focusedItem","toFocus","_arrowKeyNavigation","key","kendoKeys","keys","DOWN","stopPropagation","first","next","UP","prev","RIGHT","LEFT","_preventFocusRemove","_asyncCommandKeyNavigation","eventArgs","_retryClicked","ESC","_checkAllComplete","SPACEBAR","ENTER","is","chunkSize","concurrent","finish","show","metaData","prepareChunk","onRetry","_commandKeyNavigation","hasValidationErrors","_filesContainValidationErrors","headers","DELETE","TAB","commandKeys","keyCode","indexOf","assignGuidToFiles","_inputFiles","_isAsyncNonBatch","validateFiles","onSelect","last","_readDirectory","item","deferred","Deferred","dirReader","createReader","allFolderFiles","readEntries","entries","concat","resolve","reject","promise","_readFile","fullpath","fullPath","relativePath","slice","droppedFolderFiles","droppedFolderCounter","setTimeout","_proceedDroppedItems","_traverseFileTree","skipCounter","then","items","isFile","isDirectory","_onDrop","dt","originalEvent","dataTransfer","droppedFiles","stopEvent","directoryDrop","webkitGetAsEntry","entry","getAllFileInfo","splice","hasErrors","batch","idx","currentFile","_enqueueFile","fileNames","_supportsRemove","_fileAction","_prepareTemplateData","templateData","totalSize","size","_createProgressbarWapper","_createFileIconWrapper","fileTypeIcon","iconClass","_progressbarInit","kendoProgressBar","animation","showStatus","_prepareDefaultSingleFileEntryTemplate","fileSize","getTotalFilesSizeMessage","fileGroup","getFileGroup","extension","errors","isError","invalidClass","fileDetails","_prepareDefaultMultipleFileEntriesTemplate","filesHaveValidationErrors","totalFileSize","sort","a","b","existingFileEntries","removeEventArgs","isProgressbar","fileUid","fileList","progressbarSelector","appendTo","angular","elements","value","_removeFileEntry","_hideActionButtons","fileElement","actionKey","skipClear","firstActionButton","iconsNameDictionary","actionKeyText","hasOwnProperty","_clearFileAction","firstActionIcon$1","append","firstActionIcon","_renderAction","_fileState","stateKey","currentState","uploading","text","uploaded","failed","iconName","actionText","empty","button","_onFileProgress","percentComplete","progressBar","prepend","getFileEntry","_onUploadSuccess","response","xhr","fileInfo","operation","XMLHttpRequest","_setUploadErrorState","after","_hideUploadProgress","_onUploadError","responseText","_decreasePosition","_autoRetryAfter","retries","performUpload","uploadPercentage","_updateUploadProgress","fileMetaData","totalChunks","Math","round","delay","fadeOut","_showActionButtons","actionsWrapper","uploadButton","clearButton","html","renderButton","themeColor","_showHeaderUploadStatus","isUploading","headerUploadStatus","headerUploadStatusIcon","currentlyUploading","not","currentlyFailed","currentlyPaused","onAbort","windows","_userAgent","support","browser","opera","safari","_supportsDrop","userAgent","toLowerCase","test","navigator","_setupDropZone","dropEffect","bindDragEventWrappers","_bindDocumentDragEventWrappers","_setupCustomDropZone","removeUrl","_submitRemove","onSuccess","onError","removeField","params","jQuery","ajax","type","dataType","dataFilter","normalizeJSON","url","traditional","success","error","xhrFields","hasLabel","selectText","wrap","prependTo","tabindex","inputFiles","prototype","filesContainErrors","relatedInput","getFileName","iframes","_frameId","prepareUpload","iframe","form","saveField","createFrame","registerFrame","createForm","frame","fileValidation","cleanupFrame","unregisterFrame","body","dataInput","one","onIframeLoad","submit","started","isFileUploadStarted","contents","ex","processResponse","fakeXHR","tryParseJSON","jsonResult","statusText","status","stopFrameSubmit","removeUploadedFile","id","action","stop","execCommand","grep","position","cancelled","paused","map","join","$input","slashIndex","lastIndexOf","substr","getFileExtension","rawFiles","fileName","rawFile","matches","match","unique","validationInfo","extensions","ext","substring","validateFileExtension","validateFileSize","validationErrors","inArray","toFixed","shouldRemoveFileEntry","textStatus","json","JSON","parse","namespace","onDragEnter","onDragLeave","hideInterval","lastDrag","Date","setInterval","clearInterval","sourceElement","fileEntries","enqueueFiles","filesLength","webkitRelativePath","formData","createFormData","createXHR","removeFileEntry","populateFormData","FileReader","postFormData","reader","onload","fileArrayBuffer","_appendBuffer","result","err","onerror","readAsArrayBuffer","_getCurrentChunk","buffer1","buffer2","tmp","Uint8Array","byteLength","set","buffer","filter","prevEntry","stopUploadRequest","_increaseChunkIndex","addEventListener","onRequestSuccess","onRequestError","onRequestProgress","open","setRequestHeader","send","FormData","chunk","serializedMetaData","stringify","raiseError","cleanupFileEntry","_resetChunkIndex","uploadComplete","isUploadButtonVisible","loaded","total","abort","chunkIndex","contentType","ceil","uploadUid","_decreaseChunkIndex","methodToInvoke","oldPosition","_getChunker","mozSlice","webkitSlice","plugin"],"sources":["kendo.upload.js"],"mappings":"CAAA,SAAWA,EAAQC,GACI,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,EAAQG,QAAQ,iBAAkBA,QAAQ,wBAAyBA,QAAQ,kBAAmBA,QAAQ,yBACpK,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,iBAAkB,wBAAyB,kBAAmB,yBAA0BJ,KAC5ID,EAA+B,oBAAfO,WAA6BA,WAAaP,GAAUQ,MAAcC,YAAcT,EAAOS,aAAe,GAAIT,EAAOS,YAAYC,GAAKT,KAHvJ,CAIGU,MAAM,WA4sFL,OAnsFA,SAAUC,EAAGC,GACT,IAAIC,EAAQC,OAAOD,MACfE,EAASF,EAAMG,GAAGD,OAClBE,EAAoBJ,EAAMI,kBAC1BC,EAAeL,EAAMK,aACrBC,EAAiB,cACjBC,EAAK,eACLC,EAAS,SACTC,EAAS,SACTC,EAAU,UACVC,EAAQ,QACRC,EAAW,WACXC,EAAS,SACTC,EAAQ,QACRC,EAAQ,QACRC,EAAS,SACTC,EAAW,WACXC,EAAS,SAETC,EAAqB,qBACrBC,EAAqB,qBACrBC,EAAuB,uBAGvBC,EAAc,UACdC,EAAc,UAEdC,EAAuB,iBAEvBC,EAAW,WAGXC,EACS,SADTA,EAES,qBAFTA,EAGS,QAGTC,EAASzB,EAAO0B,OAAO,CACvBC,KAAM,SAASC,EAASC,GACpB,IAAIC,EAAOnC,KACXmC,EAAKC,aAAe,GAEpB/B,EAAOgC,GAAGL,KAAKM,KAAKH,EAAMF,EAASC,GAEnCC,EAAKI,KAAON,EAAQM,KACpBJ,EAAKK,SAAWL,EAAKD,QAAQM,SAC7BL,EAAKM,UAAYN,EAAKD,QAAQO,UAC9BN,EAAKO,aAAeP,EAAKD,QAAQQ,aAEjC,IAAIC,EAAcR,EAAKF,QACvBE,EAAKS,QAAUD,EAAYE,QAAQ,aACP,IAAxBV,EAAKS,QAAQE,SACbX,EAAKS,QAAUT,EAAKY,WAAWJ,IAGnCR,EAAKa,aAAaL,GAClBR,EAAKc,OAAOd,EAAKD,QAAQgB,SAEzB,IAAIC,EAAKhB,EAAKiB,IAAM1C,EAAK,IAAMP,EAAMkD,OACrCV,EAAYE,QAAQ,QACfS,GAAG,SAAWH,EAAIhB,EAAKoB,oBAAoBC,KAAKrB,IAChDmB,GAAG,QAAUH,EAAIhB,EAAKsB,mBAAmBD,KAAKrB,IAEnDA,EAAKuB,oBAELvB,EAAKwB,kBAELxB,EAAKS,QACAU,GAAG,UAAW,mBAAoBnB,EAAKyB,uBAAuBJ,KAAKrB,IACnEmB,GAAG,QAAS,mBAAoBnB,EAAK0B,cAAcL,KAAKrB,IACxDmB,GAAG,QAAS,oBAAqBnB,EAAK2B,iBAAiBN,KAAKrB,IAC5DmB,GAAG,QAAS,qBAAsBnB,EAAK4B,kBAAkBP,KAAKrB,IAC9DmB,GAAG,UAAWnB,EAAK6B,WAAWR,KAAKrB,IACnCmB,GAAG,WAAYnB,EAAK8B,UAAUT,KAAKrB,IAEpCA,EAAKF,QAAQiC,OACb/B,EAAKgC,eAAe,CAAEC,OAAQjC,EAAKF,WAI3CoC,OAAQ,CACJ1D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAG,EACAC,EACAH,EACAC,GAGJe,QAAS,CACLK,KAAM,SACNW,SAAS,EACTV,UAAU,EACVC,WAAW,EACX6B,cAAc,EACdC,SAAU,GACVC,MAAO,GACPC,MAAO,CACHC,eAAgB,EAChBC,gBAAiB,IACjBC,eAAgB,EAChBC,WAAY,OACZC,YAAY,EACZC,iBAAiB,EACjBC,OAAQ,+BACRC,gBAAgB,GAEpBvC,aAAc,CACVwC,OAAU,kBACVC,OAAU,SACVC,MAAS,QACTC,OAAU,SACVC,MAAS,QACTC,OAAU,SACVC,mBAAsB,QACtBC,oBAAuB,SACvBC,cAAiB,4BACjBC,aAAgB,0DAChBC,gBAAmB,YACnBC,eAAkB,WAClBC,cAAiB,UACjBC,aAAgB,SAChBC,sBAAyB,eACzBC,mBAAsB,SACtBC,qBAAwB,OACxBC,cAAiB,iCACjBC,WAAc,4BACdC,mBAAsB,uBACtBC,mBAAsB,uBACtBC,qBAAwB,0BAE5BC,WAAY,CACRC,kBAAmB,GACnBC,YAAa,EACbC,YAAa,GAEjBC,SAAU,IAGdlD,kBAAmB,WACf,IAAIvB,EAAOnC,KACPkC,EAAUC,EAAKD,QAEnB,GAAIA,EAAQuC,MAAMoC,QAAS,CACvB1E,EAAK2E,QAAU3E,EAAK4E,oBACpB,IAAIC,EAAqB7E,GACzB,IAAI8E,EAAmB9E,GACvBA,EAAK+E,QAAS,EAEd,IAAIC,EAAejF,EAAQsC,MACvB2C,EAAarE,OAAS,GACtBX,EAAKiF,oBAAoBD,QAI7BhF,EAAK2E,QAAU,IAAIO,EAAiBlF,IAI5CmF,WAAY,SAASpF,GACjB,IAAIC,EAAOnC,KACP2C,EAAcR,EAAKF,QAEvBhC,EAAEkC,EAAKD,QAAQ0E,UAAUW,IAAIpF,EAAKiB,KAElC/C,EAAOgC,GAAGiF,WAAWhF,KAAKH,EAAMD,GAEhCC,EAAKK,SAAWL,EAAKD,QAAQM,SAC7BL,EAAKM,UAAYN,EAAKD,QAAQO,UAE9BE,EAAY6E,KAAK,aAAYrF,EAAKsF,qBAAsBtF,EAAKK,UACzDL,EAAKM,YACLE,EAAY6E,KAAK,kBAAmBrF,EAAKM,WACzCE,EAAY6E,KAAK,YAAarF,EAAKM,YAEvCN,EAAKc,OAAOd,EAAKD,QAAQgB,SAEzBf,EAAKuB,oBAELvB,EAAKwB,mBAGT+D,OAAQ,SAASA,GACbA,OAA6B,IAAb,GAAkCA,EAClD1H,KAAKiD,OAAOyE,IAGhBC,QAAS,WACL3H,KAAKiD,QAAO,IAGhBA,OAAQ,SAASyE,GACbA,OAA6B,IAAb,EAA2BA,GAAUA,EACrD1H,KAAK4C,QAAQgF,YAAY,aAAcF,GACvC1H,KAAKiC,QAAQ4F,KAAK,WAAYH,IAGlCI,MAAO,WACH9H,KAAKiC,QAAQ8F,QAAQ,UAGzBC,QAAS,WACL,IAAI7F,EAAOnC,KACPiI,EAAiBhI,EAAEkC,EAAKD,QAAQ0E,UAEpC3G,EAAEiI,UACGC,IAAIlI,EAAE,cAAekC,EAAKS,UAC1BuF,IAAIhG,EAAKS,QAAQC,QAAQ,SACzB0E,IAAIpF,EAAKiB,KAEV6E,EAAenF,OAAS,GACxBmF,EAAeV,IAAIpF,EAAKiB,KAG5BnD,EAAEkC,EAAKF,SAASsF,IAAI7G,GAEhByB,EAAKC,cACLD,EAAKC,aAAagG,SAAQ,SAAUC,GAChCA,EAAYL,aAGpB3H,EAAOgC,GAAG2F,QAAQ1F,KAAKH,IAE3BmD,MAAO,SAASgD,GACZtI,KAAK8G,QAAQyB,QAAQ,CAAEnE,OAAQnE,EAAEqI,EAAWtI,KAAK4C,WAEjD,IAAI4F,EAAYF,EAAUG,KAAK,mCAC3BlD,EAASpF,EAAMuI,WAAW1I,KAAK0C,aAAa6C,QAChDpF,EAAMG,GAAGqI,KAAKH,EAAW,CAAEG,KAAM,YACjCH,EAAUhB,KAAK,QAASjC,GACxBtF,EAAEuI,GAAWI,SAASpB,KAAK,aAAcjC,IAE7CA,OAAQ,SAAS+C,GACbtI,KAAK8G,QAAQ+B,SAAS,CAAEzE,OAAQnE,EAAEqI,EAAWtI,KAAK4C,WAElD,IAAIkG,EAAWR,EAAUG,KAAK,iCAC1BnD,EAAQnF,EAAMuI,WAAW1I,KAAK0C,aAAa4C,OAC/CnF,EAAMG,GAAGqI,KAAKG,EAAU,CAAEH,KAAM,aAChCG,EAAStB,KAAK,QAASlC,GACvBrF,EAAE6I,GAAUF,SAASpB,KAAK,aAAclC,IAE5CyD,OAAQ,WACO/I,KAEN8G,QAAQkC,kBAGjBC,SAAU,WAMN,IALA,IACIC,EACAC,EAAW,GACXC,EAHOpJ,KAGU4C,QAAQ6F,KAAK,WAEzBY,EAAI,EAAGA,EAAID,EAAUtG,OAAQuG,IAGlC,GAFAH,EAAYjJ,EAAEmJ,EAAUC,IAAIC,KAAK,aAG7B,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAUpG,OAAQyG,IAClCJ,EAASK,KAAKN,EAAUK,IAKpC,OAAOJ,GAGXM,cAAe,WACX,IAAItH,EAAOnC,KACCmC,EAAKS,QAAQ6F,KAAK,WAExBiB,MAAK,SAASC,EAAOC,GACvBzH,EAAK0H,wBAAwBD,GAAM,OAI3CE,eAAgB,WACZ,IAAI3H,EAAOnC,KACCmC,EAAKS,QAAQ6F,KAAK,WAExBiB,MAAK,SAASC,EAAOC,GACvBzH,EAAK0H,wBAAwBD,GAAM,OAI3CG,gBAAiB,SAASC,GACtBhK,KAAKiK,iBAAiBD,GAAK,IAG/BE,eAAgB,SAASF,GACrBhK,KAAKiK,iBAAiBD,GAAK,IAG/BC,iBAAkB,SAASD,EAAKG,GAC5B,IACI7B,EAEe,iBAAR0B,IAEX1B,EAAYrI,EAAE,WAAaE,EAAMqH,KAAK,OAAS,KAAOwC,EAAM,KALjDhK,KAK4D4C,UAEzDE,OAAS,GAPZ9C,KAQF6J,wBAAwBvB,EAAW6B,IAIhDC,UAAW,SAASC,GAChBrK,KAAKsK,YAAYD,GAAU,IAG/BE,WAAY,SAASF,GACjBrK,KAAKsK,YAAYD,GAAU,IAG/BC,YAAa,SAASD,EAAUF,GAC5B,IAEIK,EAFArI,EAAOnC,KACPwE,EAAQrC,EAAKS,QAAQ6F,KAAK,WAGN,mBAAb4B,GACP7F,EAAMkF,MAAK,SAASC,EAAOC,GACvBY,EAAWvK,EAAE2J,GAAMN,KAAK,aAEpBe,EAASG,IACTrI,EAAK0H,wBAAwBD,EAAMO,OAMnDN,wBAAyB,SAASvB,EAAW6B,GACzC,IAAIhI,EAAOnC,KACPwK,EAAW,CACXpG,OAAQnE,EAAEqI,EAAWnG,EAAKS,UAI1BT,EAAKD,QAAQuC,MAAMoC,SACf5G,EAAEqI,GAAWmC,SAAS,mBACtBtI,EAAK2E,QAAQ4D,SAASF,GAEtBrI,EAAK2E,QAAQ6D,SAASH,EAAU,GAAIL,GAKhB,IAFblK,EAAE,UAAWkC,EAAKS,SAEhBE,OACTX,EAAKyI,0BAELzI,EAAK0I,6BAGT1I,EAAK2E,QAAQ6D,SAASH,EAAU,GAAIL,IAI5CW,UAAW,SAASC,GAEhB,GAAKA,EAAY,GAAGC,SAApB,CAIA,IAAI7I,EAAOnC,KACPiL,EAAQF,EAAYG,QAAQhH,IAAI,IAEpC+G,EACKE,YAAYhJ,EAAKF,SACjBqH,KAAK,QAAUnH,EAAKD,QAAQkJ,OAASjJ,EAAKD,QAAQK,KAAMJ,GAE7DlC,EAAEkC,EAAKF,SACFoJ,OACA7D,KAAK5F,EAAU,MACf0J,WAAW,MACX/D,IAAI7G,GAETyB,EAAKa,aAAaiI,GAClB9I,EAAKF,QAAQ8F,QAAQ,WAGzB/E,aAAc,SAASiI,GACnB,IAAI9I,EAAOnC,KACP4C,EAAUT,EAAKS,QAEnBT,EAAKF,QAAUgJ,EAEX9I,EAAKM,YACLwI,EAAMzD,KAAK,kBAAmBrF,EAAKM,WACnCwI,EAAMzD,KAAK,YAAarF,EAAKM,YAGjCwI,EACKzD,KAAK,aAAYrF,EAAKsF,qBAAsBtF,EAAKK,UACjDgF,KAAK,eAAgB,OACrBlE,GAAG,QAAU5C,GAAI,SAAS6K,GACnB3I,EAAQ6H,SAAS,eACjBc,EAAEC,oBAGTlI,GAAG,QAAU5C,GAAI,WACdT,EAAED,MAAM4I,SAAS6C,SAAS/J,MAE7B4B,GAAG,OAAS5C,GAAI,WACbT,EAAED,MAAM4I,SAAS8C,YAAYhK,MAEhC4B,GAAG,SAAW5C,EAAIyB,EAAKgC,eAAeX,KAAKrB,KAGpDwJ,kBAAmB,SAASC,EAAaC,GACrCD,EAAYF,YAAYhK,GACxBkK,EAAYpE,KAAK5F,GAAW,GAC5BiK,EAAQJ,SAAS/J,GACjBmK,EAAQrE,KAAK5F,EAAU,IAG3BkK,oBAAqB,SAASP,EAAGQ,EAAKH,GAClC,IAEIC,EAFA1J,EAAOnC,KACPgM,EAAY7L,EAAM8L,KAGlBF,IAAQC,EAAUE,MAClBX,EAAEC,iBACFD,EAAEY,kBAEFN,EAAU1J,EAAKS,QAAQ6F,KAAK,2BAA2B2D,QAEnDR,EAAY9I,OAAS,IACjB8I,EAAYnB,SAAS,qBACrBmB,EAAYF,YAAYhK,GACxBkK,EAAcA,EAAY/I,QAAQ,YAGtCgJ,EAAUD,EAAYS,QAG1BlK,EAAKwJ,kBAAkBC,EAAaC,GAE/BA,GAA8B,IAAnBA,EAAQ/I,SACpB+I,EAAU1J,EAAKS,QAAQ6F,KAAK,uBAEzBsD,IAAQC,EAAUM,IACzBf,EAAEC,iBACFD,EAAEY,kBAEFN,EAAU1J,EAAKS,QAAQ6F,KAAK,gCAExBmD,EAAY9I,OAAS,IACjB8I,EAAYnB,SAAS,qBACrBmB,EAAYF,YAAYhK,GACxBkK,EAAcA,EAAY/I,QAAQ,YAGtCgJ,EAAUD,EAAYW,QAG1BpK,EAAKwJ,kBAAkBC,EAAaC,IAC7BE,IAAQC,EAAUQ,OACrBZ,EAAYnB,SAAS,oBACrBoB,EAAUD,EAAYS,KAAK,sBAEQ,IAAnBR,EAAQ/I,SACpB+I,EAAUD,EAAYhD,SAASH,KAAK,2BAEjCmD,EAAY9I,OAAS,IAC5B+I,EAAUD,EAAYnD,KAAK,2BAG3BoD,GAAWA,EAAQ/I,OAAS,IAC5B8I,EAAYF,YAAYhK,GACxBmK,EAAQJ,SAAS/J,KAEdqK,IAAQC,EAAUS,OACrBb,EAAYnB,SAAS,oBACrBoB,EAAUD,EAAYW,KAAK,sBAEQ,IAAnBV,EAAQ/I,SACpB+I,EAAUD,EAAYhD,SAASH,KAAK,0BAEjCmD,EAAY9I,OAAS,IAC5B+I,EAAUD,EAAYnD,KAAK,0BAG3BoD,GAAWA,EAAQ/I,OAAS,IAC5B8I,EAAYF,YAAYhK,GACxBmK,EAAQJ,SAAS/J,KAInBmK,GAA8B,IAAnBA,EAAQ/I,QAAkBiJ,IAAQC,EAAUM,IAAMP,IAAQC,EAAUE,OACjFL,EAAU1J,EAAKF,SAGf4J,GAAWA,EAAQ/I,OAAS,IAC5BX,EAAKuK,qBAAsB,EAC3Bb,EAAQ9D,QAAQ,WAIxB4E,2BAA4B,SAASZ,EAAKH,EAAagB,GACnD,IAAIzK,EAAOnC,KACPgM,EAAY7L,EAAM8L,KAClB3D,EAAYrI,EAAE2L,EAAazJ,EAAKS,SAIpC,GAFAT,EAAK0K,eAAgB,EAEjBd,IAAQC,EAAUc,KAAOlB,EAAYnD,KAAK,+BAA+B3F,OAAS,EAClFX,EAAK4F,QAAQ/G,EAAQ4L,GACrBzK,EAAK2E,QAAQ4D,SAAS,CAAEtG,OAAQkE,IAChCnG,EAAK4K,oBACL5K,EAAK0I,4BACL1I,EAAKuK,qBAAsB,EAC3BvK,EAAKF,QAAQ8F,QAAQ,cAClB,GAAIgE,IAAQC,EAAUgB,SACrBpB,EAAYnD,KAAK,mCAAmC3F,OAAS,GAC7DX,EAAK4F,QAAQ7G,EAAO0L,GACpBzK,EAAKmD,MAAMsG,GACXzJ,EAAK0I,6BACEe,EAAYnD,KAAK,iCAAiC3F,OAAS,IAClEX,EAAK4F,QAAQ5G,EAAQyL,GACrBzK,EAAKoD,OAAOqG,SAEb,GAAIG,IAAQC,EAAUiB,QAAUrB,EAAYsB,GAAG,sDAAuD,CACzG,GAAI/K,EAAKD,QAAQuC,MAAM0I,YAAchL,EAAKD,QAAQuC,MAAM2I,YAAcnN,EAAE,mBAAoBkC,EAAKS,SAASE,OAAS,EAC/G,OAGJ7C,EApfe,sDAofS2L,GAAavG,SACrCpF,EAAE0B,EAAsBiK,GAAayB,SAASC,OAEzCnL,EAAK2E,QAAQyG,SAASjF,EAAUgB,KAAK,SACtCnH,EAAK2E,QAAQ0G,aAAalF,GAG9BnG,EAAK2E,QAAQ2G,QAAQ,CAAErJ,OAAQkE,IAC/BnG,EAAK0K,eAAgB,IAI7Ba,sBAAuB,SAAS3B,EAAKH,GACjC,IAAIzJ,EAAOnC,KACPgM,EAAY7L,EAAM8L,KAClBzH,EAAQoH,EAAYtC,KAAK,aACzBqE,EAAsBxL,EAAKyL,8BAA8BpJ,GACzDoI,EAAY,CACRpI,MAAOA,EACPqJ,QAAS,IAGb9B,IAAQC,EAAU8B,OACb3L,EAAK4F,QAAQ1G,EAAQuL,KACtBzK,EAAK2E,QAAQ6D,SAAS,CAAEvG,OAAQnE,EAAE2L,EAAazJ,EAAKS,UAAYgK,GAAYe,GAC5ExL,EAAKuK,qBAAsB,EAC3BvK,EAAKF,QAAQ8F,QAAQ,UAElBgE,IAAQC,EAAU+B,KACzBnC,EAAYF,YAAYhK,GACxBkK,EAAYpE,KAAK5F,GAAW,IACnBO,EAAKD,QAAQuC,MAAMoC,SAC5B1E,EAAKwK,2BAA2BZ,EAAKH,EAAagB,IAI1D3I,UAAW,WACP,IAAI2H,EAAc5L,KAAK4C,QAAQ6F,KAAK,mCAE/BzI,KAAK0M,oBAIN1M,KAAK0M,qBAAsB,GAH3Bd,EAAYF,YAAYhK,GACxBkK,EAAYpE,KAAK5F,GAAW,KAMpCoC,WAAY,SAASuH,GACjB,IAAIpJ,EAAOnC,KACP4L,EAAczJ,EAAKS,QAAQ6F,KAAK,4DAChCuD,EAAY7L,EAAM8L,KAClB+B,EAAc,CAAChC,EAAU8B,OAAQ9B,EAAUc,IAAKd,EAAUiB,MAAOjB,EAAUgB,SAAUhB,EAAU+B,KAC/FhC,EAAMR,EAAE0C,QAERlC,IAAQC,EAAUE,MAAQH,IAAQC,EAAUM,IAAMP,IAAQC,EAAUS,MAAQV,IAAQC,EAAUQ,MAC9FrK,EAAK2J,oBAAoBP,EAAGQ,EAAKH,GAC1BA,EAAY9I,OAAS,GAAK8I,EAAYnB,SAAS,WAAauD,EAAYE,QAAQnC,IAAQ,IAAM5J,EAAKS,QAAQ6H,SAAS,gBACvHsB,IAAQC,EAAUgB,WAClBzB,EAAEC,iBACFD,EAAEY,mBAGNhK,EAAKuL,sBAAsB3B,EAAKH,KAIxCzH,eAAgB,SAASoH,GACrB,IAAIpJ,EAAOnC,KACPiL,EAAQhL,EAAEsL,EAAEnH,QACZI,EAAQ2J,EAAkBhM,EAAKiM,YAAYnD,GAAQ9I,EAAKkM,oBAE5DC,EAAc9J,EAAOrC,EAAKD,QAAQsE,YAElBrE,EAAK4F,QAAQpH,EAAQ,CAAE6D,MAAOA,KAE1CrC,EAAK2I,UAAUG,GACfA,EAAM5F,UAENlD,EAAK2E,QAAQyH,SAAS,CAAEnK,OAAQ6G,GAASzG,IAIjDZ,uBAAwB,SAAS2H,GAC7B,IAAIQ,EAAMR,EAAE0C,QACRjC,EAAY7L,EAAM8L,KAElBF,IAAQC,EAAUiB,OAASlB,IAAQC,EAAUgB,UAC7ChN,KAAK4C,QAAQ6F,KAAK,+BAA+B+F,OAAOzG,QAAQ,UAIxE0G,eAAgB,SAASC,GACrB,IAAIC,EAAW,IAAI1O,EAAE2O,SACjBC,EAAYH,EAAKI,eACjBC,EAAiB,GAEjBC,EAAc,WACdH,EAAUG,aAAY,SAASC,GACtBA,EAAQnM,QAGTiM,EAAiBA,EAAeG,OAAOD,GACvCD,KAHAL,EAASQ,QAAQJ,KAKtBJ,EAASS,SAKf,OAFDJ,IAEQL,EAASU,WAGrBC,UAAW,SAASZ,GAChB,IAAIvM,EAAOnC,KACPuP,EAAWb,EAAKc,SAEpBd,EAAK9E,MAAK,SAASA,GACXA,EAAK6F,aAAeF,EAASG,MAAM,GACnCvN,EAAKwN,mBAAmBnG,KAAKI,GAC7BzH,EAAKyN,uBAC6B,IAA9BzN,EAAKyN,sBACLC,YAAW,WAC2B,IAA9B1N,EAAKyN,sBACDzN,EAAKwN,mBAAmB7M,SACxBX,EAAK2N,qBAAqB3N,EAAKwN,oBAC/BxN,EAAKwN,mBAAqB,MAGpC,MAEX,WACCnP,EAAa,mBAIrBuP,kBAAmB,SAASrB,EAAMsB,GAC9B,IAAI7N,EAAOnC,KACNgQ,GACD7N,EAAKyN,uBAGT5P,KAAKyO,eAAeC,GAAMuB,MAAK,SAASC,GACpC/N,EAAKyN,sBAAwBM,EAAMpN,OACnC,IAAK,IAAIuG,EAAI,EAAGA,EAAI6G,EAAMpN,OAAQuG,IAC1B6G,EAAM7G,GAAG8G,OACThO,EAAKmN,UAAUY,EAAM7G,IACd6G,EAAM7G,GAAG+G,aAChBjO,EAAK4N,kBAAkBG,EAAM7G,QAM7CgH,QAAS,SAAS9E,GACd,IAGIzI,EAHAwN,EAAK/E,EAAEgF,cAAcC,aACrBrO,EAAOnC,KACPyQ,EAAeH,EAAG9L,MAIvB,GADCkM,EAAUnF,GACPpJ,EAAKD,QAAQyO,eAAiBL,EAAGJ,MAAO,CACvCpN,EAASwN,EAAGJ,MAAMpN,OAClBX,EAAKyN,qBAAuB,EAC5BzN,EAAKwN,mBAAqB,GAE1B,IAAK,IAAItG,EAAI,EAAGA,EAAIvG,EAAQuG,IACxB,GAAIiH,EAAGJ,MAAM7G,GAAGuH,iBAAkB,CAC9B,IAAIC,EAAQP,EAAGJ,MAAM7G,GAAGuH,mBAEpBC,EAAMT,YACNjO,EAAK4N,kBAAkBc,GAAO,GACvBA,EAAMV,QACbhO,EAAKwN,mBAAmBnG,KAAK8G,EAAG9L,MAAM6E,SAGzClH,EAAK2N,qBAAqBW,QAIpCtO,EAAK2N,qBAAqBW,IAIjCX,qBAAsB,SAASW,GAC3B,IAAItO,EAAOnC,KACPwE,EAAQ2J,EAAkB2C,EAAeL,GAAetO,EAAKkM,oBAE3DoC,EAAa3N,OAAS,IAAMX,EAAKS,QAAQ6H,SAAS,iBAC/CtI,EAAKK,UAAYgC,EAAM1B,OAAS,GACjC0B,EAAMuM,OAAO,EAAGvM,EAAM1B,OAAS,GAGnCwL,EAAc9J,EAAOrC,EAAKD,QAAQsE,YAElBrE,EAAK4F,QAAQpH,EAAQ,CAAE6D,MAAOA,KAE1CrC,EAAK2E,QAAQyH,SAAS,CAAEnK,OAAQnE,EAAE,cAAekC,EAAKS,UAAY4B,KAK9EoJ,8BAA+B,SAASpJ,GACpC,IAAIwM,GAAY,EAShB,OAPA/Q,EAAEuE,GAAOkF,MAAK,SAASC,EAAOC,GAC1B,GAAIA,EAAqB,kBAAKA,EAAqB,iBAAE9G,OAAS,EAE1D,OADAkO,GAAY,GACL,KAIRA,GAGX3C,iBAAkB,WACd,OAAQrO,KAAKkH,SAAWlH,KAAKkC,QAAQuC,MAAMwM,QAAU,GAGzD7J,oBAAqB,SAAS5C,GAC1B,IAAIrC,EAAOnC,KACPkR,EAAM,EAGV,IAFA1M,EAAQ2J,EAAkB3J,GAAO,GAE5B0M,EAAM,EAAGA,EAAM1M,EAAM1B,OAAQoO,IAAO,CACrC,IAAIC,EAAc3M,EAAM0M,GAEpB5I,EAAYnG,EAAKiP,aAAaD,EAAY5O,KAAM,CAAE8O,UAAW,CAACF,KAClE7I,EAAUmD,SAAS,kBAAkBnC,KAAK,QAAS,CAAC9E,EAAM0M,KAEtD/O,EAAKmP,mBACLnP,EAAKoP,YAAYjJ,EAAWjH,KAKxCmQ,qBAAsB,SAASjP,EAAM+G,GACjC,IAAIJ,EAAYI,EAAK+H,UACjBI,EAAe,GACfC,EAAY,EACZR,EAAM,EAEV,IAAKA,EAAM,EAAGA,EAAMhI,EAAUpG,OAAQoO,IAClCQ,GAAaxI,EAAUgI,GAAKS,KAOhC,OAJAF,EAAalP,KAAOA,EACpBkP,EAAaE,KAAOD,EACpBD,EAAajN,MAAQ8E,EAAK+H,UAEnBI,GAGXG,yBAA0B,WACtB,MAAO,8CAGXC,uBAAwB,SAASC,GAC7B,MAAO,qCACH3R,EAAMG,GAAGqI,KAAK,CAAEA,KAAMmJ,EAAcC,UAAW,cAAeJ,KAAM,YADjE,6CAMXK,iBAAkB,SAASpP,GACvB,IAAIyF,EAAczF,EAAQqP,iBAAiB,CACvCC,WAAW,EACXC,YAAY,IACb7I,KAAK,oBACRtJ,KAAKoC,aAAaoH,KAAKnB,IAG3B+J,uCAAwC,SAAS9I,GAC7C,IACIM,EAAON,EAAK+H,UAAU,GACtBgB,EAAWC,EAAyBhJ,EAAK+H,WACzCkB,EAAYpS,EAAMqS,aAAa5I,EAAK6I,WAAW,GAC/CC,EAAS9I,EAAqB,iBAC9B+I,EAAUD,GAAUA,EAAO5P,OAAS,EACpC8P,EAAeD,EAAU,+BAAiC,GAC1DE,EAAcF,EACV,8DAAgExS,EAAMuI,WARnE1I,KAQmF0C,aAAagQ,EAAO,KAAO,UACjH,6BAA+BL,EAAW,UAC9C9N,EAAW,GAYf,OAVAA,GAAY,oBAAsBqO,EAAe,KAC7C5S,KAAK4R,2BACL5R,KAAK6R,uBAAuBU,GAFpB,8DAIkC3I,EAAKrH,KAAO,KAAOqH,EAAKrH,KAAO,UACrEsQ,EACJ,UAIG5S,EAFPsE,GAAY,2CAKhBuO,2CAA4C,SAASxJ,GACjD,IAKID,EAAG8H,EAJH3M,EAAQ8E,EAAK+H,UACb0B,EAFO/S,KAE0B4N,8BAA8BpJ,GAC/DwO,EAAgBV,EAAyB9N,GACzCD,EAAW,GAiBf,IAbAA,GAAY,qBAFOwO,EAA4B,+BAAiC,IAE/B,KAC7C/S,KAAK4R,2BACL5R,KAAK6R,uBAAuB,QAEhCrN,EAAMyO,MAAK,SAASC,EAAGC,GACnB,OAAID,EAAkB,kBAAa,EAE/BC,EAAkB,iBAAY,EAE3B,KAGX5O,GAAY,0CACP8E,EAAI,EAAGA,EAAI7E,EAAM1B,OAAQuG,IAAK,CAE/B,IAAIgJ,EAAWC,EAAyB,CADxCnB,EAAc3M,EAAM6E,KAGpB9E,GAAY,0CACR4M,EAA4B,kBAAKA,EAA4B,iBAAErO,OAAS,EACxEyB,GAAY,wDAA0D4M,EAAY5O,KAAO,KAAO4O,EAAY5O,KAAO,UAEnHgC,GAAY,oCAAsC4M,EAAY5O,KAAO,KAAO4O,EAAY5O,KAAO,UAEnGgC,GAAY,6BAA+B8N,EAAW,iBAW1D,OAPI9N,GADAwO,EACY,8DAAgE5S,EAAMuI,WAnC3E1I,KAmC2F0C,aAAaiD,cAAgB,UAEnH,uCAAyCnB,EAAM1B,OAAS,WAAakQ,EAAgB,UAK9F/S,EAFPsE,GAAY,kDAKhB6M,aAAc,SAAS7O,EAAM+G,GACzB,IACI8J,EACA9K,EAKAmJ,EACA4B,EAEAhL,EACAiL,EAXAnR,EAAOnC,KAGPuT,EAAUjK,EAAK+H,UAAU,GAAGrH,IAC5BwJ,EAAWvT,EAAE,kBAAmBkC,EAAKS,SAErC2B,EADUpC,EAAKD,QACIqC,SAGnBkP,EAAsBlP,EAv1BE,cAu1ByC5C,EA8DrE,OA1DwB,IAApB6R,EAAS1Q,SACT0Q,EAAWvT,EAAE,4CAA4CyT,SAASvR,EAAKS,SAClET,EAAKD,QAAQoC,cACdkP,EAASnI,OAGblJ,EAAKS,QAAQ8I,YAAY,mBAG7B0H,EAAsBnT,EAAE,UAAWuT,GAE9BjP,GAODkN,EAAetP,EAAKqP,qBAAqBjP,EAAM+G,GAC/C/E,EAAWpE,EAAMoE,SAASA,IAE1B+D,EAAYrI,EAAE,sBAAwBsE,EAASkN,GAAgB,UACrDhJ,KAAK,oBAAoBgD,SAAS,oFAE5CtJ,EAAKwR,QAAQ,WAAW,WACpB,MAAO,CACHC,SAAUtL,EACVgB,KAAM,CAAEmI,QAdZnJ,EAD0B,IAA1BgB,EAAK+H,UAAUvO,OACHX,EAAKiQ,uCAAuC9I,GAE5CnH,EAAK2Q,2CAA2CxJ,IAkBpEgK,GADAjL,EAAcpI,EAAEwT,EAAqBnL,EAAU,KACnBxF,OAAS,IAGjCX,EAAK6P,iBAAiB3J,GAG1BC,EACKd,KAAKrH,EAAMqH,KAAK,OAAQ+L,GACxBG,SAASF,GACTlK,KAAKA,IAELnH,EAAK+E,QAAUoM,GAChBjL,EAAYiB,KAAK,oBAAoBuK,MAAM,MAG1C1R,EAAKK,UAAY4Q,EAAoBtQ,OAAS,IAC/CuQ,EAAkB,CACd7O,MAAO4O,EAAoB9J,KAAK,aAChCuE,QAAS,IAER1L,EAAK4F,QAAQ1G,EAAQgS,IACtBlR,EAAK2E,QAAQ6D,SAAS,CAAEvG,OAAQnE,EAAEmT,EAAqBjR,EAAKS,UAAYyQ,IAIzE/K,GAGXwL,iBAAkB,SAASxL,GACvB,IAEIa,EAFAhH,EAAOnC,KACPwT,EAAWlL,EAAUzF,QAAQ,mBAGjCyF,EAAUjD,SACV8D,EAAWlJ,EAAE,UAAWuT,GACJvT,EAAE,iCAAkCuT,GAElC1Q,SAAWqG,EAASrG,QACtC9C,KAAK+T,qBAGe,IAApB5K,EAASrG,QACT0Q,EAASnO,SACTlD,EAAKS,QAAQ6I,SAAS,kBACtBtJ,EAAKyI,2BAELzI,EAAK0I,6BAIb0G,YAAa,SAASyC,EAAaC,EAAWC,GAC1C,IACIC,EADAC,EAAsB,CAAE/O,OAAQ,IAAKF,OAAQ,SAAUC,MAAO,wBAAyBE,MAAO,YAE9F+O,EAAgBlU,EAAMuI,WAAW1I,KAAK0C,aAAauR,IAEvD,GAAKG,EAAoBE,eAAeL,GAMxC,GAHKC,GACDlU,KAAKuU,iBAAiBP,GAErBhU,KAAKkC,QAAQqC,SASd,IADA4P,EAAoBH,EAAYvL,KAAK,oBAAoB2D,SAClC3D,KAAK,uBAAuB3F,QAS5C,GAAIqR,EAAkB9H,KAAK,oBAAoBvJ,OAAQ,CAC1D,IAAI0R,EAAoBrU,EAAMG,GAAGqI,KAAK1I,EAAG,gBAAmBoU,EAAgB,iBAAqBA,EAAgB,aAAgB,CAC7H1L,KAAMyL,EAAoBH,GAC1BlC,UAAW,iBAAgC,SAAbkC,EAAuB,aAAe,MAExEE,EAAkB9H,KAAK,oBAClBZ,SAAS,sFACTgJ,OAAOD,GACPlH,YAjBkD,CACvD,IAAIoH,EAAkBvU,EAAMG,GAAGqI,KAAK1I,EAAG,gBAAmBoU,EAAgB,iBAAqBA,EAAgB,aAAgB,CAC3H1L,KAAMyL,EAAoBH,GAC1BlC,UAAW,iBAAgC,SAAbkC,EAAuB,aAAe,MAExEE,EACK1I,SAAS,sFACTgJ,OAAOC,GACPpH,YAhBJ4G,GACDF,EAAYvL,KAAK,oBAAoBpD,SAEzC2O,EAAYvL,KAAK,qBAAqBgM,OAClCzU,KAAK2U,cAAcP,EAAoBH,GAAYI,EAA4B,SAAbJ,EAAuB,YAAc,MA0BnHW,WAAY,SAAStM,EAAWuM,GAC5B,IAAInS,EAAe1C,KAAK0C,aAYpBoS,EAXS,CACLC,UAAW,CACPC,KAAMtS,EAAakD,iBAEvBqP,SAAU,CACND,KAAMtS,EAAamD,gBAEvBqP,OAAQ,CACJF,KAAMtS,EAAaqD,eAGL8O,GAEtBC,GACA7U,EAAE,oBAAqBqI,GAAW0M,KAAK7U,EAAMuI,WAAWoM,EAAaE,QAI7EL,cAAe,SAASQ,EAAUC,EAAYrD,GAC1C,MAAiB,KAAboD,EACOlV,EACP,iKAAmKmV,EAAa,mBAC5KjV,EAAMG,GAAGqI,KAAK1I,EAAG,gBAAmBmV,EAAa,aAAgB,CAAEzM,KAAMwM,EAAUpD,UAAW,iBAAmBA,EAAa,IAAMA,EAAa,MACrJ,aACEzO,GAAG,SAAS,WAAarD,EAAED,MAAMyL,SAAS/J,MAC1C4B,GAAG,QAAQ,WAAarD,EAAED,MAAM0L,YAAYhK,MAGvCzB,EACP,oIAEQmV,EAFR,qBASRb,iBAAkB,SAASP,GACvB/T,EAAE,mBAAoB+T,GAAaqB,QAAQhK,QAG/CxH,cAAe,SAAS0H,GACpB,IAAIpJ,EAAOnC,KACX,IAAKmC,EAAKS,QAAQ6H,SAAS,cAAe,CACtC,IAAI6K,EAASrV,EAAEsL,EAAEnH,QAAQvB,QAAQ,oBAC7B8F,EAAO2M,EAAO7M,KAAK,uBACnBH,EAAYgN,EAAOzS,QAAQ,WAC3B2B,EAAQ8D,EAAUgB,KAAK,aACvBqE,EAAsBxL,EAAKyL,8BAA8BpJ,GACzDoI,EAAY,CACZpI,MAAOA,EACPqJ,QAAS,IAGb1L,EAAK0K,eAAgB,EAEjBlE,EAAKuE,GAAG,qBACH/K,EAAK4F,QAAQ1G,EAAQuL,KACtBzK,EAAK2E,QAAQ6D,SAAS,CAAEvG,OAAQnE,EAAEqI,EAAWnG,EAAKS,UAAYgK,GAAYe,GAC1ExL,EAAKF,QAAQ8F,QAAQ,UAElBY,EAAKuE,GAAG,gCACf/K,EAAK4F,QAAQ/G,EAAQ4L,GACrBzK,EAAK2E,QAAQ4D,SAAS,CAAEtG,OAAQnE,EAAEqI,EAAWnG,EAAKS,WAClDT,EAAK4K,oBACL5K,EAAK0I,4BACL1I,EAAKF,QAAQ8F,QAAQ,UACdY,EAAKuE,GAAG,oCACf/K,EAAK4F,QAAQ7G,EAAO0L,GACpBzK,EAAKmD,MAAMgD,GACXnG,EAAK0I,6BACElC,EAAKuE,GAAG,kCACf/K,EAAK4F,QAAQ5G,EAAQyL,GACrBzK,EAAKoD,OAAO+C,IACLK,EAAK8B,SAAS,eACrBxK,EAAE,0BAA2BqI,GAAWjD,SACxCpF,EAAE0B,EAAsB2G,GAAW+E,SAASC,OAC5CnL,EAAK2E,QAAQ2G,QAAQ,CAAErJ,OAAQnE,EAAEqI,EAAWnG,EAAKS,WACjDT,EAAK0K,eAAgB,GAGzBvE,EAAUmD,SAAS/J,GAGvB,OAAO,GAGXqC,kBAAmB,WAQf,OAPW/D,KACQ4C,QAEN6H,SAAS,eAClBzK,KAAK8G,QAAQkC,kBAGV,GAGXlF,iBAAkB,WACd,IAAI3B,EAAOnC,KAQX,OAPcmC,EAAKS,QAGN6H,SAAS,eAAkBtI,EAAK4F,QAAQ9G,EADhC,KAEjBkB,EAAKsH,iBAGF,GAGX8L,gBAAiB,SAAShK,EAAGiK,GACzB,IACIC,EAAcxV,EAAE0B,EAAsB4J,EAAEnH,QAAQkF,KAAK,oBAErDkM,EAAkB,MAClBA,EAAkB,KAGtBvV,EAAE0B,EAAsB4J,EAAEnH,QAAQsH,YAAY,YAEzC1L,KAAKkC,QAAQqC,WAGa,IAFbtE,EAAE,gBAAiBsL,EAAEnH,QAEnBtB,QACZ7C,EAAE,oBAAqBsL,EAAEnH,QAAQsR,QAAQ,sCAGrB,MAApBF,EACAvV,EAAE,gBAAiBsL,EAAEnH,QAAQ4Q,KAAKQ,EAAkB,KAEpDvV,EAAE,gBAAiBsL,EAAEnH,QAAQiB,UAIjCoQ,GACAA,EAAY5B,MAAM2B,GAGtBxV,KAAK+H,QAAQ3G,EAAU,CACnBoD,MAAOmR,EAAapK,GAAGjC,KAAK,aAC5BkM,gBAAiBA,KAIzBI,iBAAkB,SAASrK,EAAGsK,EAAUC,GACpC,IAAI3T,EAAOnC,KACPsI,EAAYqN,EAAapK,GACzB/G,EAAQ8D,EAAUgB,KAAK,aACvByM,EAAWzN,EAAUG,KAAK,mBAC1B4J,EAAW/J,EAAUG,KAAK,gBAEdtG,EAAK4F,QAAQlH,EAAS,CAClC2D,MAAO8D,EAAUgB,KAAK,aACtBuM,SAAUA,EACVG,UAAW,SACXC,eAAgBH,IAIhB3T,EAAK+T,qBAAqB5N,IAE1BnG,EAAKyS,WAAWtM,EAAW,YAC3BA,EAAUoD,YAAY,mBAAmBD,SAAS,kBAE9CsK,EAASjT,OAAS,EAClBiT,EAAStK,SAAS,YACb0K,MAAM,8DAAgE3R,EAAM1B,OAAS,IAAM3C,EAAMuI,WAAWvG,EAAKO,aAAayD,eAAiB,WAC7IkM,EAASvP,OAAS,GACzBuP,EAAS5G,SAAS,YACb0K,MAAM,8DAAgEhW,EAAMuI,WAAWvG,EAAKO,aAAayD,eAAiB,WAGnIhE,EAAK0I,4BAED1I,EAAKmP,kBACLnP,EAAKoP,YAAYjJ,EAAWjH,GAE5Bc,EAAKoS,iBAAiBjM,IAI9BnG,EAAKiU,oBAAoB9N,GAEzBnG,EAAK4K,qBAGTsJ,eAAgB,SAAS9K,EAAGuK,GACxB,IAAI3T,EAAOnC,KACPR,EAAS2C,EAAK2E,QACdwB,EAAYqN,EAAapK,GACzBgI,EAAUjL,EAAUgB,KAAK,OAE7BnH,EAAK+T,qBAAqB5N,GAE1BnG,EAAK4F,QAAQjH,EAAO,CAChBkV,UAAW,SACXxR,MAAO8D,EAAUgB,KAAK,aACtB2M,eAAgBH,IAGpBtV,EAAa,oBAAsBsV,EAAIQ,cAElCnU,EAAKD,QAAQuC,MAAM0I,UAGhB3N,EAAO+W,mBACP/W,EAAO+W,kBAAkBhD,GAH7BpR,EAAKiU,oBAAoB9N,GAO9BnG,EAAK4K,oBAEA/M,KAAKkC,QAAQuC,MAAMC,gBACpB1E,KAAKwW,gBAAgBlO,IAG5BkO,gBAAiB,SAASlO,GACtB,IAAInG,EAAOnC,KACPyW,EAAUzW,KAAK8G,QAAQ2P,QAEtBA,IAIAA,EAAQnO,EAAUgB,KAAK,UACxBmN,EAAQnO,EAAUgB,KAAK,QAAU,GAGjCmN,EAAQnO,EAAUgB,KAAK,SAAWtJ,KAAKkC,QAAQuC,MAAMG,iBACrD6R,EAAQnO,EAAUgB,KAAK,UACvBuG,YAAW,WACP1N,EAAK2E,QAAQ4P,cAAcpO,KAC7BtI,KAAKkC,QAAQuC,MAAMC,mBAG7BwR,qBAAsB,SAAS5N,GAC3B,IACIqO,EADAxU,EAAOnC,KAEPwE,EAAQ8D,EAAUgB,KAAK,aACvByM,EAAWzN,EAAUG,KAAK,mBAC1B4J,EAAW/J,EAAUG,KAAK,gBAE9BtG,EAAKyS,WAAWtM,EAAW,UAC3BA,EAAUoD,YAAY,mBAAmBD,SAAS,gBAE9CsK,EAASjT,OAAS,EAClBiT,EAAStK,SAAS,YACb0K,MAAM,8DAAgE3R,EAAM1B,OAAS,IAAM3C,EAAMuI,WAAWvG,EAAKO,aAAa0D,YAAc,WAC1IiM,EAASvP,OAAS,GACzBuP,EAAS5G,SAAS,YACb0K,MAAM,8DAAgEhW,EAAMuI,WAAWvG,EAAKO,aAAa0D,YAAc,WAGhIjE,EAAKyU,sBAAsBtO,IAE3BqO,EAAmB1W,EAAE,gBAAiBqI,IAEjBxF,OAAS,GAC1B6T,EAAiBtR,SAGrBrF,KAAK6K,4BACL7K,KAAKuR,YAAYjJ,EAAW,SAC5BtI,KAAKuR,YAAYjJ,EAAWjH,GAAQ,GAEhCc,EAAK0K,eACLvE,EAAUP,QAAQ,UAI3B6O,sBAAuB,SAAStO,GAC3B,IAAInG,EAAOnC,KACPqI,EAAcpI,EAAG0B,EAAsB2G,GACvCgL,EAAgBjL,EAAYvF,OAAS,EAEzC,IAAKX,EAAKD,QAAQuC,MAAM0I,WAAamG,EACjCjL,EAAYiB,KAAK,oBAAoBuK,MAAM,SACxC,CACH,IAAIN,EAAUjL,EAAUgB,KAAK,OAC7B,GAAInH,EAAK2E,QAAQyG,SAAU,CACvB,IAAIsJ,EAAe1U,EAAK2E,QAAQyG,SAASgG,GAEzC,GAAIsD,EAAc,CACd,IAAIrB,EAAkBqB,EAAaC,YAAcC,KAAKC,MAAQH,EAAuB,WAAIA,EAAaC,YAAe,KAAO,IAE5H3U,EAAKoT,gBAAgB,CAAEnR,OAAQnE,EAAEqI,EAAWnG,EAAKS,UAAY4S,OAM7EY,oBAAqB,SAAS9N,GAC1BrI,EAAE0B,EAAsB2G,GACnB2O,MAtwCW,KAuwCXC,QAtwCc,KAswCgB,WAC3BjX,EAAED,MAAMsJ,KAAK,oBAAoBuK,MAAM,OAInDsD,mBAAoB,WAChB,IAAIhV,EAAOnC,KACPoX,EAAiBnX,EAAE,aAAckC,EAAKS,SACtCyU,EAAepX,EAAE,qBAAsBkC,EAAKS,SAC5C0U,EAAcrX,EAAE,oBAAqBkC,EAAKS,SAElB,IAAxByU,EAAavU,SACbuU,EAAepX,EAAEE,EAAMoX,KAAKC,aAAc,qCAAwCrX,EAAMuI,WAAW1I,KAAK0C,aAAa+C,qBAAwB,YAAc,CACnJkD,KAAM,SACN8O,WAAY,aAGpBH,EAAcrX,EAAEE,EAAMoX,KAAKC,aAAc,oCAAuCrX,EAAMuI,WAAW1I,KAAK0C,aAAa8C,oBAAuB,YAAc,CACpJmD,KAAM,QAKTyO,EAAetU,SAChBsU,EAAiBnX,EAAE,WACdwL,SAAS,aACTgJ,OAAO4C,EAAcC,IAI9BtX,KAAK4C,QAAQ6R,OAAO2C,IAGxBrD,mBAAoB,WAChB9T,EAAE,aAAcD,KAAK4C,SAASyC,UAGlCqS,wBAAyB,SAASC,GAC9B,IAAIxV,EAAOnC,KACP0C,EAAeP,EAAKO,aACpBkE,EAAW3G,EAAE,cAAekC,EAAKS,SACjCgV,EAAqB3X,EAAE,yBAA0BkC,EAAKS,SAExB,IAA9BgV,EAAmB9U,QACnB8U,EAAmBvS,SAGvBpF,EAAE,mBAAoBkC,EAAKS,SAAS6I,SAAS,YAE7CmM,EAAqB,0FAEjBD,GACAC,EAAqB3X,EAAE2X,GAAoBnD,OAAOtU,EAAMuI,WAAWhG,EAAasD,wBAChF7F,EAAMG,GAAGqI,KAAKiP,EAAmBnP,KAAK,uBAAwB,CAAEE,KAAM9G,MAEtE+V,EAAqB3X,EAAE2X,GAAoBnD,OAAOtU,EAAMuI,WAAWhG,EAAawD,uBAChF/F,EAAMG,GAAGqI,KAAKiP,EAAmBnP,KAAK,uBAAwB,CAAEE,KAAM9G,KAGtE+E,EAAS9D,OAAS,EAClB8D,EAAS6N,OAAOmD,GAEhB3X,EAAE,mBAAoBkC,EAAKS,SAASuT,MAAMyB,IAIlD/M,0BAA2B,WACvB,IAKIgN,EALA1V,EAAOnC,KACP4X,EAAqB3X,EAAE,yBAA0BD,KAAK4C,SACtDkV,EAAqB7X,EAAE,UAAWkC,EAAKS,SAASmV,IAAI,kCACpDC,EAAkB/X,EAAE,gBAAiBkC,EAAKS,SAC1CqV,EAAkBhY,EAAE,UAAWkC,EAAKS,SAAS6F,KAAK,kCAGlDwP,EAAgBnV,QACnBmV,EAAgBnV,SAAWgV,EAAmBhV,QAAWX,EAAKD,QAAQuC,MAAM2I,YASpC,IAA9B0K,EAAmBhV,QAAgBkV,EAAgBlV,OAAS,KACnE8U,EAAqB3X,EAAE,yBAA0BkC,EAAKS,UACtDiV,EAAyB5X,EAAE,sBAAuB2X,GAAoBlM,eAE3C5I,SAEvB3C,EAAMG,GAAGqI,KAAKkP,EAAwB,CAAElP,KAAiC,IAA3BqP,EAAgBlV,OAAejB,EAA+BA,IAE5G+V,EAAmBL,KAAKM,GACnBpD,OAAOtU,EAAMuI,WAAWvG,EAAKO,aAAawD,0BAjBnD2R,EAAyB5X,EAAE,sBAAuB2X,GAAoBlM,eAE3C5I,SACvB3C,EAAMG,GAAGqI,KAAKkP,EAAwB,CAAElP,KAAM,aAE9CiP,EAAmBL,KAAKM,GACnBpD,OAAOtU,EAAMuI,WAAWvG,EAAKO,aAAauD,uBAgB3D2E,wBAAyB,WACrB,IACIhE,EADO5G,KACSkC,QAAQ0E,SAE5B3G,EAAE,yBAA0BD,KAAK4C,SAASyC,SAEzB,KAAbuB,GACA3G,EAAE,mBANKD,KAMoB4C,SAAS8I,YAAY,aAIxDnI,oBAAqB,WACjB,IACItB,EADSjC,KACQiC,QAMrB,QAJoC,IAAzBjC,KAAK8G,QAAQoR,SACpBlY,KAAK8G,QAAQoR,WAGZjW,EAAQ4R,MAAO,CAChB,IAAI5I,EAAQhL,EAAEgC,GAGdgJ,EAAMzD,KAAK,WAAY,YAEvBpH,OAAOyP,YAAW,WAGd5E,EAAMpD,KAAK,YAAY,KACxB,KAIXpE,mBAAoB,WAChBxD,EAAE,kBAAmBD,KAAK4C,SAASyC,UAGvC0B,kBAAmB,WACf,MAA2B,oBAAd,UAGjBU,kBAAmB,WACf,IAAI0Q,EAAUnY,KAAKoY,aAAalK,QAAQ,YAAc,EAEtD,QAAQ/N,EAAMkY,QAAQC,QAAQC,OACrBpY,EAAMkY,QAAQC,QAAQE,QAAUL,IAG7CM,cAAe,WACX,IAAIC,EAAY1Y,KAAKoY,aAAaO,cAKlC,SAJe,SAASC,KAAKF,IACD,SAASE,KAAKF,IACR,UAAUE,KAAKF,KAEtB1Y,KAAK+G,qBAAwB/G,KAAKkC,QAAQuC,MAAa,SAGtF2T,WAAY,WACR,OAAOS,UAAUH,WAGrBI,eAAgB,WACZ,IAAI3W,EAAOnC,KAEPmD,EAAKhB,EAAKiB,IACVwD,EAAW3G,EAAE,cAAekC,EAAKS,SAEhCU,GAAG,YAAcH,EAAIuN,GACrBpN,GAAG,WAAaH,GAAI,SAASoI,GACtBA,EAAEgF,gBACFhF,EAAEgF,cAAcC,aAAauI,WAAa,QAE9CxN,EAAEC,oBAELlI,GAAG,OAASH,EAAIhB,EAAKkO,QAAQ7M,KAAKrB,IAElCyE,EAAS6B,KAAK,oBAAoB3F,QACnC8D,EAAS6N,OAAOxU,EAAE,iCAAmCE,EAAMuI,WAAWvG,EAAKO,aAAagD,eAAiB,YAG7GsT,EAAsBpS,EAAUzD,GAC5B,WACSyD,EAAS/D,QAAQ,aAAa4H,SAAS,eACxC7D,EAAS6E,SAAShK,MAG1B,WAAamF,EAAS8E,YAAYjK,MAEtCU,EAAK8W,+BAA+BrS,IAGxCsS,qBAAsB,WAClB,IAAI/W,EAAOnC,KACP4G,EAAW3G,EAAEkC,EAAKD,QAAQ0E,UAEzBzE,EAAKS,QAAQ6F,KAAK,oBAAoB3F,OAKvC7C,EAAE,mBAAoBkC,EAAKS,SAAS6I,SAAS,YAJ7CxL,EAAE,cAAekC,EAAKS,SACjB6R,OAAOxU,EAAE,0CAA4CE,EAAMuI,WAAWvG,EAAKO,aAAagD,eAAiB,YAMlH,IAAIvC,EAAKhB,EAAKiB,IACdwD,EAAStD,GAAG,YAAcH,EAAIuN,GACrBpN,GAAG,WAAaH,GAAI,SAASoI,GACtBA,EAAEgF,gBACFhF,EAAEgF,cAAcC,aAAauI,WAAa,QAE9CxN,EAAEC,oBAELlI,GAAG,OAASH,EAAIhB,EAAKkO,QAAQ7M,KAAKrB,IAE3C6W,EAAsBpS,EAAUzD,GAC5B,SAASoI,GACApJ,EAAKS,QAAQ6H,SAAS,gBACvB7D,EAAS8E,YAAYjK,GACrBmF,EAAS6E,SAAShK,GAClBxB,EAAEsL,EAAEnH,QAAQqH,SAAShK,OAG7B,WACImF,EAAS8E,YAAYjK,MAI7BU,EAAK8W,+BAA+BrS,IAGxCqS,+BAAgC,SAASrS,GACrC,IAAIzE,EAAOnC,KACPmD,EAAKhB,EAAKiB,IAEd4V,EAAsB/Y,EAAEiI,UAAW/E,GAC/B,WACShB,EAAKS,QAAQ6H,SAAS,gBACvB7D,EAAS6E,SAAS,qBAClB7E,EAAS/D,QAAQ,aAAa6I,YAAY,kBAC1C9E,EAAS6B,KAAK,oBAAoBiD,YAAY,gBAGtD,WACI9E,EAAS8E,YAAY,qBACrB9E,EAAS6B,KAAK,oBAAoBgD,SAAS,YACkB,IAAzDxL,EAAE,YAAa2G,EAAS/D,QAAQ,cAAcC,QAC9C8D,EAAS/D,QAAQ,aAAa4I,SAAS,sBAMvD9H,gBAAiB,WACb,IAAIxB,EAAOnC,KACP4G,EAAWzE,EAAKD,QAAQ0E,SAEvBzE,EAAKsW,kBAIVxY,EAAE2G,GAAUW,IAAIpF,EAAKiB,KACrBnD,EAAE,cAAekC,EAAKS,SAAS2E,IAAIpF,EAAKiB,KAEvB,KAAbwD,EACAzE,EAAK+W,uBAEL/W,EAAK2W,mBAIbxH,gBAAiB,WACb,QAAStR,KAAKkC,QAAQuC,MAAM0U,WAGhCC,cAAe,SAAS/H,EAAWzE,EAAWyM,EAAWC,GACrD,IACIC,EADSvZ,KACYkC,QAAQuC,MAAM8U,aAAe,YAClDC,EAASvZ,EAAE8B,OAAO6K,EAAUtD,KAAM/I,KAEtCiZ,EAAOD,GAAelI,EAEtBoI,OAAOC,KAAK,CACNC,KAAM3Z,KAAKkC,QAAQuC,MAAMI,WACzB+U,SAAU,OACVC,WAAYC,EACZC,IAAK/Z,KAAKkC,QAAQuC,MAAM0U,UACxBa,aAAa,EACb1Q,KAAMkQ,EACN3L,QAASjB,EAAUiB,QACnBoM,QAASZ,EACTa,MAAOZ,EACPa,UAAW,CACTpV,gBAAiB/E,KAAKkC,QAAQuC,MAAMM,oBAKhDhC,WAAY,SAASkI,GACjB,IACI/I,EADOlC,KACQkC,QACfkY,IAAanP,EAAMzD,KAAK,OAASvH,EAAE,SAAWgL,EAAMzD,KAAK,MAAQ,MAAM1E,OAAS,EAChFuX,EAAala,EAAMuI,WAHZ1I,KAG4B0C,aAAawC,QAChDmS,EAAepX,EAAE,0KAwBrB,OAtBAoX,EAAa5O,KAAK,kBAAkBuM,KAAKqF,GAEzCpP,EAAMqP,KAAK,2IACXjD,EAAakD,UAAUtP,EAAMrC,UAExB1G,EAAQuC,MAAMoC,QAGfoE,EAAMpI,QAAQ,aAAa4I,SAAS,kBAFpCR,EAAMpI,QAAQ,aAAa4I,SAAS,iBAKxCR,EAAMpI,QAAQ,aAAa4I,SAAS,kBAE/B2O,GAAanP,EAAMzD,KAAK,eACzByD,EAAMzD,KAAK,aAAc6S,GAG7BpP,EAAMzD,KAAK,CACPgT,UAAW,EACX,eAAe,IAGZvP,EAAMpI,QAAQ,cAGzBkK,kBAAmB,WAC2C,IAAtD9M,EAAE,0BAA2BD,KAAK4C,SAASE,QAC3C9C,KAAK+H,QAAQhH,IAIrBqN,YAAa,SAASrD,GAClB,OAAO0P,EAAW1P,MAKtB1D,EAAmB,SAAS0B,GAC5B/I,KAAKuC,KAAO,mBACZvC,KAAKiC,QAAU8G,EAAOnG,QACtB5C,KAAK+I,OAASA,EACd/I,KAAKiC,QACAY,QAAQ,QACJ2E,KAAK,UAAW,uBAChBA,KAAK,WAAY,wBAG9BH,EAAiBqT,UAAY,CACzBnM,SAAU,SAAShD,EAAG/G,GAClB,IAAIuE,EAAS/I,KAAK+I,OACdgC,EAAc9K,EAAEsL,EAAEnH,QAClBuW,EAAqB5R,EAAO6E,8BAA8BpJ,GAE9DuE,EAAO+B,UAAUC,GAEjB,IAAIP,EAAW,CAAE6G,UAAa7M,GAE1BmW,EACA5P,EAAY1F,SAEZmF,EAASoQ,aAAe7P,EAG5B,IAAInB,EAAOb,EAAOqI,aAAayJ,EAAY9P,GAAcP,GAErDmQ,GACA5R,EAAOqN,oBAAoBxM,GAG/Bb,EAAOwI,YAAY3H,EAAMvI,IAG7BsJ,SAAU,SAASY,GACf,IAAIjD,EAAYqN,EAAapK,GACzBqP,EAAetS,EAAUgB,KAAK,gBAE9BsR,GACAA,EAAavV,SAGjBrF,KAAK+I,OAAO+K,iBAAiBxL,KAIrC,IAAIrB,EAAqB,SAAS8B,GAC9B/I,KAAKuC,KAAO,qBACZvC,KAAKiC,QAAU8G,EAAOnG,QACtB5C,KAAK+I,OAASA,EACd/I,KAAK8a,QAAU,IAGnBhZ,EAAOiZ,SAAW,EAElB9T,EAAmByT,UAAY,CAC3BnM,SAAU,SAAShD,EAAG/G,GAClB,IAAIuE,EAAS/I,KAAK+I,OACdgC,EAAc9K,EAAEsL,EAAEnH,QAClBuJ,EAAsB5E,EAAO6E,8BAA8BpJ,GAE3D8D,EAAYtI,KAAKgb,cAAcjQ,EAAavG,EAAOmJ,GAEnD5E,EAAO7G,QAAQuC,MAAMK,WAChB6I,GAGD5E,EAAOwI,YAAYjJ,EAAWjH,GAC9B0H,EAAO2O,yBAAwB,IAH/B1X,KAAK0W,cAAcpO,IAMvBS,EAAOwI,YAAYjJ,EAAWjH,GAEzBsM,EAGD5E,EAAO8B,4BAFP9B,EAAOoO,sBAMXxJ,GACA5E,EAAOqN,oBAAoB9N,IAInC0S,cAAe,SAASjQ,EAAavG,EAAOmJ,GACxC,IAGIrF,EAAWkC,EAAUyQ,EAAQC,EAH7BnS,EAAS/I,KAAK+I,OACdpG,EAAc1C,EAAE8I,EAAO9G,SACvBM,EAAOwG,EAAO7G,QAAQuC,MAAM0W,WAAapQ,EAAYvD,KAAK,QA0B9D,OAvBAuB,EAAO+B,UAAUC,GACjBA,EAAYvD,KAAK,OAAQjF,GAEpBoL,GASD5C,EAAY1F,SAEZmF,EAAW,CAAE6G,UAAa7M,KAV1ByW,EAASjb,KAAKob,YAAYrS,EAAOxG,KAAO,IAAMT,EAAOiZ,YACrD/a,KAAKqb,cAAcJ,GAEnBC,EAAOlb,KAAKsb,WAAWvS,EAAO7G,QAAQuC,MAAMoC,QAASoU,EAAOzT,KAAK,SAC5DiN,OAAO9R,GAEZ6H,EAAW,CAAE+Q,MAASN,EAAQL,aAAgBjY,EAAa0O,UAAa7M,IAO5E8D,EAAYS,EAAOqI,aAAayJ,EAAY9P,GAAcP,GAEtDyQ,GACAA,EAAO3R,KAAK,CAAE4R,KAAQA,EAAMtR,KAAQtB,IAGjCA,GAGXoO,cAAe,SAASpO,GACpB,IAAIiD,EAAI,CAAE/G,MAAO8D,EAAUgB,KAAK,cAC5B2R,EAAS3S,EAAUgB,KAAK,SACxBP,EAAS/I,KAAK+I,OACdyS,EAAiBlT,EAAUG,KAAK,8BAChCsN,EAAWzN,EAAUG,KAAK,mBAC1B4J,EAAW/J,EAAUG,KAAK,gBAE9B,GAAKM,EAAOhB,QAAQnH,EAAQ2K,GAuCxBxC,EAAO+K,iBAAiBmH,EAAO3R,KAAK,SACpCtJ,KAAKyb,aAAaR,GAClBjb,KAAK0b,gBAAgBT,OAzCO,CAC5BlS,EAAOgL,qBACPhL,EAAO2O,yBAAwB,GAE/BuD,EAAOvH,SAASxL,SAASyT,MAEzB,IAAIT,EAAOD,EAAO3R,KAAK,QAClB9B,KAAK,SAAUuB,EAAO7G,QAAQuC,MAAMoC,SACpC6M,SAASxL,SAASyT,MAGvB,IAAK,IAAI5P,KADTR,EAAEjC,KAAOrJ,EAAE8B,OAAO,GAAKwJ,EAAEjC,KAAM/I,KACfgL,EAAEjC,KAAM,CACpB,IAAIsS,EAAYV,EAAKzS,KAAK,eAAiBsD,EAAM,MACxB,IAArB6P,EAAU9Y,SACV8Y,EAAY3b,EAAE,UAAW,CAAE0Z,KAAM,SAAUpX,KAAMwJ,IAC5CwO,UAAUW,IAEnBU,EAAU1X,IAAIqH,EAAEjC,KAAKyC,IAGzBhD,EAAOwI,YAAYjJ,EAAWtH,GAC9B+H,EAAO6L,WAAWtM,EAAW,aAC7BrI,EAAEqI,GAAWoD,YAAY,gBAAgBD,SAAS,mBAE9C+P,EAAe1Y,OAAS,GACxB0Y,EAAenW,SAGf0Q,EAASjT,OAAS,EAClBiT,EAASrK,YAAY,YACd2G,EAASvP,OAAS,GACzBuP,EAAS3G,YAAY,YAGzBuP,EACKY,IAAI,OAAQ7b,KAAK8b,aAAatY,KAAKxD,OAExCkb,EAAK,GAAGa,WAQhB/S,eAAgB,WACZ,IAAIxJ,EAASQ,KACT+I,EAASvJ,EAAOuJ,OAEpB9I,EAAE,UAAWD,KAAKiC,SAASyH,MAAK,WAC5B,IAAIpB,EAAYrI,EAAED,MACdgc,EAAUC,EAAoB3T,GAC9BqF,EAAsB5E,EAAO6E,8BAA8BtF,EAAUgB,KAAK,cAEzE0S,GAAYrO,GACbnO,EAAOkX,cAAcpO,OAKjCwT,aAAc,SAASvQ,GACnB,IACI+K,EADA2E,EAAShb,EAAEsL,EAAEnH,QAGjB,IACIkS,EAAe2E,EAAOiB,WAAWlH,OACnC,MAAOmH,GACL7F,EAAe,wCAA0C6F,EAG7Dnc,KAAKoc,gBAAgBnB,EAAQ3E,IAGjC8F,gBAAiB,SAASnB,EAAQ3E,GAC9B,IAAIhO,EAAY2S,EAAO3R,KAAK,QACxB9J,EAASQ,KACTqc,EAAU,CACN/F,aAAcA,GAEtBgG,EAAahG,GACT,SAASiG,GACLtc,EAAE8B,OAAOsa,EAAS,CAAEG,WAAY,KAAMC,OAAQ,QAC9Cjd,EAAOuJ,OAAOwM,gBAAgB,CAAEnR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY,KAC/EpD,EAAOuJ,OAAO6M,iBAAiB,CAAExR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY2Z,EAAYF,GAE5F7c,EAAOic,aAAaR,GACpBzb,EAAOkc,gBAAgBT,MAE3B,WACIhb,EAAE8B,OAAOsa,EAAS,CAAEG,WAAY,QAASC,OAAQ,QACjDjd,EAAOuJ,OAAOsN,eAAe,CAAEjS,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAYyZ,OAK1F3R,SAAU,SAASa,GACf,IAAI0P,EAAShb,EAAEsL,EAAEnH,QAAQkF,KAAK,SAE9BtJ,KAAK0c,gBAAgBzB,GACrBjb,KAAKyb,aAAaR,GAClBjb,KAAK0b,gBAAgBT,GACrBjb,KAAK+I,OAAO+K,iBAAiBmH,EAAO3R,KAAK,UAG7CmE,QAAS,SAASlC,GACd,IAAIjD,EAAYqN,EAAapK,GAC7BvL,KAAK0W,cAAcpO,IAGvBqC,SAAU,SAASY,EAAGqB,EAAWzC,GAC7B,IAAI3K,EAASQ,KACT+I,EAASvJ,EAAOuJ,OAChBT,EAAYqN,EAAapK,GACzB0P,EAAS3S,EAAUgB,KAAK,SAExB2R,GACAzb,EAAOkc,gBAAgBT,GACvBlS,EAAO+K,iBAAiBxL,GACxB9I,EAAOic,aAAaR,IAEhB3S,EAAUmC,SAAS,kBACnBkS,EAAmBrU,EAAWS,EAAQ6D,EAAWzC,GAEjDpB,EAAO+K,iBAAiBxL,IAKpC4P,QAAS,WACL,IAAIjW,EAAUjC,KAAKiC,QACfzC,EAASQ,KAEbC,EAAEyJ,KAAK1J,KAAK8a,SAAS,WACjB7a,EAAE,QAASD,KAAKsJ,KAAK,SAASoK,SAASzR,GACvCzC,EAAOkd,gBAAgB1c,KAAK,IAC5BA,KAAKsJ,KAAK,QAAQjE,SAClBrF,KAAKqF,YAGTrF,KAAK8a,QAAU,IAGnBM,YAAa,SAASwB,GAClB,OAAO3c,EACH,iBACY2c,EADZ,SAEUA,EAFV,QAIFvR,QAGNiQ,WAAY,SAASuB,EAAQzY,GACzB,OAAOnE,EACH,6DACc4c,EADd,aAEczY,EAFd,QAMRsY,gBAAiB,SAASnB,QACI,IAAfA,EAAU,KACjBA,EAAMuB,OACCvB,EAAMrT,UACbqT,EAAMrT,SAAS6U,YAAY,SAInC1B,cAAe,SAASE,GACpBvb,KAAK8a,QAAQtR,KAAK+R,IAGtBG,gBAAiB,SAASH,GACtBvb,KAAK8a,QAAU7a,EAAE+c,KAAKhd,KAAK8a,SAAS,SAASjH,GACzC,OAAOA,EAAMrM,KAAK,SAAW+T,EAAM/T,KAAK,YAIhDiU,aAAc,SAASF,GACnB,IAAIL,EAAOK,EAAMjS,KAAK,QAEtBiS,EAAMjS,KAAK,QAAQA,KAAK,QAAS,MAEjCuG,YAAW,WACPqL,EAAK7V,SACLkW,EAAMlW,WACP,KAKX,IAAI2B,EAAuB,SAAS+B,GAChC/I,KAAKuC,KAAO,uBACZvC,KAAKiC,QAAU8G,EAAOnG,QACtB5C,KAAK+I,OAASA,EACd/I,KAAKid,SAAW,GAChBjd,KAAKuN,SAAW,GAChBvN,KAAKkd,UAAY,GACjBld,KAAKuF,OAAS,GACdvF,KAAKmd,OAAS,GACdnd,KAAKyW,QAAU,IAyhBnB,SAASoE,EAAY5P,GACjB,OAAOhL,EAAEmd,IAAI3C,EAAWxP,IAAQ,SAASrB,GACrC,OAAOA,EAAKrH,QACb8a,KAAK,MAGZ,SAAS5C,EAAW6C,GAChB,IAmCe/a,EACXgb,EApCAtS,EAAQqS,EAAO,GAEnB,OAAIrS,EAAMzG,MACCsM,EAAe7F,EAAMzG,OAErB,CAAC,CACJjC,MA6BOA,EA7BS0I,EAAM4I,MA8B1B0J,EAAahb,EAAKib,YAAY,OACX,GAAfD,EAAoBhb,EAAKkb,OAAOF,EAAa,GAAKhb,GA9BlDkQ,UAAWiL,EAAiBzS,EAAM4I,OAClClC,KAAM,OAKlB,SAASb,EAAe6M,GACpB,OAAO1d,EAAEmd,IAAIO,GAAU,SAAS/T,GAC5B,OAMAgU,GAFaC,EAJMjU,GAMArH,MAAQsb,EAAQD,SAChC,CACHrb,KAAMpC,EAAMuI,WAAWkV,GACvBnL,UAAWiL,EAAiBE,GAC5BjM,KAA6B,iBAAhBkM,EAAQlM,KAAmBkM,EAAQlM,KAAOkM,EAAQxL,SAC/DwL,QAASA,GAPjB,IAAqBA,EAEbD,KASR,SAASF,EAAiBE,GACtB,IAAIE,EAAUF,EAASG,MAAMtd,GAC7B,OAAOqd,EAAUA,EAAQ,GAAK,GAQlC,SAAS3P,EAAkB3J,EAAOwZ,GAC9B,IAAIhU,EAAM7J,EAAMkD,OAEhB,OAAOpD,EAAEmd,IAAI5Y,GAAO,SAASoF,GAGzB,OAFAA,EAAKI,IAAMgU,EAAS7d,EAAMkD,OAAS2G,EAE5BJ,KAIf,SAAS0E,EAAc9J,EAAOyZ,GAK1B,IAJA,IAU4BC,EAVxBzX,GAUwByX,EAVmBD,EAAexX,kBAWtCxG,EAAEmd,IAAIc,GAAY,SAASC,GAE/C,OADyC,MAAxBA,EAAIC,UAAU,EAAG,GAAcD,EAAO,IAAMA,GAC5CxF,kBAZjBjS,EAAcuX,EAAevX,YAC7BC,EAAcsX,EAAetX,YAExB0C,EAAI,EAAGA,EAAI7E,EAAM1B,OAAQuG,IAC9BgV,EAAsB7Z,EAAM6E,GAAI5C,GAChC6X,EAAiB9Z,EAAM6E,GAAI1C,EAAaD,GAahD,SAAS2X,EAAsBzU,EAAMnD,GAC7BA,EAAkB3D,OAAS,GACvB2D,EAAkByH,QAAQtE,EAAK6I,UAAUkG,eAAiB,IAC1D/O,EAAK2U,iBAAmB3U,EAAK2U,kBAAoB,IACe,IAA5Dte,EAAEue,QAAQhd,EAAsBoI,EAAK2U,mBACrC3U,EAAK2U,iBAAiB/U,KAAKhI,IAM3C,SAAS8c,EAAiB1U,EAAMjD,EAAaD,GACrB,IAAhBC,GAAqBiD,EAAK+H,KAAOhL,IACjCiD,EAAK2U,iBAAmB3U,EAAK2U,kBAAoB,IACa,IAA1Dte,EAAEue,QAAQjd,EAAoBqI,EAAK2U,mBACnC3U,EAAK2U,iBAAiB/U,KAAKjI,IAIf,IAAhBmF,GAAqBkD,EAAK+H,KAAOjL,IACjCkD,EAAK2U,iBAAmB3U,EAAK2U,kBAAoB,IACa,IAA1Dte,EAAEue,QAAQld,EAAoBsI,EAAK2U,mBACnC3U,EAAK2U,iBAAiB/U,KAAKlI,IAKvC,SAASgR,EAAyB9N,GAC9B,IAAIkN,EAAY,EAEhB,GAA4B,iBAAjBlN,EAAM,GAAGmN,KAOhB,MAAO,GANP,IAAK,IAAItI,EAAI,EAAGA,EAAI7E,EAAM1B,OAAQuG,IAC1B7E,EAAM6E,GAAGsI,OACTD,GAAalN,EAAM6E,GAAGsI,MASlC,OAFAD,GAAa,MAEG,KACLA,EAAU+M,QAAQ,GAAK,OAEtB/M,EAAY,MAAM+M,QAAQ,GAAK,MAI/C,SAASC,EAAsB3V,GAC3B,OAAQA,EAAOvG,UAAYvC,EAAE,UAAW8I,EAAOnG,SAASE,OAAS,EAGrE,SAAS6Z,EAAmBrU,EAAWS,EAAQ6D,EAAWzC,GACtD,GAAKpB,EAAOuI,kBAAZ,CAQA,IAAI9M,EAAQ8D,EAAUgB,KAAK,aACvB+H,EAAYpR,EAAEmd,IAAI5Y,GAAO,SAASoF,GAAQ,OAAOA,EAAKrH,SAE1B,IAA5B4H,EAMJpB,EAAOqQ,cAAc/H,EAAWzE,GAC5B,SAAmBtD,EAAMqV,EAAY7I,GACjB/M,EAAOhB,QAAQlH,EAAS,CACpCmV,UAAW,SACXxR,MAAOA,EACPqR,SAAUvM,EACV2M,eAAgBH,KAIhB/M,EAAO+K,iBAAiBxL,MAIhC,SAAiBwN,GACT4I,EAAsB3V,IACtBA,EAAO+K,iBAAiBxL,GAG5BS,EAAOhB,QAAQjH,EAAO,CAClBkV,UAAW,SACXxR,MAAOA,EACPyR,eAAgBH,IAGpBtV,EAAa,oBAAsBsV,EAAIQ,iBA9B3CvN,EAAO+K,iBAAiBxL,QAXpBoW,EAAsB3V,IAAYoB,GAClCpB,EAAO+K,iBAAiBxL,GA6CpC,SAASgU,EAAarR,EAAOoO,EAAWC,GACpC,IAAIW,GAAU,EACV2E,EAAO,GAEX,IACIA,EAAOC,KAAKC,MAAMhF,EAAc7O,IAChCgP,GAAU,EACZ,MAAO1O,GACL+N,IAGAW,GACAZ,EAAUuF,GAIlB,SAAS9E,EAAc7O,GAKnB,YAJqB,IAAVA,GAAmC,KAAVA,IAChCA,EAAQ,MAGLA,EAGX,SAASyF,EAAUnF,GACXA,EAAEgF,gBACFhF,EAAEgF,cAAcC,aAAauI,WAAa,QAE9CxN,EAAEY,kBAAmBZ,EAAEC,iBAG3B,SAASwN,EAAsB/W,EAAS8c,EAAWC,EAAaC,GAC5D,IAAIC,EAAcC,EAElBld,EACKqB,GAAG,YAAcyb,GAAW,SAASxT,GAClCyT,EAAYzT,GACZ4T,EAAW,IAAIC,KAEVF,IACDA,EAAeG,aAAY,WACH,IAAID,KAASD,EACb,MAChBF,IAEAK,cAAcJ,GACdA,EAAe,QAEpB,SAGV5b,GAAG,WAAayb,GAAW,WACxBI,EAAW,IAAIC,QAI3B,SAASnD,EAAoB3T,GACzB,OAAOA,EAAU4E,GAAG,yEAGxB,SAASyI,EAAapK,GAClB,OAAOtL,EAAEsL,EAAEnH,QAAQvB,QAAQ,WArwB/BmE,EAAqB0T,UAAY,CAC7BnM,SAAU,SAAShD,EAAG/G,GAClB,IAIImJ,EACApB,EALAxD,EAAS/I,KAAK+I,OACdvJ,EAASQ,KACTuf,EAAgBtf,EAAEsL,EAAEnH,QACpBob,EAAcxf,KAAKgb,cAAcuE,EAAe/a,GAIpDvE,EAAEyJ,KAAK8V,GAAa,SAAS7V,GACzBgE,EAAsB5E,EAAO6E,8BAA8B3N,EAAED,KAAKsJ,KAAK,eAEnEP,EAAO7G,QAAQuC,MAAMK,WAChB6I,GAaD5E,EAAOwI,YAAYvR,KAAMqB,GACzB0H,EAAO2O,yBAAwB,IAb3B3O,EAAO7G,QAAQuC,MAAM0I,WACrB3N,EAAOgO,aAAaxN,MACpBuM,EAAOvM,KAAKuM,QAERxD,EAAO7G,QAAQuC,MAAM2I,YAAyB,IAAVzD,IAAgB4C,EAAKzJ,QACjD,IAAV6G,GAAe4C,EAAK9B,SAAS,oBAC3BjL,EAAOkX,cAAc1W,OAGzBR,EAAOkX,cAAc1W,OAO7B+I,EAAOwI,YAAYvR,KAAMqB,GAEpBsM,EAID5E,EAAO8B,6BAHP9B,EAAOoO,qBACPnX,KAAKyL,SAAS,gBAMlBkC,GACA5E,EAAOqN,oBAAoBpW,UAKvCgb,cAAe,SAASuE,EAAe/a,GACnC,IAAIgb,EAAcxf,KAAKyf,aAAajb,GAUpC,OARI+a,EAAcrS,GAAG,WACjBjN,EAAEyJ,KAAK8V,GAAa,WAChBvf,EAAED,MAAMsJ,KAAK,eAAgBiW,MAEjCA,EAAcjW,KAAK,qBAAsBkW,GACzCxf,KAAK+I,OAAO+B,UAAUyU,IAGnBC,GAGXC,aAAc,SAASjb,GACnB,IACIjC,EACA8G,EAEA8H,EACA7I,EALAS,EAAS/I,KAAK+I,OAGd2W,EAAclb,EAAM1B,OAGpB0c,EAAc,GAElB,IAAmC,IAA/BzW,EAAO7G,QAAQuC,MAAMwM,MACrB1O,EAAOtC,EAAEmd,IAAI5Y,GAAO,SAASoF,GAAQ,OAAOA,EAAKrH,QAAS8a,KAAK,OAE3DtU,EAAOtG,WAAasG,EAAO7G,QAAQyO,gBACnC1Q,EAAEuE,GAAOkF,MAAK,YACN1J,KAAK6d,QAAQ8B,oBAAsB3f,KAAK6d,QAAQpO,gBAChDzP,KAAKuC,KAAOvC,KAAK6d,QAAQ8B,oBAAsB3f,KAAK6d,QAAQpO,kBAKxEnH,EAAYS,EAAOqI,aAAa7O,EAAM,CAAE8O,UAAW7M,KACzC8E,KAAK,QAAS9E,GAExBgb,EAAYhW,KAAKlB,QAEjB,IAAKe,EAAI,EAAGA,EAAIqW,EAAarW,IAEzB9G,GADA4O,EAAc3M,EAAM6E,IACD9G,MACfwG,EAAOtG,WAAasG,EAAO7G,QAAQyO,iBAC/BQ,EAAY0M,QAAQ8B,oBAAsBxO,EAAY0M,QAAQpO,gBAC9D0B,EAAY5O,KAAO4O,EAAY0M,QAAQ8B,oBAAsBxO,EAAY0M,QAAQpO,eAGzFnH,EAAYS,EAAOqI,aAAa7O,EAAM,CAAE8O,UAAW,CAACF,MAC1C7H,KAAK,QAAS,CAAC6H,IAEzBqO,EAAYhW,KAAKlB,GAIzB,OAAOkX,GAGX9I,cAAe,SAASpO,GACpB,IAOI9D,EAPAuE,EAAS/I,KAAK+I,OACd6W,EAAW5f,KAAK6f,iBAChB/J,EAAM9V,KAAK8f,YACXvU,EAAI,CACA/G,MAAO8D,EAAUgB,KAAK,aACtB2M,eAAgBH,GAGpB0F,EAAiBlT,EAAUG,KAAK,8BAChCsN,EAAWzN,EAAUG,KAAK,mBAC1B4J,EAAW/J,EAAUG,KAAK,gBAE9B,GAAKM,EAAOhB,QAAQnH,EAAQ2K,GA+CxBvL,KAAK+f,gBAAgBzX,OA/CO,CAc5B,GAb6D,IAAzDA,EAAUG,KAAK,+BAA+B3F,SAC1CiG,EAAO7G,QAAQuC,MAAM0I,WACrBpE,EAAOwI,YAAYjJ,EAAWpH,GAElC6H,EAAOwI,YAAYjJ,EAAWtH,EAAQ+H,EAAO7G,QAAQuC,MAAM0I,YAG1DpE,EAAOnG,QAAQ6F,KAAK,eAAe3F,QACpCiG,EAAOgL,qBAGXhL,EAAO2O,yBAAwB,GAE3BnM,EAAEqU,SACFA,EAAWrU,EAAEqU,aACV,CAEH,IAAK,IAAI7T,KADTR,EAAEjC,KAAOrJ,EAAE8B,OAAO,GAAKwJ,EAAEjC,KAAM/I,KACfgL,EAAEjC,KACdsW,EAASnL,OAAO1I,EAAKR,EAAEjC,KAAKyC,KAGhCvH,EAAQ8D,EAAUgB,KAAK,WAEnBtJ,KAAKggB,iBAAiBJ,EAAUpb,GAIxCuE,EAAO6L,WAAWtM,EAAW,aAC7BrI,EAAEqI,GAAWoD,YAAY,gBAAgBD,SAAS,mBAE9C+P,EAAe1Y,OAAS,GACxB0Y,EAAenW,SAGf0Q,EAASjT,OAAS,EAClBiT,EAASrK,YAAY,YACd2G,EAASvP,OAAS,GACzBuP,EAAS3G,YAAY,YAGrB3C,EAAO7G,QAAQuC,MAAMQ,gBAAkB7E,OAAO6f,WAC9CjgB,KAAKsP,UAAUvG,EAAO7G,QAAQuC,MAAMoC,QAAS+Y,EAAUtX,EAAWwN,GAElE9V,KAAKkgB,aAAanX,EAAO7G,QAAQuC,MAAMoC,QAAS+Y,EAAUtX,EAAWwN,KAOjFxG,UAAW,SAASzI,EAAS+Y,EAAUtX,EAAWwN,GAC9C,IAAI3T,EAAOnC,KACP+I,EAAS5G,EAAK4G,OACda,EAAOtB,EAAUgB,KAAK,SAAS,GAE/B6W,EAAS,IAAIF,WACjBE,EAAOC,OAAS,SAAS7U,GACrB,IACSpJ,EAAKke,gBAGNle,EAAKke,gBAAkBle,EAAKme,cAAcne,EAAKke,gBAAiB9U,EAAEnH,OAAOmc,QAFzEpe,EAAKke,gBAAkB9U,EAAEnH,OAAOmc,OAItC,MAAOC,GAEL,YADAzX,EAAOsN,eAAe,CAAEjS,OAAQnE,EAAEqI,EAAWS,EAAOnG,UAAYkT,GAIhE3T,EAAK8a,SAASrT,EAAKI,KAAOJ,EAAK+H,MAC/BxP,EAAK+d,aAAanX,EAAO7G,QAAQuC,MAAMoC,QAAS1E,EAAKke,gBAAiB/X,EAAWwN,GACjF3T,EAAKke,gBAAkB,MAEvBle,EAAKmN,UAAUzI,EAAS+Y,EAAUtX,EAAWwN,IAGrDqK,EAAOM,QAAU,WACb1X,EAAOsN,eAAe,CAAEjS,OAAQnE,EAAEqI,EAAWS,EAAOnG,UAAYkT,IAEpEqK,EAAOO,kBAAkBve,EAAKwe,iBAAiB/W,EAAKiU,QAASjU,EAAKI,OAGtEsW,cAAe,SAASM,EAASC,GAC7B,IAAIC,EAAM,IAAIC,WAAWH,EAAQI,WAAaH,EAAQG,YAKtD,OAHAF,EAAIG,IAAI,IAAIF,WAAWH,GAAU,GACjCE,EAAIG,IAAI,IAAIF,WAAWF,GAAUD,EAAQI,YAElCF,EAAII,QAGflY,eAAgB,WACZ,IAAIxJ,EAASQ,KACT+I,EAASvJ,EAAOuJ,OAEpB9I,EAAE,cAAeD,KAAKiC,SAASkf,QAAO,WAClC,IAAI7Y,EAAYrI,EAAED,MACdgc,EAAUC,EAAoB3T,GAC9BqF,EAAsB5E,EAAO6E,8BAA8BtF,EAAUgB,KAAK,cAE9E,OAAQ0S,IAAYrO,KACrBjE,MAAK,SAASC,GACb,IAAIrB,EAAYrI,EAAED,MACdohB,EAAY9Y,EAAUiE,OAE1BjE,EAAUoD,YAAY,cAClB3C,EAAO7G,QAAQuC,MAAM0I,WACrB3N,EAAOgO,aAAalF,IAEhBS,EAAO7G,QAAQuC,MAAM2I,YAAyB,IAAVzD,IAAgByX,EAAUte,QACnD,IAAV6G,GAAeyX,EAAU3W,SAAS,mBAAqB2W,EAAU3W,SAAS,sCAC3EjL,EAAOkX,cAAcpO,IAGzB9I,EAAOkX,cAAcpO,OAKjCoC,SAAU,SAASa,GACf,IAAIjD,EAAYqN,EAAapK,GAEzBvL,KAAK+I,OAAO7G,QAAQuC,MAAM0I,YAC1BnN,KAAKkd,UAAU5U,EAAUgB,KAAK,SAAU,GAE5CtJ,KAAKqhB,kBAAkB/Y,GACvBtI,KAAK+f,gBAAgBzX,IAGzBC,QAAS,SAASgD,GACd,IACIgI,EADYoC,EAAapK,GACLjC,KAAK,OACzB7E,EAAQzE,KAAK+I,OAAO7G,QAAQuC,MAE5BA,EAAM0I,YACNnN,KAAKyW,QAAQlD,GAAW9O,EAAMG,eAAiB,EAC/C5E,KAAKmd,OAAO5J,IAAW,EACvBvT,KAAKuF,OAAOgO,IAAW,IAI/B1K,SAAU,SAAS0C,GACf,IAAIjD,EAAYqN,EAAapK,GACzBgI,EAAUjL,EAAUgB,KAAK,OAEzBtJ,KAAK+I,OAAO7G,QAAQuC,MAAM0I,mBACnBnN,KAAKmd,OAAO5J,GACnBvT,KAAKuF,OAAOgO,IAAW,EACvBvT,KAAKyW,QAAQnO,EAAUgB,KAAK,QAAU,EACtCtJ,KAAKshB,oBAAoB/N,GACzBvT,KAAK0W,cAAcpO,KAI3BmF,QAAS,SAASlC,GACd,IAAIjD,EAAYqN,EAAapK,GACzB9G,EAAQzE,KAAK+I,OAAO7G,QAAQuC,MAE5BA,EAAM0I,YACNnN,KAAKyW,QAAQnO,EAAUgB,KAAK,QAAU7E,EAAMG,eAAiB,SACtD5E,KAAKmd,OAAO7U,EAAUgB,KAAK,SAGtCtJ,KAAK0W,cAAcpO,IAGvBqC,SAAU,SAASY,EAAGqB,EAAWzC,GAC7B,IACIpB,EADS/I,KACO+I,OAChBT,EAAYqN,EAAapK,GACzB9G,EAAQzE,KAAK+I,OAAO7G,QAAQuC,MAE5BA,EAAM0I,YACNnN,KAAKyW,QAAQnO,EAAUgB,KAAK,QAAU7E,EAAMG,eAAiB,GAG7D0D,EAAUmC,SAAS,kBACnBkS,EAAmBrU,EAAWS,EAAQ6D,EAAWzC,GAVxCnK,KAYF+f,gBAAgBzX,IAI/BwX,UAAW,WACP,OAAO,IAAI7J,gBAGfiK,aAAc,SAASnG,EAAKzQ,EAAMhB,EAAWwN,GACzC,IAAItW,EAASQ,KAEbsI,EAAUgB,KAAK,UAAWwM,GAE1BA,EAAIyL,iBAAiB,QAAQ,SAAShW,GAClC/L,EAAOgiB,iBAAiBlf,KAAK9C,EAAQ+L,EAAGjD,MACzC,GAEHwN,EAAIyL,iBAAiBzgB,GAAO,SAASyK,GACjC/L,EAAOiiB,eAAenf,KAAK9C,EAAQ+L,EAAGjD,MACvC,GAEHwN,EAAI/M,OAAOwY,iBAAiB,YAAY,SAAShW,GAC7C/L,EAAOkiB,kBAAkBpf,KAAK9C,EAAQ+L,EAAGjD,MAC1C,GAEHwN,EAAI6L,KAAK,OAAQ5H,GAAK,GACtBjE,EAAI/Q,gBAAkB/E,KAAK+I,OAAO7G,QAAQuC,MAAMM,gBAEhD,IAAIC,EAAShF,KAAK+I,OAAO7G,QAAQuC,MAAMO,OACnCA,GACA8Q,EAAI8L,iBAAiB,SAAU5c,GAGnC8Q,EAAI+L,KAAKvY,IAGbuW,eAAgB,WACZ,OAAO,IAAIiC,UAGf9B,iBAAkB,SAAS1W,EAAM9E,GAC7B,IAAIud,EACA1Y,EAEAW,EADAlH,EAAS0B,EAAM1B,OAEfiG,EAAS/I,KAAK+I,OAElB,GAAIA,EAAO7G,QAAQuC,MAAM0I,UAAW,CAC/BnD,EAAMxF,EAAM,GAAGwF,IACf+X,EAAQ/hB,KAAK2gB,iBAAiBnc,EAAM,GAAGqZ,QAAS7T,GAEjDV,EAAKmL,OACD1L,EAAO7G,QAAQuC,MAAM0W,WAAapS,EAAOxG,KACzCwf,GAGJ,IAAIC,EAAqBnD,KAAKoD,UAAUjiB,KAAKuN,SAASvD,IACtDV,EAAKmL,OAAO,WAAYuN,QAEvB,IAAK3Y,EAAI,EAAGA,EAAIvG,EAAQuG,IACrBC,EAAKmL,OACD1L,EAAO7G,QAAQuC,MAAM0W,WAAapS,EAAOxG,KACzCiC,EAAM6E,GAAGwU,SAKrB,OAAOvU,GAGXkY,iBAAkB,SAASjW,EAAGjD,GAC1B,IAAIwN,EAAMvK,EAAEnH,OACR5E,EAASQ,KAEb,SAASkiB,IACL1iB,EAAOuJ,OAAOsN,eAAe,CAAEjS,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAYkT,GAgC9EA,EAAI2G,QAAU,KAAO3G,EAAI2G,QAAU,IACnCH,EAAaxG,EAAIQ,cA9BrB,SAAsBiG,GAClB,IAAItL,EAAQzR,EAAOuJ,OAAO7G,QAAQuC,MAAMwM,MACpC9D,EAAY3N,EAAOuJ,OAAO7G,QAAQuC,MAAM0I,UACxCC,EAAa5N,EAAOuJ,OAAO7G,QAAQuC,MAAM2I,WACzCmG,EAAUgJ,EAAWhJ,QAErB/T,EAAO2d,OAAO5J,IAAY/T,EAAO0d,UAAU3J,YAIxC/T,EAAOiX,QAAQlD,IAElBpG,GAAc8D,GAAUsL,EAAWtH,UAI5B9H,GAAc8D,GAAU7D,IAAc9E,EAAU+D,OAAOvJ,QAAWwF,EAAU+D,OAAO5B,SAAS,eAOnGjL,EAAOuJ,OAAOwM,gBAAgB,CAAEnR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY,KAC/EpD,EAAOuJ,OAAO6M,iBAAiB,CAAExR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY2Z,EAAYzG,GAC5FtW,EAAO2iB,iBAAiB7Z,KARpB9I,EAAOuJ,OAAOwM,gBAAgB,CAAEnR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY,KAC/EpD,EAAO4iB,iBAAiB7O,GACxB/T,EAAOuJ,OAAO6M,iBAAiB,CAAExR,OAAQnE,EAAEqI,EAAW9I,EAAOuJ,OAAOnG,UAAY2Z,EAAYzG,GAE5FtW,EAAOkX,cAAcpO,EAAU+D,UAPnC7M,EAAO8hB,oBAAoB/N,GAC3B/T,EAAOkX,cAAcpO,OAiBrB4Z,GAGJA,KAIRT,eAAgB,SAASlW,EAAGjD,GACxB,IAAIwN,EAAMvK,EAAEnH,OAEZpE,KAAK+I,OAAOsN,eAAe,CAAEjS,OAAQnE,EAAEqI,EAAWtI,KAAK+I,OAAOnG,UAAYkT,IAG9EqM,iBAAkB,SAAS7Z,GACvB,IAAIsS,EAAetS,EAAUgB,KAAK,gBAC9B+Y,GAAiB,EAEjBzH,IACA3a,EAAEyJ,KAAKkR,EAAatR,KAAK,uBAAyB,IAAI,WAE9CtJ,KAAK4I,SAAS9F,OAAS,GAAK9C,KAAK,IAAMsI,EAAU,KACjD+Z,EAAiBA,GAAkBriB,KAAKyK,SAAS,sBAIrD4X,GACAzH,EAAavV,WAKzB0a,gBAAiB,SAASzX,GACtB,IAAI6E,EAAYnN,KAAK+I,OAAO7G,QAAQuC,MAAM0I,UACtCC,EAAapN,KAAK+I,OAAO7G,QAAQuC,MAAM2I,WACvCkV,EAAwBtiB,KAAK+I,OAAOnG,QAAQ6F,KAAK,sBAAsB3F,OAAS,EAEpF9C,KAAKmiB,iBAAiB7Z,IAClB6E,GAAcC,GAAekV,GACxBha,EAAU+D,OAAOvJ,QACjB9C,KAAK0W,cAAcpO,EAAU+D,QAGtCrM,KAAK+I,OAAO+K,iBAAiBxL,IAGjCoZ,kBAAmB,SAASnW,EAAGjD,GAC3B,IAEIuO,EAFArB,EAAkBuB,KAAKC,MAAiB,IAAXzL,EAAEgX,OAAehX,EAAEiX,OAChDjP,EAAUjL,EAAUgB,KAAK,OAGzBtJ,KAAK+I,OAAO7G,QAAQuC,MAAM0I,YAE1BqI,GADAqB,EAAe7W,KAAKuN,SAASgG,KACKsD,EAAaC,YAAcC,KAAKC,MAAQH,EAAuB,WAAIA,EAAaC,YAAe,KAAO,KAE5I9W,KAAK+I,OAAOwM,gBAAgB,CAAEnR,OAAQnE,EAAEqI,EAAWtI,KAAK+I,OAAOnG,UAAY4S,IAG/E6L,kBAAmB,SAAS/Y,GACpBA,EAAUgB,KAAK,YACfhB,EAAUgB,KAAK,WAAWmZ,SAIlCjV,aAAc,SAASlF,GACnB,IAAIsB,EAAOtB,EAAUgB,KAAK,SAAS,GAC/BuU,EAAUjU,EAAKiU,QACf7T,EAAMJ,EAAKI,IACXmD,EAAYnN,KAAK+I,OAAO7G,QAAQuC,MAAM0I,UAC1CnN,KAAKid,SAASjT,GAAO,EAErBhK,KAAKuN,SAASvD,GAAO,CACjB0Y,WAAY,EACZC,YAAa9E,EAAQlE,KACrBiE,SAAUC,EAAQtb,KAClBkN,aAAc7F,EAAKrH,KACnByQ,cAAe6K,EAAQlM,KACvBmF,YAAaC,KAAK6L,KAAK/E,EAAQlM,KAAOxE,GACtC0V,UAAW7Y,IAInB8Y,oBAAqB,SAAS9Y,GAC1BhK,KAAKuN,SAASvD,GAAK0Y,cAGvBpB,oBAAqB,SAAStX,GAC1BhK,KAAKuN,SAASvD,GAAK0Y,cAGvBN,iBAAkB,SAASpY,GACvBhK,KAAKuN,SAASvD,GAAK0Y,WAAa,GAGpCnM,kBAAmB,SAASvM,GACxBhK,KAAKid,SAASjT,IAAQhK,KAAK+I,OAAO7G,QAAQuC,MAAM0I,WAGpDwT,iBAAkB,SAAS/W,EAAMI,GAC7B,IACI+Y,EADAC,EAAchjB,KAAKid,SAASjT,GAE5BvF,EAAQzE,KAAK+I,OAAO7G,QAAQuC,MAC5B0I,EAAY1I,EAAM0I,WAAa1I,EAAME,gBAOzC,OALK3E,KAAKid,SAASjT,KACfhK,KAAKid,SAASjT,GAAO,GAEzBhK,KAAKid,SAASjT,IAAQmD,GAEf4V,EAAiB/iB,KAAKijB,YAAYrZ,IAC9BA,EAAKmZ,GAAgBC,EAAahjB,KAAKid,SAASjT,IAEhDJ,GAIfqZ,YAAa,SAASrZ,GAClB,OAAIA,EAAK8F,MACE,QACA9F,EAAKsZ,SACL,WACAtZ,EAAKuZ,YACD,cAEJ,OAwPnBhjB,EAAMG,GAAG8iB,OAAOthB,GA/rFpB,CAgsFG1B,OAAOD,MAAMsZ,QACFtZ","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.core.js'), require('kendo.progressbar.js'), require('kendo.icons.js'), require('kendo.html.button.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.core', 'kendo.progressbar', 'kendo.icons', 'kendo.html.button'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendoupload = global.kendoupload || {}, global.kendoupload.js = factory()));\n})(this, (function () {\n var __meta__ = {\n id: \"upload\",\n name: \"Upload\",\n category: \"web\",\n description: \"The Upload widget uses progressive enhancement to deliver the best possible uploading experience to users.\",\n depends: [\"core\", \"progressbar\", \"icons\", \"html.button\"]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n antiForgeryTokens = kendo.antiForgeryTokens,\n logToConsole = kendo.logToConsole,\n rFileExtension = /\\.([^\\.]+)$/,\n NS = \".kendoUpload\",\n SELECT = \"select\",\n UPLOAD = \"upload\",\n SUCCESS = \"success\",\n ERROR = \"error\",\n COMPLETE = \"complete\",\n CANCEL = \"cancel\",\n CLEAR = \"clear\",\n PAUSE = \"pause\",\n RESUME = \"resume\",\n PROGRESS = \"progress\",\n REMOVE = \"remove\",\n VALIDATIONERRORS = \"validationErrors\",\n INVALIDMAXFILESIZE = \"invalidMaxFileSize\",\n INVALIDMINFILESIZE = \"invalidMinFileSize\",\n INVALIDFILEEXTENSION = \"invalidFileExtension\",\n PROGRESSHIDEDELAY = 1000,\n PROGRESSHIDEDURATION = 2000,\n HOVER_STATE = \"k-hover\",\n FOCUS_STATE = \"k-focus\",\n PROGRESSBAR_CLASS = \"k-progressbar\",\n PROGRESSBAR_SELECTOR = \".\" + PROGRESSBAR_CLASS,\n PROGRESSBAR_TEMPLATE_SELECTOR = \".k-progress\",\n TABINDEX = \"tabindex\",\n WARNINGICON_SELECTOR = \".k-i-exclamation-circle,.k-svg-i-exclamation-circle\";\n\n var headerStatusIconName = {\n loading: \"upload\",\n warning: \"exclamation-circle\",\n success: \"check\"\n };\n\n var Upload = Widget.extend({\n init: function(element, options) {\n var that = this;\n that.progressbars = [];\n\n Widget.fn.init.call(that, element, options);\n\n that.name = element.name;\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\n that.localization = that.options.localization;\n\n var activeInput = that.element;\n that.wrapper = activeInput.closest(\".k-upload\");\n if (that.wrapper.length === 0) {\n that.wrapper = that._wrapInput(activeInput);\n }\n\n that._activeInput(activeInput);\n that.toggle(that.options.enabled);\n\n var ns = that._ns = NS + \"-\" + kendo.guid();\n activeInput.closest(\"form\")\n .on(\"submit\" + ns, that._onParentFormSubmit.bind(that))\n .on(\"reset\" + ns, that._onParentFormReset.bind(that));\n\n that._initUploadModule();\n\n that._toggleDropZone();\n\n that.wrapper\n .on(\"keydown\", \".k-upload-button\", that._onUploadButtonKeydown.bind(that))\n .on(\"click\", \".k-upload-action\", that._onFileAction.bind(that))\n .on(\"click\", \".k-clear-selected\", that._onClearSelected.bind(that))\n .on(\"click\", \".k-upload-selected\", that._onUploadSelected.bind(that))\n .on(\"keydown\", that._onKeyDown.bind(that))\n .on(\"focusout\", that._focusout.bind(that));\n\n if (that.element.val()) {\n that._onInputChange({ target: that.element });\n }\n },\n\n events: [\n SELECT,\n UPLOAD,\n SUCCESS,\n ERROR,\n COMPLETE,\n CANCEL,\n CLEAR,\n PROGRESS,\n REMOVE,\n PAUSE,\n RESUME\n ],\n\n options: {\n name: \"Upload\",\n enabled: true,\n multiple: true,\n directory: false,\n showFileList: true,\n template: \"\",\n files: [],\n async: {\n autoRetryAfter: 0,\n bufferChunkSize: 10000000,\n maxAutoRetries: 1,\n removeVerb: \"POST\",\n autoUpload: true,\n withCredentials: true,\n accept: \"*/*; q=0.5, application/json\",\n useArrayBuffer: false\n },\n localization: {\n \"select\": \"Select files...\",\n \"cancel\": \"Cancel\",\n \"retry\": \"Retry\",\n \"remove\": \"Remove\",\n \"pause\": \"Pause\",\n \"resume\": \"Resume\",\n \"clearSelectedFiles\": \"Clear\",\n \"uploadSelectedFiles\": \"Upload\",\n \"dropFilesHere\": \"Drop files here to upload\",\n \"invalidFiles\": \"Invalid file(s). Please check file upload requirements.\",\n \"statusUploading\": \"uploading\",\n \"statusUploaded\": \"uploaded\",\n \"statusWarning\": \"warning\",\n \"statusFailed\": \"failed\",\n \"headerStatusUploading\": \"Uploading...\",\n \"headerStatusPaused\": \"Paused\",\n \"headerStatusUploaded\": \"Done\",\n \"uploadSuccess\": \"File(s) uploaded successfully.\",\n \"uploadFail\": \"File(s) failed to upload.\",\n \"invalidMaxFileSize\": \"File size too large.\",\n \"invalidMinFileSize\": \"File size too small.\",\n \"invalidFileExtension\": \"File type not allowed.\"\n },\n validation: {\n allowedExtensions: [],\n maxFileSize: 0,\n minFileSize: 0\n },\n dropZone: \"\"\n },\n\n _initUploadModule: function() {\n var that = this,\n options = that.options;\n\n if (options.async.saveUrl) {\n that._module = that._supportsFormData() ?\n new formDataUploadModule(that) :\n new iframeUploadModule(that);\n that._async = true;\n\n var initialFiles = options.files;\n if (initialFiles.length > 0) {\n that._renderInitialFiles(initialFiles);\n }\n\n } else {\n that._module = new syncUploadModule(that);\n }\n },\n\n setOptions: function(options) {\n var that = this,\n activeInput = that.element;\n\n $(that.options.dropZone).off(that._ns);\n\n Widget.fn.setOptions.call(that, options);\n\n that.multiple = that.options.multiple;\n that.directory = that.options.directory;\n\n activeInput.attr(\"multiple\", that._supportsMultiple() ? that.multiple : false);\n if (that.directory) {\n activeInput.attr(\"webkitdirectory\", that.directory);\n activeInput.attr(\"directory\", that.directory);\n }\n that.toggle(that.options.enabled);\n\n that._initUploadModule();\n\n that._toggleDropZone();\n },\n\n enable: function(enable) {\n enable = typeof (enable) === \"undefined\" ? true : enable;\n this.toggle(enable);\n },\n\n disable: function() {\n this.toggle(false);\n },\n\n toggle: function(enable) {\n enable = typeof (enable) === \"undefined\" ? enable : !enable;\n this.wrapper.toggleClass(\"k-disabled\", enable);\n this.element.prop(\"disabled\", enable);\n },\n\n focus: function() {\n this.element.trigger(\"focus\");\n },\n\n destroy: function() {\n var that = this;\n var customDropZone = $(that.options.dropZone);\n\n $(document)\n .add($(\".k-dropzone\", that.wrapper))\n .add(that.wrapper.closest(\"form\"))\n .off(that._ns);\n\n if (customDropZone.length > 0) {\n customDropZone.off(that._ns);\n }\n\n $(that.element).off(NS);\n\n if (that.progressbars) {\n that.progressbars.forEach(function (progressbar) {\n progressbar.destroy();\n });\n }\n Widget.fn.destroy.call(that);\n },\n pause: function(fileEntry) {\n this._module.onPause({ target: $(fileEntry, this.wrapper) });\n\n var pauseIcon = fileEntry.find(\".k-i-pause-sm,.k-svg-i-pause-sm\");\n var resume = kendo.htmlEncode(this.localization.resume);\n kendo.ui.icon(pauseIcon, { icon: \"play-sm\" });\n pauseIcon.attr(\"title\", resume);\n $(pauseIcon).parent().attr(\"aria-label\", resume);\n },\n resume: function(fileEntry) {\n this._module.onResume({ target: $(fileEntry, this.wrapper) });\n\n var playIcon = fileEntry.find(\".k-i-play-sm,.k-svg-i-play-sm\");\n var pause = kendo.htmlEncode(this.localization.pause);\n kendo.ui.icon(playIcon, { icon: \"pause-sm\" });\n playIcon.attr(\"title\", pause);\n $(playIcon).parent().attr(\"aria-label\", pause);\n },\n upload: function() {\n var that = this;\n\n that._module.onSaveSelected();\n },\n\n getFiles: function() {\n var that = this;\n var filesData;\n var allFiles = [];\n var listItems = that.wrapper.find(\".k-file\");\n\n for (var i = 0; i < listItems.length; i++) {\n filesData = $(listItems[i]).data(\"fileNames\");\n\n if (filesData) {\n for (var j = 0; j < filesData.length; j++) {\n allFiles.push(filesData[j]);\n }\n }\n }\n\n return allFiles;\n },\n\n clearAllFiles: function() {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n\n files.each(function(index, file) {\n that._removeFileByDomElement(file, false);\n });\n },\n\n removeAllFiles: function() {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n\n files.each(function(index, file) {\n that._removeFileByDomElement(file, true);\n });\n },\n\n removeFileByUid: function(uid) {\n this._removeFileByUid(uid, true);\n },\n\n clearFileByUid: function(uid) {\n this._removeFileByUid(uid, false);\n },\n\n _removeFileByUid: function(uid, shouldSendRemoveRequest) {\n var that = this;\n var fileEntry;\n\n if (typeof uid !== 'string') { return; }\n\n fileEntry = $('.k-file[' + kendo.attr('uid') + '=\"' + uid + '\"]', that.wrapper);\n\n if (fileEntry.length > 0) {\n that._removeFileByDomElement(fileEntry, shouldSendRemoveRequest);\n }\n },\n\n clearFile: function(callback) {\n this._removeFile(callback, false);\n },\n\n removeFile: function(callback) {\n this._removeFile(callback, true);\n },\n\n _removeFile: function(callback, shouldSendRemoveRequest) {\n var that = this;\n var files = that.wrapper.find(\".k-file\");\n var fileData;\n\n if (typeof callback === \"function\") {\n files.each(function(index, file) {\n fileData = $(file).data(\"fileNames\");\n\n if (callback(fileData)) {\n that._removeFileByDomElement(file, shouldSendRemoveRequest);\n }\n });\n }\n },\n\n _removeFileByDomElement: function(fileEntry, shouldSendRemoveRequest) {\n var that = this;\n var fileData = {\n target: $(fileEntry, that.wrapper)\n };\n var allFiles;\n\n if (that.options.async.saveUrl) {\n if ($(fileEntry).hasClass(\"k-file-progress\")) {\n that._module.onCancel(fileData);\n } else {\n that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n }\n\n allFiles = $(\".k-file\", that.wrapper);\n\n if (allFiles.length === 0) {\n that._hideHeaderUploadstatus();\n } else {\n that._updateHeaderUploadStatus();\n }\n } else {\n that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n }\n },\n\n _addInput: function(sourceInput) {\n //check if source input is a DOM element. Required for some unit tests\n if (!sourceInput[0].nodeType) {\n return;\n }\n\n var that = this,\n input = sourceInput.clone().val(\"\");\n\n input\n .insertAfter(that.element)\n .data(\"kendo\" + that.options.prefix + that.options.name, that);\n\n $(that.element)\n .hide()\n .attr(TABINDEX, \"-1\")\n .removeAttr(\"id\")\n .off(NS);\n\n that._activeInput(input);\n that.element.trigger(\"focus\");\n },\n\n _activeInput: function(input) {\n var that = this,\n wrapper = that.wrapper;\n\n that.element = input;\n\n if (that.directory) {\n input.attr(\"webkitdirectory\", that.directory);\n input.attr(\"directory\", that.directory);\n }\n\n input\n .attr(\"multiple\", that._supportsMultiple() ? that.multiple : false)\n .attr(\"autocomplete\", \"off\")\n .on(\"click\" + NS, function(e) {\n if (wrapper.hasClass(\"k-disabled\")) {\n e.preventDefault();\n }\n })\n .on(\"focus\" + NS, function() {\n $(this).parent().addClass(FOCUS_STATE);\n })\n .on(\"blur\" + NS, function() {\n $(this).parent().removeClass(FOCUS_STATE);\n })\n .on(\"change\" + NS, that._onInputChange.bind(that));\n },\n\n _adjustFocusState: function(focusedItem, toFocus) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n toFocus.addClass(FOCUS_STATE);\n toFocus.attr(TABINDEX, 0);\n },\n\n _arrowKeyNavigation: function(e, key, focusedItem) {\n var that = this,\n kendoKeys = kendo.keys,\n toFocus;\n\n if (key === kendoKeys.DOWN) {\n e.preventDefault();\n e.stopPropagation();\n\n toFocus = that.wrapper.find(\".k-upload-files .k-file\").first();\n\n if (focusedItem.length > 0) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem = focusedItem.closest(\".k-file\");\n }\n\n toFocus = focusedItem.next();\n }\n\n that._adjustFocusState(focusedItem, toFocus);\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = that.wrapper.find(\".k-clear-selected\");\n }\n } else if (key === kendoKeys.UP) {\n e.preventDefault();\n e.stopPropagation();\n\n toFocus = that.wrapper.find(\".k-upload-files .k-file:last\");\n\n if (focusedItem.length > 0) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem = focusedItem.closest(\".k-file\");\n }\n\n toFocus = focusedItem.prev();\n }\n\n that._adjustFocusState(focusedItem, toFocus);\n } else if (key === kendoKeys.RIGHT) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n toFocus = focusedItem.next(\".k-upload-action\");\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = focusedItem.parent().find(\".k-upload-action:first\");\n }\n } else if (focusedItem.length > 0) {\n toFocus = focusedItem.find(\".k-upload-action:first\");\n }\n\n if (toFocus && toFocus.length > 0) {\n focusedItem.removeClass(FOCUS_STATE);\n toFocus.addClass(FOCUS_STATE);\n }\n } else if (key === kendoKeys.LEFT) {\n if (focusedItem.hasClass(\"k-upload-action\")) {\n toFocus = focusedItem.prev(\".k-upload-action\");\n\n if (!toFocus || toFocus.length === 0) {\n toFocus = focusedItem.parent().find(\".k-upload-action:last\");\n }\n } else if (focusedItem.length > 0) {\n toFocus = focusedItem.find(\".k-upload-action:last\");\n }\n\n if (toFocus && toFocus.length > 0) {\n focusedItem.removeClass(FOCUS_STATE);\n toFocus.addClass(FOCUS_STATE);\n }\n }\n\n if ((!toFocus || toFocus.length === 0) && (key === kendoKeys.UP || key === kendoKeys.DOWN)) {\n toFocus = that.element;\n }\n\n if (toFocus && toFocus.length > 0) {\n that._preventFocusRemove = true;\n toFocus.trigger(\"focus\");\n }\n },\n\n _asyncCommandKeyNavigation: function(key, focusedItem, eventArgs) {\n var that = this,\n kendoKeys = kendo.keys,\n fileEntry = $(focusedItem, that.wrapper);\n\n that._retryClicked = false;\n\n if (key === kendoKeys.ESC && focusedItem.find(\".k-i-cancel,.k-svg-i-cancel\").length > 0) {\n that.trigger(CANCEL, eventArgs);\n that._module.onCancel({ target: fileEntry });\n that._checkAllComplete();\n that._updateHeaderUploadStatus();\n that._preventFocusRemove = true;\n that.element.trigger(\"focus\");\n } else if (key === kendoKeys.SPACEBAR) {\n if (focusedItem.find(\".k-i-pause-sm,.k-svg-i-pause-sm\").length > 0) {\n that.trigger(PAUSE, eventArgs);\n that.pause(focusedItem);\n that._updateHeaderUploadStatus();\n } else if (focusedItem.find(\".k-i-play-sm,.k-svg-i-play-sm\").length > 0) {\n that.trigger(RESUME, eventArgs);\n that.resume(focusedItem);\n }\n } else if (key === kendoKeys.ENTER && !focusedItem.is(\".k-file-progress, .k-file-success, .k-file-invalid\")) {\n if (that.options.async.chunkSize && !that.options.async.concurrent && $('.k-file-progress', that.wrapper).length > 0) {\n return;\n }\n\n $(WARNINGICON_SELECTOR, focusedItem).remove();\n $(PROGRESSBAR_SELECTOR, focusedItem).finish().show();\n\n if (!that._module.metaData[fileEntry.data(\"uid\")]) {\n that._module.prepareChunk(fileEntry);\n }\n\n that._module.onRetry({ target: fileEntry });\n that._retryClicked = true;\n }\n },\n\n _commandKeyNavigation: function(key, focusedItem) {\n var that = this,\n kendoKeys = kendo.keys,\n files = focusedItem.data(\"fileNames\"),\n hasValidationErrors = that._filesContainValidationErrors(files),\n eventArgs = {\n files: files,\n headers: {}\n };\n\n if (key === kendoKeys.DELETE) {\n if (!that.trigger(REMOVE, eventArgs)) {\n that._module.onRemove({ target: $(focusedItem, that.wrapper) }, eventArgs, !hasValidationErrors);\n that._preventFocusRemove = true;\n that.element.trigger(\"focus\");\n }\n } else if (key === kendoKeys.TAB) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n } else if (!!that.options.async.saveUrl) {\n that._asyncCommandKeyNavigation(key, focusedItem, eventArgs);\n }\n },\n\n _focusout: function() {\n var focusedItem = this.wrapper.find(\".k-upload-files .k-file.\" + FOCUS_STATE);\n\n if (!this._preventFocusRemove) {\n focusedItem.removeClass(FOCUS_STATE);\n focusedItem.attr(TABINDEX, -1);\n } else {\n this._preventFocusRemove = false;\n }\n },\n\n _onKeyDown: function(e) {\n var that = this,\n focusedItem = that.wrapper.find(\".k-upload-files .k-file.\" + FOCUS_STATE + \",\" + \".k-upload-action.\" + FOCUS_STATE),\n kendoKeys = kendo.keys,\n commandKeys = [kendoKeys.DELETE, kendoKeys.ESC, kendoKeys.ENTER, kendoKeys.SPACEBAR, kendoKeys.TAB],\n key = e.keyCode;\n\n if (key === kendoKeys.DOWN || key === kendoKeys.UP || key === kendoKeys.LEFT || key === kendoKeys.RIGHT) {\n that._arrowKeyNavigation(e, key, focusedItem);\n } else if (focusedItem.length > 0 && focusedItem.hasClass(\"k-file\") && commandKeys.indexOf(key) > -1 && !that.wrapper.hasClass(\"k-disabled\")) {\n if (key === kendoKeys.SPACEBAR) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n that._commandKeyNavigation(key, focusedItem);\n }\n },\n\n _onInputChange: function(e) {\n var that = this;\n var input = $(e.target);\n var files = assignGuidToFiles(that._inputFiles(input), that._isAsyncNonBatch());\n\n validateFiles(files, that.options.validation);\n\n var prevented = that.trigger(SELECT, { files: files });\n if (prevented) {\n that._addInput(input);\n input.remove();\n } else {\n that._module.onSelect({ target: input }, files);\n }\n },\n\n _onUploadButtonKeydown: function(e) {\n var key = e.keyCode,\n kendoKeys = kendo.keys;\n\n if (key === kendoKeys.ENTER || key === kendoKeys.SPACEBAR) {\n this.wrapper.find(\".k-upload-button-wrap input\").last().trigger(\"click\");\n }\n },\n\n _readDirectory: function(item) {\n var deferred = new $.Deferred();\n var dirReader = item.createReader();\n var allFolderFiles = [];\n\n var readEntries = function() {\n dirReader.readEntries(function(entries) {\n if (!entries.length) {\n deferred.resolve(allFolderFiles);\n } else {\n allFolderFiles = allFolderFiles.concat(entries);\n readEntries();\n }\n }, deferred.reject);\n };\n\n readEntries();\n\n return deferred.promise();\n },\n\n _readFile: function(item) {\n var that = this;\n var fullpath = item.fullPath;\n\n item.file(function(file) {\n file.relativePath = fullpath.slice(1);\n that.droppedFolderFiles.push(file);\n that.droppedFolderCounter --;\n if (that.droppedFolderCounter === 0) {\n setTimeout(function() {\n if (that.droppedFolderCounter === 0) {\n if (that.droppedFolderFiles.length) {\n that._proceedDroppedItems(that.droppedFolderFiles);\n that.droppedFolderFiles = [];\n }\n }\n },0);\n }\n }, function() {\n logToConsole(\"File error.\");\n });\n },\n\n _traverseFileTree: function(item, skipCounter) {\n var that = this;\n if (!skipCounter) {\n that.droppedFolderCounter--;\n }\n\n this._readDirectory(item).then(function(items) {\n that.droppedFolderCounter += items.length;\n for (var i = 0; i < items.length; i++) {\n if (items[i].isFile) {\n that._readFile(items[i]);\n } else if (items[i].isDirectory) {\n that._traverseFileTree(items[i]);\n }\n }\n });\n },\n\n _onDrop: function(e) {\n var dt = e.originalEvent.dataTransfer;\n var that = this;\n var droppedFiles = dt.files;\n var length;\n\n stopEvent(e);\n if (that.options.directoryDrop && dt.items) {\n length = dt.items.length;\n that.droppedFolderCounter = 0;\n that.droppedFolderFiles = [];\n\n for (var i = 0; i < length; i++) {\n if (dt.items[i].webkitGetAsEntry) {\n var entry = dt.items[i].webkitGetAsEntry();\n\n if (entry.isDirectory) {\n that._traverseFileTree(entry, true);\n } else if (entry.isFile) {\n that.droppedFolderFiles.push(dt.files[i]);\n }\n } else {\n that._proceedDroppedItems(droppedFiles);\n }\n }\n } else {\n that._proceedDroppedItems(droppedFiles);\n }\n },\n\n _proceedDroppedItems: function(droppedFiles) {\n var that = this;\n var files = assignGuidToFiles(getAllFileInfo(droppedFiles), that._isAsyncNonBatch());\n\n if (droppedFiles.length > 0 && !that.wrapper.hasClass(\"k-disabled\")) {\n if (!that.multiple && files.length > 1) {\n files.splice(1, files.length - 1);\n }\n\n validateFiles(files, that.options.validation);\n\n var prevented = that.trigger(SELECT, { files: files });\n if (!prevented) {\n that._module.onSelect({ target: $(\".k-dropzone\", that.wrapper) }, files);\n }\n }\n },\n\n _filesContainValidationErrors: function(files) {\n var hasErrors = false;\n\n $(files).each(function(index, file) {\n if (file[VALIDATIONERRORS] && file[VALIDATIONERRORS].length > 0) {\n hasErrors = true;\n return false;\n }\n });\n\n return hasErrors;\n },\n\n _isAsyncNonBatch: function() {\n return (this._async && !this.options.async.batch) || false;\n },\n\n _renderInitialFiles: function(files) {\n var that = this;\n var idx = 0;\n files = assignGuidToFiles(files, true);\n\n for (idx = 0; idx < files.length; idx++) {\n var currentFile = files[idx];\n\n var fileEntry = that._enqueueFile(currentFile.name, { fileNames: [currentFile] });\n fileEntry.addClass(\"k-file-success\").data(\"files\", [files[idx]]);\n\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n }\n }\n },\n\n _prepareTemplateData: function(name, data) {\n var filesData = data.fileNames,\n templateData = {},\n totalSize = 0,\n idx = 0;\n\n for (idx = 0; idx < filesData.length; idx++) {\n totalSize += filesData[idx].size;\n }\n\n templateData.name = name;\n templateData.size = totalSize;\n templateData.files = data.fileNames;\n\n return templateData;\n },\n\n _createProgressbarWapper: function() {\n return \"
\";\n },\n\n _createFileIconWrapper: function(fileTypeIcon) {\n return \"\" +\n kendo.ui.icon({ icon: fileTypeIcon, iconClass: \"k-file-icon\", size: \"xxlarge\" }) +\n \"\" +\n \"\";\n },\n\n _progressbarInit: function(wrapper) {\n var progressbar = wrapper.kendoProgressBar({\n animation: false,\n showStatus: false\n }).data(\"kendoProgressBar\");\n this.progressbars.push(progressbar);\n },\n\n _prepareDefaultSingleFileEntryTemplate: function(data) {\n var that = this;\n var file = data.fileNames[0];\n var fileSize = getTotalFilesSizeMessage(data.fileNames);\n var fileGroup = kendo.getFileGroup(file.extension, true);\n var errors = file[VALIDATIONERRORS];\n var isError = errors && errors.length > 0;\n var invalidClass = isError ? \" k-file-invalid k-file-error\" : \"\";\n var fileDetails = isError ?\n \"\" + kendo.htmlEncode(that.localization[errors[0]]) + \"\" :\n \"\" + fileSize + \"\";\n var template = \"\";\n\n template += \"
  • \" +\n this._createProgressbarWapper() +\n this._createFileIconWrapper(fileGroup) +\n \"\" +\n \"\" + file.name + \"\" +\n fileDetails +\n \"\";\n\n template += \"\";\n\n return $(template);\n },\n\n _prepareDefaultMultipleFileEntriesTemplate: function(data) {\n var that = this;\n var files = data.fileNames;\n var filesHaveValidationErrors = that._filesContainValidationErrors(files);\n var totalFileSize = getTotalFilesSizeMessage(files);\n var template = \"\";\n var i, currentFile;\n var invalidClass = filesHaveValidationErrors ? \" k-file-invalid k-file-error\" : \"\";\n\n template += \"
  • \" +\n this._createProgressbarWapper() +\n this._createFileIconWrapper(\"copy\");\n\n files.sort(function(a, b) {\n if (a[VALIDATIONERRORS]) { return -1; }\n\n if (b[VALIDATIONERRORS]) { return 1; }\n\n return 0;\n });\n\n template += \"\";\n for (i = 0; i < files.length; i++) {\n currentFile = files[i];\n var fileSize = getTotalFilesSizeMessage([currentFile]);\n\n template += \"\";\n if (currentFile[VALIDATIONERRORS] && currentFile[VALIDATIONERRORS].length > 0) {\n template += \"\" + currentFile.name + \"\";\n } else {\n template += \"\" + currentFile.name + \"\";\n }\n template += \"\" + fileSize + \"\";\n }\n\n if (filesHaveValidationErrors) {\n template += \"\" + kendo.htmlEncode(that.localization.invalidFiles) + \"\";\n } else {\n template += \"Total: \" + files.length + \" files, \" + totalFileSize + \"\";\n }\n\n template += \"\";\n\n return $(template);\n },\n\n _enqueueFile: function(name, data) {\n var that = this;\n var existingFileEntries;\n var fileEntry;\n var fileUid = data.fileNames[0].uid;\n var fileList = $(\".k-upload-files\", that.wrapper);\n var options = that.options;\n var template = options.template;\n var templateData;\n var removeEventArgs;\n var progressbarSelector = template ? PROGRESSBAR_TEMPLATE_SELECTOR : PROGRESSBAR_SELECTOR;\n var progressbar;\n var isProgressbar;\n\n if (fileList.length === 0) {\n fileList = $(\"\").appendTo(that.wrapper);\n if (!that.options.showFileList) {\n fileList.hide();\n }\n\n that.wrapper.removeClass(\"k-upload-empty\");\n }\n\n existingFileEntries = $(\".k-file\", fileList);\n\n if (!template) {\n if (data.fileNames.length === 1) {\n fileEntry = that._prepareDefaultSingleFileEntryTemplate(data);\n } else {\n fileEntry = that._prepareDefaultMultipleFileEntriesTemplate(data);\n }\n } else {\n templateData = that._prepareTemplateData(name, data);\n template = kendo.template(template);\n\n fileEntry = $(\"
  • \" + template(templateData) + \"
  • \");\n fileEntry.find(\".k-upload-action\").addClass(\"k-button k-icon-button k-button-md k-rounded-md k-button-flat k-button-flat-base\");\n\n that.angular(\"compile\", function() {\n return {\n elements: fileEntry,\n data: [ templateData ]\n };\n });\n }\n\n progressbar = $(progressbarSelector, fileEntry[0]);\n isProgressbar = progressbar.length > 0;\n\n if (isProgressbar) {\n that._progressbarInit(progressbar);\n }\n\n fileEntry\n .attr(kendo.attr(\"uid\"), fileUid)\n .appendTo(fileList)\n .data(data);\n\n if (!that._async && isProgressbar) {\n progressbar.data(\"kendoProgressBar\").value(100);\n }\n\n if (!that.multiple && existingFileEntries.length > 0) {\n removeEventArgs = {\n files: existingFileEntries.data(\"fileNames\"),\n headers: {}\n };\n if (!that.trigger(REMOVE, removeEventArgs)) {\n that._module.onRemove({ target: $(existingFileEntries, that.wrapper) }, removeEventArgs);\n }\n }\n\n return fileEntry;\n },\n\n _removeFileEntry: function(fileEntry) {\n var that = this;\n var fileList = fileEntry.closest(\".k-upload-files\");\n var allFiles, allCompletedFiles, allInvalidFiles;\n\n fileEntry.remove();\n allFiles = $(\".k-file\", fileList);\n allCompletedFiles = $(\".k-file-success, .k-file-error\", fileList);\n\n if (allCompletedFiles.length === allFiles.length) {\n this._hideActionButtons();\n }\n\n if (allFiles.length === 0) {\n fileList.remove();\n that.wrapper.addClass(\"k-upload-empty\");\n that._hideHeaderUploadstatus();\n } else {\n that._updateHeaderUploadStatus();\n }\n },\n\n _fileAction: function(fileElement, actionKey, skipClear) {\n var iconsNameDictionary = { remove: \"x\", cancel: \"cancel\", retry: \"arrow-rotate-cw-small\", pause: \"pause-sm\" };\n var firstActionButton;\n var actionKeyText = kendo.htmlEncode(this.localization[actionKey]);\n\n if (!iconsNameDictionary.hasOwnProperty(actionKey)) {\n return;\n }\n if (!skipClear) {\n this._clearFileAction(fileElement);\n }\n if (!this.options.template) {\n if (!skipClear) {\n fileElement.find(\".k-upload-action\").remove();\n }\n fileElement.find(\".k-upload-actions\").append(\n this._renderAction(iconsNameDictionary[actionKey], actionKeyText, actionKey == \"retry\" ? \"k-i-retry\" : \"\")\n );\n } else {\n firstActionButton = fileElement.find(\".k-upload-action\").first();\n if (!firstActionButton.find(\".k-icon,.k-svg-icon\").length) {\n var firstActionIcon = kendo.ui.icon($((\"\")), {\n icon: iconsNameDictionary[actionKey],\n iconClass: \"k-button-icon\" + (actionKey == \"retry\" ? \" k-i-retry\" : \"\")\n });\n firstActionButton\n .addClass(\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button\")\n .append(firstActionIcon)\n .show();\n } else if (firstActionButton.next(\".k-upload-action\").length) {\n var firstActionIcon$1 = kendo.ui.icon($((\"\")), {\n icon: iconsNameDictionary[actionKey],\n iconClass: \"k-button-icon\" + (actionKey == \"retry\" ? \" k-i-retry\" : \"\")\n });\n firstActionButton.next(\".k-upload-action\")\n .addClass(\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base k-icon-button\")\n .append(firstActionIcon$1)\n .show();\n }\n }\n },\n\n _fileState: function(fileEntry, stateKey) {\n var localization = this.localization,\n states = {\n uploading: {\n text: localization.statusUploading\n },\n uploaded: {\n text: localization.statusUploaded\n },\n failed: {\n text: localization.statusFailed\n }\n },\n currentState = states[stateKey];\n\n if (currentState) {\n $(\"span.k-file-state\", fileEntry).text(kendo.htmlEncode(currentState.text));\n }\n },\n\n _renderAction: function(iconName, actionText, iconClass) {\n if (iconName !== \"\") {\n return $(\n \"\"\n ).on(\"focus\", function() { $(this).addClass(FOCUS_STATE); })\n .on(\"blur\", function() { $(this).removeClass(FOCUS_STATE); });\n }\n else {\n return $(\n \"\"\n );\n }\n },\n\n _clearFileAction: function(fileElement) {\n $(\".k-upload-action\", fileElement).empty().hide();\n },\n\n _onFileAction: function(e) {\n var that = this;\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n var button = $(e.target).closest(\".k-upload-action\");\n var icon = button.find(\".k-icon,.k-svg-icon\");\n var fileEntry = button.closest(\".k-file\");\n var files = fileEntry.data(\"fileNames\");\n var hasValidationErrors = that._filesContainValidationErrors(files);\n var eventArgs = {\n files: files,\n headers: {}\n };\n\n that._retryClicked = false;\n\n if (icon.is(\".k-i-x,.k-svg-i-x\")) {\n if (!that.trigger(REMOVE, eventArgs)) {\n that._module.onRemove({ target: $(fileEntry, that.wrapper) }, eventArgs, !hasValidationErrors);\n that.element.trigger(\"focus\");\n }\n } else if (icon.is(\".k-i-cancel,.k-svg-i-cancel\")) {\n that.trigger(CANCEL, eventArgs);\n that._module.onCancel({ target: $(fileEntry, that.wrapper) });\n that._checkAllComplete();\n that._updateHeaderUploadStatus();\n that.element.trigger(\"focus\");\n } else if (icon.is(\".k-i-pause-sm,.k-svg-i-pause-sm\")) {\n that.trigger(PAUSE, eventArgs);\n that.pause(fileEntry);\n that._updateHeaderUploadStatus();\n } else if (icon.is(\".k-i-play-sm,.k-svg-i-play-sm\")) {\n that.trigger(RESUME, eventArgs);\n that.resume(fileEntry);\n } else if (icon.hasClass(\"k-i-retry\")) {\n $(\".k-i-exclamation-circle\", fileEntry).remove();\n $(PROGRESSBAR_SELECTOR, fileEntry).finish().show();\n that._module.onRetry({ target: $(fileEntry, that.wrapper) });\n that._retryClicked = true;\n }\n\n fileEntry.addClass(FOCUS_STATE);\n }\n\n return false;\n },\n\n _onUploadSelected: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n if (!wrapper.hasClass(\"k-disabled\")) {\n this._module.onSaveSelected();\n }\n\n return false;\n },\n\n _onClearSelected: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n var clearEventArgs = { };\n if (!wrapper.hasClass(\"k-disabled\") && !that.trigger(CLEAR, clearEventArgs)) {\n that.clearAllFiles();\n }\n\n return false;\n },\n\n _onFileProgress: function(e, percentComplete) {\n var progressPct;\n var progressBar = $(PROGRESSBAR_SELECTOR, e.target).data(\"kendoProgressBar\");\n\n if (percentComplete > 100) {\n percentComplete = 100;\n }\n\n $(PROGRESSBAR_SELECTOR, e.target).removeClass('k-hidden');\n\n if (!this.options.template) {\n progressPct = $(\".k-upload-pct\", e.target);\n\n if (progressPct.length === 0) {\n $(\".k-upload-actions\", e.target).prepend(\"\");\n }\n\n if (percentComplete !== 100) {\n $(\".k-upload-pct\", e.target).text(percentComplete + \"%\");\n } else {\n $(\".k-upload-pct\", e.target).remove();\n }\n }\n\n if (progressBar) {\n progressBar.value(percentComplete);\n }\n\n this.trigger(PROGRESS, {\n files: getFileEntry(e).data(\"fileNames\"),\n percentComplete: percentComplete\n });\n },\n\n _onUploadSuccess: function(e, response, xhr) {\n var that = this;\n var fileEntry = getFileEntry(e);\n var files = fileEntry.data(\"fileNames\");\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n var prevented = that.trigger(SUCCESS, {\n files: fileEntry.data(\"fileNames\"),\n response: response,\n operation: \"upload\",\n XMLHttpRequest: xhr\n });\n\n if (prevented) {\n that._setUploadErrorState(fileEntry);\n } else {\n that._fileState(fileEntry, \"uploaded\");\n fileEntry.removeClass('k-file-progress').addClass('k-file-success');\n\n if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden')\n .after('' + files.length + ' ' + kendo.htmlEncode(that.localization.uploadSuccess) + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden')\n .after('' + kendo.htmlEncode(that.localization.uploadSuccess) + '');\n }\n\n that._updateHeaderUploadStatus();\n\n if (that._supportsRemove()) {\n that._fileAction(fileEntry, REMOVE);\n } else {\n that._clearFileAction(fileEntry);\n }\n }\n\n that._hideUploadProgress(fileEntry);\n\n that._checkAllComplete();\n },\n\n _onUploadError: function(e, xhr) {\n var that = this;\n var module = that._module;\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n\n that._setUploadErrorState(fileEntry);\n\n that.trigger(ERROR, {\n operation: \"upload\",\n files: fileEntry.data(\"fileNames\"),\n XMLHttpRequest: xhr\n });\n\n logToConsole(\"Server response: \" + xhr.responseText);\n\n if (!that.options.async.chunkSize) {\n that._hideUploadProgress(fileEntry);\n } else {\n if (module._decreasePosition) {\n module._decreasePosition(fileUid);\n }\n }\n\n that._checkAllComplete();\n\n if (this.options.async.autoRetryAfter) {\n this._autoRetryAfter(fileEntry);\n }\n },\n _autoRetryAfter: function(fileEntry) {\n var that = this;\n var retries = this._module.retries;\n\n if (!retries) {\n return;\n }\n\n if (!retries[fileEntry.data(\"uid\")]) {\n retries[fileEntry.data(\"uid\")] = 1;\n }\n\n if (retries[fileEntry.data(\"uid\")] <= this.options.async.maxAutoRetries) {\n retries[fileEntry.data(\"uid\")]++;\n setTimeout(function() {\n that._module.performUpload(fileEntry);\n },this.options.async.autoRetryAfter);\n }\n },\n _setUploadErrorState: function(fileEntry) {\n var that = this,\n uploadPercentage,\n files = fileEntry.data(\"fileNames\"),\n fileInfo = fileEntry.find('.k-file-summary'),\n fileSize = fileEntry.find('.k-file-size');\n\n that._fileState(fileEntry, \"failed\");\n fileEntry.removeClass('k-file-progress').addClass('k-file-error');\n\n if (fileInfo.length > 0) {\n fileInfo.addClass('k-hidden')\n .after('' + files.length + ' ' + kendo.htmlEncode(that.localization.uploadFail) + '');\n } else if (fileSize.length > 0) {\n fileSize.addClass('k-hidden')\n .after('' + kendo.htmlEncode(that.localization.uploadFail) + '');\n }\n\n that._updateUploadProgress(fileEntry);\n\n uploadPercentage = $('.k-upload-pct', fileEntry);\n\n if (uploadPercentage.length > 0) {\n uploadPercentage.remove();\n }\n\n this._updateHeaderUploadStatus();\n this._fileAction(fileEntry, \"retry\");\n this._fileAction(fileEntry, REMOVE, true);\n\n if (that._retryClicked) {\n fileEntry.trigger(\"focus\");\n }\n },\n\n _updateUploadProgress: function(fileEntry) {\n var that = this;\n var progressbar = $( PROGRESSBAR_SELECTOR, fileEntry);\n var isProgressbar = progressbar.length > 0;\n\n if (!that.options.async.chunkSize && isProgressbar) {\n progressbar.data(\"kendoProgressBar\").value(100);\n } else {\n var fileUid = fileEntry.data(\"uid\");\n if (that._module.metaData) {\n var fileMetaData = that._module.metaData[fileUid];\n\n if (fileMetaData) {\n var percentComplete = fileMetaData.totalChunks ? Math.round(((fileMetaData.chunkIndex) / fileMetaData.totalChunks) * 100) : 100;\n\n that._onFileProgress({ target: $(fileEntry, that.wrapper) }, percentComplete);\n }\n }\n }\n },\n\n _hideUploadProgress: function(fileEntry) {\n $(PROGRESSBAR_SELECTOR, fileEntry)\n .delay(PROGRESSHIDEDELAY)\n .fadeOut(PROGRESSHIDEDURATION, function() {\n $(this).data(\"kendoProgressBar\").value(0);\n });\n },\n\n _showActionButtons: function() {\n var that = this;\n var actionsWrapper = $(\".k-actions\", that.wrapper);\n var uploadButton = $(\".k-upload-selected\", that.wrapper);\n var clearButton = $(\".k-clear-selected\", that.wrapper);\n\n if (uploadButton.length === 0) {\n uploadButton = $(kendo.html.renderButton((\"\"), {\n icon: 'upload',\n themeColor: 'primary'\n }));\n\n clearButton = $(kendo.html.renderButton((\"\"), {\n icon: 'x'\n }));\n\n }\n\n if (!actionsWrapper.length) {\n actionsWrapper = $(\"
    \")\n .addClass(\"k-actions\")\n .append(uploadButton, clearButton);\n }\n\n\n this.wrapper.append(actionsWrapper);\n },\n\n _hideActionButtons: function() {\n $(\".k-actions\", this.wrapper).remove();\n },\n\n _showHeaderUploadStatus: function(isUploading) {\n var that = this;\n var localization = that.localization;\n var dropZone = $(\".k-dropzone\", that.wrapper);\n var headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n\n if (headerUploadStatus.length !== 0) {\n headerUploadStatus.remove();\n }\n\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n\n headerUploadStatus = '';\n\n if (isUploading) {\n headerUploadStatus = $(headerUploadStatus).append(kendo.htmlEncode(localization.headerStatusUploading));\n kendo.ui.icon(headerUploadStatus.find(\".k-icon,.k-svg-icon\"), { icon: headerStatusIconName.loading });\n } else {\n headerUploadStatus = $(headerUploadStatus).append(kendo.htmlEncode(localization.headerStatusUploaded));\n kendo.ui.icon(headerUploadStatus.find(\".k-icon,.k-svg-icon\"), { icon: headerStatusIconName.warning });\n }\n\n if (dropZone.length > 0) {\n dropZone.append(headerUploadStatus);\n } else {\n $('.k-upload-button', that.wrapper).after(headerUploadStatus);\n }\n },\n\n _updateHeaderUploadStatus: function() {\n var that = this;\n var headerUploadStatus = $('.k-upload-status-total', this.wrapper);\n var currentlyUploading = $('.k-file', that.wrapper).not('.k-file-success, .k-file-error');\n var currentlyFailed = $('.k-file-error', that.wrapper);\n var currentlyPaused = $('.k-file', that.wrapper).find(\".k-i-play-sm,.k-svg-i-play-sm\");\n var headerUploadStatusIcon;\n\n if (currentlyPaused.length &&\n (currentlyPaused.length === currentlyUploading.length || !that.options.async.concurrent)) {\n headerUploadStatusIcon = $('.k-icon,.k-svg-icon', headerUploadStatus).removeClass();\n\n if (headerUploadStatusIcon.length) {\n kendo.ui.icon(headerUploadStatusIcon, { icon: \"pause-sm\" });\n\n headerUploadStatus.html(headerUploadStatusIcon)\n .append(kendo.htmlEncode(that.localization.headerStatusPaused));\n }\n } else if (currentlyUploading.length === 0 || currentlyFailed.length > 0) {\n headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n headerUploadStatusIcon = $('.k-icon,.k-svg-icon', headerUploadStatus).removeClass();\n\n if (headerUploadStatusIcon.length) {\n\n kendo.ui.icon(headerUploadStatusIcon, { icon: currentlyFailed.length !== 0 ? headerStatusIconName.warning : headerStatusIconName.success });\n\n headerUploadStatus.html(headerUploadStatusIcon)\n .append(kendo.htmlEncode(that.localization.headerStatusUploaded));\n }\n }\n },\n\n _hideHeaderUploadstatus: function() {\n var that = this,\n dropZone = that.options.dropZone;\n\n $('.k-upload-status-total', this.wrapper).remove();\n\n if (dropZone === \"\") {\n $('.k-dropzone-hint', that.wrapper).removeClass('k-hidden');\n }\n },\n\n _onParentFormSubmit: function() {\n var upload = this,\n element = upload.element;\n\n if (typeof this._module.onAbort !== 'undefined') {\n this._module.onAbort();\n }\n\n if (!element.value) {\n var input = $(element);\n\n // Prevent submitting an empty input\n input.attr(\"disabled\", \"disabled\");\n\n window.setTimeout(function() {\n // Restore the input so the Upload remains functional\n // in case the user cancels the form submit\n input.prop(\"disabled\", false);\n }, 0);\n }\n },\n\n _onParentFormReset: function() {\n $(\".k-upload-files\", this.wrapper).remove();\n },\n\n _supportsFormData: function() {\n return typeof(FormData) != \"undefined\";\n },\n\n _supportsMultiple: function() {\n var windows = this._userAgent().indexOf(\"Windows\") > -1;\n\n return !kendo.support.browser.opera &&\n !(kendo.support.browser.safari && windows);\n },\n\n _supportsDrop: function() {\n var userAgent = this._userAgent().toLowerCase();\n var isChrome = /chrome/.test(userAgent);\n var isSafari = !isChrome && /safari/.test(userAgent);\n var isWindowsSafari = isSafari && /windows/.test(userAgent);\n\n return !isWindowsSafari && this._supportsFormData() && (this.options.async.saveUrl);\n },\n\n _userAgent: function() {\n return navigator.userAgent;\n },\n\n _setupDropZone: function() {\n var that = this;\n\n var ns = that._ns;\n var dropZone = $(\".k-dropzone\", that.wrapper)\n\n .on(\"dragenter\" + ns, stopEvent)\n .on(\"dragover\" + ns, function(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.preventDefault();\n })\n .on(\"drop\" + ns, that._onDrop.bind(that));\n\n if (!dropZone.find(\".k-dropzone-hint\").length) {\n dropZone.append($(\"\" + kendo.htmlEncode(that.localization.dropFilesHere) + \"\"));\n }\n\n bindDragEventWrappers(dropZone, ns,\n function() {\n if (!dropZone.closest('.k-upload').hasClass(\"k-disabled\")) {\n dropZone.addClass(HOVER_STATE);\n }\n },\n function() { dropZone.removeClass(HOVER_STATE); });\n\n that._bindDocumentDragEventWrappers(dropZone);\n },\n\n _setupCustomDropZone: function() {\n var that = this;\n var dropZone = $(that.options.dropZone);\n\n if (!that.wrapper.find(\".k-dropzone-hint\").length) {\n $(\".k-dropzone\", that.wrapper)\n .append($(\"\" + kendo.htmlEncode(that.localization.dropFilesHere) + \"\"));\n } else {\n // Dropzone hint in upload should be hidden if customDropZone is used\n $('.k-dropzone-hint', that.wrapper).addClass('k-hidden');\n }\n\n var ns = that._ns;\n dropZone.on(\"dragenter\" + ns, stopEvent)\n .on(\"dragover\" + ns, function(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.preventDefault();\n })\n .on(\"drop\" + ns, that._onDrop.bind(that));\n\n bindDragEventWrappers(dropZone, ns,\n function(e) {\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n dropZone.removeClass(HOVER_STATE);\n dropZone.addClass(HOVER_STATE);\n $(e.target).addClass(HOVER_STATE);\n }\n },\n function() {\n dropZone.removeClass(HOVER_STATE);\n }\n );\n\n that._bindDocumentDragEventWrappers(dropZone);\n },\n\n _bindDocumentDragEventWrappers: function(dropZone) {\n var that = this;\n var ns = that._ns;\n\n bindDragEventWrappers($(document), ns,\n function() {\n if (!that.wrapper.hasClass(\"k-disabled\")) {\n dropZone.addClass(\"k-dropzone-active\");\n dropZone.closest('.k-upload').removeClass('k-upload-empty');\n dropZone.find('.k-dropzone-hint').removeClass('k-hidden');\n }\n },\n function() {\n dropZone.removeClass(\"k-dropzone-active\");\n dropZone.find('.k-dropzone-hint').addClass('k-hidden');\n if ($('li.k-file', dropZone.closest('.k-upload')).length === 0) {\n dropZone.closest('.k-upload').addClass('k-upload-empty');\n }\n }\n );\n },\n\n _toggleDropZone: function() {\n var that = this,\n dropZone = that.options.dropZone;\n\n if (!that._supportsDrop()) {\n return;\n }\n\n $(dropZone).off(that._ns);\n $(\".k-dropzone\", that.wrapper).off(that._ns);\n\n if (dropZone !== \"\") {\n that._setupCustomDropZone();\n } else {\n that._setupDropZone();\n }\n },\n\n _supportsRemove: function() {\n return !!this.options.async.removeUrl;\n },\n\n _submitRemove: function(fileNames, eventArgs, onSuccess, onError) {\n var upload = this,\n removeField = upload.options.async.removeField || \"fileNames\",\n params = $.extend(eventArgs.data, antiForgeryTokens());\n\n params[removeField] = fileNames;\n\n jQuery.ajax({\n type: this.options.async.removeVerb,\n dataType: \"json\",\n dataFilter: normalizeJSON,\n url: this.options.async.removeUrl,\n traditional: true,\n data: params,\n headers: eventArgs.headers,\n success: onSuccess,\n error: onError,\n xhrFields: {\n withCredentials: this.options.async.withCredentials\n }\n });\n },\n\n _wrapInput: function(input) {\n var that = this;\n var options = that.options;\n var hasLabel = !!input.attr(\"id\") && $(\"[for='\" + input.attr(\"id\") + \"']\").length > 0;\n var selectText = kendo.htmlEncode(that.localization.select);\n var uploadButton = $(\"
    \");\n\n uploadButton.find('.k-button-text').text(selectText);\n\n input.wrap(\"
    \");\n uploadButton.prependTo(input.parent());\n\n if (!options.async.saveUrl) {\n input.closest(\".k-upload\").addClass(\"k-upload-sync\");\n } else {\n input.closest(\".k-upload\").addClass(\"k-upload-async\");\n }\n\n input.closest(\".k-upload\").addClass(\"k-upload-empty\");\n\n if (!hasLabel && !input.attr(\"aria-label\")) {\n input.attr(\"aria-label\", selectText);\n }\n\n input.attr({\n tabindex: -1,\n \"aria-hidden\": true\n });\n\n return input.closest(\".k-upload\");\n },\n\n _checkAllComplete: function() {\n if ($(\".k-file.k-file-progress\", this.wrapper).length === 0) {\n this.trigger(COMPLETE);\n }\n },\n\n _inputFiles: function(sourceInput) {\n return inputFiles(sourceInput);\n }\n });\n\n // Synchronous upload module\n var syncUploadModule = function(upload) {\n this.name = \"syncUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.element\n .closest(\"form\")\n .attr(\"enctype\", \"multipart/form-data\")\n .attr(\"encoding\", \"multipart/form-data\");\n };\n\n syncUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var sourceInput = $(e.target);\n var filesContainErrors = upload._filesContainValidationErrors(files);\n\n upload._addInput(sourceInput);\n\n var fileData = { \"fileNames\": files };\n\n if (filesContainErrors) {\n sourceInput.remove();\n } else {\n fileData.relatedInput = sourceInput;\n }\n\n var file = upload._enqueueFile(getFileName(sourceInput), fileData);\n\n if (filesContainErrors) {\n upload._hideUploadProgress(file);\n }\n\n upload._fileAction(file, REMOVE);\n },\n\n onRemove: function(e) {\n var fileEntry = getFileEntry(e);\n var relatedInput = fileEntry.data(\"relatedInput\");\n\n if (relatedInput) {\n relatedInput.remove();\n }\n\n this.upload._removeFileEntry(fileEntry);\n }\n };\n\n var iframeUploadModule = function(upload) {\n this.name = \"iframeUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.iframes = [];\n };\n\n Upload._frameId = 0;\n\n iframeUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var sourceInput = $(e.target);\n var hasValidationErrors = upload._filesContainValidationErrors(files);\n\n var fileEntry = this.prepareUpload(sourceInput, files, hasValidationErrors);\n\n if (upload.options.async.autoUpload) {\n if (!hasValidationErrors) {\n this.performUpload(fileEntry);\n } else {\n upload._fileAction(fileEntry, REMOVE);\n upload._showHeaderUploadStatus(false);\n }\n } else {\n upload._fileAction(fileEntry, REMOVE);\n\n if (!hasValidationErrors) {\n upload._showActionButtons();\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n\n if (hasValidationErrors) {\n upload._hideUploadProgress(fileEntry);\n }\n },\n\n prepareUpload: function(sourceInput, files, hasValidationErrors) {\n var upload = this.upload;\n var activeInput = $(upload.element);\n var name = upload.options.async.saveField || sourceInput.attr(\"name\");\n var fileEntry, fileData, iframe, form;\n\n upload._addInput(sourceInput);\n sourceInput.attr(\"name\", name);\n\n if (!hasValidationErrors) {\n iframe = this.createFrame(upload.name + \"_\" + Upload._frameId++);\n this.registerFrame(iframe);\n\n form = this.createForm(upload.options.async.saveUrl, iframe.attr(\"name\"))\n .append(activeInput);\n\n fileData = { \"frame\": iframe, \"relatedInput\": activeInput, \"fileNames\": files };\n } else {\n sourceInput.remove();\n\n fileData = { \"fileNames\": files };\n }\n\n fileEntry = upload._enqueueFile(getFileName(sourceInput), fileData);\n\n if (iframe) {\n iframe.data({ \"form\": form, \"file\": fileEntry });\n }\n\n return fileEntry;\n },\n\n performUpload: function(fileEntry) {\n var e = { files: fileEntry.data(\"fileNames\") };\n var iframe = fileEntry.data(\"frame\");\n var upload = this.upload;\n var fileValidation = fileEntry.find('.k-file-validation-message');\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n if (!upload.trigger(UPLOAD, e)) {\n upload._hideActionButtons();\n upload._showHeaderUploadStatus(true);\n\n iframe.appendTo(document.body);\n\n var form = iframe.data(\"form\")\n .attr(\"action\", upload.options.async.saveUrl)\n .appendTo(document.body);\n\n e.data = $.extend({ }, e.data, antiForgeryTokens());\n for (var key in e.data) {\n var dataInput = form.find(\"input[name='\" + key + \"']\");\n if (dataInput.length === 0) {\n dataInput = $(\"\", { type: \"hidden\", name: key })\n .prependTo(form);\n }\n dataInput.val(e.data[key]);\n }\n\n upload._fileAction(fileEntry, CANCEL);\n upload._fileState(fileEntry, \"uploading\");\n $(fileEntry).removeClass(\"k-file-error\").addClass(\"k-file-progress\");\n\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\n }\n\n iframe\n .one(\"load\", this.onIframeLoad.bind(this));\n\n form[0].submit();\n } else {\n upload._removeFileEntry(iframe.data(\"file\"));\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n }\n },\n\n onSaveSelected: function() {\n var module = this;\n var upload = module.upload;\n\n $(\".k-file\", this.element).each(function() {\n var fileEntry = $(this);\n var started = isFileUploadStarted(fileEntry);\n var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data(\"fileNames\"));\n\n if (!started && !hasValidationErrors) {\n module.performUpload(fileEntry);\n }\n });\n },\n\n onIframeLoad: function(e) {\n var iframe = $(e.target),\n responseText;\n\n try {\n responseText = iframe.contents().text();\n } catch (ex) {\n responseText = \"Error trying to get server response: \" + ex;\n }\n\n this.processResponse(iframe, responseText);\n },\n\n processResponse: function(iframe, responseText) {\n var fileEntry = iframe.data(\"file\"),\n module = this,\n fakeXHR = {\n responseText: responseText\n };\n tryParseJSON(responseText,\n function(jsonResult) {\n $.extend(fakeXHR, { statusText: \"OK\", status: \"200\" });\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, fakeXHR);\n\n module.cleanupFrame(iframe);\n module.unregisterFrame(iframe);\n },\n function() {\n $.extend(fakeXHR, { statusText: \"error\", status: \"500\" });\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, fakeXHR);\n }\n );\n },\n\n onCancel: function(e) {\n var iframe = $(e.target).data(\"frame\");\n\n this.stopFrameSubmit(iframe);\n this.cleanupFrame(iframe);\n this.unregisterFrame(iframe);\n this.upload._removeFileEntry(iframe.data(\"file\"));\n },\n\n onRetry: function(e) {\n var fileEntry = getFileEntry(e);\n this.performUpload(fileEntry);\n },\n\n onRemove: function(e, eventArgs, shouldSendRemoveRequest) {\n var module = this;\n var upload = module.upload;\n var fileEntry = getFileEntry(e);\n var iframe = fileEntry.data(\"frame\");\n\n if (iframe) {\n module.unregisterFrame(iframe);\n upload._removeFileEntry(fileEntry);\n module.cleanupFrame(iframe);\n } else {\n if (fileEntry.hasClass(\"k-file-success\")) {\n removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n } else {\n upload._removeFileEntry(fileEntry);\n }\n }\n },\n\n onAbort: function() {\n var element = this.element,\n module = this;\n\n $.each(this.iframes, function() {\n $(\"input\", this.data(\"form\")).appendTo(element);\n module.stopFrameSubmit(this[0]);\n this.data(\"form\").remove();\n this.remove();\n });\n\n this.iframes = [];\n },\n\n createFrame: function(id) {\n return $(\n \"\"\n ).hide();\n },\n\n createForm: function(action, target) {\n return $(\n \"
    \");\n },\n\n stopFrameSubmit: function(frame) {\n if (typeof(frame.stop) != \"undefined\") {\n frame.stop();\n } else if (frame.document) {\n frame.document.execCommand(\"Stop\");\n }\n },\n\n registerFrame: function(frame) {\n this.iframes.push(frame);\n },\n\n unregisterFrame: function(frame) {\n this.iframes = $.grep(this.iframes, function(value) {\n return value.attr(\"name\") != frame.attr(\"name\");\n });\n },\n\n cleanupFrame: function(frame) {\n var form = frame.data(\"form\");\n\n frame.data(\"file\").data(\"frame\", null);\n\n setTimeout(function() {\n form.remove();\n frame.remove();\n }, 1);\n }\n };\n\n // FormData upload module\n var formDataUploadModule = function(upload) {\n this.name = \"formDataUploadModule\";\n this.element = upload.wrapper;\n this.upload = upload;\n this.position = {};\n this.metaData = {};\n this.cancelled = {};\n this.resume = {};\n this.paused = {};\n this.retries = {};\n };\n\n formDataUploadModule.prototype = {\n onSelect: function(e, files) {\n var upload = this.upload;\n var module = this;\n var sourceElement = $(e.target);\n var fileEntries = this.prepareUpload(sourceElement, files);\n var hasValidationErrors;\n var prev;\n\n $.each(fileEntries, function(index) {\n hasValidationErrors = upload._filesContainValidationErrors($(this.data(\"fileNames\")));\n\n if (upload.options.async.autoUpload) {\n if (!hasValidationErrors) {\n if (upload.options.async.chunkSize) {\n module.prepareChunk(this);\n prev = this.prev();\n\n if (upload.options.async.concurrent || (index === 0 && !prev.length) ||\n (index === 0 && prev.hasClass(\"k-file-success\"))) {\n module.performUpload(this);\n }\n } else {\n module.performUpload(this);\n }\n } else {\n upload._fileAction(this, REMOVE);\n upload._showHeaderUploadStatus(false);\n }\n } else {\n upload._fileAction(this, REMOVE);\n\n if (!hasValidationErrors) {\n upload._showActionButtons();\n this.addClass(\"k-toupload\");\n } else {\n upload._updateHeaderUploadStatus();\n }\n }\n\n if (hasValidationErrors) {\n upload._hideUploadProgress(this);\n }\n });\n },\n\n prepareUpload: function(sourceElement, files) {\n var fileEntries = this.enqueueFiles(files);\n\n if (sourceElement.is(\"input\")) {\n $.each(fileEntries, function() {\n $(this).data(\"relatedInput\", sourceElement);\n });\n sourceElement.data(\"relatedFileEntries\", fileEntries);\n this.upload._addInput(sourceElement);\n }\n\n return fileEntries;\n },\n\n enqueueFiles: function(files) {\n var upload = this.upload;\n var name;\n var i;\n var filesLength = files.length;\n var currentFile;\n var fileEntry;\n var fileEntries = [];\n\n if (upload.options.async.batch === true) {\n name = $.map(files, function(file) { return file.name; }).join(\", \");\n\n if (upload.directory || upload.options.directoryDrop) {\n $(files).each(function() {\n if (this.rawFile.webkitRelativePath || this.rawFile.relativePath) {\n this.name = this.rawFile.webkitRelativePath || this.rawFile.relativePath;\n }\n });\n }\n\n fileEntry = upload._enqueueFile(name, { fileNames: files });\n fileEntry.data(\"files\", files);\n\n fileEntries.push(fileEntry);\n } else {\n for (i = 0; i < filesLength; i++) {\n currentFile = files[i];\n name = currentFile.name;\n if (upload.directory || upload.options.directoryDrop) {\n if (currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath) {\n currentFile.name = currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath;\n }\n }\n fileEntry = upload._enqueueFile(name, { fileNames: [currentFile] });\n fileEntry.data(\"files\", [currentFile]);\n\n fileEntries.push(fileEntry);\n }\n }\n\n return fileEntries;\n },\n\n performUpload: function(fileEntry) {\n var upload = this.upload,\n formData = this.createFormData(),\n xhr = this.createXHR(),\n e = {\n files: fileEntry.data(\"fileNames\"),\n XMLHttpRequest: xhr\n },\n files;\n var fileValidation = fileEntry.find('.k-file-validation-message');\n var fileInfo = fileEntry.find('.k-file-summary');\n var fileSize = fileEntry.find('.k-file-size');\n\n if (!upload.trigger(UPLOAD, e)) {\n if (fileEntry.find(\".k-i-cancel,.k-svg-i-cancel\").length === 0) {\n if (upload.options.async.chunkSize) {\n upload._fileAction(fileEntry, PAUSE);\n }\n upload._fileAction(fileEntry, CANCEL, upload.options.async.chunkSize);\n }\n\n if (!upload.wrapper.find(\".k-toupload\").length) {\n upload._hideActionButtons();\n }\n\n upload._showHeaderUploadStatus(true);\n\n if (e.formData) {\n formData = e.formData;\n } else {\n e.data = $.extend({ }, e.data, antiForgeryTokens());\n for (var key in e.data) {\n formData.append(key, e.data[key]);\n }\n\n files = fileEntry.data(\"files\");\n if (files) {\n this.populateFormData(formData, files);\n }\n }\n\n upload._fileState(fileEntry, \"uploading\");\n $(fileEntry).removeClass(\"k-file-error\").addClass(\"k-file-progress\");\n\n if (fileValidation.length > 0) {\n fileValidation.remove();\n }\n\n if (fileInfo.length > 0) {\n fileInfo.removeClass('k-hidden');\n } else if (fileSize.length > 0) {\n fileSize.removeClass('k-hidden');\n }\n\n if (upload.options.async.useArrayBuffer && window.FileReader) {\n this._readFile(upload.options.async.saveUrl, formData, fileEntry, xhr);\n } else {\n this.postFormData(upload.options.async.saveUrl, formData, fileEntry, xhr);\n }\n } else {\n this.removeFileEntry(fileEntry);\n }\n },\n\n _readFile: function(saveUrl, formData, fileEntry, xhr) {\n var that = this;\n var upload = that.upload;\n var file = fileEntry.data(\"files\")[0];\n\n var reader = new FileReader();\n reader.onload = function(e) {\n try {\n if (!that.fileArrayBuffer) {\n that.fileArrayBuffer = e.target.result;\n } else {\n that.fileArrayBuffer = that._appendBuffer(that.fileArrayBuffer, e.target.result);\n }\n } catch (err) {\n upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n return;\n }\n\n if (that.position[file.uid] > file.size) {\n that.postFormData(upload.options.async.saveUrl, that.fileArrayBuffer, fileEntry, xhr);\n that.fileArrayBuffer = null;\n } else {\n that._readFile(saveUrl, formData, fileEntry, xhr);\n }\n };\n reader.onerror = function() {\n upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n };\n reader.readAsArrayBuffer(that._getCurrentChunk(file.rawFile, file.uid));\n },\n\n _appendBuffer: function(buffer1, buffer2) {\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n\n tmp.set(new Uint8Array(buffer1), 0);\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n\n return tmp.buffer;\n },\n\n onSaveSelected: function() {\n var module = this;\n var upload = module.upload;\n\n $(\".k-toupload\", this.element).filter(function() {\n var fileEntry = $(this);\n var started = isFileUploadStarted(fileEntry);\n var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data(\"fileNames\"));\n\n return !started && !hasValidationErrors;\n }).each(function(index) {\n var fileEntry = $(this);\n var prevEntry = fileEntry.prev();\n\n fileEntry.removeClass(\"k-toupload\");\n if (upload.options.async.chunkSize) {\n module.prepareChunk(fileEntry);\n\n if (upload.options.async.concurrent || (index === 0 && !prevEntry.length) ||\n (index === 0 && prevEntry.hasClass(\"k-file-success\") || prevEntry.hasClass(\"k-file-error:not(k-file-invalid)\"))) {\n module.performUpload(fileEntry);\n }\n } else {\n module.performUpload(fileEntry);\n }\n });\n },\n\n onCancel: function(e) {\n var fileEntry = getFileEntry(e);\n\n if (this.upload.options.async.chunkSize) {\n this.cancelled[fileEntry.data(\"uid\")] = true;\n }\n this.stopUploadRequest(fileEntry);\n this.removeFileEntry(fileEntry);\n },\n\n onPause: function(e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileUid] = async.maxAutoRetries + 1;\n this.paused[fileUid] = true;\n this.resume[fileUid] = false;\n }\n },\n\n onResume: function(e) {\n var fileEntry = getFileEntry(e);\n var fileUid = fileEntry.data(\"uid\");\n\n if (this.upload.options.async.chunkSize) {\n delete this.paused[fileUid];\n this.resume[fileUid] = true;\n this.retries[fileEntry.data(\"uid\")] = 1;\n this._increaseChunkIndex(fileUid);\n this.performUpload(fileEntry);\n }\n },\n\n onRetry: function(e) {\n var fileEntry = getFileEntry(e);\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileEntry.data(\"uid\")] = async.maxAutoRetries + 1;\n delete this.paused[fileEntry.data(\"uid\")];\n }\n\n this.performUpload(fileEntry);\n },\n\n onRemove: function(e, eventArgs, shouldSendRemoveRequest) {\n var module = this;\n var upload = module.upload;\n var fileEntry = getFileEntry(e);\n var async = this.upload.options.async;\n\n if (async.chunkSize) {\n this.retries[fileEntry.data(\"uid\")] = async.maxAutoRetries + 1;\n }\n\n if (fileEntry.hasClass(\"k-file-success\")) {\n removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n } else {\n module.removeFileEntry(fileEntry);\n }\n },\n\n createXHR: function() {\n return new XMLHttpRequest();\n },\n\n postFormData: function(url, data, fileEntry, xhr) {\n var module = this;\n\n fileEntry.data(\"request\", xhr);\n\n xhr.addEventListener(\"load\", function(e) {\n module.onRequestSuccess.call(module, e, fileEntry);\n }, false);\n\n xhr.addEventListener(ERROR, function(e) {\n module.onRequestError.call(module, e, fileEntry);\n }, false);\n\n xhr.upload.addEventListener(\"progress\", function(e) {\n module.onRequestProgress.call(module, e, fileEntry);\n }, false);\n\n xhr.open(\"POST\", url, true);\n xhr.withCredentials = this.upload.options.async.withCredentials;\n\n var accept = this.upload.options.async.accept;\n if (accept) {\n xhr.setRequestHeader(\"Accept\", accept);\n }\n\n xhr.send(data);\n },\n\n createFormData: function() {\n return new FormData();\n },\n\n populateFormData: function(data, files) {\n var chunk;\n var i;\n var length = files.length;\n var uid;\n var upload = this.upload;\n\n if (upload.options.async.chunkSize) {\n uid = files[0].uid;\n chunk = this._getCurrentChunk(files[0].rawFile, uid);\n\n data.append(\n upload.options.async.saveField || upload.name,\n chunk\n );\n\n var serializedMetaData = JSON.stringify(this.metaData[uid]);\n data.append(\"metadata\", serializedMetaData);\n } else {\n for (i = 0; i < length; i++) {\n data.append(\n upload.options.async.saveField || upload.name,\n files[i].rawFile\n );\n }\n }\n\n return data;\n },\n\n onRequestSuccess: function(e, fileEntry) {\n var xhr = e.target,\n module = this;\n\n function raiseError() {\n module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, xhr);\n }\n\n function parseSuccess(jsonResult) {\n var batch = module.upload.options.async.batch;\n var chunkSize = module.upload.options.async.chunkSize;\n var concurrent = module.upload.options.async.concurrent;\n var fileUid = jsonResult.fileUid;\n\n if (module.paused[fileUid] || module.cancelled[fileUid]) {\n return;\n }\n\n delete module.retries[fileUid];\n\n if (chunkSize && !batch && !jsonResult.uploaded) {\n\n module._increaseChunkIndex(fileUid);\n module.performUpload(fileEntry);\n } else if (chunkSize && !batch && !concurrent && fileEntry.next().length && !fileEntry.next().hasClass(\"k-toupload\")) {\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module._resetChunkIndex(fileUid);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n\n module.performUpload(fileEntry.next());\n } else {\n module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n module.cleanupFileEntry(fileEntry);\n }\n }\n\n if (xhr.status >= 200 && xhr.status <= 299) {\n tryParseJSON(xhr.responseText,\n parseSuccess,\n raiseError\n );\n } else {\n raiseError();\n }\n },\n\n onRequestError: function(e, fileEntry) {\n var xhr = e.target;\n\n this.upload._onUploadError({ target: $(fileEntry, this.upload.wrapper) }, xhr);\n },\n\n cleanupFileEntry: function(fileEntry) {\n var relatedInput = fileEntry.data(\"relatedInput\"),\n uploadComplete = true;\n\n if (relatedInput) {\n $.each(relatedInput.data(\"relatedFileEntries\") || [], function() {\n // Exclude removed file entries and self\n if (this.parent().length > 0 && this[0] != fileEntry[0]) {\n uploadComplete = uploadComplete && this.hasClass(\"k-file-success\");\n }\n });\n\n if (uploadComplete) {\n relatedInput.remove();\n }\n }\n },\n\n removeFileEntry: function(fileEntry) {\n var chunkSize = this.upload.options.async.chunkSize;\n var concurrent = this.upload.options.async.concurrent;\n var isUploadButtonVisible = this.upload.wrapper.find(\".k-upload-selected\").length > 0;\n\n this.cleanupFileEntry(fileEntry);\n if (chunkSize && !concurrent && !isUploadButtonVisible) {\n if (fileEntry.next().length) {\n this.performUpload(fileEntry.next());\n }\n }\n this.upload._removeFileEntry(fileEntry);\n },\n\n onRequestProgress: function(e, fileEntry) {\n var percentComplete = Math.round(e.loaded * 100 / e.total);\n var fileUid = fileEntry.data(\"uid\");\n var fileMetaData;\n\n if (this.upload.options.async.chunkSize) {\n fileMetaData = this.metaData[fileUid];\n percentComplete = fileMetaData && fileMetaData.totalChunks ? Math.round(((fileMetaData.chunkIndex) / fileMetaData.totalChunks) * 100) : 100;\n }\n this.upload._onFileProgress({ target: $(fileEntry, this.upload.wrapper) }, percentComplete);\n },\n\n stopUploadRequest: function(fileEntry) {\n if (fileEntry.data(\"request\")) {\n fileEntry.data(\"request\").abort();\n }\n },\n\n prepareChunk: function(fileEntry) {\n var file = fileEntry.data(\"files\")[0];\n var rawFile = file.rawFile;\n var uid = file.uid;\n var chunkSize = this.upload.options.async.chunkSize;\n this.position[uid] = 0;\n\n this.metaData[uid] = {\n chunkIndex: 0,\n contentType: rawFile.type,\n fileName: rawFile.name,\n relativePath: file.name,\n totalFileSize: rawFile.size,\n totalChunks: Math.ceil(rawFile.size / chunkSize),\n uploadUid: uid\n };\n },\n\n _decreaseChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex--;\n },\n\n _increaseChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex++;\n },\n\n _resetChunkIndex: function(uid) {\n this.metaData[uid].chunkIndex = 0;\n },\n\n _decreasePosition: function(uid) {\n this.position[uid] -= this.upload.options.async.chunkSize;\n },\n\n _getCurrentChunk: function(file, uid) {\n var oldPosition = this.position[uid];\n var methodToInvoke;\n var async = this.upload.options.async;\n var chunkSize = async.chunkSize || async.bufferChunkSize;\n\n if (!this.position[uid]) {\n this.position[uid] = 0;\n }\n this.position[uid] += chunkSize;\n\n if (!!(methodToInvoke = this._getChunker(file))) {\n return file[methodToInvoke](oldPosition, this.position[uid]);\n } else {\n return file;\n }\n },\n\n _getChunker: function(file) {\n if (file.slice) {\n return \"slice\";\n } else if (file.mozSlice) {\n return \"mozSlice\";\n } else if (file.webkitSlice) {\n return \"webkitSlice\";\n } else {\n return null;\n }\n }\n };\n\n // Helper functions\n function getFileName(input) {\n return $.map(inputFiles(input), function(file) {\n return file.name;\n }).join(\", \");\n }\n\n function inputFiles($input) {\n var input = $input[0];\n\n if (input.files) {\n return getAllFileInfo(input.files);\n } else {\n return [{\n name: stripPath(input.value),\n extension: getFileExtension(input.value),\n size: null\n }];\n }\n }\n\n function getAllFileInfo(rawFiles) {\n return $.map(rawFiles, function(file) {\n return getFileInfo(file);\n });\n }\n\n function getFileInfo(rawFile) {\n // Older Firefox versions (before 3.6) use fileName and fileSize\n var fileName = rawFile.name || rawFile.fileName;\n return {\n name: kendo.htmlEncode(fileName),\n extension: getFileExtension(fileName),\n size: typeof rawFile.size == \"number\" ? rawFile.size : rawFile.fileSize, //rawFile.size || rawFile.fileSize,\n rawFile: rawFile\n };\n }\n\n function getFileExtension(fileName) {\n var matches = fileName.match(rFileExtension);\n return matches ? matches[0] : \"\";\n }\n\n function stripPath(name) {\n var slashIndex = name.lastIndexOf(\"\\\\\");\n return (slashIndex != -1) ? name.substr(slashIndex + 1) : name;\n }\n\n function assignGuidToFiles(files, unique) {\n var uid = kendo.guid();\n\n return $.map(files, function(file) {\n file.uid = unique ? kendo.guid() : uid;\n\n return file;\n });\n }\n\n function validateFiles(files, validationInfo) {\n var allowedExtensions = parseAllowedExtensions(validationInfo.allowedExtensions);\n var maxFileSize = validationInfo.maxFileSize;\n var minFileSize = validationInfo.minFileSize;\n\n for (var i = 0; i < files.length; i++) {\n validateFileExtension(files[i], allowedExtensions);\n validateFileSize(files[i], minFileSize, maxFileSize);\n }\n }\n\n function parseAllowedExtensions(extensions) {\n var allowedExtensions = $.map(extensions, function(ext) {\n var parsedExt = (ext.substring(0, 1) === \".\") ? ext : (\".\" + ext);\n return parsedExt.toLowerCase();\n });\n\n return allowedExtensions;\n }\n\n function validateFileExtension(file, allowedExtensions) {\n if (allowedExtensions.length > 0) {\n if (allowedExtensions.indexOf(file.extension.toLowerCase()) < 0) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDFILEEXTENSION, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDFILEEXTENSION);\n }\n }\n }\n }\n\n function validateFileSize(file, minFileSize, maxFileSize) {\n if (minFileSize !== 0 && file.size < minFileSize) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDMINFILESIZE, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDMINFILESIZE);\n }\n }\n\n if (maxFileSize !== 0 && file.size > maxFileSize) {\n file.validationErrors = file.validationErrors || [];\n if ($.inArray(INVALIDMAXFILESIZE, file.validationErrors) === -1) {\n file.validationErrors.push(INVALIDMAXFILESIZE);\n }\n }\n }\n\n function getTotalFilesSizeMessage(files) {\n var totalSize = 0;\n\n if (typeof files[0].size == \"number\") {\n for (var i = 0; i < files.length; i++) {\n if (files[i].size) {\n totalSize += files[i].size;\n }\n }\n } else {\n return \"\";\n }\n\n totalSize /= 1024;\n\n if (totalSize < 1024) {\n return totalSize.toFixed(2) + \" KB\";\n } else {\n return (totalSize / 1024).toFixed(2) + \" MB\";\n }\n }\n\n function shouldRemoveFileEntry(upload) {\n return !upload.multiple && $(\".k-file\", upload.wrapper).length > 1;\n }\n\n function removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest) {\n if (!upload._supportsRemove()) {\n if (shouldRemoveFileEntry(upload) || !shouldSendRemoveRequest) {\n upload._removeFileEntry(fileEntry);\n }\n\n return;\n }\n\n var files = fileEntry.data(\"fileNames\");\n var fileNames = $.map(files, function(file) { return file.name; });\n\n if (shouldSendRemoveRequest === false) {\n upload._removeFileEntry(fileEntry);\n\n return;\n }\n\n upload._submitRemove(fileNames, eventArgs,\n function onSuccess(data, textStatus, xhr) {\n var prevented = upload.trigger(SUCCESS, {\n operation: \"remove\",\n files: files,\n response: data,\n XMLHttpRequest: xhr\n });\n\n if (!prevented) {\n upload._removeFileEntry(fileEntry);\n }\n },\n\n function onError(xhr) {\n if (shouldRemoveFileEntry(upload)) {\n upload._removeFileEntry(fileEntry);\n }\n\n upload.trigger(ERROR, {\n operation: \"remove\",\n files: files,\n XMLHttpRequest: xhr\n });\n\n logToConsole(\"Server response: \" + xhr.responseText);\n }\n );\n }\n\n function tryParseJSON(input, onSuccess, onError) {\n var success = false,\n json = \"\";\n\n try {\n json = JSON.parse(normalizeJSON(input));\n success = true;\n } catch (e) {\n onError();\n }\n\n if (success) {\n onSuccess(json);\n }\n }\n\n function normalizeJSON(input) {\n if (typeof input === \"undefined\" || input === \"\") {\n input = \"{}\";\n }\n\n return input;\n }\n\n function stopEvent(e) {\n if (e.originalEvent) {\n e.originalEvent.dataTransfer.dropEffect = \"copy\";\n }\n e.stopPropagation(); e.preventDefault();\n }\n\n function bindDragEventWrappers(element, namespace, onDragEnter, onDragLeave) {\n var hideInterval, lastDrag;\n\n element\n .on(\"dragenter\" + namespace, function(e) {\n onDragEnter(e);\n lastDrag = new Date();\n\n if (!hideInterval) {\n hideInterval = setInterval(function() {\n var sinceLastDrag = new Date() - lastDrag;\n if (sinceLastDrag > 100) {\n onDragLeave();\n\n clearInterval(hideInterval);\n hideInterval = null;\n }\n }, 100);\n }\n })\n .on(\"dragover\" + namespace, function() {\n lastDrag = new Date();\n });\n }\n\n function isFileUploadStarted(fileEntry) {\n return fileEntry.is(\".k-file-progress, .k-file-success, .k-file-error:not(.k-file-invalid)\");\n }\n\n function getFileEntry(e) {\n return $(e.target).closest(\".k-file\");\n }\n\n kendo.ui.plugin(Upload);\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}