udata 7.0.8.dev28841__py2.py3-none-any.whl → 9.0.1.dev29390__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of udata might be problematic. Click here for more details.
- udata/__init__.py +1 -1
- udata/api/__init__.py +6 -4
- udata/api/oauth2.py +2 -1
- udata/api_fields.py +254 -0
- udata/commands/purge.py +8 -2
- udata/core/badges/models.py +2 -1
- udata/core/dataservices/__init__.py +0 -0
- udata/core/dataservices/api.py +92 -0
- udata/core/dataservices/models.py +142 -0
- udata/core/dataservices/permissions.py +7 -0
- udata/core/dataservices/tasks.py +25 -0
- udata/core/dataset/apiv2.py +2 -0
- udata/core/dataset/csv.py +8 -1
- udata/core/dataset/models.py +1 -0
- udata/core/dataset/rdf.py +77 -15
- udata/core/metrics/commands.py +18 -3
- udata/core/metrics/models.py +2 -3
- udata/core/organization/api_fields.py +28 -3
- udata/core/organization/csv.py +5 -3
- udata/core/organization/models.py +3 -1
- udata/core/owned.py +39 -2
- udata/core/reuse/csv.py +3 -0
- udata/core/site/api.py +4 -1
- udata/core/spatial/api.py +5 -10
- udata/core/spatial/models.py +7 -2
- udata/core/spatial/tasks.py +7 -0
- udata/core/spatial/tests/test_api.py +26 -0
- udata/core/user/api.py +11 -7
- udata/core/user/models.py +13 -2
- udata/harvest/backends/base.py +93 -103
- udata/harvest/backends/dcat.py +65 -90
- udata/harvest/tasks.py +3 -13
- udata/harvest/tests/dcat/bnodes.xml +10 -1
- udata/harvest/tests/dcat/catalog.xml +1 -0
- udata/harvest/tests/factories.py +13 -6
- udata/harvest/tests/test_actions.py +2 -2
- udata/harvest/tests/test_base_backend.py +9 -5
- udata/harvest/tests/test_dcat_backend.py +17 -1
- udata/rdf.py +4 -0
- udata/routing.py +6 -0
- udata/settings.py +4 -1
- udata/static/admin.css +2 -2
- udata/static/admin.css.map +1 -1
- udata/static/chunks/{0.6f1698738c9b0618b673.js → 0.93c3ae13b5b94753ee80.js} +3 -3
- udata/static/chunks/0.93c3ae13b5b94753ee80.js.map +1 -0
- udata/static/chunks/{14.f4037a917d5364cb564b.js → 14.e64890872b31c55fcdf7.js} +2 -2
- udata/static/chunks/14.e64890872b31c55fcdf7.js.map +1 -0
- udata/static/chunks/{2.7c89fae92899be371ed3.js → 2.614b3e73b072982fd9b1.js} +2 -2
- udata/static/chunks/2.614b3e73b072982fd9b1.js.map +1 -0
- udata/static/chunks/{5.3dc97ea195d251881552.js → 5.48417db6b33328fa9d6a.js} +2 -2
- udata/static/chunks/5.48417db6b33328fa9d6a.js.map +1 -0
- udata/static/common.js +1 -1
- udata/static/common.js.map +1 -1
- udata/tasks.py +1 -0
- udata/tests/api/__init__.py +3 -0
- udata/tests/api/test_dataservices_api.py +236 -0
- udata/tests/api/test_organizations_api.py +78 -5
- udata/tests/api/test_user_api.py +47 -13
- udata/tests/dataservice/test_dataservice_tasks.py +46 -0
- udata/tests/dataset/test_dataset_rdf.py +17 -2
- udata/tests/plugin.py +5 -0
- udata/tests/site/test_site_rdf.py +16 -0
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/METADATA +27 -1
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/RECORD +68 -60
- udata/core/metrics/api.py +0 -10
- udata/static/chunks/0.6f1698738c9b0618b673.js.map +0 -1
- udata/static/chunks/14.f4037a917d5364cb564b.js.map +0 -1
- udata/static/chunks/2.7c89fae92899be371ed3.js.map +0 -1
- udata/static/chunks/5.3dc97ea195d251881552.js.map +0 -1
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/LICENSE +0 -0
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/WHEEL +0 -0
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/entry_points.txt +0 -0
- {udata-7.0.8.dev28841.dist-info → udata-9.0.1.dev29390.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack:///chunks/2.614b3e73b072982fd9b1.js","webpack:///./js/components/dataset/resource/modal.vue","webpack:///./js/components/form/base-field.js?d201**","webpack:///./~/babel-runtime/core-js/array/from.js?efc2**","webpack:///./~/babel-runtime/helpers/toConsumableArray.js?1825**","webpack:///./~/core-js/library/fn/array/from.js?669d**","webpack:///./js/components/form/date-picker.vue?2ff1**","webpack:///./js/components/form/select-input.vue?1a51**","webpack:///./js/components/calendar.vue?b4b3**","webpack:///./js/components/form/checkbox.vue?79f6**","webpack:///./js/components/form/hidden-input.vue?6d3c**","webpack:///./js/components/form/markdown-editor.vue?572c**","webpack:///./js/components/form/number-input.vue?2cd5**","webpack:///./js/components/form/select-input-group.vue?d959**","webpack:///./js/components/form/text-input.vue?279a**","webpack:///calendar.vue?d6ac**","webpack:///checkbox.vue?f2a2**","webpack:///date-picker.vue?fccb**","webpack:///hidden-input.vue?0922**","webpack:///markdown-editor.vue?0452**","webpack:///number-input.vue?3c96**","webpack:///select-input-group.vue?40d9**","webpack:///select-input.vue?503b**","webpack:///text-input.vue?7c1b**","webpack:///./~/bootstrap-markdown/js/bootstrap-markdown.js?f021**","webpack:///./js/components/calendar.vue?bc04**","webpack:///./js/components/form/checkbox.vue?45df**","webpack:///./js/components/form/date-picker.vue?0ea9**","webpack:///./js/components/form/markdown-editor.vue?cf40**","webpack:///./js/components/calendar.vue?460f**","webpack:///./js/components/form/checkbox.vue?4b49**","webpack:///./js/components/form/date-picker.vue?872d**","webpack:///./js/components/form/hidden-input.vue?f09c**","webpack:///./js/components/form/markdown-editor.vue?fdce**","webpack:///./js/components/form/number-input.vue?5698**","webpack:///./js/components/form/select-input-group.vue?a8eb**","webpack:///./js/components/form/select-input.vue?75a5**","webpack:///./js/components/form/text-input.vue?cfa0**","webpack:///./js/components/calendar.vue?16e8**","webpack:///./js/components/form/checkbox.vue?d1f2**","webpack:///./js/components/form/date-picker.vue?e485**","webpack:///./js/components/form/markdown-editor.vue?e621**","webpack:///./js/components/form/base-form.js?7e0b**","webpack:///./~/jquery-validation/dist/jquery.validate.js?dd6f**","webpack:///./~/core-js/library/modules/_redefine-all.js?c729**","webpack:///./js/mixins/uploader.js?2cb0**","webpack:///./js/models/allowedExtensions.js?50d5**","webpack:///./~/babel-runtime/core-js/set.js?0724**","webpack:///./~/core-js/library/fn/set.js?2c6c**","webpack:///./~/core-js/library/modules/_collection.js?55a5**","webpack:///./~/core-js/library/modules/_set-species.js?27d6**","webpack:///./~/fine-uploader/fine-uploader/fine-uploader.js?17b8**","webpack:///./~/fine-uploader/lib/traditional.js?d674**","webpack:///./js/components/form/horizontal-field.vue?16f6","webpack:///horizontal-field.vue?7b0e","webpack:///horizontal-form.vue?8853","webpack:///./js/components/form/horizontal-field.vue?fb82*","webpack:///./js/components/form/horizontal-field.vue?5412*","webpack:///./js/components/form/horizontal-form.vue?7ace*","webpack:///./js/components/form/horizontal-form.vue?d5ca*","webpack:///./js/components/form/horizontal-field.vue?dadb*","webpack:///./js/models/communityresource.js?65b0","webpack:///./js/models/resource.js?166b","webpack:///./js/models/schemas.js?f1c2","webpack:///form.vue?bdb9*","webpack:///./js/components/dataset/resource/form.vue?2273*","webpack:///./js/components/dataset/resource/form.vue?6953*","webpack:///./js/components/dataset/resource/form.vue?2d94","webpack:///./js/components/dataset/resource/form.vue?ff99*","webpack:///./js/mixins/watch-refs.js","webpack:///modal.vue","webpack:///./js/components/dataset/resource/modal.vue?66e6","webpack:///./js/components/dataset/resource/modal.vue?390a","webpack:///./js/components/dataset/resource/modal.vue?4424"],"names":["webpackJsonp","344","module","exports","__webpack_require__","__vue_script__","__vue_template__","__esModule","default","options","template","984","_interopRequireDefault","obj","Object","defineProperty","value","BaseField","FieldComponentMixin","undefined","_logger","_logger2","_utils","_utils2","_vue","_vue2","props","field","type","model","description","property","required","Boolean","placeholder","String","readonly","methods","onChange","evt","this","$dispatch","target","name","data","errors","success","isField","components","text-input","number-input","hidden-input","select-input","select-input-group","markdown-editor","date-picker","checkbox","events","field:value-change","schema","computed","hasOwnProperty","properties","id","log","warn","indexOf","is_bool","is_hidden","u","getattr","label","$parent","widget","format","enum","Vue","util","resolveAsset","$options","resolve","reject","e","__WEBPACK_AMD_REQUIRE_ARRAY__","apply","bind","watch","987","988","989","990","1034","_from","_from2","arr","Array","isArray","i","arr2","length","1035","from","1036","1037","1038","1040","1041","1042","1043","1044","1045","1046","1047","1048","1049","optionalMoment","_moment2","_moment","VIEWS","MONTH_FORMAT","selected","coerce","min","max","view","current","today","days","weekdays","weekdaysMin","first","localeData","firstDayOfWeek","push","months","monthsShort","monthDisplay","rangeDisplay","year","start","clone","subtract","end","add","yearsRange","years","nextValue","previousValue","nextDisabled","isAfter","slice","pop","previousDisabled","isBefore","monthDays","date","startOf","endOf","row","diff","next","previous","zoomOut","pickDay","day","pickMonth","month","pickYear","isOld","isNew","isDisabled","isBeforeMin","isAfterMax","isMonthDisabled","idx","isYearDisabled","dayClasses","old","new","isSame","active","focus","button","$el","querySelector","clear","1050","_baseField","mixins","checked","1051","_calendar","_calendar2","DEFAULT_FORMAT","ISO_FORMAT","serializable","Calendar","picking","dateFormat","calendar:date:selected","calendar:date:cleared","onFocus","$nextTick","$refs","calendar","onOutside","1052","1053","_jquery","_jquery2","_config","_config2","_i18n","_markdown","_markdown2","EXCERPT_TOKEN","fn","markdown","messages","lang","Bold","_","Italic","Heading","URL/Link","Image","List","Preview","strong text","emphasized text","heading text","enter link description here","Insert Hyperlink","enter image description here","Insert Image Hyperlink","enter image title here","list text here","ready","language","autofocus","savable","resize","iconlibrary","onPreview","getContent","additionalButtons","title","icon","callback","getSelection","cursor","replaceSelection","setSelection","1054","1055","_base","groups","values","items","labels","map","text","filters","extract","group","_this","filter","item","license","includes","1056","1057","1058","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","jQuery","factory","$","Markdown","element","opts","each","opt","$ns","$element","$editable","el","attrKeys","attrValues","content","extend","defaults","$oldContent","$isPreview","$isFullscreen","$editor","$textarea","$handler","$callback","$nextTab","showEditor","prototype","constructor","__alterButtons","alter","handler","isAll","that","k","v","halt","find","__buildButtons","buttonsArray","container","ns","y","btnGroups","z","buttons","btnGroupContainer","class","buttonContainer","buttonIconContainer","buttonHandler","buttonIcon","__getIcon","btnText","btnClass","tabIndex","hotkey","hotkeyCaption","hotkeys","__localize","addClass","match","removeClass","attr","tabindex","data-provider","data-handler","data-hotkey","toggle","prependTo","append","__setListener","hasRows","maxRows","val","split","rowsVal","css","on","proxy","keyup","change","select","eventSupported","keydown","keypress","__handle","currentTarget","handlerName","callbackIndex","callbackHandler","preventDefault","string","src","setFullscreen","mode","onFullscreen","hidePreview","showPreview","textarea","instance","editable","editor","click","editorHeader","allBtnGroups","concat","buttonGroup","matchingGroups","grep","allButtonGroup","allIdx","reorderButtonGroups","btnGroup","sort","a","b","fullscreen","enable","icons","fullscreenOn","is","before","rawContent","toMarkdown","html","currentContent","trim","prop","toLowerCase","attributes","nodeName","nodeValue","replaceWith","editorFooter","createFooter","footer","saveHandler","onSave","width","isNumeric","height","Math","outerHeight","Date","getTime","disableButtons","$button","trigger","initialstate","show","fullscreenOff","hideButtons","hiddenButtons","disabledButtons","onShow","parseContent","parser","toHTML","marked","callbackContent","afterContainer","replacementContainer","enableButtons","insertBefore","parent","outerWidth","hide","remove","isDirty","setContent","findSelection","chunk","startChunkPosition","selection","oldSelection","l","selectionEnd","selectionStart","substr","getNextTab","nextTab","tab","shift","setNextTab","__parseButtonNameParam","names","removeAttr","showButtons","eventName","isSupported","setAttribute","blocked","keyCode","setTimeout","stopPropagation","onSelect","hideable","document","attachedMarkdown","blur","isHideable","hasClass","oldElement","onBlur","option","$this","glyph","fa","fa-3","pointer","prevChar","link","prompt","urlRegex","RegExp","test","sanitizedLink","list","join","isPreview","Constructor","noConflict","initMarkdown","blurNonFocused","$activeElement","activeElement","focused","closest","call","1059","version","sources","mappings","file","sourcesContent","sourceRoot","1060","1061","1062","1063","1064","1065","1066","1067","1068","1069","1070","1071","1072","sourceMap","locals","1073","1074","1075","1076","empty_schema","_slicedToArray2","_slicedToArray3","_entries","_entries2","_toConsumableArray2","_toConsumableArray3","_getIterator2","_getIterator3","_api","_api2","_jqueryValidation","_jqueryValidation2","interpolation","defaultVariables","O","1","ISO","validator","remote","email","url","dateISO","number","digits","creditcard","equalTo","maxlength","minlength","rangelength","range","addMethod","param","getElementById","optional","TEXT_INPUTS","TEXT_TAGS","fields","defs","fill","field:change","s","__schema__","forEach","currentSchema","path","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","done","API","$ref","err","return","$form","form","$els","attached","validate","ignore","errorClass","highlight","unhighlight","showErrors","errorPlacement","$broadcast","beforeDestroy","valid","serialize","elements","querySelectorAll","out","tagName","multiple","setattr","isObject","falsy","on_error","response","isString","error","headers","JSON","parse","fill_errors","message","details","flattenObject","_ref","_ref2","errs","$field","findField","errorMap","errorList","_this2","defaultShowErrors","$component","findComponent","1077","debug","window","console","settings","onsubmit","event","submitButton","cancelSubmit","handle","hidden","result","submitHandler","formSubmitted","appendTo","currentForm","pendingRequest","focusInvalid","rules","command","argument","staticRules","existingRules","filtered","isContentEditable","normalizeRule","index","method","normalizeRules","classRules","attributeRules","dataRules","str","replace","expr","pseudos","blank","filled","unchecked","init","source","params","arguments","args","makeArray","unshift","n","pendingClass","validClass","errorElement","focusCleanup","errorContainer","errorLabelContainer","ignoreTitle","onfocusin","lastActive","hideThese","errorsFor","onfocusout","checkable","submitted","onkeyup","excludedKeys","which","elementValue","inArray","invalid","onclick","parentNode","findByName","setDefaults","step","autoCreateRanges","delegate","eventType","labelContainer","errorContext","containers","valueCache","pending","reset","key","invalidHandler","checkForm","triggerHandler","prepareForm","currentElements","check","rs","cleanElement","clean","checkElement","validationTargetFor","prepareElement","testgroup","numberOfInvalids","toHide","successList","resetForm","hideErrors","removeData","resetElements","objectLength","count","not","addWrapper","size","findLastActive","rulesCache","selector","resetInternals","toShow","validity","badInput","lastIndexOf","rule","normalizer","rulesCount","dependencyMismatch","abortRequest","parameters","formatAndAdd","TypeError","customDataMessage","charAt","toUpperCase","substring","customMessage","m","findDefined","defaultMessage","theregex","toToggle","wrapper","showLabel","validElements","invalidElements","place","errorID","elementID","idOrName","describedBy","escapeHtml","wrap","insertAfter","parents","escapeCssMeta","describer","getLength","depend","dependTypes","boolean","function","elementAjaxPort","startRequest","stopRequest","port","ajaxAbort","destroy","off","classRuleSettings","addClassRules","className","classes","normalizeAttributeRule","Number","isNaN","getAttribute","depends","keepRule","parameter","parts","transformed","called","toString","decimals","errorMessage","supportedTypes","re","notSupported","decimalPlaces","num","toInt","round","pow","Error","optionDataString","originalMessage","ajax","dataType","context","pendingRequests","ajaxPrefilter","xhr","ajaxSettings","abort","1083","1084","safe","1085","1097","_set","_set2","_i18n2","_fineUploader","_fineUploader2","_allowedExtensions","_allowedExtensions2","HAS_FILE_API","File","FileReader","FileList","Blob","_1GO","_1MO","_1KO","minSizeLimit","sizeLimit","netItems","itemLimit","extensions","emptyError","i18n","maxHeightImageError","maxWidthImageError","minHeightImageError","minWidthImageError","minSizeError","noFilesError","onLeave","retryFailTooManyItemsError","sizeError","tooManyItemsError","typeError","unsupportedBrowserIos8Safari","autoUpload","uploadMultiple","dropActive","files","dropping","upload_endpoint","canDrop","$dnd","qq","DragAndDrop","dropZoneElements","callbacks","processingDroppedFilesComplete","on_dropped_files_complete","_build_uploader","setupExtraDropzone","dispose","fileext","filename","filesize","$uploader","FineUploaderBasic","uploaderType","uploadBtn","request","endpoint","inputName","uuidName","totalFileSizeName","filenameParam","chunking","enabled","concurrent","paramNames","chunkSize","partByteOffset","partIndex","totalParts","retry","enableAuto","onUpload","on_upload","onSubmitted","on_submit","onProgress","on_progress","onComplete","on_complete","onError","on_upload_error","validation","allowedExtensions","upload","setParams","uploadStoredFiles","getFile","progress","$emit","uploaded","total","$remove","addFiles","reason","has","responseText","config","sentry","dsn","sentryId","getResponseHeader","clearStoredFiles","1100","AllowedExtensions","_getPrototypeOf","_getPrototypeOf2","_classCallCheck2","_classCallCheck3","_possibleConstructorReturn2","_possibleConstructorReturn3","_inherits2","_inherits3","_List","__proto__","fetch","1119","1120","Set","1121","1122","1123","1124","1125","1126","1127","global","$export","meta","fails","redefineAll","forOf","anInstance","setToStringTag","dP","f","DESCRIPTORS","NAME","common","IS_MAP","IS_WEAK","Base","C","ADDER","proto","entries","iterable","_c","KEY","IS_ADDER","get","getConstructor","NEED","G","W","F","setStrong","1128","1129","1130","core","SPECIES","configurable","1131","1132","1133","1134","1141","style","display","attach","addEventListener","attachEvent","detach","removeEventListener","detachEvent","contains","descendant","compareDocumentPosition","elementB","removeChild","styles","opacity","considerParent","getByClass","candidates","getElementsByTagName","getFirstByClass","children","child","firstChild","nodeType","nextSibling","setText","innerText","textContent","clearText","hasAttribute","attrName","attrVal","exec","canvasToBlob","canvas","mime","quality","dataUriToBlob","toDataURL","dataUri","arrayBuffer","byteString","intArray","mimeString","createBlob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","blobBuilder","getBlob","atob","decodeURI","ArrayBuffer","Uint8Array","character","charCodeAt","level","variable","isFunction","buffer","isItemList","maybeItemList","isNodeList","maybeNodeList","namedItem","maybeString","trimStr","newStr","nextIdxToReplace","strBefore","strAfter","isFile","maybeFile","isFileList","maybeFileList","isFileOrInput","maybeFileOrInput","isInput","maybeInput","notFile","evaluateType","normalizedType","HTMLInputElement","isBlob","maybeBlob","isXhrUploadSupported","input","createElement","FormData","createXhrInstance","XMLHttpRequest","ActiveXObject","isFolderDropSupported","dataTransfer","webkitGetAsEntry","isFileChunkingSupported","androidStock","webkitSlice","mozSlice","sliceBlob","fileOrBlob","slicer","arrayBufferToHex","bytesAsHex","bytes","byt","byteAsHexStr","readBlobToHex","blob","startOffset","initialBlob","fileReader","promise","Promise","onload","onerror","failure","readAsArrayBuffer","second","extendNested","override","sourceFn","super_","srcPropName","srcPropVal","elt","len","getUniqueId","c","r","random","ie","navigator","userAgent","ie7","ie8","ie10","ie11","edge","safari","vendor","chrome","opera","firefox","windows","platform","android","ios6","ios","ios7","ios8","ios800","iosChrome","iosSafari","iosSafariWebView","returnValue","toElement","div","innerHTML","iterableItem","keyOrIndex","retVal","Storage","getItem","oldFunc","newArgs","obj2url","temp","prefixDone","uristrings","prefix","nextObj","nextTemp","encodeURIComponent","obj2FormData","formData","arrayKeyName","obj2Inputs","appendChild","parseJson","json","eval","getExtension","extIdx","getFilename","blobOrFileInput","fileName","DisposeSupport","disposers","disposer","addDisposer","disposeFunction","supportedFeatures","testSupportsFileInputElement","tempInput","supported","disabled","ex","isChrome14OrHigher","isCrossOriginXhrSupported","withCredentials","isXdrSupported","XDomainRequest","isCrossOriginAjaxSupported","isFolderSelectionSupported","webkitdirectory","isLocalStorageSupported","localStorage","setItem","isDragAndDropSupported","span","supportsUploading","supportsUploadingBlobs","supportsFileDrop","supportsAjaxFileUploading","supportsFolderDrop","supportsChunking","supportsResume","supportsUploadViaPaste","supportsUploadCors","supportsDeleteFileXdr","supportsDeleteFileCorsXhr","supportsDeleteFileCors","supportsFolderSelection","supportsImagePreviews","supportsUploadProgress","postMessage","ajaxUploading","blobUploading","canDetermineSize","deleteFileCors","deleteFileCorsXdr","deleteFileCorsXhr","dialogElement","HTMLDialogElement","fileDrop","folderDrop","folderSelection","imagePreviews","imageValidation","itemSizeValidation","pause","progressBar","resume","scaling","tiffPreviews","unlimitedScaledImageSize","uploading","uploadCors","uploadCustomHeaders","uploadNonMultipart","uploadViaPaste","isGenericPromise","maybePromise","then","successArgs","failureArgs","successCallbacks","failureCallbacks","doneCallbacks","state","onSuccess","onFailure","BlobProxy","referenceBlob","onCreate","create","UploadButton","o","createInput","BUTTON_ID_ATTR_NAME","buttonId","self","setMultiple","folders","acceptFiles","position","right","top","fontFamily","fontSize","margin","padding","disposeSupport","hoverClass","focusClass","ios8BrowserCrashWorkaround","overflow","direction","getInput","getButtonId","isMultiple","optInput","removeAttribute","setAcceptFiles","UploadData","uploaderProxy","getDataByIds","idOrIds","getDataByUuids","uuids","uuid","byUuid","getDataByStatus","status","statusResults","statuses","statusEnum","statusResultIndexes","byStatus","dataIndex","byProxyGroupId","byBatchId","addFile","spec","SUBMITTING","originalName","batchId","proxyGroupId","onBeforeStatusChange","onStatusChange","retrieve","optionalFilter","removeFileRef","record","setStatus","newStatus","oldStatus","byStatusOldStatusIndex","splice","uuidChanged","newUuid","oldUuid","updateName","newName","updateSize","newSize","setParentId","targetId","parentId","getIdsInProxyGroup","getIdsInBatch","SUBMITTED","REJECTED","QUEUED","CANCELED","PAUSED","UPLOADING","UPLOAD_FINALIZING","UPLOAD_RETRYING","UPLOAD_SUCCESSFUL","UPLOAD_FAILED","DELETE_FAILED","DELETING","DELETED","basePublicApi","addBlobs","blobDataOrArray","addInitialFiles","cannedFileList","cannedFile","_addCannedFile","_maybeHandleIos8SafariWorkaround","_storedIds","_currentBatchId","processBlob","_handleNewFile","_options","blobs","defaultName","verifiedFiles","processBlobData","blobData","processCanvas","processCanvasData","canvasData","normalizedQuality","processFileOrInput","fileOrInput","normalizeData","fileContainer","_prepareItemsForUpload","cancel","uploadData","_uploadData","getName","_handler","cancelAll","storedIdsCopy","storedFileId","continueUpload","_uploadFile","deleteFile","_onSubmitDelete","doesExist","fileOrBlobId","isValid","drawThumbnail","fileId","imgOrCanvas","maxSize","fromServer","customResizeFunction","fileOrUrl","promiseToReturn","_imageGenerator","_thumbnailUrls","scale","generate","modifiedContainer","getButton","_getButton","_buttonIdsForFileIds","getEndpoint","_endpointStore","uploadDataRecord","getInProgress","getParentId","uploadDataEntry","getUploads","getResumableFilesData","getSize","getNetUploads","_netUploaded","getRemainingAllowedItems","allowedItems","_currentItemLimit","_netUploadedOrQueued","getUuid","isResumable","hasResumeRecord","pauseUpload","expunge","_autoRetries","_retryTimeouts","_preventRetries","_buttons","_paramsStore","_pasteHandler","session","refreshOnReset","_refreshSessionData","_succeededSinceLastAllComplete","_failedSinceLastAllComplete","_totalProgress","_customResumeDataStore","_manualRetry","scaleImage","specs","Scaler","setCustomHeaders","_customHeadersStore","set","setCustomResumeData","setDeleteFileCustomHeaders","_deleteFileCustomHeadersStore","setDeleteFileEndpoint","_deleteFileEndpointStore","setDeleteFileParams","_deleteFileParamsStore","setEndpoint","setForm","elementOrId","_updateFormSupportAndParams","setItemLimit","newItemLimit","setName","setUuid","fileRecord","_onDeleteComplete","_itemError","_uploadStoredFiles","basePrivateApi","sessionData","deleteFileEndpoint","deleteFileParams","thumbnailUrl","_annotateWithButtonId","associatedInput","qqButtonId","_getButtonId","_batchError","_createDeleteHandler","DeleteFileAjaxRequester","maxConnections","uuidParamName","customHeaders","paramsStore","endpointStore","cors","onDelete","_onDelete","onDeleteComplete","xhrOrXdr","isError","_createPasteHandler","PasteSupport","targetElement","paste","pasteReceived","_handleCheckedCallback","onPasteReceived","_handlePasteSuccess","identifier","_createStore","initialValue","_readOnlyValues_","store","catchall","perIdReadOnlyValues","readOnlyValues","copy","orig","getReadOnlyValues","includeReadOnlyValues","existing","addReadOnly","_createUploadDataTracker","_onUploadStatusChange","_maybeAllComplete","_createUploadButton","allowMultiple","workarounds","iosEmptyVideos","_isAllowedExtension","accept","buttonFocus","buttonHover","ios8BrowserCrash","_onInputChange","fileInputTitle","_disposeSupport","_createUploadHandler","additionalOptions","namespace","lastOnProgress","preventRetryParam","preventRetryResponseProperty","loaded","_onProgress","_onComplete","onCancel","cancelFinalizationEffort","_onCancel","onUploadPrep","_onUploadPrep","_onUpload","onUploadResult","onUploadChunk","chunkData","_onUploadChunk","onUploadChunkResult","onUploadChunkSuccess","_onUploadChunkSuccess","onResume","customResumeData","onAutoRetry","responseJSON","_onAutoRetry","onUuidChanged","setSize","_setSize","getDataByUuid","isQueued","isInProgress","getCustomResumeData","_getCustomResumeData","UploadHandlerController","_fileOrBlobRejected","_formatSize","sizeSymbols","toFixed","_generateExtraButtonSpecs","_extraButtonSpecs","extraButtons","extraButtonOptionEntry","extraButtonSpec","_initExtraButton","extraButtonsSpec","_defaultButtonId","buttonOrFileInputOrFile","inputs","fileInput","fileBlobOrInput","_getNotFinished","_getValidationBase","_getValidationDescriptor","fileWrapper","_getValidationDescriptors","fileWrappers","fileDescriptors","_handleCameraAccess","camera","acceptIosCamera","optionRoot","callbackRetVal","successParam","newFileWrapperList","actualFile","_customNewFileHandler","_handleNewFileGeneric","addFileToHandler","_trackButton","fileList","extSuppliedName","extension","_handleDeleteSuccess","_handleDeleteFailed","_initFormSupportAndParams","_formSupport","FormSupport","attachedToForm","getFormInputsAsObject","newAutoUpload","newEndpoint","_isDeletePossible","expected","allowXdr","allowed","allowedExt","extRegex","code","maybeNameOrNames","replacement","extensionsForMessage","placeholderMatch","validationBase","allowedExtension","formatFileName","_onBeforeManualRetry","notFinished","_onAllComplete","ios8SafariUploads","alert","_maybeParseAndSendUploadError","errorReason","defaultResponseError","_maybeProcessNextItemAfterOnValidateCallback","validItem","stopOnFirstInvalidFile","validationDescriptor","onValidate","_onValidateCallbackSuccess","_onValidateCallbackFailure","successful","failed","onAllComplete","_shouldAutoRetry","retryWaitPeriod","autoAttemptDelay","_onBeforeAutoRetry","onManualRetry","clearTimeout","storedItemIndex","fileIndex","onIndividualProgress","_onSubmit","_onSubmitCallbackSuccess","_onSubmitted","_storeForLater","onSuccessCallback","additionalMandatedParams","adjustedOnSuccessCallback","onSubmitDelete","_deleteHandler","sendDelete","_onTotalProgress","onTotalProgress","_onValidateBatchCallbackFailure","_onValidateBatchCallbackSuccess","validationDescriptors","proposedNetFilesUploadedOrQueued","nextIndex","_validateFileOrBlobData","_upload","onValidateBatch","_preventLeaveInProgress","Session","_session","addFileRecord","refresh","_sessionRequestComplete","onSessionRequestComplete","onNewSize","maxAutoAttempts","formElementOrId","onSubmit","idToUpload","stillSubmitting","validityChecker","allowEmpty","ImageValidation","image","errorCode","_wrapCallbacks","safeCallback","errorMsg","exception","callbackName","callbackFunc","disableCancelForFormUploads","warnBeforeUnload","forceMultipart","omitDefaultParams","paramsInBody","requireSuccessJson","maxHeight","maxWidth","minHeight","minWidth","maybeXhr","maybeXhrOrXdr","attemptNumber","fileOrBlobData","retryFailTooManyItems","mandatory","totalFileSize","partSize","jsonPayload","resetOnStatus","recordsExpireIn","resuming","customKeys","fileOrBlobName","sendCredentials","interceptSubmit","customResizer","sendOriginal","orient","defaultType","defaultQuality","failureText","includeExif","sizes","ImageGenerator","_scaler","handleNewFile","TotalProgress","entry","AjaxRequester","isSimpleMethod","containsNonSimpleHeaders","containsNonSimple","header","isXdr","getCorsAjaxTransport","ontimeout","onprogress","getXhrOrXdr","suppliedXhr","requestData","dequeue","nextId","queue","sendRequest","xdrError","isResponseSuccessful","getParams","onDemandParams","additionalParams","mandatedParams","optXhr","payload","onSend","createUrl","additionalQueryParams","getXdrLoadHandler","getXdrErrorHandler","onreadystatechange","getXhrReadyStateChangeHandler","registerForUploadProgress","open","setHeaders","send","shouldParamsBeInQueryString","contentType","stringify","addToPath","readyState","lengthComputable","onDemandHeaders","additionalHeaders","allHeaders","acceptHeader","setRequestHeader","allowXRequestedWithAndCacheControl","responseCode","successfulResponseCodes","prepareToSend","validMethods","DELETE","PATCH","POST","PUT","GET","initTransport","cacheBuster","withPath","appendToPath","withParams","withQueryParams","_additionalQueryParams_","withHeaders","withPayload","thePayload","withCacheBuster","qqtimestamp","canceled","UploadHandler","fileState","fileItem","onCancelRetVal","getThirdPartyFileId","_getFileState","_setThirdPartyFileId","thirdPartyFileId","_wasCanceled","preventRetryResponse","controller","chunkingPossible","concurrentChunkingPossible","chunked","chunkIdx","_getChunkData","attemptingResume","chunkProgress","_getChunkDataForCallback","finalize","finalizeChunks","normaizedResponse","normalizeResponse","_maybeDeletePersistedChunkData","cleanup","normalizedResponse","handleFailure","clearCachedChunk","inProgressIdx","responseToReport","inProgressChunksArray","inProgress","remaining","ignoreFailure","keys","_getXhrs","ckid","ckXhr","_cancelled","moveInProgressToRemaining","connectionManager","free","hasMoreParts","nextPart","nextIdx","_getTotalChunks","reevaluateChunking","sendNext","inProgressChunks","available","onUploadChunkPromise","requestOverrides","uploadChunkData","overrides","uploadChunk","inProgressChunkIdx","_maybePersistChunkedState","clearXhr","_open","_openChunks","_waiting","openChunkEntriesCount","openChunksCount","openChunkIndexes","dontAllowNext","allowNext","waitingIndex","connectionsIndex","getProxyOrBlob","getWaitingOrConnected","waitingOrConnected","chunks","parseInt","isUsingConnection","openChunksEntry","simple","uploadFile","maybeNewUuid","_clearXhrs","getProxy","initHandler","handlerType","traditional","handlerModuleSubtype","onFinalizing","_removeExpiredChunkingRecords","isDeferredEligibleForUpload","maybeDefer","generatedBlob","updateBlob","maybeSendDeferredFiles","errorResponse","idsInGroup","uploadedThisId","idInGroup","now","originalResponse","_shouldChunkThisFile","blobToUpload","cancelRetVal","isProxied","_getLocalStorageId","isAttemptingResume","WindowReceiveMessage","callbackWrapperDetachers","receiveMessage","onMessageCallbackWrapper","stopReceivingMessages","detacher","FormUploadHandler","expungeFile","detachLoadEvents","isCors","postMessageCallbackTimers","corsMessageReceiver","iframe","_getIframeName","getFileIdForIframeName","iframeName","initIframeForUpload","body","registerPostMessageCallback","onloadCallbacks","onloadCallback","_parseJsonResponse","_detachLoadEvent","formHandlerInstanceId","_attachLoadEvent","responseDescriptor","contentDocument","_createIframe","_initFormForUpload","targetName","innerHtmlOrMessage","XhrUploadHandler","xhrId","ajaxRequester","_getAjaxRequester","getChunkSize","chunkFiles","resumeEnabled","blobOrProxy","_initTempState","_maybePrepareForResume","cachedChunks","tempState","xhrs","ajaxRequesters","responseParser","lastChunkIdx","_getXhr","resumableFilesData","_iterateResumeRecords","notResumable","optInProgress","optRemaining","chunkingState","reverse","paused","totalChunks","newBlob","chunkId","_createXhr","optChunkIdx","_registerXhr","chunkIndex","fileSize","startBytes","endBytes","part","startByte","endByte","formatVersion","localStorageId","_getMimeType","_getPersistableData","ceil","_markNotResumable","removeItem","persistedData","lastUpdated","_registerProgressHandler","progressCalculator","totalSuccessfullyLoadedForFile","loadedForRequest","totalForRequest","estActualChunkLoaded","totalLoadedForFile","chunkLoaded","optAjaxRequester","xhrsId","expirationDays","expirationDate","setDate","getDate","getMandatedParams","_method","requester","detectSubsampling","img","ctx","iw","naturalWidth","ih","naturalHeight","getContext","drawImage","getImageData","detectVerticalSquash","alpha","ratio","sy","ey","py","renderImageToDataURL","doSquash","renderImageToCanvas","maybeCalculateDownsampledDimensions","maxPixels","origHeight","origWidth","newHeight","sqrt","newWidth","modifiedDimensions","save","renderImageToCanvasWithCustomResizer","imageHeight","imageWidth","orientation","targetHeight","targetWidth","transformCoordinate","tmpCtx","sx","dx","d","tmpCanvas","vertSquashRatio","dw","dh","dy","clearRect","restore","qqImageRendered","resizeInfo","sourceCanvas","sourceCanvasContext","targetCanvas","translate","rotate","PI","MegaPixImage","srcImage","errorCallback","URL","createObjectURL","webkitURL","listeners","imageLoadListeners","render","imgWidth","imgHeight","optionsKey","optionsValue","oldTargetSrc","onrender","isImg","isCanvas","isImgCorsSupported","crossOrigin","isCanvasSupported","determineMimeOfFileName","nameWithPath","pathSegments","isCrossOrigin","targetProtocol","targetHostname","targetPort","targetAnchor","href","protocol","hostname","location","registerImgLoadListeners","registerCanvasDrawImageListener","registerThumbnailRenderedListener","registered","draw","drawPreview","Identify","megapixErrorHandler","isPreviewable","dummyExif","exif","Exif","mpImg","Orientation","failureMsg","drawOnCanvasOrImgFromUrl","canvasOrImg","tempImg","tempImgRender","drawOnImgFromUrlWithCssScaling","drawFromUrl","fileBlobOrUrl","_testing","parseLittleEndian","hex","seekToApp1","offset","theOffset","thePromise","segmentLength","getApp1Offset","isLittleEndian","app1Start","getDirEntryCount","littleEndian","getIfd","dirEntries","getDirEntries","ifdHex","getTagValues","TAG_VAL_OFFSET","tagsToFind","TAG_IDS","vals","tagValHex","tagValLength","idHex","tagsToFindIdx","TAG_INFO","274","onParseFailure","app1Offset","dirEntryCount","tagValues","isIdentifiable","magicBytes","questionableBytes","identifiable","magicBytesEntries","magicBytesArrayEntry","previewable","isPreviewableSync","PREVIEWABLE_MIME_TYPES","fileMime","isRecognizedImage","image/jpeg","image/gif","image/png","image/bmp","image/tiff","hasNonZeroLimits","limits","atLeastOne","limit","getWidthHeight","sizeDetermination","getFailingLimit","dimensions","failingLimit","limitName","limitValue","limitMatcher","dimensionPropName","actualValue","validationEffort","isJsonResponseValid","handleFileItems","fileItems","someItemsIgnored","refreshEffort","refreshCompleteCallback","requesterOptions","SessionAjaxRequester","queryServer","includeOriginal","failedToScaleText","_getSortedSizes","getFileRecords","originalFileUuid","originalFileName","originalBlobOrBlobData","records","originalBlob","sizeRecord","outputType","_determineOutputType","requestedType","refType","_getName","_generateScaledImage","failedText","api","scaledIds","originalId","blobSize","scaledId","qqparentuuid","qqparentsize","scalingEffort","scalingOptions","scaler","referenceType","scaledVersionProperties","startOfExt","versionType","scaledName","scaledExt","nameAppendage","sourceFile","imageGenerator","scaledImageDataUri","signalSuccess","_insertExifHeader","scaledImageDataUriWithExif","originalImage","reader","insertionEffort","originalImageDataUri","ExifRestorer","readAsDataURL","_dataUriToBlob","_createBlob","KEY_STR","encode64","chr1","chr2","enc1","enc2","enc3","output","chr3","enc4","origFileBase64","resizedFileBase64","expectedBase64Header","rawImage","decode64","segments","slice2Segments","exifManipulation","exifArray","getExifArray","newImageArray","insertExif","aBuffer","seg","x","imageData","buf","separatePoint","mae","ato","array","rawImageArray","head","endPoint","base64test","perFileProgress","totalLoaded","totalSize","lastLoadedSent","lastTotalSent","callbackProxy","noRetryableFiles","retryable","none","failedId","updateTotalProgress","onNew","newLoaded","newTotal","oldLoaded","oldTotal","isImage","registerPasteHandler","detachPasteHandler","clipboardData","getAsFile","unregisterPasteHandler","startUpload","determineNewEndpoint","formEl","validateForm","nativeSubmit","checkValidity","maybeUploadOnSubmit","submit","determineFormEl","_form2Obj","notIrrelevantType","irrelevantTypes","radioOrCheckbox","ignoreValue","selectValue","getIframeContentJson","doc","innerHtml","contentWindow","createForm","responseFromMessage","multipart","addChunkingSpecificParams","allChunksDoneRequester","AllChunksDoneAjaxRequester","createReadyStateChangedHandler","onUploadOrChunkComplete","getChunksCompleteParams","isErrorUploadResponse","parseResponse","sendChunksCompleteRequest","complete","setParamsAndGetEntityToSend","entityToSendParams","xhrOverrides","customParams","defaultParams","xhrOverrideParams","setUploadHeaders","headersOptions","headerOverrides","headerName","headerValue","extraHeaders","uploadChunkParams","toSend","promises","endpointHandler","uploadDroppedFiles","uploadDropZone","filesAsArray","dropLog","dropDisabled","getElement","traverseFileTree","parseEntryPromise","qqPath","extractDirectoryPath","droppedFiles","fileError","fullPath","isDirectory","getFilesInDirectory","entriesLeft","indexOfNameInFullPath","accumEntries","existingPromise","dirReader","createReader","readEntries","newEntries","handleDataTransfer","pendingFolderPromises","handleDataTransferPromise","processingDroppedFiles","allowMultipleItems","dropError","setupDropzone","dropArea","dropZone","UploadDropZone","HIDE_ZONES_EVENT_NAME","onEnter","onLeaveNotDescendants","onDrop","HIDE_BEFORE_ENTER_ATTR","uploadDropZones","isFileDrag","dragEvent","fileDrag","types","leavingDocumentOut","setupDragDrop","dropZones","maybeHideDropZones","HTMLElement","removeDropzone","dzs","targetEl","errorSpecifics","dragoverShouldBeCanceled","disableDropOutside","dropOutsideDisabled","dropEffect","isValidFileDrag","effectTest","dt","isSafari","effectAllowed","isOrSetDropDisabled","preventDrop","triggerHidezonesEvent","triggerUsingOldApi","hideZonesEvent","createEvent","initEvent","CustomEvent","dispatchEvent","attachEvents","effect","relatedTarget","elementFromPoint","clientX","clientY","uiPublicApi","_parent","_templating","addCacheToDom","clearFiles","addExtraDropzone","_dnd","removeExtraDropzone","getItemByFileId","isHiddenForever","getFileContainer","_setupDragAndDrop","_totalFilesInBatch","_filesInBatchAddedToUi","_setupClickAndEditEventHandlers","formattedFilename","updateFilename","uploadPaused","continued","uploadContinued","getId","fileContainerOrChildEl","getFileId","getDropTarget","qqDropTarget","uiPrivateApi","_removeFileItem","removeFile","_fileButtonsClickHandler","FileButtonsClickHandler","_bindFileButtonsClickEvent","_focusinEventSupported","_isEditFilenameEnabled","_filenameClickHandler","_bindFilenameClickEvent","_filenameInputFocusInHandler","_bindFilenameInputFocusInEvent","_filenameInputFocusHandler","_bindFilenameInputFocusEvent","dragAndDrop","extraDropzones","templating","defaultDropZone","getDropZone","showDropProcessing","hideDropProcessing","errorData","lvl","onDeleteFile","onRetry","onPause","onContinue","onGetName","isEditFilenamePossible","FilenameClickHandler","FilenameInputFocusHandler","_filenameEditHandler","onGetUploadStatus","onSetName","onEditingStatusChange","isEditing","qqInput","getEditInput","qqFileContainer","hideFilename","hideEditIcon","showFilename","showEditIcon","markFilenameEditable","hideRetry","setStatusText","_classes","retrying","hidePause","FilenameInputFocusInHandler","hideSpinner","resetTotalProgress","reportDirectoryPaths","qqpath","_addToList","addHandler","updateProgress","hideCancel","hideProgress","waitingForResponse","_displayFileSize","completeUpload","_markFileAsSuccessful","fail","showCancel","isRetryPossible","showRetry","_controlFailureTextDisplay","parentRetVal","newResult","showDeleteButton","_maybeUpdateThumbnail","showSpinner","allowPause","retryNumForDisplay","maxAuto","retryNote","_showCancelLink","showAutoRetryNote","autoRetryNote","resetProgress","_onSubmitDeleteSuccess","forceConfirm","_showDeleteConfirm","_sendDeleteRequest","deletingFailedText","hideDeleteButton","deletingStatusText","confirmMessage","deleteRequestArgs","showConfirm","canned","prependData","prependIndex","dontDisplay","hideScaled","prependFiles","disableCancel","_handledProxyGroup","_clearList","addFileToCache","updateThumbnail","thumbnails","generatePreview","fileSizeOnSubmit","loadedSize","sizeForDisplay","_formatProgress","uploadedSize","formatProgress","responseProperty","failureReason","failedUploadTextDisplay","failUpload","enableTooltip","_showTooltip","showMessage","_setupPastePrompt","namePromptMessage","defaultVal","showPrompt","fileStatus","placeholders","waitUntilResponse","FineUploader","listElement","tooManyFilesError","unsupportedBrowser","promptForName","maxCount","notAvailablePath","waitingPath","timeBetweenThumbs","hasDialog","showDialog","confirm","defaultValue","Templating","templateIdOrEl","containerEl","fileContainerEl","maxThumbs","waitUntilUpdate","thumbnailNotAvailable","waitingForThumbnail","renderFailure","isEditElementsExist","isRetryElementExist","templateDom","showThumbnails","serverScale","FILE_ID_ATTR","FILE_CLASS_PREFIX","THUMBNAIL_MAX_SIZE_ATTR","THUMBNAIL_SERVER_SCALE_ATTR","HIDE_DROPZONE_ATTR","DROPZPONE_TEXT_ATTR","IN_PROGRESS_CLASS","HIDDEN_FOREVER_CLASS","fileBatch","createDocumentFragment","isCancelDisabled","generatedThumbnails","thumbnailQueueMonitorRunning","thumbGenerationQueue","thumbnailMaxSize","selectorClasses","alertDialog","dialogCancelButton","confirmDialog","dialogMessage","dialogOkButton","promptDialog","uploader","drop","progressBarContainer","totalProgressBarContainer","totalProgressBar","spinner","continueButton","deleteButton","statusText","editFilenameInput","editNameIcon","dropText","dropProcessing","dropProcessingSpinner","thumbnail","previewGeneration","cachedThumbnailNotAvailableImg","cachedWaitingForThumbnailImg","cacheThumbnailPlaceholders","notAvailableUrl","waitingUrl","updatedImg","displayWaitingImg","waitingImgPlacement","maybeScalePlaceholderViaCss","generateNewPreview","getThumbnail","qqThumbnailId","maybeSetDisplayNotAvailableImg","generateNextQueuedPreview","queuedThumbRequest","update","processUpdateQueuedPreviewRequest","processNewQueuedPreviewRequest","getCancel","getTemplateEl","getContinue","getDialog","getDelete","getDropProcessing","getEditIcon","getPause","getProgress","getRetry","getSpinner","cssClass","previewing","notAvailableImgPlacement","parseAndGetTemplate","scriptEl","scriptHtml","fileListNode","tempTemplateEl","fileListEl","defaultButton","dropTextEl","uploaderEl","cloneNode","fileTemplate","prependFile","parentEl","beforeEl","optFileOrBlob","relatedThumbnailId","useCachedPreview","showWaitingImg","setProgressBarWidth","percent","bar","progressBarSelector","targetThumbnailId","cachedThumbnailId","targetThumbnail","cachedThumbnail","hideTotalProgress","cantRenderEl","prependInfo","hideForever","batch","thumb","fileEl","fileNameEl","waitingImg","currentNode","getFileList","filenameEl","isFileName","isEditIcon","isEditInput","isCancel","allowContinueButton","isPause","isContinueButton","isDeleteButton","isRetry","textEl","dialog","messageEl","inputEl","cancelBtn","okBtn","closeHandler","cancelClickHandler","okClickHandler","close","showModal","UiEventHandler","protectedApi","srcElement","onHandled","attachTo","getFileIdFromItem","qqFileId","getDisposeSupport","examineEvent","buttonHandlers","buttonType","firstLetterCapButtonType","inheritedInternalApi","handleFilenameEdit","FilenameEditHandler","handleInputFocus","getFilenameSansExtension","filenameSansExt","getOriginalExtension","origName","handleNameUpdate","newFilenameInputEl","origExtension","registerInputBlurHandler","registerInputEnterKeyHandler","focusInput","1142","1219","1221","1222","_baseForm","_baseForm2","_horizontalField","_horizontalField2","Field","1225","1227","1228","1231","1234","1252","_createClass2","_createClass3","CommunityResource","_Model","ident","loading","$api","community","on_fetched","Model","1275","Resource","datasetId","resourceId","dataset","rid","1280","schemas","Schemas","sorted","1283","_assign","_assign2","_dataset","_dataset2","_resource","_resource2","_communityresource","_communityresource2","_horizontalForm","_horizontalForm2","_uploader","_uploader2","_resource_types","_resource_types2","_schemas","_schemas2","FormHorizontal","resource","filetype","isUpload","created","$on","hasSchemas","has_data","hasChosenRemoteFile","generic_fields","rows","hasData","hasUploadedFile","file_fields","schema_field","is_community","operations","datasets","route_new","route_namespace","urlify","uploader:progress","uploader:complete","resources","postUpload","manual","getSchemaValue","extras","1287","1290","1294","1298","1323","_keys","_keys2","watchRefs","watchRef","component","wait","$watch","1415","_modal","_modal2","_form","_form2","_card","_card2","_card3","_card4","_filters","_filters2","_watchRefs","_watchRefs2","Modal","ResourceForm","OrgCard","UserCard","edit","next_route","successMsg","can_edit","$root","me","modal:closed","$go","route","$route","matched","$once","updHandler","on_success","resource_from_dataset","deactivate","save_resource","autoclose","modal","delete_confirmed","delete","delete_resource","form.isUpload","form.hasUploadedFile","1491","1517","1642"],"mappings":"AAAAA,cAAc,EAAE,KAEVC,IACA,SAASC,EAAQC,EAASC,GCHhC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IDWzFK,IACA,SAAST,EAAQC,EAASC,GAE/B,YAmBA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAjBvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,IAEXb,EAAQc,UAAYd,EAAQe,oBAAsBC,ME1BnD,IAAAC,GAAAhB,EAAA,IF8BKiB,EAAWT,uBAAuBQ,GE7BvCE,EAAAlB,EAAA,KFiCKmB,EAAUX,uBAAuBU,GEhCtCE,EAAApB,EAAA,IFoCKqB,EAAQb,uBAAuBY,GEPvBP,GAxBAC,uBACTQ,OACIC,OACIC,KAAMd,OACNN,QAFG,WAES,WAEhBqB,MAAOf,OACPE,MAAO,KACPc,YAAa,KACbC,SAAUjB,OACVkB,SAAUC,QACVC,YAAaC,OACbC,SAAUH,SAEdI,SACIC,SADK,SACIC,GACLC,KAAKC,UAAU,qBAAsBF,EAAIG,OAAO1B,UAQ/CC,aACT0B,KAAM,aACNC,KAFqB,WAGjB,OACIC,UACAC,QAAS3B,OACT4B,SAAS,IAGjBC,YAEIC,aAAc7C,EAAQ,MACtB8C,eAAgB9C,EAAQ,MACxB+C,eAAgB/C,EAAQ,MACxBgD,eAAgBhD,EAAQ,MACxBiD,qBAAsBjD,EAAQ,MAC9BkD,kBAAmBlD,EAAQ,MAC3BmD,cAAenD,EAAQ,MACvBoD,SAAYpD,EAAQ,OAExBqD,QACIC,qBAAsB,SAAS1C,GAE3B,MADAwB,MAAKC,UAAU,eAAgBD,KAAMxB,IAC9B,IAGfU,OACIC,OACIC,KAAMd,OACNN,QAFG,WAES,UACZwB,UAAU,GAEdH,OACID,KAAMd,OACNN,QAFG,WAES,UACZwB,UAAU,GAEd2B,QACI/B,KAAMd,OACNN,QAFI,WAEQ,UACZwB,UAAU,IAGlB4B,UACI9B,YADM,WAEF,GAAMC,GAAWS,KAAKT,QACtB,OAAOA,IAAYA,EAAS8B,eAAe,eACrC9B,EAASD,YACTX,QAEVY,SAPM,WAQF,MAAKS,MAAKmB,OAAOG,WAAWD,eAAerB,KAAKb,MAAMoC,IAK/CvB,KAAKmB,OAAOG,WAAWtB,KAAKb,MAAMoC,KAJrCC,UAAIC,KAAK,UAAYzB,KAAKb,MAAMoC,GAAK,8BAM7C/B,SAfM,WAgBF,SAAKQ,KAAKb,QAAUa,KAAKmB,OAAOE,eAAe,cAGxCrB,KAAKmB,OAAO3B,SAASkC,QAAQ1B,KAAKb,MAAMoC,KAAO,GAE1DI,QArBM,WAsBF,MAAO3B,MAAKT,UAAmC,YAAvBS,KAAKT,SAASH,MAE1CwC,UAxBM,WAyBF,MAAO5B,MAAKb,OAA6B,WAApBa,KAAKb,MAAMC,MAEpCZ,MA3BM,QAAAA,SA4BF,GAAIA,aAOJ,OANIwB,MAAKX,OAASW,KAAKb,QACnBX,MAAQqD,UAAEC,QAAQ9B,KAAKX,MAAOW,KAAKb,MAAMoC,MAE9B5C,SAAVH,OAAiC,OAAVA,QAAmBwB,KAAKT,UAAYS,KAAKT,SAAS8B,eAAe,aACzF7C,MAAQwB,KAAKT,SAASvB,SAEnBQ,OAEXkB,YArCM,WAsCF,MAAOM,MAAKb,MAAMO,aAAeM,KAAKb,MAAM4C,OAAS,IAEzDnC,SAxCM,WA0CF,MAAOI,MAAKgC,QAAQpC,UAAYI,KAAKb,MAAMS,WAAY,GAE3DqC,OA5CM,QAAAA,UA6CF,GAAIA,cAsBJ,OArBIjC,MAAKb,MAAM8C,OACXA,OAASjC,KAAKb,MAAM8C,OACU,YAAvBjC,KAAKT,SAASH,KACrB6C,OAAS,WACqB,YAAvBjC,KAAKT,SAASH,KACrB6C,OAAS,eACqB,WAAvBjC,KAAKT,SAASH,OACQ,aAAzBY,KAAKT,SAAS2C,OACdD,OAAS,kBACFjC,KAAKT,SAAS4C,OACrBF,OAAS,iBAGjBA,OAASA,QAAU,aAGdG,UAAIC,KAAKC,aAAatC,KAAKuC,SAAU,aAAcN,UACpDjC,KAAKuC,SAAS/B,WAAWyB,QAAU,SAASO,EAASC,GACjD7E,EAAA8E,EAAA,YAAA9E,GAAQ,GAAA+E,IAAC/E,EAAA,WAAOqE,OAAS,QAASO,GFuCwII,MAAM,KAAMD,IEvCtLE,KAAA7C,SAGDiC,SAGfa,OACItE,MADG,SACGA,GACFwB,KAAKC,UAAU,eAAgBD,KAAMxB,MF4ChDb,GAAQK,QEvCMS,GF2CTsE,KACL,IAAK,GAAI,IAEJC,KACL,IAAK,IAEAC,KACL,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAExBC,IACA,SAASxF,EAAQC,EAASC,GG5MhCF,EAAAC,SAAkBK,QAAAJ,EAAA,MAAAG,YAAA,IHkNZoF,KACA,SAASzF,EAAQC,EAASC,GInNhC,YAQA,SAAAQ,wBAAAC,GAAsC,MAAAA,MAAAN,WAAAM,GAAuCL,QAAAK,GAN7EV,EAAAI,YAAA,CAEA,IAAAqF,GAAAxF,EAAA,KAEAyF,EAAAjF,uBAAAgF,EAIAzF,GAAAK,QAAA,SAAAsF,GACA,GAAAC,MAAAC,QAAAF,GAAA,CACA,OAAAG,GAAA,EAAAC,EAAAH,MAAAD,EAAAK,QAA6CF,EAAAH,EAAAK,OAAgBF,IAC7DC,EAAAD,GAAAH,EAAAG,EAGA,OAAAC,GAEA,SAAAL,EAAArF,SAAAsF,KJ2NMM,KACA,SAASlG,EAAQC,EAASC,GK9OhCA,EAAA,KACAA,EAAA,MACAF,EAAAC,QAAAC,EAAA,IAAA2F,MAAAM,MLqPMC,MACL,IAAK,GAAI,KAEJC,MACL,IAAK,IAEAC,MACL,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,KAAM,IAAK,MAEvCC,KACA,SAASvG,EAAQC,EAASC,GMjQhC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,INyQzFoG,KACA,SAASxG,EAAQC,EAASC,GOjRhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IPyRzFqG,KACA,SAASzG,EAAQC,EAASC,GQhShC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IRwSzFsG,KACA,SAAS1G,EAAQC,EAASC,GShThC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,ITwTzFuG,KACA,SAAS3G,EAAQC,EAASC,GUhUhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IVwUzFwG,KACA,SAAS5G,EAAQC,EAASC,GW/UhC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IXuVzFyG,KACA,SAAS7G,EAAQC,EAASC,GY/VhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IZuWzF0G,KACA,SAAS9G,EAAQC,EAASC,Ga9WhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IbsXzF2G,KACA,SAAS/G,EAAQC,EAASC,Gc7XhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IdqYzF4G,KACA,SAAShH,EAAQC,EAASC,GAE/B,YAUA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GepWxF,QAAAsG,gBAAAnG,GACA,MAAAA,IAAA,EAAAoG,EAAA5G,SAAAQ,GAAA,Kf2VCF,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIqG,GAAUjH,EAAoB,IAE9BgH,EAAWxG,uBAAuByG,GerWvCC,GAAA,yBACAC,EAAA,Wf+WCpH,GAAQK,SexWTmC,KAAA,WACAjB,OACA8F,UACA5F,KAAAwF,EAAA5G,QACAiH,OAAAN,eACA3G,QAAA,MAEAkH,KACA9F,KAAAwF,EAAA5G,QACAiH,OAAAN,eACA3G,QAAA,MAEAmH,KACA/F,KAAAwF,EAAA5G,QACAiH,OAAAN,eACA3G,QAAA,MAEAoH,MACAhG,KAAAO,OACA3B,QAAA,SAGAoC,KAvBA,WAwBA,GAAAiF,GAAArF,KAAAgF,WAAA,EAAAJ,EAAA5G,UACA,QACAqH,UACAC,OAAA,EAAAV,EAAA5G,aAGAoD,UACAmE,KADA,QAAAA,QAKA,OAHAA,SACAC,EAAAZ,EAAA5G,QAAAyH,cACAC,EAAAd,EAAA5G,QAAA2H,aAAAC,iBACAnC,EAAA,EAAAA,EAAA,EAAAA,IACA8B,KAAAM,KAAAL,GAAA/B,EAAAiC,GAAA,GAEA,OAAAH,OAEAO,OAVA,WAWA,MAAAlB,GAAA5G,QAAA+H,eAEAC,aAbA,WAcA,MAAAhG,MAAAqF,QAAAnD,OAAA6C,IAEAkB,aAhBA,WAiBA,WAAAjG,KAAAoF,KACA,MAAApF,MAAAqF,QAAAnD,OAAA6C,EACA,cAAA/E,KAAAoF,KACA,MAAApF,MAAAqF,QAAAa,MACA,aAAAlG,KAAAoF,KAAA,CACA,GAAAe,GAAAnG,KAAAqF,QAAAe,QAAAC,SAAA,WACAC,EAAAtG,KAAAqF,QAAAe,QAAAG,IAAA,UACA,OAAAJ,GAAAD,OAAA,IAAAI,EAAAJ,SAGAM,WA3BA,WA+BA,OAHAL,GAAAnG,KAAAqF,QAAAe,QAAAC,SAAA,WACAI,KAEAhD,EAAA,EAAAA,EAAA,GAAAA,IACAgD,EAAAZ,KAAAM,EAAAC,QAAAG,IAAA9C,EAAA,SAAAyC,OAEA,OAAAO,IAEAC,UApCA,WAqCA,GAAAlI,GAAAwB,KAAAqF,QAAAe,OAQA,OAPA,SAAApG,KAAAoF,KACA5G,EAAA+H,IAAA,YACA,WAAAvG,KAAAoF,KACA5G,EAAA+H,IAAA,WACA,UAAAvG,KAAAoF,MACA5G,EAAA+H,IAAA,YAEA/H,GAEAmI,cA/CA,WAgDA,GAAAnI,GAAAwB,KAAAqF,QAAAe,OAQA,OAPA,SAAApG,KAAAoF,KACA5G,EAAA6H,SAAA,YACA,WAAArG,KAAAoF,KACA5G,EAAA6H,SAAA,UACA,UAAArG,KAAAoF,MACA5G,EAAA6H,SAAA,YAEA7H,GAEAoI,aA1DA,WA2DA,GAAA5G,KAAAmF,IACA,OAAAnF,KAAAoF,MACA,iBAAApF,MAAA0G,UAAAG,QAAA7G,KAAAmF,IAAA,QACA,oBAAAnF,MAAA0G,UAAAG,QAAA7G,KAAAmF,IAAA,OACA,mBAAAnF,MAAAwG,WAAAM,UAAAC,OAAA/G,KAAAmF,IAAAe,SAGAc,iBAlEA,WAmEA,GAAAhH,KAAAkF,IACA,OAAAlF,KAAAoF,MACA,iBAAApF,MAAA2G,cAAAM,SAAAjH,KAAAkF,IAAA,QACA,oBAAAlF,MAAA2G,cAAAM,SAAAjH,KAAAkF,IAAA,OACA,mBAAAlF,MAAAwG,WAAA,IAAAxG,KAAAkF,IAAAgB,UAIArG,SACAqH,UADA,SACAC,GAMA,OALAhB,GAAAgB,EAAAf,QAAAgB,QAAA,SAAAA,QAAA,QACAd,EAAAa,EAAAf,QAAAiB,MAAA,SAAAA,MAAA,QACA9B,KACA+B,EAAA,OAEA7D,EAAA,EAAAA,GAAA6C,EAAAiB,KAAApB,EAAA,QAAA1C,IACAA,EAAA,QACA6D,KACA/B,EAAAM,KAAAyB,IAEAA,EAAAzB,KAAAM,EAAAC,QAAAG,IAAA9C,EAAA,QAEA,OAAA8B,IAEAiC,KAhBA,WAiBAxH,KAAAqF,QAAArF,KAAA0G,WAEAe,SAnBA,WAoBAzH,KAAAqF,QAAArF,KAAA2G,eAEAe,QAtBA,WAuBA5C,EAAApD,QAAA1B,KAAAoF,MAAA,EAAAN,EAAAnB,SACA3D,KAAAoF,KAAAN,IAAApD,QAAA1B,KAAAoF,MAAA,KAGAuC,QA3BA,SA2BAC,GACA5H,KAAAgF,SAAA4C,EACA5H,KAAAC,UAAA,yBAAA2H,IAEAC,UA/BA,SA+BAC,GACA9H,KAAAqF,QAAArF,KAAAqF,QAAAyC,SACA9H,KAAAoF,KAAA,OACApF,KAAAC,UAAA,0BAAA6H,IAEAC,SApCA,SAoCA7B,GACAlG,KAAAqF,QAAArF,KAAAqF,QAAAa,QACAlG,KAAAoF,KAAA,SACApF,KAAAC,UAAA,yBAAAiG,IAGA8B,MA1CA,SA0CAJ,GACA,MAAAA,GAAAX,SAAAjH,KAAAqF,QAAA+B,QAAA,WAGAa,MA9CA,SA8CAL,GACA,MAAAA,GAAAf,QAAA7G,KAAAqF,QAAAgC,MAAA,WAGAa,WAlDA,SAkDAN,GACA,GAAAO,GAAAnI,KAAAkF,KAAA0C,EAAAX,SAAAjH,KAAAkF,IAAA,OACAkD,EAAApI,KAAAmF,KAAAyC,EAAAf,QAAA7G,KAAAmF,IAAA,MACA,OAAAgD,IAAAC,GAGAC,gBAxDA,SAwDAC,GACA,GAAAR,GAAA9H,KAAAqF,QAAAe,QAAA0B,MAAAQ,GACAH,EAAAnI,KAAAkF,KAAA4C,EAAAb,SAAAjH,KAAAkF,IAAA,SACAkD,EAAApI,KAAAmF,KAAA2C,EAAAjB,QAAA7G,KAAAmF,IAAA,QACA,OAAAgD,IAAAC,GAGAG,eA/DA,SA+DArC,GACA,GAAAiC,GAAAnI,KAAAkF,KAAAgB,EAAAlG,KAAAkF,IAAAgB,OACAkC,EAAApI,KAAAmF,KAAAe,EAAAlG,KAAAmF,IAAAe,MACA,OAAAiC,IAAAC,GAGAI,WArEA,SAqEAZ,GACA,OACAa,IAAAzI,KAAAgI,MAAAJ,GACAc,IAAA1I,KAAAiI,MAAAL,GACAtC,MAAAsC,EAAAe,OAAA3I,KAAAsF,MAAA,OACAsD,OAAAhB,EAAAe,OAAA3I,KAAAgF,SAAA,SAIA6D,MA9EA,WAgFA,GAAAC,GAAA9I,KAAA+I,IAAAC,cAAA,sCACAhJ,KAAA+I,IAAAC,cAAA,6BACAF,MAAAD,SAGAI,MArFA,WAsFAjJ,KAAAgF,SAAA,KACAhF,KAAAqF,QAAArF,KAAAsF,MAAAc,QACApG,KAAAoF,KAAA,OACApF,KAAAC,UAAA,2BAGA6C,OACAkC,SADA,SACAxG,GACAA,IACAwB,KAAAqF,QAAA7G,EAAA4H,af6WM8C,KACA,SAASxL,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI2K,GAAavL,EAAoB,IAErCD,GAAQK,SgBhmBTmC,KAAA,WACAiJ,QAAAD,EAAAzK,qBACAmB,SACAC,SADA,SACAC,GACAC,KAAAC,UAAA,qBAAAF,EAAAG,OAAAmJ,ahBwmBMC,KACA,SAAS5L,EAAQC,EAASC,GAE/B,YAgBA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAdvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIqG,GAAUjH,EAAoB,IAE9BgH,EAAWxG,uBAAuByG,GiBhnBvC0E,EAAA3L,EAAA,MjBonBK4L,EAAapL,uBAAuBmL,GiBnnBzCJ,EAAAvL,EAAA,KAEA6L,EAAA,IACAC,EAAA,qBjBynBC/L,GAAQK,SiBtnBTmC,KAAA,cACAiJ,QAAAD,EAAAzK,qBACAQ,OACAyK,cACAvK,KAAAK,QACAzB,SAAA,IAGAwC,YAAAoJ,SAAAJ,EAAAxL,SACAoC,KAVA,WAWA,OACAyJ,SAAA,EACAH,eAGAtI,UACA0I,WADA,WAEA,MAAA9J,MAAAb,MAAA+C,QAAAuH,IAGAxI,QACA8I,yBAAA,SAAA5C,GAGA,MAFAnH,MAAAxB,MAAA2I,EACAnH,KAAA6J,SAAA,GACA,GAEAG,wBAAA,WAGA,MAFAhK,MAAAxB,MAAA,KACAwB,KAAA6J,SAAA,GACA,IAGAhK,SACAoK,QADA,WAEAjK,KAAA6J,SAAA7J,KAAAkK,UAAAlK,KAAAmK,MAAAC,SAAAvB,OACA7I,KAAA6J,SAAA,GAEA/J,SALA,SAKA4C,GACA,IACA1C,KAAAxB,OAAA,EAAAoG,EAAA5G,SAAA0E,EAAAxC,OAAA1B,MAAAwB,KAAA8J,YACA,MAAApH,MAIA2H,UAZA,WAaArK,KAAA6J,SAAA,MjB6nBMS,KACA,SAAS5M,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI2K,GAAavL,EAAoB,IAErCD,GAAQK,SkB/sBTmC,KAAA,eACAiJ,QAAAD,EAAAzK,uBlBqtBM6L,KACA,SAAS7M,EAAQC,EAASC,GAE/B,YAsBA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GApBvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIgM,GAAU5M,EAAoB,IAE9B6M,EAAWrM,uBAAuBoM,GmBnrBvCE,EAAA9M,EAAA,InBurBK+M,EAAWvM,uBAAuBsM,GmBtrBvCE,EAAAhN,EAAA,KACAuL,EAAAvL,EAAA,KACAiN,EAAAjN,EAAA,KnB4rBKkN,EAAa1M,uBAAuByM,GmB1rBzCE,EAAA,mBAEAnN,GAAA,MAEA6M,EAAAzM,QAAAgN,GAAAC,SAAAC,SAAAP,EAAA3M,QAAAmN,OACAC,MAAA,EAAAR,EAAAS,GAAA,QACAC,QAAA,EAAAV,EAAAS,GAAA,UACAE,SAAA,EAAAX,EAAAS,GAAA,WACAG,YAAA,EAAAZ,EAAAS,GAAA,YACAI,OAAA,EAAAb,EAAAS,GAAA,SACAK,MAAA,EAAAd,EAAAS,GAAA,QACAM,SAAA,EAAAf,EAAAS,GAAA,WACAO,eAAA,EAAAhB,EAAAS,GAAA,eACAQ,mBAAA,EAAAjB,EAAAS,GAAA,mBACAS,gBAAA,EAAAlB,EAAAS,GAAA,gBACAU,+BAAA,EAAAnB,EAAAS,GAAA,+BACAW,oBAAA,EAAApB,EAAAS,GAAA,oBACAY,gCAAA,EAAArB,EAAAS,GAAA,gCACAa,0BAAA,EAAAtB,EAAAS,GAAA,0BACAc,0BAAA,EAAAvB,EAAAS,GAAA,0BACAe,kBAAA,EAAAxB,EAAAS,GAAA,mBnBisBC1N,EAAQK,SmB7rBTmC,KAAA,kBACAjB,OAAA,QACAkK,QAAAD,EAAAzK,qBACA2N,MAAA,YACA,EAAA5B,EAAAzM,SAAAgC,KAAA+I,KAAAkC,UACAqB,SAAA3B,EAAA3M,QAAAmN,KACAoB,WAAA,EACAC,SAAA,EACAC,OAAA,OACAC,YAAA,KACAC,UAAA,SAAAjK,GAAA,SAAAoI,EAAA9M,SAAA0E,EAAAkK,eACAC,qBAEA1M,KAAA,SACAC,OACAD,KAAA,aACA2M,OAAA,EAAAlC,EAAAS,GAAA,WACA0B,KAAA,iBACAC,SAAA,SAAAtK,GACA,GAAAsC,GAAAtC,EAAAuK,eACAC,EAAAlI,EAAAmB,KAEAzD,GAAAyK,iBAAApC,GACArI,EAAA0K,aAAAF,IAAAnC,EAAApH,mBnBysBM0J,KACA,SAAS3P,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI2K,GAAavL,EAAoB,IAErCD,GAAQK,SoBnzBTmC,KAAA,eACAiJ,QAAAD,EAAAzK,uBpByzBM4O,KACA,SAAS5P,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI+O,GAAQ3P,EAAoB,IqB/zBjCuL,EAAAvL,EAAA,IrBm0BCD,GAAQK,SqBh0BTmC,KAAA,qBACAiJ,QAAAD,EAAAzK,qBACAQ,OACAsO,QACApO,KAAAd,OACAN,QAFA,WAGA,YAIAoD,UACAnD,QAAA,WACA,MAAA+B,MAAAT,UAAAS,KAAAb,MAEAa,KAAAb,MAAAsO,OACAzN,KAAAb,MAAAsO,iBAAAF,GAAA7B,KACA1L,KAAAb,MAAAsO,OAAAC,MAEA1N,KAAAb,MAAAsO,OACAzN,KAAAT,SAAA4C,MAAAnC,KAAAb,MAAAwO,OACA3N,KAAAT,SAAA4C,KAAAyL,IAAA,SAAApP,GACA,OAAAA,QAAAqP,KAAA7N,KAAAb,MAAAwO,OAAAnP,MAEAwB,KAAAT,SAAA4C,KACAnC,KAAAT,SAAA4C,KAAAyL,IAAA,SAAApP,GACA,OAAAA,QAAAqP,KAAArP,aAOAsP,SACAC,QAAA,SAAAL,EAAAM,GAAA,GAAAC,GAAAjO,IACA,OAAAA,MAAAb,MAAAyO,KACAF,IAAAE,IAAA5N,KAAAb,MAAAyO,KACAF,EAAAQ,OAAA,SAAAC,GAAA,MAAAF,GAAA9O,MAAAqO,OAAAQ,GAAAJ,IAAA,SAAAQ,GAAA,MAAAA,GAAA5P,QAAA6P,SAAAF,EAAA3P,UAEAkP,MrB80BMY,KACA,SAAS5Q,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI+O,GAAQ3P,EAAoB,IsBl4BjCuL,EAAAvL,EAAA,ItBs4BCD,GAAQK,SsBn4BTmC,KAAA,eACAiJ,QAAAD,EAAAzK,qBACA0C,UACAnD,QAAA,WACA,MAAA+B,MAAAT,UAAAS,KAAAb,MAEAa,KAAAb,MAAAsO,OACAzN,KAAAb,MAAAsO,iBAAAF,GAAA7B,KACA1L,KAAAb,MAAAsO,OAAAC,MAEA1N,KAAAb,MAAAsO,OACAzN,KAAAT,SAAA4C,MAAAnC,KAAAb,MAAAwO,OACA3N,KAAAT,SAAA4C,KAAAyL,IAAA,SAAApP,GACA,OAAAA,QAAAqP,KAAA7N,KAAAb,MAAAwO,OAAAnP,MAEAwB,KAAAT,SAAA4C,KACAnC,KAAAT,SAAA4C,KAAAyL,IAAA,SAAApP,GACA,OAAAA,QAAAqP,KAAArP,aAOAsP,SACAC,QAAA,SAAAL,GACA,MAAA1N,MAAAb,MAAAyO,IACAF,EAAAE,IAAA5N,KAAAb,MAAAyO,KAEAF,MtB24BMa,KACA,SAAS7Q,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI2K,GAAavL,EAAoB,IAErCD,GAAQK,SuBx7BTmC,KAAA,aACAiJ,QAAAD,EAAAzK,uBvB87BM8P,KACA,SAAS9Q,EAAQC,EAASC,GAE/B,GAAI6Q,GAAgCC,EAA8BC,GwBj9BnE,SAAAC,IAmBA,SAAAC,GAGAH,GAAA9Q,EAAA,KAAA6Q,EAAA,EAAAE,EAAA,kBAAAF,KAAA7L,MAAAjF,EAAA+Q,GAAAD,IAAA9P,SAAAgQ,IAAAjR,EAAAC,QAAAgR,KAQC,SAAAG,GACD,YAKA,IAAAC,GAAA,SAAAC,EAAA/Q,GAGA,GAAAgR,IAAA,yCACA,2CACA,wDACAH,GAAAI,KAAAD,EAAA,SAAA5D,EAAA8D,GACA,mBAAAL,GAAAE,GAAA5O,KAAA+O,KACAlR,EAAA,gBAAAA,QACAA,EAAAkR,GAAAL,EAAAE,GAAA5O,KAAA+O,MAMAnP,KAAAoP,IAAA,qBACApP,KAAAqP,SAAAP,EAAAE,GACAhP,KAAAsP,WAA0BC,GAAA,KAAAnQ,KAAA,KAAAoQ,YAAAC,cAAAC,QAAA,MAC1B1P,KAAAuC,SAAAuM,EAAAa,QAAA,KAA0Cb,EAAA9D,GAAAC,SAAA2E,SAAA3R,EAAA+B,KAAAqP,SAAAjP,KAAA,YAC1CJ,KAAA6P,YAAA,KACA7P,KAAA8P,YAAA,EACA9P,KAAA+P,eAAA,EACA/P,KAAAgQ,QAAA,KACAhQ,KAAAiQ,UAAA,KACAjQ,KAAAkQ,YACAlQ,KAAAmQ,aACAnQ,KAAAoQ,YAEApQ,KAAAqQ,aAGAtB,GAAAuB,WAEAC,YAAAxB,EAEAyB,eAAA,SAAArQ,EAAAsQ,GACA,GAAAC,GAAA1Q,KAAAkQ,SAAAS,EAAA,OAAAxQ,EAAAyQ,EAAA5Q,IAEA8O,GAAAI,KAAAwB,EAAA,SAAAG,EAAAC,GACA,GAAAC,IAAA,CAEAA,IADAJ,GAGAG,EAAApP,QAAAvB,GAAA,EAGA4Q,KAAA,GACAN,EAAAG,EAAAZ,QAAAgB,KAAA,wBAAAF,EAAA,UAKAG,eAAA,SAAAC,EAAAC,GACA,GAAA1N,GACA2N,EAAApR,KAAAoP,IACAsB,EAAA1Q,KAAAkQ,SACAlD,EAAAhN,KAAAmQ,SAEA,KAAA1M,EAAA,EAAeA,EAAAyN,EAAAvN,OAAsBF,IAAA,CAErC,GAAA4N,GAAAC,EAAAJ,EAAAzN,EACA,KAAA4N,EAAA,EAAiBA,EAAAC,EAAA3N,OAAmB0N,IAAA,CAEpC,GAAAE,GACAC,EAAAF,EAAAD,GAAAjR,KACAqR,EAAA3C,EAAA,UACA4C,MAAA,aAGA,KAAAH,EAAA,EAAmBA,EAAAC,EAAA7N,OAAiB4N,IAAA,CACpC,GACAI,GAAAC,EADA9I,EAAA0I,EAAAD,GAEAM,EAAAT,EAAA,IAAAtI,EAAA3I,KACA2R,EAAA9R,KAAA+R,UAAAjJ,EAAAiE,MACAiF,EAAAlJ,EAAAkJ,QAAAlJ,EAAAkJ,QAAA,GACAC,EAAAnJ,EAAAmJ,SAAAnJ,EAAAmJ,SAAA,MACAC,EAAApJ,EAAAoJ,SAAApJ,EAAAoJ,SAAA,KACAC,EAAA,mBAAArJ,GAAAqJ,OAAArJ,EAAAqJ,OAAA,GACAC,EAAA,mBAAAxD,GAAAyD,SAAA,KAAAF,EAAA,KAAAA,EAAA,MAGAR,GAAA7C,EAAA,qBACA6C,EAAA9D,KAAA,IAAA7N,KAAAsS,WAAAN,IAAAO,SAAA,sBAAAA,SAAAN,GACAA,EAAAO,MAAA,oDACAb,EAAAc,YAAA,eAEAd,EAAAe,MACAtT,KAAA,SACA0N,MAAA9M,KAAAsS,WAAAxJ,EAAAgE,OAAAsF,EACAO,SAAAT,EACAU,gBAAAxB,EACAyB,eAAAhB,EACAiB,cAAAX,IAEArJ,EAAAiK,UAAA,GACApB,EAAAe,KAAA,wBAEAd,EAAA9C,EAAA,WACA8C,EAAAW,SAAAT,GACAF,EAAAoB,UAAArB,GAGAF,EAAAwB,OAAAtB,GAGAjB,EAAA7K,KAAAgM,GACA7E,EAAAnH,KAAAiD,EAAAkE,UAIAmE,EAAA8B,OAAAxB,IAIA,MAAAN,IAEA+B,cAAA,WAEA,GAAAC,GAAA,mBAAAnT,MAAAiQ,UAAAyC,KAAA,QACAU,EAAApT,KAAAiQ,UAAAoD,MAAAC,MAAA,MAAA3P,OAAA,EAAA3D,KAAAiQ,UAAAoD,MAAAC,MAAA,MAAA3P,OAAA,IACA4P,EAAAJ,EAAAnT,KAAAiQ,UAAAyC,KAAA,QAAAU,CAEApT,MAAAiQ,UAAAyC,KAAA,OAAAa,GACAvT,KAAAuC,SAAAkK,QACAzM,KAAAiQ,UAAAuD,IAAA,SAAAxT,KAAAuC,SAAAkK,QAGAzM,KAAAiQ,UAAAwD,IACA5K,MAAAiG,EAAA4E,MAAA1T,KAAA6I,MAAA7I,MACA2T,MAAA7E,EAAA4E,MAAA1T,KAAA2T,MAAA3T,MACA4T,OAAA9E,EAAA4E,MAAA1T,KAAA4T,OAAA5T,MACA6T,OAAA/E,EAAA4E,MAAA1T,KAAA6T,OAAA7T,QAGAA,KAAA8T,eAAA,YACA9T,KAAAiQ,UAAAwD,GAAA,UAAA3E,EAAA4E,MAAA1T,KAAA+T,QAAA/T,OAGAA,KAAA8T,eAAA,aACA9T,KAAAiQ,UAAAwD,GAAA,WAAA3E,EAAA4E,MAAA1T,KAAAgU,SAAAhU,OAIAA,KAAAiQ,UAAA7P,KAAA,WAAAJ,OAGAiU,SAAA,SAAAvR,GACA,GAAAxC,GAAA4O,EAAApM,EAAAwR,eACAxD,EAAA1Q,KAAAkQ,SACAlD,EAAAhN,KAAAmQ,UACAgE,EAAAjU,EAAAwS,KAAA,gBACA0B,EAAA1D,EAAAhP,QAAAyS,GACAE,EAAArH,EAAAoH,EAGAtF,GAAApM,EAAAwR,eAAArL,QAEAwL,EAAArU,MAGAA,KAAA4T,OAAA5T,MAIAmU,EAAAzS,QAAA,cACA1B,KAAAiQ,UAAApH,QAGAnG,EAAA4R,kBAGAhC,WAAA,SAAAiC,GACA,GAAArJ,GAAA4D,EAAA9D,GAAAC,SAAAC,SACAoB,EAAAtM,KAAAuC,SAAA+J,QACA,OACA,mBAAApB,IACA,mBAAAA,GAAAoB,IACA,mBAAApB,GAAAoB,GAAAiI,GAEArJ,EAAAoB,GAAAiI,GAEAA,GAGAxC,UAAA,SAAAyC,GACA,sBAAAA,KAAAxU,KAAAuC,SAAAmK,aAAA8H,GAGAC,cAAA,SAAAC,GACA,GAAA1E,GAAAhQ,KAAAgQ,QACAC,EAAAjQ,KAAAiQ,SAEAyE,MAAA,GACA1E,EAAAuC,SAAA,sBACAzD,EAAA,QAAAyD,SAAA,iBACAvS,KAAAuC,SAAAoS,aAAA3U,QAEAgQ,EAAAyC,YAAA,sBACA3D,EAAA,QAAA2D,YAAA,iBAEA,GAAAzS,KAAA8P,YAAA9P,KAAA4U,cAAAC,eAGA7U,KAAA+P,cAAA2E,EACAzE,EAAApH,SAGAwH,WAAA,WACA,GACAyE,GADAC,EAAA/U,KAEAoR,EAAApR,KAAAoP,IACA+B,EAAAnR,KAAAqP,SAGA2F,GAFA7D,EAAAqC,IAAA,UACArC,EAAAqC,IAAA,SACAxT,KAAAsP,WACAoB,EAAA1Q,KAAAkQ,SACAlD,EAAAhN,KAAAmQ,UACAlS,EAAA+B,KAAAuC,SACA0S,EAAAnG,EAAA,UACA4C,MAAA,YACAwD,MAAA,WACAH,EAAAlM,UAKA,WAAA7I,KAAAgQ,QAAA,CAEA,GAAAmF,GAAArG,EAAA,UACA4C,MAAA,0BAIA0D,IAiDA,IAhDAnX,EAAAuT,QAAA7N,OAAA,IAAAyR,IAAAC,OAAApX,EAAAuT,QAAA,KACAvT,EAAA4O,kBAAAlJ,OAAA,GAEAmL,EAAAI,KAAAjR,EAAA4O,kBAAA,YAAAvE,EAAAgN,GAGA,GAAAC,GAAAzG,EAAA0G,KAAAJ,EAAA,SAAAK,EAAAC,GACA,MAAAD,GAAAtV,OAAAmV,EAAAnV,MAIAoV,GAAA5R,OAAA,EACA4R,EAAA,GAAAnV,KAAAmV,EAAA,GAAAnV,KAAAiV,OAAAC,EAAAlV,MAEAgV,EAAAvP,KAAA5H,EAAA4O,kBAAA,GAAAvE,MAOArK,EAAA0X,oBAAAhS,OAAA,IACAyR,IACAlH,OAAA,SAAA0H,GACA,MAAA3X,GAAA0X,oBAAAjU,QAAAkU,EAAAzV,WAEA0V,KAAA,SAAAC,EAAAC,GACA,MAAA9X,GAAA0X,oBAAAjU,QAAAoU,EAAA3V,MAAAlC,EAAA0X,oBAAAjU,QAAAqU,EAAA5V,SACAlC,EAAA0X,oBAAAjU,QAAAoU,EAAA3V,MAAAlC,EAAA0X,oBAAAjU,QAAAqU,EAAA5V,MAAA,EACA,KAKAiV,EAAAzR,OAAA,IACAwR,EAAAnV,KAAAiR,gBAAAmE,GAAAD,IAGAlX,EAAA+X,WAAAC,QACAd,EAAAlC,OAAA,8FAAAjT,KAAA+R,UAAA9T,EAAA+X,WAAAE,MAAAC,cAAA,uBAAA1C,GAAA,0CAAA/Q,GACAA,EAAA4R,iBACAS,EAAAN,eAAA,KAIAQ,EAAAhC,OAAAkC,GAGAhE,EAAAiF,GAAA,YACAjF,EAAAkF,OAAApB,GACAH,EAAA3D,EACA2D,EAAAvC,SAAA,YACA0C,EAAAhC,OAAA6B,OACS,CACT,GAAAwB,GAAA,kBAAAC,uBAAApF,EAAAqF,QAAArF,EAAAqF,OACAC,EAAA3H,EAAA4H,KAAAJ,EAGAxB,GAAAhG,EAAA,eACA4C,MAAA,WACA2B,IAAAoD,IAGAxB,EAAAhC,OAAA6B,GAGAE,EAAAzF,GAAA4B,EACA6D,EAAA5V,KAAA+R,EAAAwF,KAAA,WAAAC,cACA5B,EAAAtF,QAAAyB,EAAAqF,OAEA1H,EAAAqC,EAAA,GAAA0F,YAAA3H,KAAA,WACA8F,EAAAxF,SAAA3J,KAAA7F,KAAA8W,UACA9B,EAAAvF,WAAA5J,KAAA7F,KAAA+W,aAIA5F,EAAA6F,YAAA/B,GAGA,GAAAgC,GAAAnI,EAAA,UACA4C,MAAA,cAEAwF,GAAA,EACAC,EAAA,EAEA,IAAAlZ,EAAAuO,QAAA,CACA0K,GAAA,CACA,IAAAE,GAAA,SAGA1G,GAAA7K,KAAAuR,GACApK,EAAAnH,KAAA5H,EAAAoZ,QAEAJ,EAAAhE,OAAA,kDACA7B,EACA,mBACAgG,EACA,6CACApX,KAAAsS,WAAA,QACA,aAyBA,GApBA6E,EAAA,kBAAAlZ,GAAAkZ,OAAAlZ,EAAAkZ,OAAAnX,MAAA/B,EAAAkZ,OAEA,KAAArI,EAAA4H,KAAAS,KACAD,GAAA,EACAD,EAAAhE,OAAAkE,IAGAD,GAAAjC,EAAAhC,OAAAgE,GAGAhZ,EAAAqZ,OAAA,YAAArZ,EAAAqZ,QACA1I,EAAA2I,UAAAtZ,EAAAqZ,QACArC,EAAAzB,IAAA,mBACAsB,EAAAtB,IAAA,QAAAvV,EAAAqZ,MAAA,OAEArC,EAAA1C,SAAAtU,EAAAqZ,QAKArZ,EAAAuZ,QAAA,YAAAvZ,EAAAuZ,OACA,GAAA5I,EAAA2I,UAAAtZ,EAAAuZ,QAAA,CACA,GAAAA,GAAAvZ,EAAAuZ,MACArC,KAAAqC,EAAAC,KAAAtS,IAAA,EAAAqS,EAAArC,EAAAuC,gBACAT,IAAAO,EAAAC,KAAAtS,IAAA,EAAAqS,EAAAP,EAAAS,gBACA5C,EAAAtB,IAAA,SAAAgE,EAAA,UAEAvC,GAAA1C,SAAAtU,EAAAuZ,OAKAxX,MAAAgQ,QAAAiF,EACAjV,KAAAiQ,UAAA6E,EACA9U,KAAAsP,UAAA0F,EACAhV,KAAA6P,YAAA7P,KAAA4M,aAEA5M,KAAAkT,gBAGAlT,KAAAgQ,QAAA0C,KAAA,SAAAiF,OAAAC,WACA5X,KAAAgQ,QAAAyD,GAAA,+CAAA3E,EAAA4E,MAAA1T,KAAAiU,SAAAjU,QAEAA,KAAAqP,SAAA+G,GAAA,cAAApW,KAAAqP,SAAA+G,GAAA,iBACApW,KAAAgQ,QAAAuC,SAAA,sBACAvS,KAAA6X,eAAA,QAGA7X,KAAA8T,eAAA,4BAAAlF,GAAAyD,SACA8C,EAAAnE,KAAA,wCAAA9B,KAAA,WACA,GAAA4I,GAAAhJ,EAAA9O,MACAmS,EAAA2F,EAAApF,KAAA,cACA,MAAAP,EAAAyE,eACA9B,EAAAjS,KAAA,UAAAsP,EAAA,WAEA,MADA2F,GAAAC,QAAA,UACA,MAMA,YAAA9Z,EAAA+Z,aACAhY,KAAA6U,cACS,eAAA5W,EAAA+Z,cAAA/Z,EAAA+X,WAAAC,QACTjW,KAAAyU,eAAA,OAIAzU,MAAAgQ,QAAAiI,MA4BA,OAzBAha,GAAAsO,YACAvM,KAAAiQ,UAAApH,QACA7I,KAAAgQ,QAAAuC,SAAA,WAGAtU,EAAA+X,WAAAC,QAAAhY,EAAA+X,cAAA,IACAhW,KAAAgQ,QAAAiD,OAAA,gHACAjT,KAAA+R,UAAA9T,EAAA+X,WAAAE,MAAAgC,eAAA,uBAGAlY,KAAAgQ,QAAAyD,GAAA,oCAAA/Q,GACAA,EAAA4R,iBACAS,EAAAN,eAAA,MAKAzU,KAAAmY,YAAAla,EAAAma,eAGApY,KAAA6X,eAAA5Z,EAAAoa,iBAGApa,EAAAqa,OAAAtY,MAEAA,MAGAuY,aAAA,SAAAlF,GACA,GAAA3D,GAGA2D,KAAArT,KAAAiQ,UAAAoD,KAYA,OATA3D,GADA1P,KAAAuC,SAAAiW,OACAxY,KAAAuC,SAAAiW,OAAAnF,GACO,gBAAApI,UACPA,SAAAwN,OAAApF,GACO,kBAAAqF,QACPA,OAAArF,GAEAA,GAMAwB,YAAA,WACA,GAIAnF,GACAiJ,EALA1a,EAAA+B,KAAAuC,SACA4O,EAAAnR,KAAAiQ,UACA2I,EAAAzH,EAAA3J,OACAqR,EAAA/J,EAAA,UAA6C4C,MAAA,aAAAkB,gBAAA,oBAI7C,WAAA5S,KAAA8P,WAGA9P,MAIAA,KAAA8P,YAAA,EAEA9P,KAAA6X,eAAA,OAAAiB,cAAA,cAGAH,EAAA1a,EAAA0O,UAAA3M,MAEA0P,EAAA,gBAAAiJ,KAAA3Y,KAAAuY,eAGAM,EAAArC,KAAA9G,GAEAkJ,GAAA,aAAAA,EAAAlG,KAAA,SAEAmG,EAAAE,aAAAH,GAGAzH,EAAA6H,SAAA/F,OAAA4F,GAIAA,EAAArF,KACA8D,MAAAnG,EAAA8H,aAAA,KACAzB,OAAArG,EAAAuG,cAAA,OAGA1X,KAAAuC,SAAAkK,QACAoM,EAAArF,IAAA,SAAAxT,KAAAuC,SAAAkK,QAIA0E,EAAA+H,OAGAL,EAAAzY,KAAA,WAAAJ,OAEAA,KAAAqP,SAAA+G,GAAA,cAAApW,KAAAqP,SAAA+G,GAAA,iBACApW,KAAAgQ,QAAAuC,SAAA,sBACAvS,KAAA6X,eAAA,QAGA7X,OAGA4U,YAAA,WAEA5U,KAAA8P,YAAA,CAGA,IAAAqB,GAAAnR,KAAAgQ,QAAAgB,KAAA,wCAcA,OAXAG,GAAAgI,SAGAnZ,KAAA8Y,cAAA,OAEA9Y,KAAA6X,eAAA7X,KAAAuC,SAAA8V,iBAGArY,KAAAiQ,UAAAgI,OACAjY,KAAAkT,gBAEAlT,MAGAoZ,QAAA,WACA,MAAApZ,MAAA6P,aAAA7P,KAAA4M,cAGAA,WAAA,WACA,MAAA5M,MAAAiQ,UAAAoD,OAGAgG,WAAA,SAAA3J,GAGA,MAFA1P,MAAAiQ,UAAAoD,IAAA3D,GAEA1P,MAGAsZ,cAAA,SAAAC,GACA,GAAAC,GAAA9J,EAAA1P,KAAA4M,YAEA,IAAA4M,EAAA9J,EAAAhO,QAAA6X,GAAAC,GAAA,GAAAD,EAAA5V,OAAA,GACA,GAAA8V,GAAAC,EAAA1Z,KAAAiN,cAOA,OALAjN,MAAAoN,aAAAoM,IAAAD,EAAA5V,QACA8V,EAAAzZ,KAAAiN,eAEAjN,KAAAoN,aAAAsM,EAAAvT,MAAAuT,EAAApT,KAEAmT,EAEA,aAIAxM,aAAA,WAEA,GAAAvK,GAAA1C,KAAAiQ,UAAA,EAEA,QAEA,kBAAAvN,IAAA,WACA,GAAAiX,GAAAjX,EAAAkX,aAAAlX,EAAAmX,cACA,QAAsB1T,MAAAzD,EAAAmX,eAAAvT,IAAA5D,EAAAkX,aAAAjW,OAAAgW,EAAA9L,KAAAnL,EAAAlE,MAAAsb,OAAApX,EAAAmX,eAAAF,MAItB,WACA,iBAOAvM,aAAA,SAAAjH,EAAAG,GAEA,GAAA5D,GAAA1C,KAAAiQ,UAAA,EAEA,QAEA,kBAAAvN,IAAA,WACAA,EAAAmX,eAAA1T,EACAzD,EAAAkX,aAAAtT,IAKA,WACA,iBAOA6G,iBAAA,SAAAU,GAEA,GAAAnL,GAAA1C,KAAAiQ,UAAA,EAEA,QAEA,kBAAAvN,IAAA,WAIA,MAHAA,GAAAlE,MAAAkE,EAAAlE,MAAAsb,OAAA,EAAApX,EAAAmX,gBAAAhM,EAAAnL,EAAAlE,MAAAsb,OAAApX,EAAAkX,aAAAlX,EAAAlE,MAAAmF,QAEAjB,EAAAmX,eAAAnX,EAAAlE,MAAAmF,OACA3D,OAIA,WAEA,MADA0C,GAAAlE,OAAAqP,EACAe,EAAAlM,QAMAqX,WAAA,WAEA,OAAA/Z,KAAAoQ,SAAAzM,OACA,WAEA,IAAAqW,GAAAC,EAAAja,KAAAoQ,SAAA8J,OAQA,OANA,kBAAAD,GACAD,EAAAC,IACS,gBAAAA,MAAAtW,OAAA,IACTqW,EAAAC,GAGAD,GAIAG,WAAA,SAAAhU,EAAAG,GAEA,mBAAAH,GAAA,CACA,GAAAyK,GAAA5Q,IACAA,MAAAoQ,SAAAvK,KAAA,WACA,MAAA+K,GAAA0I,cAAAnT,SAEO,oBAAAA,IAAA,gBAAAG,GAAA,CACP,GAAAoT,GAAA1Z,KAAAiN,cAEAjN,MAAAoN,aAAAjH,EAAAG,GACAtG,KAAAoQ,SAAAvK,KAAA7F,KAAAiN,gBAEAjN,KAAAoN,aAAAsM,EAAAvT,MAAAuT,EAAApT,OAMA8T,uBAAA,SAAAC,GACA,sBAAAA,GACAA,EAAA/G,MAAA,KACA+G,GAIAvB,cAAA,SAAA3Y,GACA,GAAAqR,GAAAxR,KAAAoa,uBAAAja,GACAyQ,EAAA5Q,IAQA,OANA8O,GAAAI,KAAAsC,EAAA,SAAA/N,EAAAqN,GACAF,EAAAJ,eAAAgB,EAAA/N,GAAA,SAAA8L,GACAA,EAAA+K,WAAA,gBAIAta,MAGA6X,eAAA,SAAA1X,GACA,GAAAqR,GAAAxR,KAAAoa,uBAAAja,GACAyQ,EAAA5Q,IAQA,OANA8O,GAAAI,KAAAsC,EAAA,SAAA/N,EAAAqN,GACAF,EAAAJ,eAAAgB,EAAA/N,GAAA,SAAA8L,GACAA,EAAAmD,KAAA,2BAIA1S,MAGAmY,YAAA,SAAAhY,GACA,GAAAqR,GAAAxR,KAAAoa,uBAAAja,GACAyQ,EAAA5Q,IAQA,OANA8O,GAAAI,KAAAsC,EAAA,SAAA/N,EAAAqN,GACAF,EAAAJ,eAAAgB,EAAA/N,GAAA,SAAA8L,GACAA,EAAAgD,SAAA,cAIAvS,MAGAua,YAAA,SAAApa,GACA,GAAAqR,GAAAxR,KAAAoa,uBAAAja,GACAyQ,EAAA5Q,IAQA,OANA8O,GAAAI,KAAAsC,EAAA,SAAA/N,EAAAqN,GACAF,EAAAJ,eAAAgB,EAAA/N,GAAA,SAAA8L,GACAA,EAAAkD,YAAA,cAIAzS,MAGA8T,eAAA,SAAA0G,GACA,GAAAC,GAAAD,IAAAxa,MAAAqP,QAKA,OAJAoL,KACAza,KAAAqP,SAAAqL,aAAAF,EAAA,WACAC,EAAA,kBAAAza,MAAAqP,SAAAmL,IAEAC,GAGA9G,MAAA,SAAAjR,GACA,GAAAiY,IAAA,CACA,QAAAjY,EAAAkY,SACA,QACA,QACA,QACA,QACA,QACA,KAEA,QACA,GAAAZ,EACA,IAAAA,EAAAha,KAAA+Z,aAAA,OAAAC,EAAA,CAEA,GAAApJ,GAAA5Q,IACA6a,YAAA,WACAjK,EAAAxD,aAAA4M,EAAA7T,MAAA6T,EAAA1T,MACa,KAEbqU,GAAA,MACW,CAGX,GAAAzN,GAAAlN,KAAAiN,cAEAC,GAAA/G,OAAA+G,EAAA5G,KAAA4G,EAAA5G,KAAAtG,KAAA4M,aAAAjJ,OAEAgX,GAAA,GAGA3a,KAAAoN,aAAApN,KAAA4M,aAAAjJ,OAAA3D,KAAA4M,aAAAjJ,QAEAgX,GAAA,GAIA,KAEA,SACAA,GAAA,CACA,MACA,SACA3a,KAAA+P,eAAA/P,KAAAyU,eAAA,GACAkG,GAAA,CACA,MAEA,SACAA,GAAA,EAGAA,IACAjY,EAAAoY,kBACApY,EAAA4R,kBAGAtU,KAAAuC,SAAAzC,SAAAE,OAGA4T,OAAA,SAAAlR,GAEA,MADA1C,MAAAuC,SAAAzC,SAAAE,MACAA,MAEA6T,OAAA,SAAAnR,GAEA,MADA1C,MAAAuC,SAAAwY,SAAA/a,MACAA,MAEA6I,MAAA,SAAAnG,GACA,GAAAzE,GAAA+B,KAAAuC,SAEA0S,GADAhX,EAAA+c,SACAhb,KAAAgQ,QAuBA,OArBAiF,GAAA1C,SAAA,UAGAzD,EAAAmM,UAAAjK,KAAA,cAAA9B,KAAA,WACA,GAAAJ,EAAA9O,MAAA0S,KAAA,QAAAuC,EAAAvC,KAAA,OACA,GAAAwI,EAEAA,GAAApM,EAAA9O,MAAAgR,KAAA,YAAA5Q,KAAA,YACA,OAAA8a,IACAA,EAAApM,EAAA9O,MAAAgR,KAAA,yCAAA5Q,KAAA,aAGA8a,GACAA,EAAAC,UAMAld,EAAAgM,QAAAjK,MAEAA,MAGAmb,KAAA,SAAAzY,GACA,GAAAzE,GAAA+B,KAAAuC,SACA6Y,EAAAnd,EAAA+c,SACA/F,EAAAjV,KAAAgQ,QACAgF,EAAAhV,KAAAsP,SAEA,IAAA2F,EAAAoG,SAAA,eAAArb,KAAAqP,SAAA2J,SAAArV,OAAA,CAGA,GAFAsR,EAAAxC,YAAA,UAEA2I,EAEA,UAAApG,EAAAzF,GAAA,CAEA,GAAA+L,GAAAxM,EAAA,IAAAkG,EAAA5V,KAAA,MACAsQ,EAAA1P,KAAA4M,aACA6J,EAAAzW,KAAAuY,aAAA7I,EAEAZ,GAAAkG,EAAAxF,UAAAN,KAAA,SAAA2B,EAAAC,GACAwK,EAAA5I,KAAAsC,EAAAxF,SAAAqB,GAAAmE,EAAAvF,WAAAoB,MAIAyK,EAAA9E,KAAAC,GAEAxB,EAAA+B,YAAAsE,OAEArG,GAAAiE,MAKAjb,GAAAsd,OAAAvb,MAGA,MAAAA,OAQA,IAAAyI,GAAAqG,EAAA9D,GAAAC,QAEA6D,GAAA9D,GAAAC,SAAA,SAAAuQ,GACA,MAAAxb,MAAAkP,KAAA,WACA,GAAAuM,GAAA3M,EAAA9O,MACAI,EAAAqb,EAAArb,KAAA,YACAnC,EAAA,gBAAAud,KACApb,IAAAqb,EAAArb,KAAA,WAAAA,EAAA,GAAA2O,GAAA/O,KAAA/B,OAIA6Q,EAAA9D,GAAAC,SAAAC,YAEA4D,EAAA9D,GAAAC,SAAA2E,UAEArD,WAAA,EACAyO,UAAA,EACAxO,SAAA,EACA8K,MAAA,UACAE,OAAA,UACA/K,OAAA,OACAC,YAAA,QACAJ,SAAA,KACA0L,aAAA,SACAQ,OAAA,KAGAhH,WAEArR,KAAA,YACAC,OACAD,KAAA,UACAgS,OAAA,SACArF,MAAA,OACAC,MAAiB2O,MAAA,2BAAAC,GAAA,aAAAC,OAAA,aACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,eAAAyC,EAAAhN,EAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,eAEAtN,EAAA6I,KAIA,OAAA6B,EAAAoK,OAAA9U,EAAAmB,MAAA,MACA,OAAAuJ,EAAAoK,OAAA9U,EAAAsB,IAAA,IACA5D,EAAA0K,aAAApI,EAAAmB,MAAA,EAAAnB,EAAAsB,IAAA,GACA5D,EAAAyK,iBAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,IAEAzD,EAAAyK,iBAAA,KAAAoM,EAAA,MACArM,EAAAlI,EAAAmB,MAAA,GAIAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,WAGAxD,KAAA,YACA2M,MAAA,SACAqF,OAAA,SACApF,MAAiB2O,MAAA,6BAAAC,GAAA,eAAAC,OAAA,eACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,eAAAyC,EAAAhN,EAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,mBAEAtN,EAAA6I,KAIA,MAAA6B,EAAAoK,OAAA9U,EAAAmB,MAAA,MACA,MAAAuJ,EAAAoK,OAAA9U,EAAAsB,IAAA,IACA5D,EAAA0K,aAAApI,EAAAmB,MAAA,EAAAnB,EAAAsB,IAAA,GACA5D,EAAAyK,iBAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,IAEAzD,EAAAyK,iBAAA,IAAAoM,EAAA,KACArM,EAAAlI,EAAAmB,MAAA,GAIAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,WAGAxD,KAAA,aACA2M,MAAA,UACAqF,OAAA,SACApF,MAAiB2O,MAAA,6BAAAC,GAAA,eAAAC,OAAA,aACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAA2O,EAAAC,EAAA9W,EAAAtC,EAAAuK,eAAAyC,EAAAhN,EAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,gBAEAtN,EAAA6I,KAAA,KAIAgO,EAAA,WAAAnM,EAAAoK,OAAA9U,EAAAmB,MAAA0V,OACAA,EAAA,UAAAnM,EAAAoK,OAAA9U,EAAAmB,MAAA0V,OACAnZ,EAAA0K,aAAApI,EAAAmB,MAAA0V,EAAA7W,EAAAsB,KACA5D,EAAAyK,iBAAAoM,GACArM,EAAAlI,EAAAmB,MAAA0V,GACa7W,EAAAmB,MAAA,IAAA2V,EAAApM,EAAAoK,OAAA9U,EAAAmB,MAAA,OAAA2V,GAAA,MAAAA,IACbpZ,EAAAyK,iBAAA,WAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,IAGAzD,EAAAyK,iBAAA,OAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,GAIAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,aAIAxD,KAAA,YACAC,OACAD,KAAA,SACA2M,MAAA,WACAqF,OAAA,SACApF,MAAiB2O,MAAA,2BAAAC,GAAA,aAAAC,OAAA,aACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAA6O,EAAA/W,EAAAtC,EAAAuK,cAAAvK,GAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,+BAEAtN,EAAA6I,KAGAkO,EAAAC,OAAAtZ,EAAA4P,WAAA,8BAEA,IAAA2J,GAAA,GAAAC,QAAA,gDACA,WAAAH,GAAA,KAAAA,GAAA,YAAAA,GAAAE,EAAAE,KAAAJ,GAAA,CACA,GAAAK,GAAAtN,EAAA,QAAAiN,EAAA,UAAAlO,MAGAnL,GAAAyK,iBAAA,IAAAoM,EAAA,KAAA6C,EAAA,KACAlP,EAAAlI,EAAAmB,MAAA,EAGAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,YAIAxD,KAAA,WACA2M,MAAA,QACAqF,OAAA,SACApF,MAAiB2O,MAAA,8BAAAC,GAAA,kBAAAC,OAAA,gBACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAA6O,EAAA/W,EAAAtC,EAAAuK,cAAAvK,GAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,gCAEAtN,EAAA6I,KAGAkO,EAAAC,OAAAtZ,EAAA4P,WAAA,oCAEA,IAAA2J,GAAA,GAAAC,QAAA,sCACA,WAAAH,GAAA,KAAAA,GAAA,YAAAA,GAAAE,EAAAE,KAAAJ,GAAA,CACA,GAAAK,GAAAtN,EAAA,QAAAiN,EAAA,UAAAlO,MAGAnL,GAAAyK,iBAAA,KAAAoM,EAAA,KAAA6C,EAAA,KAAA1Z,EAAA4P,WAAA,gCACApF,EAAAlI,EAAAmB,MAAA,EAGAzD,EAAAyX,WAAAzX,EAAA4P,WAAA,2BAGA5P,EAAA0K,aAAAF,IAAAqM,EAAA5V,cAKAxD,KAAA,YACAC,OACAD,KAAA,UACAgS,OAAA,SACArF,MAAA,iBACAC,MAAiB2O,MAAA,2BAAAC,GAAA,aAAAC,OAAA,gBACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,cAAAvK,GAAAkK,YAGA,QAAA5H,EAAArB,OAEA4V,EAAA7W,EAAA4P,WAAA,kBAEA5P,EAAAyK,iBAAA,KAAAoM,GAEArM,EAAAlI,EAAAmB,MAAA,MAEA,IAAAnB,EAAA6I,KAAAnM,QAAA,QACA6X,EAAAvU,EAAA6I,KAEAnL,EAAAyK,iBAAA,KAAAoM,GAGArM,EAAAlI,EAAAmB,MAAA,MACe,CACf,GAAAkW,KAEAA,GAAArX,EAAA6I,KAAAyF,MAAA,MACAiG,EAAA8C,EAAA,GAEAvN,EAAAI,KAAAmN,EAAA,SAAAxL,EAAAC,GACAuL,EAAAxL,GAAA,KAAAC,IAGApO,EAAAyK,iBAAA,OAAAkP,EAAAC,KAAA,OAGApP,EAAAlI,EAAAmB,MAAA,EAKAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,WAIAxD,KAAA,WACAgS,OAAA,SACArF,MAAA,eACAC,MAAiB2O,MAAA,8BAAAC,GAAA,gBAAAC,OAAA,gBACjB5O,SAAA,SAAAtK,GAGA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,cAAAvK,GAAAkK,YAGA,QAAA5H,EAAArB,OAEA4V,EAAA7W,EAAA4P,WAAA,kBACA5P,EAAAyK,iBAAA,MAAAoM,GAEArM,EAAAlI,EAAAmB,MAAA,MAEA,IAAAnB,EAAA6I,KAAAnM,QAAA,QACA6X,EAAAvU,EAAA6I,KAEAnL,EAAAyK,iBAAA,MAAAoM,GAGArM,EAAAlI,EAAAmB,MAAA,MACe,CACf,GAAAkW,KAEAA,GAAArX,EAAA6I,KAAAyF,MAAA,MACAiG,EAAA8C,EAAA,GAEAvN,EAAAI,KAAAmN,EAAA,SAAAxL,EAAAC,GACAuL,EAAAxL,GAAA,MAAAC,IAGApO,EAAAyK,iBAAA,OAAAkP,EAAAC,KAAA,OAGApP,EAAAlI,EAAAmB,MAAA,EAKAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,WAIAxD,KAAA,UACAgS,OAAA,SACArF,MAAA,OACAC,MAAiB2O,MAAA,+BAAAC,GAAA,aAAAC,OAAA,aACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,eAAAyC,EAAAhN,EAAAkK,YAIA2M,GAFA,IAAAvU,EAAArB,OAEAjB,EAAA4P,WAAA,kBAEAtN,EAAA6I,KAIA,UAAA6B,EAAAoK,OAAA9U,EAAAmB,MAAA,MACA,UAAAuJ,EAAAoK,OAAA9U,EAAAsB,IAAA,IACA5D,EAAA0K,aAAApI,EAAAmB,MAAA,EAAAnB,EAAAsB,IAAA,GACA5D,EAAAyK,iBAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,GACa,MAAAuJ,EAAAoK,OAAA9U,EAAAmB,MAAA,MACb,MAAAuJ,EAAAoK,OAAA9U,EAAAsB,IAAA,IACA5D,EAAA0K,aAAApI,EAAAmB,MAAA,EAAAnB,EAAAsB,IAAA,GACA5D,EAAAyK,iBAAAoM,GACArM,EAAAlI,EAAAmB,MAAA,GACauJ,EAAAhO,QAAA,UACbgB,EAAAyK,iBAAA,QAAAoM,EAAA,SACArM,EAAAlI,EAAAmB,MAAA,IAEAzD,EAAAyK,iBAAA,IAAAoM,EAAA,KACArM,EAAAlI,EAAAmB,MAAA,GAIAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,WAIAxD,KAAA,WACAgS,OAAA,SACArF,MAAA,QACAC,MAAiB2O,MAAA,8BAAAC,GAAA,mBAAAC,OAAA,mBACjB5O,SAAA,SAAAtK,GAEA,GAAA6W,GAAArM,EAAAlI,EAAAtC,EAAAuK,cAAAvK,GAAAkK,YAGA,QAAA5H,EAAArB,OAEA4V,EAAA7W,EAAA4P,WAAA,cAEA5P,EAAAyK,iBAAA,KAAAoM,GAGArM,EAAAlI,EAAAmB,MAAA,MAEA,IAAAnB,EAAA6I,KAAAnM,QAAA,QACA6X,EAAAvU,EAAA6I,KAEAnL,EAAAyK,iBAAA,KAAAoM,GAGArM,EAAAlI,EAAAmB,MAAA,MACe,CACf,GAAAkW,KAEAA,GAAArX,EAAA6I,KAAAyF,MAAA,MACAiG,EAAA8C,EAAA,GAEAvN,EAAAI,KAAAmN,EAAA,SAAAxL,EAAAC,GACAuL,EAAAxL,GAAA,KAAAC,IAGApO,EAAAyK,iBAAA,OAAAkP,EAAAC,KAAA,OAGApP,EAAAlI,EAAAmB,MAAA,EAKAzD,EAAA0K,aAAAF,IAAAqM,EAAA5V,aAIAxD,KAAA,YACAC,OACAD,KAAA,aACA4S,QAAA,EACAZ,OAAA,SACArF,MAAA,UACAkF,QAAA,UACAC,SAAA,yBACAlF,MAAiB2O,MAAA,6BAAAC,GAAA,eAAAC,OAAA,eACjB5O,SAAA,SAAAtK,GAEA,GAAA6Z,GAAA7Z,EAAAoN,UAEAyM,MAAA,EAEA7Z,EAAAmS,cAEAnS,EAAAkS,oBAMA/H,qBACA8I,uBACAyC,iBACAC,mBACAlB,OAAA,GACAnB,YACAC,QAAA,EACAC,OACAC,cACAwF,GAAA,eACAD,MAAA,iCACAE,OAAA,oBAEA1D,eACAyD,GAAA,iBACAD,MAAA,iCACAE,OAAA,uBAMAtD,OAAA,SAAA5V,KACAiK,UAAA,SAAAjK,KACA2U,OAAA,SAAA3U,KACA6Y,OAAA,SAAA7Y;AACAuH,QAAA,SAAAvH,KACA5C,SAAA,SAAA4C,KACAiS,aAAA,SAAAjS,KACAqY,SAAA,SAAArY,MAGAoM,EAAA9D,GAAAC,SAAAuR,YAAAzN,EAMAD,EAAA9D,GAAAC,SAAAwR,WAAA,WAEA,MADA3N,GAAA9D,GAAAC,SAAAxC,EACAzI,KAKA,IAAA0c,GAAA,SAAAnN,GACA,GAAAkM,GAAAlM,CAEA,OAAAkM,GAAArb,KAAA,gBACAqb,GAAArb,KAAA,YAAAiQ,iBAIAoL,GAAAxQ,YAGA0R,EAAA,SAAAja,GACA,GAAAka,GAAA9N,EAAAmM,SAAA4B,cAGA/N,GAAAmM,UAAAjK,KAAA,cAAA9B,KAAA,WACA,GAAAuM,GAAA3M,EAAA9O,MACA8c,EAAAF,EAAAG,QAAA,mBAAA/c,KACAkb,EAAAO,EAAAzK,KAAA,YAAA5Q,KAAA,aACAqb,EAAAzK,KAAA,yCAAA5Q,KAAA,WAEA8a,KAAA4B,GACA5B,EAAAC,SAKArM,GAAAmM,UACAxH,GAAA,wEAAA/Q,GACAga,EAAA5N,EAAA9O,OACA0C,EAAA4R,mBAEAb,GAAA,yBAAA/Q,GACAia,EAAAja,KAEA2J,MAAA,WACAyC,EAAA,qCAAAI,KAAA,WACAwN,EAAA5N,EAAA9O,exBu9B8Bgd,KAAKrf,EAASC,EAAoB,MAI1Dqf,KACA,SAASvf,EAAQC,EAASC,GyBr0EhCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,wwIAAiyI,IAAQ2b,QAAA,EAAAC,SAAA,iCAAA9C,SAAA+C,SAAA,u/BAAAC,KAAA,eAAAC,gBAAA,8wIAAw3KC,WAAA,iBzB80E3pTC,KACA,SAAS9f,EAAQC,EAASC,G0Bp1EhCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,8CAAqE,IAAQ2b,QAAA,EAAAC,SAAA,sCAAA9C,SAAA+C,SAAA,yBAAAC,KAAA,eAAAC,gBAAA,gDAAiMC,WAAA,iB1B61ExQE,KACA,SAAS/f,EAAQC,EAASC,G2Bn2EhCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,yDAAgF,IAAQ2b,QAAA,EAAAC,SAAA,yCAAA9C,SAAA+C,SAAA,6BAAAC,KAAA,kBAAAC,gBAAA,0DAAqNC,WAAA,iB3B42EvSG,KACA,SAAShgB,EAAQC,EAASC,G4Bl3EhCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,s9RAA6+R,IAAQ2b,QAAA,EAAAC,SAAA,6CAAA9C,SAAA+C,SAAA,k8CAAAC,KAAA,sBAAAC,gBAAA,uhSAAqmVC,WAAA,iB5B23EplnBI,KACA,SAASjgB,EAAQC,G6Bj4EvBD,EAAAC,QAAA;E7Bu4EMigB,KACA,SAASlgB,EAAQC,G8Bx4EvBD,EAAAC,QAAA,6N9B84EMkgB,KACA,SAASngB,EAAQC,G+B/4EvBD,EAAAC,QAAA,ykB/Bq5EMmgB,KACA,SAASpgB,EAAQC,GgCt5EvBD,EAAAC,QAAA,qFhC45EMogB,KACA,SAASrgB,EAAQC,GiC75EvBD,EAAAC,QAAA,0MjCm6EMqgB,KACA,SAAStgB,EAAQC,GkCp6EvBD,EAAAC,QAAA,oKlC06EMsgB,KACA,SAASvgB,EAAQC,GmC36EvBD,EAAAC,QAAA,0ZnCi7EMugB,KACA,SAASxgB,EAAQC,GoCl7EvBD,EAAAC,QAAA,ySpCw7EMwgB,KACA,SAASzgB,EAAQC,GqCz7EvBD,EAAAC,QAAA,kKrC+7EMygB,KACA,SAAS1gB,EAAQC,EAASC,GsC77EhC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAAoF2O,WAAA,GACpF3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,StCm9EMC,KACA,SAAS7gB,EAAQC,EAASC,GuCx9EhC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAAuF2O,WAAA,GACvF3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,SvC8+EME,KACA,SAAS9gB,EAAQC,EAASC,GwCn/EhC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAAuF2O,WAAA,GACvF3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,SxCygFMG,KACA,SAAS/gB,EAAQC,EAASC,GyC9gFhC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAAuF2O,WAAA,GACvF3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,SzCoiFMI,KACA,SAAShhB,EAAQC,EAASC,GAE/B,YA0CA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,G0ChjFxF,QAASsgB,gBACL,OAAQrd,cAAgB9B,a1CugF3BlB,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIogB,GAAkBhhB,EAAoB,KAEtCihB,EAAkBzgB,uBAAuBwgB,GAEzCE,EAAWlhB,EAAoB,KAE/BmhB,EAAY3gB,uBAAuB0gB,GAEnCE,EAAsBphB,EAAoB,MAE1CqhB,EAAsB7gB,uBAAuB4gB,GAE7CE,EAAgBthB,EAAoB,KAEpCuhB,EAAgB/gB,uBAAuB8gB,G0ClkF5CE,EAAAxhB,EAAA,I1CskFKyhB,EAAQjhB,uBAAuBghB,G0CrkFpCxU,EAAAhN,EAAA,KACAkB,EAAAlB,EAAA,KACAgB,EAAAhB,EAAA,I1C2kFKiB,EAAWT,uBAAuBQ,G0C1kFvCiG,EAAAjH,EAAA,I1C8kFKgH,EAAWxG,uBAAuByG,G0C7kFvCya,EAAA1hB,EAAA,M1CilFK2hB,EAAqBnhB,uBAAuBkhB,G0C9kF3CE,GAAiBC,kBAAmBC,EAAK,MAAOC,EAAK,MAAOC,IAAO,SAGzE9Q,WAAEa,OAAOb,UAAE+Q,UAAU3U,UACjB1L,UAAU,EAAAoL,EAAAS,GAAE,kBACZyU,QAAQ,EAAAlV,EAAAS,GAAE,gBACV0U,OAAO,EAAAnV,EAAAS,GAAE,eACT2U,KAAK,EAAApV,EAAAS,GAAE,aACPlE,MAAM,EAAAyD,EAAAS,GAAE,cACR4U,SAAS,EAAArV,EAAAS,GAAE,kBAAmBmU,cAAeA,IAC7CU,QAAQ,EAAAtV,EAAAS,GAAE,gBACV8U,QAAQ,EAAAvV,EAAAS,GAAE,gBACV+U,YAAY,EAAAxV,EAAAS,GAAE,oBACdgV,SAAS,EAAAzV,EAAAS,GAAE,kBACXiV,UAAWxR,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,mBAAoBmU,cAAeA,KACnEe,UAAWzR,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,mBAAoBmU,cAAeA,KACnEgB,YAAa1R,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,sBAAuBmU,cAAeA,KACxEiB,MAAO3R,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,eAAgBmU,cAAeA,KAC3Dra,IAAK2J,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,aAAcmU,cAAeA,KACvDta,IAAK4J,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,aAAcmU,cAAeA,OAO3D1Q,UAAE+Q,UAAUa,UAAU,kBAAmB,SAASliB,EAAOwQ,EAAS2R,GAC9D,GAAMxa,IAAQ,EAAAvB,EAAA5G,SAAOid,SAAS2F,eAAeD,GAAOniB,MACpD,OAAOwB,MAAK6gB,SAAS7R,KAAY,EAAApK,EAAA5G,SAAOQ,GAAOqI,QAAQV,IACxD2I,UAAE+Q,UAAU3d,QAAO,EAAA0I,EAAAS,GAAE,oCAYxB,IAAMyV,IACF,QACA,OACA,WACA,iBACA,QACA,SACA,QACA,SACA,QACA,SACA,MACA,OACA,OACA,MACA,QAMEC,GAAa,SAAU,W1CsjF5BpjB,GAAQK,S0CnjFLmC,KAAM,YACNjB,OACI8hB,OAAQzd,MACRlE,MAAOf,OACP2iB,KAAM3iB,OACNsB,UACIR,KAAMK,QACNzB,SAAS,GAEbkjB,KAAMzhB,SAEVwB,QACIkgB,eAAgB,SAAShiB,EAAOX,GAE5B,MADAwB,MAAKC,UAAU,cAAeD,KAAMb,EAAOX,IACpC,IAGf4C,UACID,OADM,QAAAA,UAEF,IAAKnB,KAAKghB,SAAYhhB,KAAKX,QAASW,KAAKihB,KACrC,MAAOtC,eAEX,IAAMyC,GAAIzC,eACJxd,OAASnB,KAAKihB,MAAQjhB,KAAKX,OAASW,KAAKX,MAAMgiB,YAAc1C,cAoDnE,OAlDA3e,MAAKghB,OAAOM,QAAQ,SAACniB,GACjB,GAAIgC,OAAOE,eAAe,eAAiBF,OAAOG,WAAWD,eAAelC,EAAMoC,IAK9E,MAJA6f,GAAE9f,WAAWnC,EAAMoC,IAAMJ,OAAOG,WAAWnC,EAAMoC,SAC7CJ,OAAO3B,UAAY2B,OAAO3B,SAASkC,QAAQvC,EAAMoC,KAAO,GACxD6f,EAAE5hB,SAASqG,KAAK1G,EAAMoC,IAK9B,IAAMD,GAAanC,EAAMoC,GAAG+R,MAAM,KAC9BiO,EAAgBpgB,OAChB3B,GAAW,EACXgiB,EAAO,GACP7K,SAbuB8K,GAAA,EAAAC,GAAA,EAAAC,EAAAhjB,MAAA,KAe3B,OAAAijB,GAAAC,GAAA,EAAA1C,EAAAnhB,SAAasD,KAAbmgB,GAAAG,EAAAC,EAAAra,QAAAsa,MAAAL,GAAA,EAAyB,CAQrB,GARC9K,EAAoBiL,EAAApjB,MACrBgjB,GAAiB,KAATA,EAAc7K,EAAQ,IAAMA,EAGhC4K,EAAclgB,eAAe,UAC7BkgB,EAAgBQ,UAAIvf,QAAQ+e,EAAcS,QAGzCT,EAAcjgB,aAAeigB,EAAcjgB,WAAWD,eAAesV,GAEtE,WADAnV,WAAIC,KAAJ,aAAsBkV,EAAtB,wBAIJnX,GACIA,GACG+hB,EAAclgB,eAAe,aAC7BkgB,EAAc/hB,SAASkC,QAAQiV,IAAS,EAG3CnX,GAAY4hB,EAAE5hB,SAASkC,QAAQ8f,GAAQ,GACvCJ,EAAE5hB,SAASqG,KAAK2b,GAIhBD,EAAcjgB,WAAWqV,GAAMtV,eAAe,UAC9CkgB,EAAgBQ,UAAIvf,QAAQ+e,EAAcjgB,WAAWqV,GAAMqL,QAxCxC,MAAAC,GAAAP,GAAA,EAAAC,EAAAM,EAAA,aAAAR,GAAAI,EAAAK,QAAAL,EAAAK,SAAA,WAAAR,EAAA,KAAAC,IA4C3BP,EAAE9f,WAAWnC,EAAMoC,IAAMggB,EAAcjgB,WAAWqV,GAC9CnX,IAAaL,EAAMoC,KAAM6f,GAAE5hB,UAC3B4hB,EAAE5hB,SAASqG,KAAK1G,EAAMoC,MAIvB6f,GAEXe,MA5DM,WA6DF,GAAKniB,KACL,MAAOA,MAAKmK,MAAMiY,MAAQpiB,KAAKqiB,KAAKD,MAAQpiB,KAAK+I,MAGzDuZ,SAnFW,YAoFP,EAAA/C,EAAAvhB,SAAEgC,KAAKmiB,OAAOI,UACVC,OAAQ,GACRC,WAAY,aACZC,UAAW1iB,KAAK0iB,UAChBC,YAAa3iB,KAAK2iB,YAClBriB,QAASN,KAAKM,QACdsiB,WAAY5iB,KAAK4iB,WACjBC,eAPmB,eASvB7iB,KAAK8iB,WAAW,eAEpBC,cA/FW,WAgGH/iB,KAAKmiB,QACLniB,KAAK8iB,WAAW,uBAChB,EAAAvD,EAAAvhB,SAAEgC,KAAKmiB,OAAO/hB,KAAK,YAAa,MAChCJ,KAAK8iB,WAAW,kBAGxBjjB,SAII0iB,SAJK,WAKD,OAAO,EAAAhD,EAAAvhB,SAAEgC,KAAKmiB,OAAOa,SAOzBC,UAZK,WAaD,GAAKjjB,KAAKmiB,MAAV,CACA,GAAMe,GAAWljB,KAAKmiB,MAAMgB,iBAAiB,yBACvCC,IAEN7f,OAAM+M,UAAU1C,IAAIoP,KAAKkG,EAAU,SAAS3T,GACxC,GAAI/Q,SAYJ,OAXiC,WAA7B+Q,EAAG8T,QAAQzM,eAA8BrH,EAAG+T,UAC5C9kB,0BAAY+Q,EAAGtR,UACfO,EAAQA,EAAM0P,OAAO,SAAAsN,GAAA,MAAUA,GAAOxW,WACtCxG,EAAQA,EAAMoP,IAAI,SAAA4N,GAAA,MAAUA,GAAOhd,SAEnCA,EADOuiB,EAAU1S,SAASkB,EAAG8T,QAAQzM,gBAAkBkK,EAAYzS,SAASkB,EAAGnQ,KAAKwX,eAC5ErH,EAAG/Q,OAAS,KACD,aAAZ+Q,EAAGnQ,KACFmQ,EAAGlG,QAEHkG,EAAG/Q,OAEP2B,KAAMoP,EAAGpP,KAAM3B,MAAOA,KAC/B8iB,QAAQ,SAASnT,IAChB,EAAArP,EAAAykB,SAAQH,EAAKjV,EAAKhO,KAAMgO,EAAK3P,QAKjC,KAAK,GAAMmY,KAAQyM,GACf,IAAI,EAAAtkB,EAAA0kB,UAASJ,EAAIzM,KAAU3W,KAAKmB,OAAO3B,SAASkC,QAAQiV,GAAQ,EAAG,CAC/D,GAAI8M,IAAQ,CACZ,KAAK,GAAM/Q,KAAQ0Q,GAAIzM,GACfyM,EAAIzM,GAAMtV,eAAeqR,KACzB+Q,IAAUL,EAAIzM,GAAMjE,GAGxB+Q,UACOL,GAAIzM,GAKvB,MAAOyM,KAEXM,SArDK,SAqDIC,GACL,GAAMzY,KAGN,KAAI,EAAApM,EAAA8kB,UAASD,GAGT,WAFAniB,WAAIqiB,MAAMF,EAYd,IANIA,EAASG,SAAW,eAAiBH,GAASG,SAC9C5Y,EAASrF,KACL7F,KAAKqL,EAAE,gCAAiC9J,GAAIoiB,EAASG,QAAQ,kBAIjE,QAAUH,GAAU,CACpB,GAAIvjB,KACJ,KACIA,EAAO2jB,KAAKC,MAAML,EAASvjB,MAC7B,MAAOsC,GACLlB,UAAIC,KAAK,iBAAkBiB,GAI/B,GAAI,UAAYtC,GAEZ,WADAJ,MAAKikB,YAAY7jB,EAAKC,OAEf,YAAaD,IACpB8K,EAASrF,KAAKzF,EAAK8jB,SAItBhZ,EAASvH,QACVuH,EAASrF,KAAK7F,KAAKqL,EAAE,4BAGzBrL,KAAKC,UAAU,UACXb,KAAM,QACN2N,KAAM,uBACND,MAAO9M,KAAKqL,EAAE,oBACd8Y,QAASjZ,EAASoR,KAAK,SAG/B2H,YAlGK,SAkGO5jB,GAAQ,GAAA4N,GAAAjO,MAChB,EAAA+e,EAAA/gB,UAAe,EAAAc,EAAAslB,eAAc/jB,IAASihB,QAAQ,SAAA+C,GAAmB,GAAAC,IAAA,EAAAzF,EAAA7gB,SAAAqmB,EAAA,GAAjBllB,EAAiBmlB,EAAA,GAAVC,EAAUD,EAAA,GACvD/U,EAAKtB,EAAKkU,MAAMnZ,cAAX,UAAmC7J,EAAnC,MACLqlB,EAASvW,EAAKwW,UAAUlV,EAC9BiV,GAAOnkB,OAASkkB,EAChBC,EAAOlkB,SAAU,KAGzBoiB,UA1GK,SA0GK1T,GACNhP,KAAKykB,UAAUzV,GAAS1O,SAAU,GAEtCqiB,YA7GK,SA6GO3T,GACRhP,KAAKykB,UAAUzV,GAAS3O,WAO5BuiB,WArHK,SAqHM8B,EAAUC,GAAW,GAAAC,GAAA5kB,IAC5B2kB,GAAUrD,QAAQ,SAAAuC,GACde,EAAKH,UAAUZ,EAAM7U,SAAS3O,QAAUwjB,EAAMK,YAElD,EAAA3E,EAAAvhB,SAAEgC,KAAKmiB,OAAO/hB,KAAK,aAAaykB,qBAKpCvkB,QA9HK,SA8HGyB,EAAOwN,GACXvP,KAAKykB,UAAUlV,GAAIjP,SAAU,GAOjCmkB,UAtIK,SAsIKlV,GAEN,IADA,GAAIuV,IAAa,EAAAhmB,EAAAimB,eAAc/kB,KAAMuP,IAC7BuV,EAAWvkB,SACfukB,EAAaA,EAAW9iB,OAE5B,OAAO8iB,O1C0jFbE,KACA,SAAStnB,EAAQC,EAASC,G2Cp3FhC,GAAA6Q,GAAAC,EAAAC,GAQA,SAAAE,GAEAH,GAAA9Q,EAAA,KAAA6Q,EAAA,EAAAE,EAAA,kBAAAF,KAAA7L,MAAAjF,EAAA+Q,GAAAD,IAAA9P,SAAAgQ,IAAAjR,EAAAC,QAAAgR,KAMC,SAAAG,GAEDA,EAAAa,OAAAb,EAAA9D,IAGAuX,SAAA,SAAAtkB,GAGA,IAAA+B,KAAA2D,OAIA,YAHA1F,KAAAgnB,OAAAC,OAAAC,SACAA,QAAA1jB,KAAA,wDAMA,IAAAoe,GAAA/Q,EAAA1O,KAAAJ,KAAA,eACA,OAAA6f,GACAA,GAIA7f,KAAA0S,KAAA,2BAEAmN,EAAA,GAAA/Q,GAAA+Q,UAAA5hB,EAAA+B,KAAA,IACA8O,EAAA1O,KAAAJ,KAAA,eAAA6f,GAEAA,EAAAuF,SAAAC,WAEArlB,KAAAyT,GAAA,oCAAA6R,GAIAzF,EAAA0F,aAAAD,EAAApR,cAGApF,EAAA9O,MAAAqb,SAAA,YACAwE,EAAA2F,cAAA,GAIA7mB,SAAAmQ,EAAA9O,MAAA0S,KAAA,oBACAmN,EAAA2F,cAAA,KAKAxlB,KAAAyT,GAAA,2BAAA6R,GAOA,QAAAG,UACA,GAAAC,GAAAC,CAcA,OAPA9F,GAAA0F,eAAA1F,EAAAuF,SAAAQ,eAAA/F,EAAAgG,iBACAH,EAAA5W,EAAA,0BACA4D,KAAA,OAAAmN,EAAA0F,aAAAplB,MACAkT,IAAAvE,EAAA+Q,EAAA0F,cAAAlS,OACAyS,SAAAjG,EAAAkG,gBAGAlG,EAAAuF,SAAAQ,gBAAA/F,EAAAuF,SAAAH,SACAU,EAAA9F,EAAAuF,SAAAQ,cAAA5I,KAAA6C,IAAAkG,YAAAT,GACAI,GAGAA,EAAAvM,SAEAxa,SAAAgnB,GACAA,GAQA,MArCA9F,GAAAuF,SAAAH,OAGAK,EAAAhR,iBAkCAuL,EAAA2F,cACA3F,EAAA2F,cAAA,EACAC,UAEA5F,EAAAuC,OACAvC,EAAAmG,gBACAnG,EAAAgG,eAAA,GACA,GAEAJ,UAEA5F,EAAAoG,gBACA,MAKApG,IAIAmD,MAAA,WACA,GAAAA,GAAAnD,EAAA8E,CAgBA,OAdA7V,GAAA9O,KAAA,IAAAoW,GAAA,QACA4M,EAAAhjB,KAAAuiB,WAAAH,QAEAuC,KACA3B,GAAA,EACAnD,EAAA/Q,EAAA9O,KAAA,GAAAoiB,MAAAG,WACAviB,KAAAkP,KAAA,WACA8T,EAAAnD,EAAA7Q,QAAAhP,OAAAgjB,EACAA,IACA2B,IAAAtP,OAAAwK,EAAA8E,cAGA9E,EAAA8E,aAEA3B,GAIAkD,MAAA,SAAAC,EAAAC,GACA,GAEAhB,GAAAiB,EAAAC,EAAAlmB,EAAAugB,EAAA4F,EAFAvX,EAAAhP,KAAA,GACAwmB,EAAA,mBAAAxmB,MAAA0S,KAAA,8BAAA1S,KAAA0S,KAAA,kBAIA,UAAA1D,KAIAA,EAAAoT,MAAAoE,IACAxX,EAAAoT,KAAApiB,KAAA+c,QAAA,WACA/N,EAAA7O,KAAAH,KAAA0S,KAAA,SAGA,MAAA1D,EAAAoT,MAAA,CAIA,GAAA+D,EAIA,OAHAf,EAAAtW,EAAA1O,KAAA4O,EAAAoT,KAAA,aAAAgD,SACAiB,EAAAjB,EAAAc,MACAI,EAAAxX,EAAA+Q,UAAAwG,YAAArX,GACAmX,GACA,UACArX,EAAAa,OAAA2W,EAAAxX,EAAA+Q,UAAA4G,cAAAL,UAGAE,GAAApb,SACAmb,EAAArX,EAAA7O,MAAAmmB,EACAF,EAAAlb,WACAka,EAAAla,SAAA8D,EAAA7O,MAAA2O,EAAAa,OAAAyV,EAAAla,SAAA8D,EAAA7O,MAAAimB,EAAAlb,UAEA,MACA,cACA,MAAAkb,IAIAG,KACAzX,EAAAI,KAAAkX,EAAA9S,MAAA,eAAAoT,EAAAC,GACAJ,EAAAI,GAAAL,EAAAK,SACAL,GAAAK,KAEAJ,UARAF,GAAArX,EAAA7O,MACAmmB,GAkCA,MAvBAlmB,GAAA0O,EAAA+Q,UAAA+G,eACA9X,EAAAa,UAEAb,EAAA+Q,UAAAgH,WAAA7X,GACAF,EAAA+Q,UAAAiH,eAAA9X,GACAF,EAAA+Q,UAAAkH,UAAA/X,GACAF,EAAA+Q,UAAAwG,YAAArX,IACAA,GAGA5O,EAAAZ,WACAmhB,EAAAvgB,EAAAZ,eACAY,GAAAZ,SACAY,EAAA0O,EAAAa,QAAqBnQ,SAAAmhB,GAAkBvgB,IAIvCA,EAAA0f,SACAa,EAAAvgB,EAAA0f,aACA1f,GAAA0f,OACA1f,EAAA0O,EAAAa,OAAAvP,GAA2B0f,OAAAa,KAG3BvgB,KAKA,IAAAsW,GAAA,SAAAsQ,GAGA,MAAAA,GAAAC,QAAA,yCAIAnY,GAAAa,OAAAb,EAAAoY,KAAAC,SAAArY,EAAAoY,KAAA,MAGAE,MAAA,SAAAtR,GACA,OAAAY,EAAA,GAAA5H,EAAAgH,GAAAzC,QAIAgU,OAAA,SAAAvR,GACA,GAAAzC,GAAAvE,EAAAgH,GAAAzC,KACA,eAAAA,KAAAqD,EAAA,GAAArD,IAIAiU,UAAA,SAAAxR,GACA,OAAAhH,EAAAgH,GAAAa,KAAA,cAKA7H,EAAA+Q,UAAA,SAAA5hB,EAAAmkB,GACApiB,KAAAolB,SAAAtW,EAAAa,QAAA,KAAmCb,EAAA+Q,UAAAjQ,SAAA3R,GACnC+B,KAAA+lB,YAAA3D,EACApiB,KAAAunB,QAIAzY,EAAA+Q,UAAA3d,OAAA,SAAAslB,EAAAC,GACA,WAAAC,UAAA/jB,OACA,WACA,GAAAgkB,GAAA7Y,EAAA8Y,UAAAF,UAEA,OADAC,GAAAE,QAAAL,GACA1Y,EAAA+Q,UAAA3d,OAAAU,MAAA5C,KAAA2nB,IAGAhpB,SAAA8oB,EACAD,GAEAE,UAAA/jB,OAAA,GAAA8jB,EAAAlX,cAAAhN,QACAkkB,EAAA3Y,EAAA8Y,UAAAF,WAAA5gB,MAAA,IAEA2gB,EAAAlX,cAAAhN,QACAkkB,OAEA3Y,EAAAI,KAAAuY,EAAA,SAAAhkB,EAAAqkB,GACAN,IAAAP,QAAA,GAAA/K,QAAA,MAA2CzY,EAAA,MAAY,gBACvD,MAAAqkB,OAGAN,IAGA1Y,EAAAa,OAAAb,EAAA+Q,WAEAjQ,UACA1E,YACAsC,UACA0Y,SACAzD,WAAA,QACAsF,aAAA,UACAC,WAAA,QACAC,aAAA,QACAC,cAAA,EACAjC,cAAA,EACAkC,eAAArZ,MACAsZ,oBAAAtZ,MACAuW,UAAA,EACA7C,OAAA,UACA6F,aAAA,EACAC,UAAA,SAAAtZ,GACAhP,KAAAuoB,WAAAvZ,EAGAhP,KAAAolB,SAAA8C,eACAloB,KAAAolB,SAAAzC,aACA3iB,KAAAolB,SAAAzC,YAAA3F,KAAAhd,KAAAgP,EAAAhP,KAAAolB,SAAA3C,WAAAziB,KAAAolB,SAAA4C,YAEAhoB,KAAAwoB,UAAAxoB,KAAAyoB,UAAAzZ,MAGA0Z,WAAA,SAAA1Z,GACAhP,KAAA2oB,UAAA3Z,QAAA7O,OAAAH,MAAA4oB,YAAA5oB,KAAA6gB,SAAA7R,IACAhP,KAAAgP,YAGA6Z,QAAA,SAAA7Z,EAAAsW,GAgBA,GAAAwD,IACA,qBACA,oBAGA,KAAAxD,EAAAyD,OAAA,KAAA/oB,KAAAgpB,aAAAha,IAAAF,EAAAma,QAAA3D,EAAA1K,QAAAkO,UAEI9Z,EAAA7O,OAAAH,MAAA4oB,WAAA5Z,EAAA7O,OAAAH,MAAAkpB,UACJlpB,KAAAgP,YAGAma,QAAA,SAAAna,GAGAA,EAAA7O,OAAAH,MAAA4oB,UACA5oB,KAAAgP,WAGIA,EAAAoa,WAAAjpB,OAAAH,MAAA4oB,WACJ5oB,KAAAgP,UAAAoa,aAGA1G,UAAA,SAAA1T,EAAAyT,EAAAuF,GACA,UAAAhZ,EAAA5P,KACAY,KAAAqpB,WAAAra,EAAA7O,MAAAoS,SAAAkQ,GAAAhQ,YAAAuV,GAEAlZ,EAAAE,GAAAuD,SAAAkQ,GAAAhQ,YAAAuV,IAGArF,YAAA,SAAA3T,EAAAyT,EAAAuF,GACA,UAAAhZ,EAAA5P,KACAY,KAAAqpB,WAAAra,EAAA7O,MAAAsS,YAAAgQ,GAAAlQ,SAAAyV,GAEAlZ,EAAAE,GAAAyD,YAAAgQ,GAAAlQ,SAAAyV,KAMAsB,YAAA,SAAAlE,GACAtW,EAAAa,OAAAb,EAAA+Q,UAAAjQ,SAAAwV,IAGAla,UACA1L,SAAA,0BACAsgB,OAAA,yBACAC,MAAA,sCACAC,IAAA,4BACA7Y,KAAA,6BACA8Y,QAAA,mCACAC,OAAA,+BACAC,OAAA,4BACAE,QAAA,qCACAC,UAAAxR,EAAA+Q,UAAA3d,OAAA,6CACAqe,UAAAzR,EAAA+Q,UAAA3d,OAAA,yCACAse,YAAA1R,EAAA+Q,UAAA3d,OAAA,6DACAue,MAAA3R,EAAA+Q,UAAA3d,OAAA,6CACAiD,IAAA2J,EAAA+Q,UAAA3d,OAAA,mDACAgD,IAAA4J,EAAA+Q,UAAA3d,OAAA,sDACAqnB,KAAAza,EAAA+Q,UAAA3d,OAAA,oCAGAsnB,kBAAA,EAEAlZ,WAEAiX,KAAA,WA2BA,QAAAkC,UAAAnE,GACA,GAAAkB,GAAA,mBAAA1X,GAAA9O,MAAA0S,KAAA,8BAAA5D,EAAA9O,MAAA0S,KAAA,kBAUA,KAPA1S,KAAAoiB,MAAAoE,IACAxmB,KAAAoiB,KAAAtT,EAAA9O,MAAA+c,QAAA,WACA/c,KAAAG,KAAA2O,EAAA9O,MAAA0S,KAAA,SAKAqT,IAAA/lB,KAAAoiB,KAAA,CAIA,GAAAvC,GAAA/Q,EAAA1O,KAAAJ,KAAAoiB,KAAA,aACAsH,EAAA,KAAApE,EAAAlmB,KAAA6nB,QAAA,gBACA7B,EAAAvF,EAAAuF,QACAA,GAAAsE,KAAA5a,EAAA9O,MAAAoW,GAAAgP,EAAA5C,SACA4C,EAAAsE,GAAA1M,KAAA6C,EAAA7f,KAAAslB,IA7CAtlB,KAAA2pB,eAAA7a,EAAA9O,KAAAolB,SAAAgD,qBACApoB,KAAA4pB,aAAA5pB,KAAA2pB,eAAAhmB,QAAA3D,KAAA2pB,gBAAA7a,EAAA9O,KAAA+lB,aACA/lB,KAAA6pB,WAAA/a,EAAA9O,KAAAolB,SAAA+C,gBAAA5hB,IAAAvG,KAAAolB,SAAAgD,qBACApoB,KAAA4oB,aACA5oB,KAAA8pB,cACA9pB,KAAAgmB,eAAA,EACAhmB,KAAA+pB,WACA/pB,KAAAkpB,WACAlpB,KAAAgqB,OAEA,IAEA9D,GAFAH,EAAA/lB,KAAA+lB,YACAvY,EAAAxN,KAAAwN,SAEAsB,GAAAI,KAAAlP,KAAAolB,SAAA5X,OAAA,SAAAyc,EAAAzrB,GACA,gBAAAA,KACAA,IAAA8U,MAAA,OAEAxE,EAAAI,KAAA1Q,EAAA,SAAAkoB,EAAAvmB,GACAqN,EAAArN,GAAA8pB,MAGA/D,EAAAlmB,KAAAolB,SAAAc,MACApX,EAAAI,KAAAgX,EAAA,SAAA+D,EAAAzrB,GACA0nB,EAAA+D,GAAAnb,EAAA+Q,UAAA4G,cAAAjoB,KA0BAsQ,EAAA9O,KAAA+lB,aACAtS,GAAA,oDACA,0VAGAgW,UAIAhW,GAAA,qEAAAgW,UAEAzpB,KAAAolB,SAAA8E,gBACApb,EAAA9O,KAAA+lB,aAAAtS,GAAA,wBAAAzT,KAAAolB,SAAA8E,iBAKA9H,KAAA,WAQA,MAPApiB,MAAAmqB,YACArb,EAAAa,OAAA3P,KAAA4oB,UAAA5oB,KAAA0kB,UACA1kB,KAAAkpB,QAAApa,EAAAa,UAA8B3P,KAAA0kB,UAC9B1kB,KAAAgjB,SACAlU,EAAA9O,KAAA+lB,aAAAqE,eAAA,gBAAApqB,OAEAA,KAAA4iB,aACA5iB,KAAAgjB,SAGAmH,UAAA,WACAnqB,KAAAqqB,aACA,QAAA5mB,GAAA,EAAAyf,EAAAljB,KAAAsqB,gBAAAtqB,KAAAkjB,WAA0EA,EAAAzf,GAAeA,IACzFzD,KAAAuqB,MAAArH,EAAAzf,GAEA,OAAAzD,MAAAgjB,SAIAhU,QAAA,SAAAA,GACA,GAIAwb,GAAAxc,EAJAyc,EAAAzqB,KAAA0qB,MAAA1b,GACA2b,EAAA3qB,KAAA4qB,oBAAAH,GACA3Z,EAAA9Q,KACA2lB,GAAA,CA2CA,OAxCAhnB,UAAAgsB,QACA3qB,MAAAkpB,QAAAuB,EAAAtqB,OAEAH,KAAA6qB,eAAAF,GACA3qB,KAAAsqB,gBAAAxb,EAAA6b,GAIA3c,EAAAhO,KAAAwN,OAAAmd,EAAAxqB,MACA6N,GACAc,EAAAI,KAAAlP,KAAAwN,OAAA,SAAArN,EAAA2qB,GACAA,IAAA9c,GAAA7N,IAAAwqB,EAAAxqB,OACAsqB,EAAA3Z,EAAA8Z,oBAAA9Z,EAAA4Z,MAAA5Z,EAAAuY,WAAAlpB,KACAsqB,KAAAtqB,OAAA2Q,GAAAoY,UACApY,EAAAwZ,gBAAAzkB,KAAA4kB,GACA9E,EAAA7U,EAAAyZ,MAAAE,IAAA9E,MAMA6E,EAAAxqB,KAAAuqB,MAAAI,MAAA,EACAhF,KAAA6E,EACAA,EACAxqB,KAAAkpB,QAAAyB,EAAAxqB,OAAA,EAEAH,KAAAkpB,QAAAyB,EAAAxqB,OAAA,EAGAH,KAAA+qB,qBAGA/qB,KAAAgrB,OAAAhrB,KAAAgrB,OAAAzkB,IAAAvG,KAAA6pB,aAEA7pB,KAAA4iB,aAGA9T,EAAAE,GAAA0D,KAAA,gBAAA8X,IAGA7E,GAIA/C,WAAA,SAAAviB,GACA,GAAAA,EAAA,CACA,GAAAwf,GAAA7f,IAGA8O,GAAAa,OAAA3P,KAAA0kB,SAAArkB,GACAL,KAAA2kB,UAAA7V,EAAAlB,IAAA5N,KAAA0kB,SAAA,SAAAR,EAAA/jB,GACA,OACA+jB,UACAlV,QAAA6Q,EAAAwJ,WAAAlpB,GAAA,MAKAH,KAAAirB,YAAAnc,EAAA0G,KAAAxV,KAAAirB,YAAA,SAAAjc,GACA,QAAAA,EAAA7O,OAAAE,MAGAL,KAAAolB,SAAAxC,WACA5iB,KAAAolB,SAAAxC,WAAA5F,KAAAhd,UAAA0kB,SAAA1kB,KAAA2kB,WAEA3kB,KAAA6kB,qBAKAqG,UAAA,WACApc,EAAA9D,GAAAkgB,WACApc,EAAA9O,KAAA+lB,aAAAmF,YAEAlrB,KAAAkpB,WACAlpB,KAAA4oB,aACA5oB,KAAAqqB,cACArqB,KAAAmrB,YACA,IAAAjI,GAAAljB,KAAAkjB,WACAkI,WAAA,iBACA9Q,WAAA,eAEAta,MAAAqrB,cAAAnI,IAGAmI,cAAA,SAAAnI,GACA,GAAAzf,EAEA,IAAAzD,KAAAolB,SAAAzC,YACA,IAAAlf,EAAA,EAAgByf,EAAAzf,GAAeA,IAC/BzD,KAAAolB,SAAAzC,YAAA3F,KAAAhd,KAAAkjB,EAAAzf,GACAzD,KAAAolB,SAAA3C,WAAA,IACAziB,KAAAqpB,WAAAnG,EAAAzf,GAAAtD,MAAAsS,YAAAzS,KAAAolB,SAAA4C,gBAGA9E,GACAzQ,YAAAzS,KAAAolB,SAAA3C,YACAhQ,YAAAzS,KAAAolB,SAAA4C,aAIA+C,iBAAA,WACA,MAAA/qB,MAAAsrB,aAAAtrB,KAAAkpB,UAGAoC,aAAA,SAAAjtB,GAEA,GACAoF,GADA8nB,EAAA,CAEA,KAAA9nB,IAAApF,GAIAM,SAAAN,EAAAoF,IAAA,OAAApF,EAAAoF,IAAApF,EAAAoF,MAAA,GACA8nB,GAGA,OAAAA,IAGAJ,WAAA,WACAnrB,KAAAwoB,UAAAxoB,KAAAgrB,SAGAxC,UAAA,SAAAnoB,GACAA,EAAAmrB,IAAAxrB,KAAA6pB,YAAAhc,KAAA,IACA7N,KAAAyrB,WAAAprB,GAAA6Y,QAGA8J,MAAA,WACA,WAAAhjB,KAAA0rB,QAGAA,KAAA,WACA,MAAA1rB,MAAA2kB,UAAAhhB,QAGAsiB,aAAA,WACA,GAAAjmB,KAAAolB,SAAAa,aACA,IACAnX,EAAA9O,KAAA2rB,kBAAA3rB,KAAA2kB,UAAAhhB,QAAA3D,KAAA2kB,UAAA,GAAA3V,aACAd,OAAA,YACA6J,QAAA,SAGAA,QAAA,WACK,MAAArV,MAOLipB,eAAA,WACA,GAAApD,GAAAvoB,KAAAuoB,UACA,OAAAA,IAEI,IAFJzZ,EAAA0G,KAAAxV,KAAA2kB,UAAA,SAAAmD,GACA,MAAAA,GAAA9Y,QAAA7O,OAAAooB,EAAApoB,OACIwD,QAAA4kB,GAGJrF,SAAA,WACA,GAAArD,GAAA7f,KACA4rB,IAGA,OAAA9c,GAAA9O,KAAA+lB,aACA/U,KAAA,8CACAwa,IAAA,sCACAA,IAAAxrB,KAAAolB,SAAA5C,QACAtU,OAAA,WACA,GAAA/N,GAAAH,KAAAG,MAAA2O,EAAA9O,MAAA0S,KAAA,QACA8T,EAAA,mBAAA1X,GAAA9O,MAAA0S,KAAA,8BAAA5D,EAAA9O,MAAA0S,KAAA,kBAaA,QAXAvS,GAAA0f,EAAAuF,SAAAH,OAAAC,OAAAC,SACAA,QAAAtB,MAAA,0BAAA7jB,MAIAwmB,IACAxmB,KAAAoiB,KAAAtT,EAAA9O,MAAA+c,QAAA,WACA/c,KAAAG,QAIAH,KAAAoiB,OAAAvC,EAAAkG,gBAKA5lB,IAAAyrB,KAAA/L,EAAAyL,aAAAxc,EAAA9O,MAAAkmB,YAIA0F,EAAAzrB,IAAA,GACA,OAIAuqB,MAAA,SAAAmB,GACA,MAAA/c,GAAA+c,GAAA,IAGAxrB,OAAA,WACA,GAAAoiB,GAAAziB,KAAAolB,SAAA3C,WAAAnP,MAAA,KAAAgJ,KAAA,IACA,OAAAxN,GAAA9O,KAAAolB,SAAA6C,aAAA,IAAAxF,EAAAziB,KAAA4pB,eAGAkC,eAAA,WACA9rB,KAAAirB,eACAjrB,KAAA2kB,aACA3kB,KAAA0kB,YACA1kB,KAAA+rB,OAAAjd,MACA9O,KAAAgrB,OAAAlc,OAGAkb,MAAA,WACAhqB,KAAA8rB,iBACA9rB,KAAAsqB,gBAAAxb,OAGAub,YAAA,WACArqB,KAAAgqB,QACAhqB,KAAAgrB,OAAAhrB,KAAAK,SAAAkG,IAAAvG,KAAA6pB,aAGAgB,eAAA,SAAA7b,GACAhP,KAAAgqB,QACAhqB,KAAAgrB,OAAAhrB,KAAAyoB,UAAAzZ,IAGAga,aAAA,SAAAha,GACA,GAGAqE,GAAA/K,EAHA+G,EAAAP,EAAAE,GACA5P,EAAA4P,EAAA5P,KACAonB,EAAA,mBAAAnX,GAAAqD,KAAA,8BAAArD,EAAAqD,KAAA,kBAGA,iBAAAtT,GAAA,aAAAA,EACAY,KAAAqpB,WAAAra,EAAA7O,MAAA+N,OAAA,YAAAmF,MACI,WAAAjU,GAAA,mBAAA4P,GAAAgd,SACJhd,EAAAgd,SAAAC,SAAA,MAAA5c,EAAAgE,OAIAA,EADAmT,EACAnX,EAAAxB,OAEAwB,EAAAgE,MAGA,SAAAjU,EAGA,mBAAAiU,EAAAyG,OAAA,MACAzG,EAAAyG,OAAA,KAKAxR,EAAA+K,EAAA6Y,YAAA,KACA5jB,GAAA,EACA+K,EAAAyG,OAAAxR,EAAA,IAIAA,EAAA+K,EAAA6Y,YAAA,MACA5jB,GAAA,EACA+K,EAAAyG,OAAAxR,EAAA,GAIA+K,IAGA,gBAAAA,GACAA,EAAA4T,QAAA,UAEA5T,IAGAkX,MAAA,SAAAvb,GACAA,EAAAhP,KAAA4qB,oBAAA5qB,KAAA0qB,MAAA1b,GAEA,IAMA2W,GAAAgB,EAAAwF,EAAAC,EANAlG,EAAApX,EAAAE,GAAAkX,QACAmG,EAAAvd,EAAAlB,IAAAsY,EAAA,SAAA4B,EAAArkB,GACA,MAAAA,KACKE,OACL2oB,GAAA,EACAjZ,EAAArT,KAAAgpB,aAAAha,EAIAhP,MAAAusB,aAAAvd,GAIA,kBAAAkX,GAAAkG,WACAA,EAAAlG,EAAAkG,WACI,kBAAApsB,MAAAolB,SAAAgH,aACJA,EAAApsB,KAAAolB,SAAAgH,YAMAA,IACA/Y,EAAA+Y,EAAApP,KAAAhO,EAAAqE,SAGA6S,GAAAkG,WAGA,KAAAzF,IAAAT,GAAA,CACAiG,GAAYxF,SAAA6F,WAAAtG,EAAAS,GACZ,KAKA,GAJAhB,EAAA7W,EAAA+Q,UAAAhgB,QAAA8mB,GAAA3J,KAAAhd,KAAAqT,EAAArE,EAAAmd,EAAAK,YAIA,wBAAA7G,GAAA,IAAA0G,EAAA,CACAC,GAAA,CACA,UAIA,GAFAA,GAAA,EAEA,YAAA3G,EAEA,YADA3lB,KAAAgrB,OAAAhrB,KAAAgrB,OAAAQ,IAAAxrB,KAAAyoB,UAAAzZ,IAIA,KAAA2W,EAEA,MADA3lB,MAAAysB,aAAAzd,EAAAmd,IACA,EAEK,MAAAzpB,GAQL,KAPA1C,MAAAolB,SAAAH,OAAAC,OAAAC,SACAA,QAAA3jB,IAAA,4CAAAwN,EAAAzN,GAAA,gBAAA4qB,EAAAxF,OAAA,YAAAjkB,GAEAA,YAAAgqB,aACAhqB,EAAAwhB,SAAA,+CAAAlV,EAAAzN,GAAA,gBAAA4qB,EAAAxF,OAAA,aAGAjkB,GAGA,IAAA4pB,EAMA,MAHAtsB,MAAAsrB,aAAApF,IACAlmB,KAAAirB,YAAAplB,KAAAmJ,IAEA,GAMA2d,kBAAA,SAAA3d,EAAA2X,GACA,MAAA7X,GAAAE,GAAA5O,KAAA,MAAAumB,EAAAiG,OAAA,GAAAC,cACAlG,EAAAmG,UAAA,GAAAlW,gBAAA9H,EAAAE,GAAA5O,KAAA,QAIA2sB,cAAA,SAAA5sB,EAAAwmB,GACA,GAAAqG,GAAAhtB,KAAAolB,SAAAla,SAAA/K,EACA,OAAA6sB,OAAAzc,cAAA5Q,OAAAqtB,IAAArG,KAIAsG,YAAA,WACA,OAAAxpB,GAAA,EAAmBA,EAAAikB,UAAA/jB,OAAsBF,IACzC,GAAA9E,SAAA+oB,UAAAjkB,GACA,MAAAikB,WAAAjkB,IAeAypB,eAAA,SAAAle,EAAAmd,GACA,gBAAAA,KACAA,GAAYxF,OAAAwF,GAGZ,IAAAjI,GAAAlkB,KAAAitB,YACAjtB,KAAA+sB,cAAA/d,EAAA7O,KAAAgsB,EAAAxF,QACA3mB,KAAA2sB,kBAAA3d,EAAAmd,EAAAxF,SAGA3mB,KAAAolB,SAAAiD,aAAArZ,EAAAlC,OAAAnO,OACAmQ,EAAA+Q,UAAA3U,SAAAihB,EAAAxF,QACA,2CAAA3X,EAAA7O,KAAA,aAEAgtB,EAAA,eAOA,OANA,kBAAAjJ,GACAA,IAAAlH,KAAAhd,KAAAmsB,EAAAK,WAAAxd,GACIme,EAAAhR,KAAA+H,KACJA,EAAApV,EAAA+Q,UAAA3d,OAAAgiB,EAAA+C,QAAAkG,EAAA,QAAkEhB,EAAAK,aAGlEtI,GAGAuI,aAAA,SAAAzd,EAAAmd,GACA,GAAAjI,GAAAlkB,KAAAktB,eAAAle,EAAAmd,EAEAnsB,MAAA2kB,UAAA9e,MACAqe,UACAlV,UACA2X,OAAAwF,EAAAxF,SAGA3mB,KAAA0kB,SAAA1V,EAAA7O,MAAA+jB,EACAlkB,KAAA4oB,UAAA5Z,EAAA7O,MAAA+jB,GAGAuH,WAAA,SAAA2B,GAIA,MAHAptB,MAAAolB,SAAAiI,UACAD,IAAA7mB,IAAA6mB,EAAApU,OAAAhZ,KAAAolB,SAAAiI,WAEAD,GAGAvI,kBAAA,WACA,GAAAphB,GAAAyf,EAAAW,CACA,KAAApgB,EAAA,EAAezD,KAAA2kB,UAAAlhB,GAAqBA,IACpCogB,EAAA7jB,KAAA2kB,UAAAlhB,GACAzD,KAAAolB,SAAA1C,WACA1iB,KAAAolB,SAAA1C,UAAA1F,KAAAhd,KAAA6jB,EAAA7U,QAAAhP,KAAAolB,SAAA3C,WAAAziB,KAAAolB,SAAA4C,YAEAhoB,KAAAstB,UAAAzJ,EAAA7U,QAAA6U,EAAAK,QAKA,IAHAlkB,KAAA2kB,UAAAhhB,SACA3D,KAAA+rB,OAAA/rB,KAAA+rB,OAAAxlB,IAAAvG,KAAA6pB,aAEA7pB,KAAAolB,SAAA9kB,QACA,IAAAmD,EAAA,EAAgBzD,KAAAirB,YAAAxnB,GAAuBA,IACvCzD,KAAAstB,UAAAttB,KAAAirB,YAAAxnB,GAGA,IAAAzD,KAAAolB,SAAAzC,YACA,IAAAlf,EAAA,EAAAyf,EAAAljB,KAAAutB,gBAAiDrK,EAAAzf,GAAeA,IAChEzD,KAAAolB,SAAAzC,YAAA3F,KAAAhd,KAAAkjB,EAAAzf,GAAAzD,KAAAolB,SAAA3C,WAAAziB,KAAAolB,SAAA4C,WAGAhoB,MAAAgrB,OAAAhrB,KAAAgrB,OAAAQ,IAAAxrB,KAAA+rB,QACA/rB,KAAAmrB,aACAnrB,KAAAyrB,WAAAzrB,KAAA+rB,QAAA9T,QAGAsV,cAAA,WACA,MAAAvtB,MAAAsqB,gBAAAkB,IAAAxrB,KAAAwtB,oBAGAA,gBAAA,WACA,MAAA1e,GAAA9O,KAAA2kB,WAAA/W,IAAA,WACA,MAAA5N,MAAAgP,WAIAse,UAAA,SAAAte,EAAAkV,GACA,GAAAuJ,GAAAzf,EAAA0f,EAAA5c,EACA+S,EAAA7jB,KAAAyoB,UAAAzZ,GACA2e,EAAA3tB,KAAA4tB,SAAA5e,GACA6e,EAAA/e,EAAAE,GAAA0D,KAAA,mBAEAmR,GAAAlgB,QAGAkgB,EAAApR,YAAAzS,KAAAolB,SAAA4C,YAAAzV,SAAAvS,KAAAolB,SAAA3C,YAGAziB,KAAAolB,UAAAplB,KAAAolB,SAAA0I,WACAjK,EAAAhW,KAAAqW,GAAA,IAEAL,EAAArN,KAAA0N,GAAA,MAKAL,EAAA/U,EAAA,IAAA9O,KAAAolB,SAAA6C,aAAA,KACAvV,KAAA,KAAAib,EAAA,UACApb,SAAAvS,KAAAolB,SAAA3C,YAEAziB,KAAAolB,UAAAplB,KAAAolB,SAAA0I,WACAjK,EAAAhW,KAAAqW,GAAA,IAEAL,EAAArN,KAAA0N,GAAA,IAIAuJ,EAAA5J,EACA7jB,KAAAolB,SAAAiI,UAIAI,EAAA5J,EAAA3K,OAAAjB,OAAA8V,KAAA,IAAA/tB,KAAAolB,SAAAiI,QAAA,MAAArU,UAEAhZ,KAAA2pB,eAAAhmB,OACA3D,KAAA2pB,eAAA1W,OAAAwa,GACKztB,KAAAolB,SAAAvC,eACL7iB,KAAAolB,SAAAvC,eAAA7F,KAAAhd,KAAAytB,EAAA3e,EAAAE,IAEAye,EAAAO,YAAAhf,GAIA6U,EAAAzN,GAAA,SAGAyN,EAAAnR,KAAA,MAAAib,GAIK,IAAA9J,EAAAoK,QAAA,cAAAjuB,KAAAkuB,cAAAP,GAAA,MAAAhqB,SACL+pB,EAAA7J,EAAAnR,KAAA,MAGAmb,EAEMA,EAAArb,MAAA,GAAA0J,QAAA,MAAAlc,KAAAkuB,cAAAR,GAAA,UAGNG,GAAA,IAAAH,GAJAG,EAAAH,EAMA5e,EAAAE,GAAA0D,KAAA,mBAAAmb,GAGA7f,EAAAhO,KAAAwN,OAAAwB,EAAA7O,MACA6N,IACA8C,EAAA9Q,KACA8O,EAAAI,KAAA4B,EAAAtD,OAAA,SAAArN,EAAA2qB,GACAA,IAAA9c,GACAc,EAAA,UAAAgC,EAAAod,cAAA/tB,GAAA,KAAA2Q,EAAAiV,aACArT,KAAA,mBAAAmR,EAAAnR,KAAA,aAMAwR,GAAAlkB,KAAAolB,SAAA9kB,UACAujB,EAAAhW,KAAA,IACA,gBAAA7N,MAAAolB,SAAA9kB,QACAujB,EAAAtR,SAAAvS,KAAAolB,SAAA9kB,SAEAN,KAAAolB,SAAA9kB,QAAAujB,EAAA7U,IAGAhP,KAAA+rB,OAAA/rB,KAAA+rB,OAAAxlB,IAAAsd,IAGA4E,UAAA,SAAAzZ,GACA,GAAA7O,GAAAH,KAAAkuB,cAAAluB,KAAA4tB,SAAA5e,IACAmf,EAAArf,EAAAE,GAAA0D,KAAA,oBACAmZ,EAAA,cAAA1rB,EAAA,kBAAAA,EAAA,MAQA,OALAguB,KACAtC,IAAA,MAAA7rB,KAAAkuB,cAAAC,GACAlH,QAAA,eAGAjnB,KACAK,SACA6N,OAAA2d,IAMAqC,cAAA,SAAA3Z,GACA,MAAA5V,UAAA4V,EACA,GAGAA,EAAA0S,QAAA,0CAA6D,SAG7D2G,SAAA,SAAA5e,GACA,MAAAhP,MAAAwN,OAAAwB,EAAA7O,QAAAH,KAAA2oB,UAAA3Z,KAAA7O,KAAA6O,EAAAzN,IAAAyN,EAAA7O,OAGAyqB,oBAAA,SAAA5b,GAQA,MALAhP,MAAA2oB,UAAA3Z,KACAA,EAAAhP,KAAAqpB,WAAAra,EAAA7O,OAIA2O,EAAAE,GAAAwc,IAAAxrB,KAAAolB,SAAA5C,QAAA,IAGAmG,UAAA,SAAA3Z,GACA,wBAAAmN,KAAAnN,EAAA5P,OAGAiqB,WAAA,SAAAlpB,GACA,MAAA2O,GAAA9O,KAAA+lB,aAAA/U,KAAA,UAAAhR,KAAAkuB,cAAA/tB,GAAA,OAGAiuB,UAAA,SAAA5vB,EAAAwQ,GACA,OAAAA,EAAA8H,SAAAF,eACA,aACA,MAAA9H,GAAA,kBAAAE,GAAArL,MACA,aACA,GAAA3D,KAAA2oB,UAAA3Z,GACA,MAAAhP,MAAAqpB,WAAAra,EAAA7O,MAAA+N,OAAA,YAAAvK,OAGA,MAAAnF,GAAAmF,QAGA0qB,OAAA,SAAA1N,EAAA3R,GACA,OAAAhP,KAAAsuB,kBAAA3N,KAAA3gB,KAAAsuB,kBAAA3N,MAAA3R,IAGAsf,aACAC,QAAA,SAAA5N,GACA,MAAAA,IAEApM,OAAA,SAAAoM,EAAA3R,GACA,QAAAF,EAAA6R,EAAA3R,EAAAoT,MAAAze,QAEA6qB,SAAA,SAAA7N,EAAA3R,GACA,MAAA2R,GAAA3R,KAIA6R,SAAA,SAAA7R,GACA,GAAAqE,GAAArT,KAAAgpB,aAAAha,EACA,QAAAF,EAAA+Q,UAAAhgB,QAAAL,SAAAwd,KAAAhd,KAAAqT,EAAArE,IAAA,uBAGAyf,gBAAA,SAAAzf,GACA,iBAAAA,EAAA7O,MAGAuuB,aAAA,SAAA1f,GACAhP,KAAA+pB,QAAA/a,EAAA7O,QACAH,KAAAgmB,iBACAlX,EAAAE,GAAAuD,SAAAvS,KAAAolB,SAAA2C,cACA/nB,KAAA+pB,QAAA/a,EAAA7O,OAAA,IAIAwuB,YAAA,SAAA3f,EAAAgU,GACAhjB,KAAAgmB,iBAGAhmB,KAAAgmB,eAAA,IACAhmB,KAAAgmB,eAAA,SAEAhmB,MAAA+pB,QAAA/a,EAAA7O,MACA2O,EAAAE,GAAAyD,YAAAzS,KAAAolB,SAAA2C,cACA/E,GAAA,IAAAhjB,KAAAgmB,gBAAAhmB,KAAA6lB,eAAA7lB,KAAAoiB,QAAA,IAAApiB,KAAAgmB,gBACAlX,EAAA9O,KAAA+lB,aAAAhO,QAAA,UAMA/X,KAAAulB,cACAzW,EAAA,sBAAA9O,KAAAulB,aAAAplB,KAAA,KAAAH,KAAA+lB,aAAA5M,SAGAnZ,KAAA6lB,eAAA,IACI7C,GAAA,IAAAhjB,KAAAgmB,gBAAAhmB,KAAA6lB,gBACJ/W,EAAA9O,KAAA+lB,aAAAqE,eAAA,gBAAApqB,OACAA,KAAA6lB,eAAA,IAIA0G,aAAA,SAAAvd,GACA,GAAA4f,EAEA5uB,MAAA+pB,QAAA/a,EAAA7O,QACAyuB,EAAA5uB,KAAAyuB,gBAAAzf,GACAF,EAAA+f,UAAAD,GAEA5uB,KAAAgmB,iBAGAhmB,KAAAgmB,eAAA,IACAhmB,KAAAgmB,eAAA,SAGAhmB,MAAA+pB,QAAA/a,EAAA7O,MACA2O,EAAAE,GAAAyD,YAAAzS,KAAAolB,SAAA2C,gBAIAphB,cAAA,SAAAqI,EAAA2X,GAGA,MAFAA,GAAA,gBAAAA,OAAA,SAEA7X,EAAA1O,KAAA4O,EAAA,kBAAAF,EAAA1O,KAAA4O,EAAA,iBACAvG,IAAA,KACAua,OAAA,EACAkB,QAAAlkB,KAAAktB,eAAAle,GAA4C2X,cAK5CmI,QAAA,WACA9uB,KAAAkrB,YAEApc,EAAA9O,KAAA+lB,aACAgJ,IAAA,aACA3D,WAAA,aACApa,KAAA,0BACA+d,IAAA,qBACAtc,YAAA,yBACAzB,KAAA,2BACA+d,IAAA,sBACAtc,YAAA,0BACAzB,KAAA,gCACA+d,IAAA,2BACAtc,YAAA,+BACAzB,KAAA,mCACA+d,IAAA,8BACAtc,YAAA,kCACAzB,KAAA,8BACA+d,IAAA,yBACAtc,YAAA,+BAKAuc,mBACAxvB,UAAaA,UAAA,GACbugB,OAAUA,OAAA,GACVC,KAAQA,KAAA,GACR7Y,MAASA,MAAA,GACT8Y,SAAYA,SAAA,GACZC,QAAWA,QAAA,GACXC,QAAWA,QAAA,GACXC,YAAeA,YAAA,IAGf6O,cAAA,SAAAC,EAAAhJ,GACAgJ,EAAA3e,cAAA5Q,OACAK,KAAAgvB,kBAAAE,GAAAhJ,EAEApX,EAAAa,OAAA3P,KAAAgvB,kBAAAE,IAIArI,WAAA,SAAA7X,GACA,GAAAkX,MACAiJ,EAAArgB,EAAAE,GAAA0D,KAAA,QASA,OAPAyc,IACArgB,EAAAI,KAAAigB,EAAA7b,MAAA,gBACAtT,OAAA8O,GAAA+Q,UAAAmP,mBACAlgB,EAAAa,OAAAuW,EAAApX,EAAA+Q,UAAAmP,kBAAAhvB,SAIAkmB,GAGAkJ,uBAAA,SAAAlJ,EAAA9mB,EAAAunB,EAAAnoB,GAIA,eAAA2d,KAAAwK,KAAA,OAAAvnB,GAAA,oBAAA+c,KAAA/c,MACAZ,EAAA6wB,OAAA7wB,GAGA8wB,MAAA9wB,KACAA,EAAAG,SAIAH,GAAA,IAAAA,EACA0nB,EAAAS,GAAAnoB,EACGY,IAAAunB,GAAA,UAAAvnB,IAIH8mB,EAAA,SAAA9mB,EAAA,UAAAunB,IAAA,IAIAG,eAAA,SAAA9X,GACA,GAGA2X,GAAAnoB,EAHA0nB,KACA7W,EAAAP,EAAAE,GACA5P,EAAA4P,EAAAugB,aAAA,OAGA,KAAA5I,IAAA7X,GAAA+Q,UAAAhgB,QAGA,aAAA8mB,GACAnoB,EAAAwQ,EAAAugB,aAAA5I,GAIA,KAAAnoB,IACAA,GAAA,GAIAA,OAEAA,EAAA6Q,EAAAqD,KAAAiU,GAGA3mB,KAAAovB,uBAAAlJ,EAAA9mB,EAAAunB,EAAAnoB,EAQA,OAJA0nB,GAAA5F,WAAA,uBAAAnE,KAAA+J,EAAA5F,kBACA4F,GAAA5F,UAGA4F,GAGAa,UAAA,SAAA/X,GACA,GAGA2X,GAAAnoB,EAHA0nB,KACA7W,EAAAP,EAAAE,GACA5P,EAAA4P,EAAAugB,aAAA,OAGA,KAAA5I,IAAA7X,GAAA+Q,UAAAhgB,QACArB,EAAA6Q,EAAAjP,KAAA,OAAAumB,EAAAiG,OAAA,GAAAC,cAAAlG,EAAAmG,UAAA,GAAAlW,eAGA,KAAApY,IACAA,GAAA,GAGAwB,KAAAovB,uBAAAlJ,EAAA9mB,EAAAunB,EAAAnoB,EAEA,OAAA0nB,IAGAG,YAAA,SAAArX,GACA,GAAAkX,MACArG,EAAA/Q,EAAA1O,KAAA4O,EAAAoT,KAAA,YAKA,OAHAvC,GAAAuF,SAAAc,QACAA,EAAApX,EAAA+Q,UAAA4G,cAAA5G,EAAAuF,SAAAc,MAAAlX,EAAA7O,YAEA+lB,GAGAU,eAAA,SAAAV,EAAAlX,GAmEA,MAhEAF,GAAAI,KAAAgX,EAAA,SAAAvP,EAAAtD,GAGA,GAAAA,KAAA,EAEA,kBADA6S,GAAAvP,EAGA,IAAAtD,EAAAsN,OAAAtN,EAAAmc,QAAA,CACA,GAAAC,IAAA,CACA,cAAApc,GAAAmc,SACA,aACAC,IAAA3gB,EAAAuE,EAAAmc,QAAAxgB,EAAAoT,MAAAze,MACA,MACA,gBACA8rB,EAAApc,EAAAmc,QAAAxS,KAAAhO,KAGAygB,EACAvJ,EAAAvP,GAAAhY,SAAA0U,EAAAsN,OAAAtN,EAAAsN,OAEA7R,EAAA1O,KAAA4O,EAAAoT,KAAA,aAAAiJ,cAAAvc,EAAAE,UACAkX,GAAAvP,OAMA7H,EAAAI,KAAAgX,EAAA,SAAAiG,EAAAuD,GACAxJ,EAAAiG,GAAA,kBAAAuD,IAAA,eAAAvD,EAAAuD,EAAA1gB,GAAA0gB,IAIA5gB,EAAAI,MAAA,oCACAgX,EAAAlmB,QACAkmB,EAAAlmB,MAAAqvB,OAAAnJ,EAAAlmB,UAGA8O,EAAAI,MAAA,kCACA,GAAAygB,EACAzJ,GAAAlmB,QACAuD,MAAAC,QAAA0iB,EAAAlmB,OACAkmB,EAAAlmB,OAAAqvB,OAAAnJ,EAAAlmB,MAAA,IAAAqvB,OAAAnJ,EAAAlmB,MAAA,KACK,gBAAAkmB,GAAAlmB,QACL2vB,EAAAzJ,EAAAlmB,MAAAinB,QAAA,cAAA3T,MAAA,UACA4S,EAAAlmB,OAAAqvB,OAAAM,EAAA,IAAAN,OAAAM,EAAA,SAKA7gB,EAAA+Q,UAAA2J,mBAGA,MAAAtD,EAAAhhB,KAAA,MAAAghB,EAAA/gB,MACA+gB,EAAAzF,OAAAyF,EAAAhhB,IAAAghB,EAAA/gB,WACA+gB,GAAAhhB,UACAghB,GAAA/gB,KAEA,MAAA+gB,EAAA3F,WAAA,MAAA2F,EAAA5F,YACA4F,EAAA1F,aAAA0F,EAAA3F,UAAA2F,EAAA5F,iBACA4F,GAAA3F,gBACA2F,GAAA5F,YAIA4F,GAIAO,cAAA,SAAArmB,GACA,mBAAAA,GAAA,CACA,GAAAwvB,KACA9gB,GAAAI,KAAA9O,EAAAkT,MAAA,iBACAsc,EAAA5vB,OAAA,IAEAI,EAAAwvB,EAEA,MAAAxvB,IAIAsgB,UAAA,SAAAvgB,EAAAwmB,EAAAzC,GACApV,EAAA+Q,UAAAhgB,QAAAM,GAAAwmB,EACA7X,EAAA+Q,UAAA3U,SAAA/K,GAAAxB,SAAAulB,IAAApV,EAAA+Q,UAAA3U,SAAA/K,GACAwmB,EAAAhjB,OAAA,GACAmL,EAAA+Q,UAAAoP,cAAA9uB,EAAA2O,EAAA+Q,UAAA4G,cAAAtmB,KAKAN,SAGAL,SAAA,SAAAhB,EAAAwQ,EAAA2R,GAGA,IAAA3gB,KAAAquB,OAAA1N,EAAA3R,GACA,2BAEA,eAAAA,EAAA8H,SAAAF,cAAA,CAGA,GAAAvD,GAAAvE,EAAAE,GAAAqE,KACA,OAAAA,MAAA1P,OAAA,EAEA,MAAA3D,MAAA2oB,UAAA3Z,GACAhP,KAAAouB,UAAA5vB,EAAAwQ,GAAA,EAEArQ,SAAAH,GAAA,OAAAA,KAAAmF,OAAA,GAIAoc,MAAA,SAAAvhB,EAAAwQ,GAMA,MAAAhP,MAAA6gB,SAAA7R,IAAA,wIAA4JmN,KAAA3d,IAI5JwhB,IAAA,SAAAxhB,EAAAwQ,GAMA,MAAAhP,MAAA6gB,SAAA7R,IAAA,mhBAAqiBmN,KAAA3d,IAIriB2I,KAAA,WACA,GAAA0oB,IAAA,CAEA,iBAAArxB,EAAAwQ,GAcA,MAbA6gB,KACAA,GAAA,EACA7vB,KAAAolB,SAAAH,OAAAC,OAAAC,SACAA,QAAA1jB,KACA,uTASAzB,KAAA6gB,SAAA7R,KAAA,cAAAmN,KAAA,GAAAxE,MAAAnZ,GAAAsxB,gBAKA7P,QAAA,SAAAzhB,EAAAwQ,GACA,MAAAhP,MAAA6gB,SAAA7R,IAAA,+DAA6CmN,KAAA3d,IAI7C0hB,OAAA,SAAA1hB,EAAAwQ,GACA,MAAAhP,MAAA6gB,SAAA7R,IAAA,8CAAmEmN,KAAA3d,IAInE2hB,OAAA,SAAA3hB,EAAAwQ,GACA,MAAAhP,MAAA6gB,SAAA7R,IAAA,QAAAmN,KAAA3d,IAIA+hB,UAAA,SAAA/hB,EAAAwQ,EAAA2R,GACA,GAAAhd,GAAAJ,MAAAC,QAAAhF,KAAAmF,OAAA3D,KAAAouB,UAAA5vB,EAAAwQ,EACA,OAAAhP,MAAA6gB,SAAA7R,IAAArL,GAAAgd,GAIAL,UAAA,SAAA9hB,EAAAwQ,EAAA2R,GACA,GAAAhd,GAAAJ,MAAAC,QAAAhF,KAAAmF,OAAA3D,KAAAouB,UAAA5vB,EAAAwQ,EACA,OAAAhP,MAAA6gB,SAAA7R,IAAArL,GAAAgd,GAIAH,YAAA,SAAAhiB,EAAAwQ,EAAA2R,GACA,GAAAhd,GAAAJ,MAAAC,QAAAhF,KAAAmF,OAAA3D,KAAAouB,UAAA5vB,EAAAwQ,EACA,OAAAhP,MAAA6gB,SAAA7R,IAAArL,GAAAgd,EAAA,IAAAhd,GAAAgd,EAAA,IAIAzb,IAAA,SAAA1G,EAAAwQ,EAAA2R,GACA,MAAA3gB,MAAA6gB,SAAA7R,IAAAxQ,GAAAmiB,GAIAxb,IAAA,SAAA3G,EAAAwQ,EAAA2R,GACA,MAAA3gB,MAAA6gB,SAAA7R,IAAAxQ,GAAAmiB,GAIAF,MAAA,SAAAjiB,EAAAwQ,EAAA2R,GACA,MAAA3gB,MAAA6gB,SAAA7R,IAAAxQ,GAAAmiB,EAAA,IAAAniB,GAAAmiB,EAAA,IAIA4I,KAAA,SAAA/qB,EAAAwQ,EAAA2R,GACA,GAkBAoP,GAlBA3wB,EAAA0P,EAAAE,GAAA0D,KAAA,QACAsd,EAAA,gCAAA5wB,EAAA,qBACA6wB,GAAA,yBACAC,EAAA,GAAAhU,QAAA,MAAA9c,EAAA,OACA+wB,EAAA/wB,IAAA8wB,EAAA/T,KAAA8T,EAAA3T,QACA8T,EAAA,SAAAC,GACA,GAAA7d,IAAA,GAAA6d,GAAA7d,MAAA,gBACA,OAAAA,IAKAA,EAAA,GAAAA,EAAA,GAAA7O,OAJA,GAMA2sB,EAAA,SAAAD,GACA,MAAA5Y,MAAA8Y,MAAAF,EAAA5Y,KAAA+Y,IAAA,GAAAT,KAEA/M,GAAA,CAKA,IAAAmN,EACA,SAAAM,OAAAT,EAUA,OAPAD,GAAAK,EAAAzP,IAGAyP,EAAA5xB,GAAAuxB,GAAAO,EAAA9xB,GAAA8xB,EAAA3P,KAAA,KACAqC,GAAA,GAGAhjB,KAAA6gB,SAAA7R,IAAAgU,GAIA3C,QAAA,SAAA7hB,EAAAwQ,EAAA2R,GAGA,GAAAzgB,GAAA4O,EAAA6R,EAMA,OALA3gB,MAAAolB,SAAAsD,YAAAxoB,EAAAsrB,IAAA,0BAAA7nB,QACAzD,EAAAqS,SAAA,yBAAAkB,GAAA;AACA3E,EAAAE,GAAAgU,UAGAxkB,IAAA0B,EAAAmT,OAIAyM,OAAA,SAAAthB,EAAAwQ,EAAA2R,EAAAgG,GACA,GAAA3mB,KAAA6gB,SAAA7R,GACA,2BAGA2X,GAAA,gBAAAA,OAAA,QAEA,IACA9G,GAAAzf,EAAAswB,EADAjpB,EAAAzH,KAAA2G,cAAAqI,EAAA2X,EAWA,OARA3mB,MAAAolB,SAAAla,SAAA8D,EAAA7O,QACAH,KAAAolB,SAAAla,SAAA8D,EAAA7O,UAEAsH,EAAAkpB,gBAAAlpB,EAAAkpB,iBAAA3wB,KAAAolB,SAAAla,SAAA8D,EAAA7O,MAAAwmB,GACA3mB,KAAAolB,SAAAla,SAAA8D,EAAA7O,MAAAwmB,GAAAlf,EAAAyc,QAEAvD,EAAA,gBAAAA,KAAyCX,IAAAW,IAAaA,EACtD+P,EAAA5hB,EAAA6R,MAAA7R,EAAAa,QAA0CvP,KAAA5B,GAAcmiB,EAAAvgB,OACxDqH,EAAAgB,MAAAioB,EACAjpB,EAAAub,OAGAvb,EAAAgB,IAAAioB,EACA7Q,EAAA7f,KACAA,KAAA0uB,aAAA1f,GACA5O,KACAA,EAAA4O,EAAA7O,MAAA3B,EACAsQ,EAAA8hB,KAAA9hB,EAAAa,QAAA,GACA+E,KAAA,QACAka,KAAA5uB,KAAAyuB,gBAAAzf,GACA6hB,SAAA,OACAzwB,OACA0wB,QAAAjR,EAAAkG,YACAzlB,QAAA,SAAAqjB,GACA,GACAtjB,GAAA6jB,EAAA0E,EADA5F,EAAAW,KAAA,YAAAA,CAGA9D,GAAAuF,SAAAla,SAAA8D,EAAA7O,MAAAwmB,GAAAlf,EAAAkpB,gBACA3N,GACA4F,EAAA/I,EAAAgG,cACAhG,EAAAmL,OAAAnL,EAAA4I,UAAAzZ,GACA6Q,EAAAgG,cAAA+C,EACA/I,EAAAoL,YAAAplB,KAAAmJ,GACA6Q,EAAAqJ,QAAAla,EAAA7O,OAAA,EACA0f,EAAA+C,eAEAviB,KACA6jB,EAAAP,GAAA9D,EAAAqN,eAAAle,GAAgE2X,SAAA6F,WAAAhuB,IAChE6B,EAAA2O,EAAA7O,MAAAsH,EAAAyc,UACArE,EAAAqJ,QAAAla,EAAA7O,OAAA,EACA0f,EAAA+C,WAAAviB,IAEAoH,EAAAub,QACAnD,EAAA8O,YAAA3f,EAAAgU,KAEIrC,IACJ,cAWA,IACAiQ,GADAG,IAmCA,OA/BAjiB,GAAAkiB,cACAliB,EAAAkiB,cAAA,SAAA5L,EAAA/Z,EAAA4lB,GACA,GAAArC,GAAAxJ,EAAAwJ,IACA,WAAAxJ,EAAA1Q,OACA5F,EAAA+f,UAAAD,GACAmC,EAAAnC,GAAAqC,MAMAL,EAAA9hB,EAAA8hB,KACA9hB,EAAA8hB,KAAA,SAAAxL,GACA,GAAA1Q,IAAA,QAAA0Q,KAAAtW,EAAAoiB,cAAAxc,KACAka,GAAA,QAAAxJ,KAAAtW,EAAAoiB,cAAAtC,IACA,iBAAAla,GACA5F,EAAA+f,UAAAD,GACAmC,EAAAnC,GAAAgC,EAAAhuB,MAAA5C,KAAA0nB,WACAqJ,EAAAnC,IAEAgC,EAAAhuB,MAAA5C,KAAA0nB,aAKA5Y,EAAA+f,UAAA,SAAAD,GACAmC,EAAAnC,KACAmC,EAAAnC,GAAAuC,cACAJ,GAAAnC,KAGA9f,K3C23FMsiB,KACN,GAEMC,KACA,SAAS3zB,EAAQC,EAASC,G4CjiJhC,GAAAsb,GAAAtb,EAAA,GACAF,GAAAC,QAAA,SAAAuC,EAAAsU,EAAA8c,GACA,OAAArH,KAAAzV,GACA8c,GAAApxB,EAAA+pB,GAAA/pB,EAAA+pB,GAAAzV,EAAAyV,GACA/Q,EAAAhZ,EAAA+pB,EAAAzV,EAAAyV,GACG,OAAA/pB,K5CyiJGqxB,MACL,IAAK,IAEAC,KACA,SAAS9zB,EAAQC,EAASC,GAE/B,YA8BA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GA5BvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIizB,GAAO7zB,EAAoB,MAE3B8zB,EAAQtzB,uBAAuBqzB,G6C5jJpC/mB,EAAA9M,EAAA,I7CgkJK+M,EAAWvM,uBAAuBsM,G6C/jJvCE,EAAAhN,EAAA,K7CmkJK+zB,EAASvzB,uBAAuBwM,G6ClkJrChM,EAAAhB,EAAA,I7CskJKiB,EAAWT,uBAAuBQ,G6CrkJvCgzB,EAAAh0B,EAAA,M7CykJKi0B,EAAiBzzB,uBAAuBwzB,G6CxkJ7CE,EAAAl0B,EAAA,M7C4kJKm0B,EAAsB3zB,uBAAuB0zB,G6C1kJ5CE,EAAe9M,OAAO+M,MAAQ/M,OAAOgN,YAAchN,OAAOiN,UAAYjN,OAAOkN,KAC7EC,EAAO5a,KAAK+Y,IAAI,KAAM,GACtB8B,EAAO7a,KAAK+Y,IAAI,KAAM,GACtB+B,EAAO,KAGP/S,GAAiBC,kBACnBpC,KAAM,SACNmV,aAAc,iBACdC,UAAW,cACXC,SAAU,aACVC,UAAW,cACXC,WAAY,iBAGV1nB,GACF2nB,WAAYC,UAAKznB,EAAE,0DAA2DmU,cAAeA,IAC7FuT,oBAAqBD,UAAKznB,EAAE,sBAC5B2nB,mBAAoBF,UAAKznB,EAAE,sBAC3B4nB,oBAAqBH,UAAKznB,EAAE,6BAC5B6nB,mBAAoBJ,UAAKznB,EAAE,6BAC3B8nB,aAAcL,UAAKznB,EAAE,6DAA8DmU,cAAeA,IAClG4T,aAAcN,UAAKznB,EAAE,uBACrBgoB,QAASP,UAAKznB,EAAE,+EAChBioB,2BAA4BR,UAAKznB,EAAE,oDACnCkoB,UAAWT,UAAKznB,EAAE,0DAA2DmU,cAAeA,IAC5FgU,kBAAmBV,UAAKznB,EAAE,6EAA8EmU,cAAeA,IACvHiU,UAAWX,UAAKznB,EAAE,sEAAuEmU,cAAeA,IACxGkU,6BAA8BZ,UAAKznB,EAAE,4K7CglJxC1N,GAAQK,S6ClkJL21B,YAAY,EAEZC,gBAAgB,EAEhBC,WAAY,cAEZta,OAAO,EAEPnZ,KAbW,WAcP,OACI0zB,SACAzzB,OAAQ,GAAAqxB,GAAA1zB,QACR+1B,UAAU,EACVC,gBAAiB,KACjBhC,iBAGR5wB,UACI6yB,QADM,WAEF,OAAO,IAGf5nB,MA3BW,WA4BPrM,KAAKk0B,KAAO,GAAIC,WAAGC,aACfC,iBAAkBr0B,KAAKi0B,SAAWj0B,KAAK+I,QACvComB,SACI0E,WAAY7zB,KAAKuC,SAASsxB,YAAc,eAE5CS,WACIC,+BAAgCv0B,KAAKw0B,6BAG7Cx0B,KAAKy0B,mBAGT3xB,OACImxB,QADG,SACKA,GACAA,EACAj0B,KAAKk0B,KAAKQ,mBAAmB10B,KAAK+I,KAElC/I,KAAKk0B,KAAKS,WAGlBX,gBARG,WASCh0B,KAAKy0B,oBAGb3mB,SACI8mB,QADK,SACGC,GACJ,MAAOA,GAASvhB,MAAM,KAAKvM,OAE/B+tB,SAJK,SAIIpJ,GACL,OAAKA,GAAQA,GAAQ,EACV,IAEPA,EAAO2G,EACA5a,KAAK8Y,MAAa,IAAP7E,EAAa2G,GAAQ,IAAM,MACtC3G,EAAO4G,EACP7a,KAAK8Y,MAAa,GAAP7E,EAAY4G,GAAQ,GAAK,MACpC5G,EAAO6G,EACP9a,KAAK8Y,MAAa,GAAP7E,EAAY6G,GAAQ,GAAK,MAEpC7G,EAAO,OAK1B7rB,SACI40B,gBADK,WAEIz0B,KAAKg0B,kBACVh0B,KAAK+0B,UAAY,GAAIZ,WAAGa,mBACpB/P,OAAO,EACP3B,SAAUtjB,KAAKuC,SAASqxB,eACxBqB,aAAc,QACdtB,WAAY3zB,KAAKuC,SAASoxB,WAC1B7qB,OAAQ9I,KAAKqiB,KAAK6S,UAClBC,SACIC,SAAUp1B,KAAKg0B,gBACfqB,UAAW,OACXC,SAAU,OACVC,kBAAmB,OACnBC,cAAe,YAEnBC,UACIC,QAAS11B,KAAKuC,SAASgX,MACvBoc,YACID,QAAS11B,KAAKuC,SAASgX,OAE3Bqc,YACIC,UAAW,YACXC,eAAgB,iBAChBC,UAAW,YACXC,WAAY,cAEhB11B,SACI80B,SAAUp1B,KAAKg0B,kBAGvBiC,OACIC,YAAY,GAEhB5B,WACI6B,SAAUn2B,KAAKo2B,UACfC,YAAar2B,KAAKs2B,UAClBC,WAAYv2B,KAAKw2B,YACjBC,WAAYz2B,KAAK02B,YACjBC,QAAS32B,KAAK42B,iBAElBC,YAAaC,kBAAmB92B,KAAKuC,SAASu0B,mBAAqBA,UAAkBppB,OACrFxC,eAOR6rB,OAjDK,SAiDEtP,GACCA,GACAznB,KAAK+0B,UAAUiC,UAAUvP,GAE7BznB,KAAK+0B,UAAUkC,qBAQnBX,UA7DK,SA6DK/0B,GACN,GAAIywB,EAAc,CACd,GAAM3U,GAAOrd,KAAK+0B,UAAUmC,QAAQ31B,EACpC8b,GAAK9b,GAAKA,EACV8b,EAAK8Z,SAAW,EAChBn3B,KAAK8zB,MAAMjuB,KAAKwX,GAChBrd,KAAKo3B,MAAM,uBAAwB71B,EAAI8b,KAS/C+Y,UA5EK,SA4EK70B,GACNvB,KAAKo3B,MAAM,kBAAmB71B,IAQlCi1B,YArFK,SAqFOj1B,EAAIpB,EAAMk3B,EAAUC,GAC5B,GAAMja,GAAOrd,KAAK+0B,UAAUmC,QAAQ31B,EACpC8b,GAAK8Z,SAAW1f,KAAK8Y,MAAiB,IAAX8G,EAAiBC,GAC5Ct3B,KAAKo3B,MAAM,oBAAqB71B,EAAI81B,EAAUC,IAQlDZ,YAhGK,SAgGOn1B,EAAIpB,EAAMwjB,GAClB,GAAKA,EAASrjB,QAAd,CACA,GAAM+c,GAAOrd,KAAK+0B,UAAUmC,QAAQ31B,EACpCvB,MAAK8zB,MAAMyD,QAAQla,GACnBrd,KAAKo3B,MAAM,oBAAqB71B,EAAIoiB,EAAUtG,KAQlDmX,0BA5GK,SA4GqBV,GAClB9zB,KAAKi0B,SACLj0B,KAAK+0B,UAAUyC,SAAS1D,IAShC8C,gBAvHK,SAuHWr1B,EAAIpB,EAAMs3B,EAAQxG,GAC9B,IAAIjxB,KAAKK,OAAOq3B,IAAIn2B,GAApB,CAEA,GAAI0vB,EACA,IACI,GAAM7wB,GAAO2jB,KAAKC,MAAMiN,EAAI0G,aAC5BF,GAASr3B,EAAKyjB,OAASzjB,EAAK8jB,SAAWuT,EACzC,MAAM/0B,GACJlB,UAAIqiB,MAAM,wBAAyBoN,EAAI0G,cAM/C,GAHe,iCAAXF,IACAA,EAASz3B,KAAKqL,EAAE,sDAEhB4lB,GAAO2G,UAAOC,OAAOC,IAAK,CAC1B,GAAMC,GAAW9G,EAAI+G,kBAAkB,cACnCD,KACAN,GAAUA,EAAQz3B,KAAKqL,EAAE,gCAAiC9J,GAAIw2B,KAAYzb,KAAK,OAGvFtc,KAAKC,UAAU,UACXb,KAAM,QACN2N,KAAM,uBACND,MAAO9M,KAAKqL,EAAE,0BAA2BlL,SACzCgkB,QAASsT,IAEbz3B,KAAKo3B,MAAM,iBAAkB71B,EAAIpB,EAAMs3B,GACvCz3B,KAAKK,OAAOkG,IAAIhF,KAGpB0H,MArJK,WAsJDjJ,KAAK+0B,UAAUkD,uB7CkiJrBC,KACA,SAASx6B,EAAQC,EAASC,GAE/B,YAyBA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAvBvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,IAEXb,EAAQw6B,kBAAoBx5B,MAE5B,IAAIy5B,GAAkBx6B,EAAoB,IAEtCy6B,EAAmBj6B,uBAAuBg6B,GAE1CE,EAAmB16B,EAAoB,IAEvC26B,EAAmBn6B,uBAAuBk6B,GAE1CE,EAA8B56B,EAAoB,IAElD66B,EAA8Br6B,uBAAuBo6B,GAErDE,EAAa96B,EAAoB,IAEjC+6B,EAAav6B,uBAAuBs6B,G8Cn0JzCnrB,EAAA3P,EAAA,IAEau6B,E9Cu0JYx6B,E8Cv0JZw6B,kB9Cu0JwC,SAAUS,G8Ct0J3D,QAAAT,mBAAYl6B,IAAS,EAAAs6B,EAAAv6B,SAAAgC,KAAAm4B,kBAAA,IAAAlqB,IAAA,EAAAwqB,EAAAz6B,SAAAgC,MAAAm4B,kBAAAU,YAAA,EAAAR,EAAAr6B,SAAAm6B,oBAAAnb,KAAAhd,KACX/B,GADW,OAEjBgQ,GAAK1L,SAAS6O,GAAK,WACnBnD,EAAK1L,SAASu2B,MAAQ,qBAHL7qB,E9Cm1JpB,OAZA,EAAI0qB,EAAW36B,SAASm6B,kBAAmBS,GAYpCT,mB8Cp1J2BzsB,O9Cu1JtC/N,GAAQK,S8C/0JM,GAAIm6B,IAAoBW,S9Cm1JjCC,KACA,SAASr7B,EAAQC,EAASC,G+C91JhCF,EAAAC,SAAkBK,QAAAJ,EAAA,MAAAG,YAAA,I/Co2JZi7B,KACA,SAASt7B,EAAQC,EAASC,GgDr2JhCA,EAAA,KACAA,EAAA,KACAA,EAAA,KACAA,EAAA,MACAA,EAAA,MACAA,EAAA,MACAA,EAAA,MACAF,EAAAC,QAAAC,EAAA,IAAAq7B,KhD42JMC,MACL,IAAK,KAEAC,MACL,IAAK,IAAK,IAAK,GAAI,IAAK,MAEnBC,MACL,IAAK,GAAI,IAAK,IAETC,MACL,IAAK,MAEAC,MACL,IAAK,GAAI,IAAK,KAAM,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,GAAI,IAAK,MAExDC,MACL,IAAK,IAAK,MAELC,KACA,SAAS97B,EAAQC,EAASC,GiDt4JhC,YACA,IAAA67B,GAAA77B,EAAA,IACA87B,EAAA97B,EAAA,IACA+7B,EAAA/7B,EAAA,KACAg8B,EAAAh8B,EAAA,IACAsb,EAAAtb,EAAA,IACAi8B,EAAAj8B,EAAA,MACAk8B,EAAAl8B,EAAA,KACAm8B,EAAAn8B,EAAA,MACA4lB,EAAA5lB,EAAA,IACAo8B,EAAAp8B,EAAA,KACAq8B,EAAAr8B,EAAA,IAAAs8B,EACAhrB,EAAAtR,EAAA,SACAu8B,EAAAv8B,EAAA,GAEAF,GAAAC,QAAA,SAAAy8B,EAAA/M,EAAAxtB,EAAAw6B,EAAAC,EAAAC,GACA,GAAAC,GAAAf,EAAAW,GACAK,EAAAD,EACAE,EAAAJ,EAAA,YACAK,EAAAF,KAAAnqB,UACAoP,IAqCA,OApCAya,IAAA,kBAAAM,KAAAF,GAAAI,EAAArZ,UAAAsY,EAAA,YACA,GAAAa,IAAAG,UAAApzB,WAOAizB,EAAApN,EAAA,SAAAntB,EAAA26B,GACAd,EAAA75B,EAAAu6B,EAAAL,EAAA,MACAl6B,EAAA46B,GAAA,GAAAN,GACA77B,QAAAk8B,GAAAf,EAAAe,EAAAP,EAAAp6B,EAAAw6B,GAAAx6B,KAEAgP,EAAA,kEAAAoE,MAAA,cAAAynB,GACA,GAAAC,GAAA,OAAAD,GAAA,OAAAA,CACAA,KAAAJ,MAAAJ,GAAA,SAAAQ,IAAA7hB,EAAAuhB,EAAAnqB,UAAAyqB,EAAA,SAAAjlB,EAAAC,GAEA,GADAgkB,EAAA/5B,KAAAy6B,EAAAM,IACAC,GAAAT,IAAA/W,EAAA1N,GAAA,aAAAilB,GAAAp8B,MACA,IAAAgnB,GAAA3lB,KAAA86B,GAAAC,GAAA,IAAAjlB,EAAA,EAAAA,EAAAC,EACA,OAAAilB,GAAAh7B,KAAA2lB,MAGA4U,GAAAN,EAAAQ,EAAAnqB,UAAA,QACA2qB,IAAA,WACA,MAAAj7B,MAAA86B,GAAApP,UApBA+O,EAAAJ,EAAAa,eAAA7N,EAAA+M,EAAAE,EAAAI,GACAb,EAAAY,EAAAnqB,UAAAzQ,GACA85B,EAAAwB,MAAA,GAuBAnB,EAAAS,EAAAL,GAEA1a,EAAA0a,GAAAK,EACAf,IAAA0B,EAAA1B,EAAA2B,EAAA3B,EAAA4B,EAAA5b,GAEA6a,GAAAF,EAAAkB,UAAAd,EAAAL,EAAAE,GAEAG,IjD84JMe,MACL,IAAK,GAAI,IAAK,IAAK,KAEdC,MACL,IAAK,IAEAC,KACA,SAASh+B,EAAQC,EAASC,GkD98JhC,YACA,IAAA67B,GAAA77B,EAAA,IACA+9B,EAAA/9B,EAAA,IACAq8B,EAAAr8B,EAAA,IACAu8B,EAAAv8B,EAAA,IACAg+B,EAAAh+B,EAAA,cAEAF,GAAAC,QAAA,SAAAo9B,GACA,GAAAN,GAAA,kBAAAkB,GAAAZ,GAAAY,EAAAZ,GAAAtB,EAAAsB,EACAZ,IAAAM,MAAAmB,IAAA3B,EAAAC,EAAAO,EAAAmB,GACAC,cAAA,EACAZ,IAAA,WAAsB,MAAAj7B,WlDu9JhB87B,MACL,IAAK,KAAM,KAAM,MAEZC,MACL,IAAK,MAEAC,MACL,IAAK,MAEAC,MACL,IAAK,GAAI,MAEJC,KACA,SAASx+B,OAAQC,QAASC,qBmD/+JhC,GAAA+Q,gCACA,SAAA8qB,QACA,GAAAtF,IAAA,SAAAnlB,GACA,YACA,QACAkK,KAAA,WAEA,MADAlK,GAAAmtB,MAAAC,QAAA,OACAp8B,MAEAq8B,OAAA,SAAAj9B,EAAA4L,GAMA,MALAgE,GAAAstB,iBACAttB,EAAAstB,iBAAAl9B,EAAA4L,GAAA,GACiBgE,EAAAutB,aACjBvtB,EAAAutB,YAAA,KAAAn9B,EAAA4L,GAEA,WACAmpB,GAAAnlB,GAAAwtB,OAAAp9B,EAAA4L,KAGAwxB,OAAA,SAAAp9B,EAAA4L,GAMA,MALAgE,GAAAytB,oBACAztB,EAAAytB,oBAAAr9B,EAAA4L,GAAA,GACiBgE,EAAAutB,aACjBvtB,EAAA0tB,YAAA,KAAAt9B,EAAA4L,GAEAhL,MAEA28B,SAAA,SAAAC,GACA,QAAAA,IAGA5tB,IAAA4tB,IAGA5tB,EAAA2tB,SACA3tB,EAAA2tB,SAAAC,MAEA,EAAAA,EAAAC,wBAAA7tB,OAGA+J,aAAA,SAAA+jB,GAEA,MADAA,GAAA1T,WAAArQ,aAAA/J,EAAA8tB,GACA98B,MAEAmZ,OAAA,WAEA,MADAnK,GAAAoa,WAAA2T,YAAA/tB,GACAhP,MAEAwT,IAAA,SAAAwpB,GACA,SAAAhuB,EAAAmtB,MACA,SAAAhI,IAAA1D,MAAA,6EAQA,OANA,OAAAuM,EAAAC,SACA,gBAAAjuB,GAAAmtB,MAAAc,SAAA,mBAAAjuB,GAAAlB,UACAkvB,EAAA9uB,OAAA,iBAAAuJ,KAAA8Y,MAAA,IAAAyM,EAAAC,SAAA,KAGA9I,GAAAxkB,OAAAX,EAAAmtB,MAAAa,GACAh9B,MAEAqb,SAAA,SAAAlb,EAAA+8B,GACA,GAAAhN,GAAA,GAAAhU,QAAA,QAAA/b,EAAA,QACA,OAAA+vB,GAAA/T,KAAAnN,EAAAkgB,eAAAgO,IAAAhN,EAAA/T,KAAAnN,EAAAoa,WAAA8F,aAEA3c,SAAA,SAAApS,GAIA,MAHAg0B,IAAAnlB,GAAAqM,SAAAlb,KACA6O,EAAAkgB,WAAA,IAAA/uB,GAEAH,MAEAyS,YAAA,SAAAtS,GACA,GAAA+vB,GAAA,GAAAhU,QAAA,QAAA/b,EAAA,QAEA,OADA6O,GAAAkgB,UAAAlgB,EAAAkgB,UAAAjI,QAAAiJ,EAAA,KAAAjJ,QAAA,iBACAjnB,MAEAm9B,WAAA,SAAAjO,EAAAxpB,GACA,GAAA03B,GAAAzX,IACA,OAAAjgB,IAAAsJ,EAAAhG,cACAgG,EAAAhG,cAAA,IAAAkmB,GACiBlgB,EAAAmU,iBACjBnU,EAAAmU,iBAAA,IAAA+L,IAEAkO,EAAApuB,EAAAquB,qBAAA,KACAlJ,GAAAjlB,KAAAkuB,EAAA,SAAA90B,EAAA+K,GACA8gB,GAAA9gB,GAAAgI,SAAA6T,IACAvJ,EAAA9f,KAAAwN,KAGA3N,EAAAigB,EAAA,GAAAA,IAEA2X,gBAAA,SAAApO,GACA,MAAAiF,IAAAnlB,GAAAmuB,WAAAjO,GAAA,IAEAqO,SAAA,WAEA,IADA,GAAAA,MAAAC,EAAAxuB,EAAAyuB,WACAD,GACA,IAAAA,EAAAE,UACAH,EAAA13B,KAAA23B,GAEAA,IAAAG,WAEA,OAAAJ,IAEAK,QAAA,SAAA/vB,GAGA,MAFAmB,GAAA6uB,UAAAhwB,EACAmB,EAAA8uB,YAAAjwB,EACA7N,MAEA+9B,UAAA,WACA,MAAA5J,IAAAnlB,GAAA4uB,QAAA,KAEAI,aAAA,SAAAC,GACA,GAAAC,EACA,OAAAlvB,GAAAgvB,eACAhvB,EAAAgvB,aAAAC,IAGA,iBAAAE,KAAAnvB,EAAAugB,aAAA0O,KAEAC,EAAAlvB,EAAAivB,GACAt/B,SAAAu/B,GAGA,iBAAAC,KAAAD,QAKA,WACA,YACA/J,IAAAiK,aAAA,SAAAC,EAAAC,EAAAC,GACA,MAAApK,IAAAqK,cAAAH,EAAAI,UAAAH,EAAAC,KAEApK,GAAAqK,cAAA,SAAAE,GACA,GAAAC,GAAAC,EAUaC,EAAAC,EAVbC,EAAA,SAAA3+B,EAAAk+B,GACA,GAAAU,GAAA9Z,OAAA8Z,aAAA9Z,OAAA+Z,mBAAA/Z,OAAAga,gBAAAha,OAAAia,cAAAC,EAAAJ,GAAA,GAAAA,EACA,OAAAI,IACAA,EAAAnsB,OAAA7S,GACAg/B,EAAAC,QAAAf,IAEA,GAAAlM,OAAAhyB,IACAhB,KAAAk/B,IAeA,OAVAM,GADAF,EAAAprB,MAAA,QAAA5R,QAAA,aACA49B,KAAAZ,EAAAprB,MAAA,SAEAisB,UAAAb,EAAAprB,MAAA,SAEAwrB,EAAAJ,EAAAprB,MAAA,QAAAA,MAAA,QAAAA,MAAA,KAAqE,GACrEqrB,EAAA,GAAAa,aAAAZ,EAAAj7B,QACAk7B,EAAA,GAAAY,YAAAd,GACAxK,GAAAjlB,KAAA0vB,EAAA,SAAAt2B,EAAAo3B,GACAb,EAAAv2B,GAAAo3B,EAAAC,WAAA,KAEAZ,EAAAJ,EAAAG,IAEA3K,GAAA3yB,IAAA,SAAA0iB,EAAA0b,GACA1a,OAAAC,UACAya,GAAA,SAAAA,EAGA1a,OAAAC,QAAAya,GACA1a,OAAAC,QAAAya,GAAA1b,GAEAgB,OAAAC,QAAA3jB,IAAA,IAAAo+B,EAAA,KAAA1b,GALAgB,OAAAC,QAAA3jB,IAAA0iB,KAUAiQ,GAAA3Q,SAAA,SAAAqc,GACA,MAAAA,OAAAnC,UAAA,oBAAAp/B,OAAAgS,UAAAwf,SAAA9S,KAAA6iB,IAEA1L,GAAA2L,WAAA,SAAAD,GACA,wBAAAA,IAEA1L,GAAA3wB,QAAA,SAAAhF,GACA,yBAAAF,OAAAgS,UAAAwf,SAAA9S,KAAAxe,OAAA0mB,OAAAsa,aAAAhhC,EAAAuhC,QAAAvhC,EAAAuhC,OAAAxvB,cAAAivB,aAEArL,GAAA6L,WAAA,SAAAC,GACA,wCAAA3hC,OAAAgS,UAAAwf,SAAA9S,KAAAijB,IAEA9L,GAAA+L,WAAA,SAAAC,GACA,4BAAA7hC,OAAAgS,UAAAwf,SAAA9S,KAAAmjB,MAAAhyB,MAAAgyB,EAAAC,WAEAjM,GAAAvQ,SAAA,SAAAyc,GACA,0BAAA/hC,OAAAgS,UAAAwf,SAAA9S,KAAAqjB,IAEAlM,GAAAmM,QAAA,SAAA/rB,GACA,MAAA5U,QAAA2Q,UAAAoG,KACAnC,EAAAmC,OAEAnC,EAAA0S,QAAA,kBAEAkN,GAAAjyB,OAAA,SAAA8kB,GACA,GAAAW,GAAApkB,MAAA+M,UAAAxJ,MAAAkW,KAAA0K,UAAA,GAAA6Y,EAAAvZ,EAAAwZ,EAAAD,EAAA7+B,QAAA,KASA,OARAyyB,IAAAjlB,KAAAyY,EAAA,SAAArf,EAAA+K,GACA,GAAAotB,GAAAF,EAAAzT,UAAA,EAAA0T,GAAAE,EAAAH,EAAAzT,UAAA0T,EAAA,EAGA,IAFAD,EAAAE,EAAAptB,EAAAqtB,EACAF,EAAAD,EAAA7+B,QAAA,KAAqD8+B,EAAAntB,EAAA1P,QACrD68B,EAAA,EACA,WAGAD,GAEApM,GAAAwM,OAAA,SAAAC,GACA,MAAA1b,QAAA+M,MAAA,kBAAA3zB,OAAAgS,UAAAwf,SAAA9S,KAAA4jB,IAEAzM,GAAA0M,WAAA,SAAAC,GACA,MAAA5b,QAAAiN,UAAA,sBAAA7zB,OAAAgS,UAAAwf,SAAA9S,KAAA8jB,IAEA3M,GAAA4M,cAAA,SAAAC,GACA,MAAA7M,IAAAwM,OAAAK,IAAA7M,GAAA8M,QAAAD,IAEA7M,GAAA8M,QAAA,SAAAC,EAAAC,GACA,GAAAC,GAAA,SAAAhiC,GACA,GAAAiiC,GAAAjiC,EAAAwX,aACA,OAAAuqB,GACA,SAAAE,EAEA,SAAAA,EAEA,UAAAnc,OAAAoc,kBACA,8BAAAhjC,OAAAgS,UAAAwf,SAAA9S,KAAAkkB,IACAA,EAAA9hC,MAAAgiC,EAAAF,EAAA9hC,WAKA8hC,EAAA7d,SACA,UAAA6d,EAAA7d,QAAAzM,eACAsqB,EAAA9hC,MAAAgiC,EAAAF,EAAA9hC,QAOA+0B,GAAAoN,OAAA,SAAAC,GACA,GAAAtc,OAAAkN,MAAA,kBAAA9zB,OAAAgS,UAAAwf,SAAA9S,KAAAwkB,GACA,UAGArN,GAAAsN,qBAAA,WACA,GAAAC,GAAAzmB,SAAA0mB,cAAA,QAEA,OADAD,GAAAtiC,KAAA,OACAT,SAAA+iC,EAAApe,UAAA,mBAAA2O,OAAA,mBAAA2P,WAAA,mBAAAzN,IAAA0N,oBAAA9K,QAEA5C,GAAA0N,kBAAA,WACA,GAAA3c,OAAA4c,eACA,UAAAA,eAEA,KACA,UAAAC,eAAA,sBACa,MAAAle,GAEb,MADAsQ,IAAA3yB,IAAA,iDACA,OAGA2yB,GAAA6N,sBAAA,SAAAC,GACA,MAAAA,GAAAv0B,OAAAu0B,EAAAv0B,MAAA/J,OAAA,GAAAs+B,EAAAv0B,MAAA,GAAAw0B,kBAEA/N,GAAAgO,wBAAA,WACA,OAAAhO,GAAAiO,gBAAAjO,GAAAsN,yBAAA9iC,SAAAszB,KAAA3hB,UAAAxJ,OAAAnI,SAAAszB,KAAA3hB,UAAA+xB,aAAA1jC,SAAAszB,KAAA3hB,UAAAgyB,WAEAnO,GAAAoO,UAAA,SAAAC,EAAAr8B,EAAAG,GACA,GAAAm8B,GAAAD,EAAA17B,OAAA07B,EAAAF,UAAAE,EAAAH,WACA,OAAAI,GAAAzlB,KAAAwlB,EAAAr8B,EAAAG,IAEA6tB,GAAAuO,iBAAA,SAAA3C,GACA,GAAA4C,GAAA,GAAAC,EAAA,GAAAnD,YAAAM,EAQA,OAPA5L,IAAAjlB,KAAA0zB,EAAA,SAAAt6B,EAAAu6B,GACA,GAAAC,GAAAD,EAAA/S,SAAA,GACAgT,GAAAn/B,OAAA,IACAm/B,EAAA,IAAAA,GAEAH,GAAAG,IAEAH,GAEAxO,GAAA4O,cAAA,SAAAC,EAAAC,EAAAt/B,GACA,GAAAu/B,GAAA/O,GAAAoO,UAAAS,EAAAC,IAAAt/B,GAAAw/B,EAAA,GAAAjR,YAAAkR,EAAA,GAAAjP,IAAAkP,OAMA,OALAF,GAAAG,OAAA,WACAF,EAAA9iC,QAAA6zB,GAAAuO,iBAAAS,EAAAxd,UAEAwd,EAAAI,QAAAH,EAAAI,QACAL,EAAAM,kBAAAP,GACAE,GAEAjP,GAAAxkB,OAAA,SAAAjK,EAAAg+B,EAAAC,GAWA,MAVAxP,IAAAjlB,KAAAw0B,EAAA,SAAA/sB,EAAAtD,GACAswB,GAAAxP,GAAA3Q,SAAAnQ,IACA1U,SAAA+G,EAAAiR,KACAjR,EAAAiR,OAEAwd,GAAAxkB,OAAAjK,EAAAiR,GAAAtD,GAAA,IAEA3N,EAAAiR,GAAAtD,IAGA3N,GAEAyuB,GAAAyP,SAAA,SAAA1jC,EAAA2jC,GACA,GAAAC,MAA2Btc,EAAAqc,EAAAC,EAO3B,OANA3P,IAAAjlB,KAAAsY,EAAA,SAAAuc,EAAAC,GACArlC,SAAAuB,EAAA6jC,KACAD,EAAAC,GAAA7jC,EAAA6jC,IAEA7jC,EAAA6jC,GAAAC,IAEA9jC,GAEAi0B,GAAAzyB,QAAA,SAAA4B,EAAA2gC,EAAApgC,GACA,GAAAP,EAAA5B,QACA,MAAA4B,GAAA5B,QAAAuiC,EAAApgC,EAEAA,MAAA,CACA,IAAAqgC,GAAA5gC,EAAAK,MAIA,KAHAE,EAAA,IACAA,GAAAqgC,GAEkBrgC,EAAAqgC,EAAWrgC,GAAA,EAC7B,GAAAP,EAAAjC,eAAAwC,IAAAP,EAAAO,KAAAogC,EACA,MAAApgC,EAGA,WAEAswB,GAAAgQ,YAAA,WACA,6CAAAld,QAAA,iBAAAmd,GACA,GAAAC,GAAA,GAAA5sB,KAAA6sB,SAAA,EAAAxzB,EAAA,KAAAszB,EAAAC,EAAA,EAAAA,EAAA,CACA,OAAAvzB,GAAAgf,SAAA,OAGAqE,GAAAoQ,GAAA,WACA,MAAAC,WAAAC,UAAA/iC,QAAA,cAAA8iC,UAAAC,UAAA/iC,QAAA,iBAEAyyB,GAAAuQ,IAAA,WACA,MAAAF,WAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAwQ,IAAA,WACA,MAAAH,WAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAyQ,KAAA,WACA,MAAAJ,WAAAC,UAAA/iC,QAAA,iBAEAyyB,GAAA0Q,KAAA,WACA,MAAA1Q,IAAAoQ,MAAAC,UAAAC,UAAA/iC,QAAA,eAEAyyB,GAAA2Q,KAAA,WACA,MAAAN,WAAAC,UAAA/iC,QAAA,YAEAyyB,GAAA4Q,OAAA,WACA,MAAApmC,UAAA6lC,UAAAQ,QAAAR,UAAAQ,OAAAtjC,QAAA,eAEAyyB,GAAA8Q,OAAA,WACA,MAAAtmC,UAAA6lC,UAAAQ,QAAAR,UAAAQ,OAAAtjC,QAAA,gBAEAyyB,GAAA+Q,MAAA,WACA,MAAAvmC,UAAA6lC,UAAAQ,QAAAR,UAAAQ,OAAAtjC,QAAA,eAEAyyB,GAAAgR,QAAA,WACA,OAAAhR,GAAA2Q,SAAA3Q,GAAA0Q,QAAAL,UAAAC,UAAA/iC,QAAA,iBAAA/C,SAAA6lC,UAAAQ,QAAA,KAAAR,UAAAQ,QAEA7Q,GAAAiR,QAAA,WACA,gBAAAZ,UAAAa,UAEAlR,GAAAmR,QAAA,WACA,MAAAd,WAAAC,UAAA7tB,cAAAlV,QAAA,iBAEAyyB,GAAAiO,aAAA,WACA,MAAAjO,IAAAmR,WAAAd,UAAAC,UAAA7tB,cAAAlV,QAAA,aAEAyyB,GAAAoR,KAAA,WACA,MAAApR,IAAAqR,OAAAhB,UAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAsR,KAAA,WACA,MAAAtR,IAAAqR,OAAAhB,UAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAuR,KAAA,WACA,MAAAvR,IAAAqR,OAAAhB,UAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAwR,OAAA,WACA,MAAAxR,IAAAqR,OAAAhB,UAAAC,UAAA/iC,QAAA,kBAEAyyB,GAAAqR,IAAA,WACA,MAAAhB,WAAAC,UAAA/iC,QAAA,cAAA8iC,UAAAC,UAAA/iC,QAAA,cAAA8iC,UAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAAyR,UAAA,WACA,MAAAzR,IAAAqR,OAAAhB,UAAAC,UAAA/iC,QAAA,eAEAyyB,GAAA0R,UAAA,WACA,MAAA1R,IAAAqR,QAAArR,GAAAyR,aAAApB,UAAAC,UAAA/iC,QAAA,gBAEAyyB,GAAA2R,iBAAA,WACA,MAAA3R,IAAAqR,QAAArR,GAAAyR,cAAAzR,GAAA0R,aAEA1R,GAAA7f,eAAA,SAAA5R,GACAA,EAAA4R,eACA5R,EAAA4R,iBAEA5R,EAAAqjC,aAAA,GAGA5R,GAAA6R,UAAA,WACA,GAAAC,GAAAhrB,SAAA0mB,cAAA,MACA,iBAAAnrB,GACAyvB,EAAAC,UAAA1vB,CACA,IAAAxH,GAAAi3B,EAAAxI,UAEA,OADAwI,GAAAlJ,YAAA/tB,GACAA,MAGAmlB,GAAAjlB,KAAA,SAAAi3B,EAAAn5B,GACA,GAAAo5B,GAAAC,CACA,IAAAF,EACA,GAAAjhB,OAAAohB,SAAAH,EAAA51B,cAAA2U,OAAAohB,QACA,IAAAF,EAAA,EAAwCA,EAAAD,EAAAxiC,SACxC0iC,EAAAr5B,EAAAm5B,EAAAlc,IAAAmc,GAAAD,EAAAI,QAAAJ,EAAAlc,IAAAmc,KACAC,KAAA,GAF0ED,SAMzD,IAAAjS,GAAA3wB,QAAA2iC,IAAAhS,GAAA6L,WAAAmG,IAAAhS,GAAA+L,WAAAiG,GACjB,IAAAC,EAAA,EAAwCA,EAAAD,EAAAxiC,SACxC0iC,EAAAr5B,EAAAo5B,EAAAD,EAAAC,IACAC,KAAA,GAF0ED,SAMzD,IAAAjS,GAAAvQ,SAAAuiB,GACjB,IAAAC,EAAA,EAAwCA,EAAAD,EAAAxiC,SACxC0iC,EAAAr5B,EAAAo5B,EAAAD,EAAAvZ,OAAAwZ,IACAC,KAAA,GAF0ED,SAO1E,KAAAA,IAAAD,GACA,GAAA7nC,OAAAgS,UAAAjP,eAAA2b,KAAAmpB,EAAAC,KACAC,EAAAr5B,EAAAo5B,EAAAD,EAAAC,IACAC,KAAA,GACA,OAOAlS,GAAAtxB,KAAA,SAAA2jC,EAAA1V,GACA,GAAAqD,GAAA2L,WAAA0G,GAAA,CACA,GAAA7e,GAAApkB,MAAA+M,UAAAxJ,MAAAkW,KAAA0K,UAAA,EACA,mBACA,GAAA+e,GAAAtS,GAAAxkB,UAAAgY,EAIA,OAHAD,WAAA/jB,SACA8iC,IAAApxB,OAAA9R,MAAA+M,UAAAxJ,MAAAkW,KAAA0K,aAEA8e,EAAA5jC,MAAAkuB,EAAA2V,IAGA,SAAAhW,OAAA,wCAEA0D,GAAAuS,QAAA,SAAAroC,EAAAsoC,EAAAC,GACA,GAAAC,MAAAC,EAAA,IAAAvgC,EAAA,SAAAwgC,EAAAtjC,GACA,GAAAujC,GAAAL,EAAA,QAAAxqB,KAAAwqB,OAAA,IAAAljC,EAAA,IAAAA,CACA,eAAAujC,GAAA,cAAAvjC,GACAojC,EAAAhhC,KAAA,gBAAAkhC,GAAA5S,GAAAuS,QAAAK,EAAAC,GAAA,yBAAA1oC,OAAAgS,UAAAwf,SAAA9S,KAAA+pB,GAAAE,mBAAAD,GAAA,IAAAC,mBAAAF,KAAAE,mBAAAD,GAAA,IAAAC,mBAAAF,IAkBA,QAfAH,GAAAD,GACAG,EAAA,KAAA3qB,KAAAwqB,GAAA,MAAAxqB,KAAAwqB,GAAA,WACAE,EAAAhhC,KAAA8gC,GACAE,EAAAhhC,KAAAsuB,GAAAuS,QAAAroC,KACa,mBAAAC,OAAAgS,UAAAwf,SAAA9S,KAAA3e,IAAA,mBAAAA,GACb81B,GAAAjlB,KAAA7Q,EAAA,SAAAiK,EAAA+K,GACA9M,EAAA8M,EAAA/K,KAEa,mBAAAjK,IAAA,OAAAA,GAAA,gBAAAA,GACb81B,GAAAjlB,KAAA7Q,EAAA,SAAAsY,EAAAtD,GACA9M,EAAA8M,EAAAsD,KAGAkwB,EAAAhhC,KAAAohC,mBAAAN,GAAA,IAAAM,mBAAA5oC,IAEAsoC,EACAE,EAAAvqB,KAAAwqB,GAEAD,EAAAvqB,KAAAwqB,GAAA7f,QAAA,SAAAA,QAAA,aAGAkN,GAAA+S,aAAA,SAAA7oC,EAAA8oC,EAAAC,GAcA,MAbAD,KACAA,EAAA,GAAAvF,WAEAzN,GAAAjlB,KAAA7Q,EAAA,SAAA4rB,EAAA5W,GACA4W,EAAAmd,IAAA,IAAAnd,EAAA,IAAAA,EACAkK,GAAA3Q,SAAAnQ,GACA8gB,GAAA+S,aAAA7zB,EAAA8zB,EAAAld,GACiBkK,GAAA2L,WAAAzsB,GACjB8zB,EAAAl0B,OAAAgX,EAAA5W,KAEA8zB,EAAAl0B,OAAAgX,EAAA5W,KAGA8zB,GAEAhT,GAAAkT,WAAA,SAAAhpC,EAAA+jB,GACA,GAAAsf,EAYA,OAXAtf,KACAA,EAAAnH,SAAA0mB,cAAA,SAEAxN,GAAA+S,aAAA7oC,GACA4U,OAAA,SAAAgX,EAAA5W,GACAquB,EAAAzmB,SAAA0mB,cAAA,SACAD,EAAAhnB,aAAA,OAAAuP,GACAyX,EAAAhnB,aAAA,QAAArH,GACA+O,EAAAklB,YAAA5F,MAGAtf,GAEA+R,GAAAoT,UAAA,SAAAC,MACA,MAAAtiB,QAAAnB,MAAAoQ,GAAA2L,WAAA/b,KAAAC,OACAD,KAAAC,MAAAwjB,MAEAC,KAAA,IAAAD,KAAA,MAGArT,GAAAuT,aAAA,SAAA7S,GACA,GAAA8S,GAAA9S,EAAA3I,YAAA,MACA,IAAAyb,EAAA,EACA,MAAA9S,GAAA/a,OAAA6tB,EAAA9S,EAAAlxB,OAAAgkC,IAGAxT,GAAAyT,YAAA,SAAAC,GACA,MAAA1T,IAAA8M,QAAA4G,GACAA,EAAArpC,MAAAyoB,QAAA,gBACakN,GAAAwM,OAAAkH,IACb,OAAAA,EAAAC,UAAAnpC,SAAAkpC,EAAAC,SACAD,EAAAC,SAGAD,EAAA1nC,MAEAg0B,GAAA4T,eAAA,WACA,GAAAC,KACA,QACArT,QAAA,WACA,GAAAsT,EACA,GACAA,GAAAD,EAAA9tB,QACA+tB,GACAA,UAEqBA,IAErB5L,OAAA,WACA,GAAA1U,GAAAD,SACA1nB,MAAAkoC,YAAA/T,GAAAxM,EAAA,IAAA0U,OAAAz5B,MAAA5C,KAAAuD,MAAA+M,UAAAxJ,MAAAkW,KAAA0K,UAAA,MAEAwgB,YAAA,SAAAC,GACAH,EAAAniC,KAAAsiC,SAKA,WACA,YAEAx5B,+BAAA,WACA,MAAAwlB,KACanX,KAAArf,QAAAC,oBAAAD,QAAAD,UAAAiB,SAAAgQ,gCAAAjR,OAAAC,QAAAgR,mCAOb,WACA,YACAwlB,IAAA1D,MAAA,SAAAvM,GACAlkB,KAAAkkB,QAAA,kBAAAiQ,GAAAjX,QAAA,KAAAgH,GAEAiQ,GAAA1D,MAAAngB,UAAA,GAAAmgB,UAEA0D,GAAAjX,QAAA,SACAiX,GAAAiU,kBAAA,WACA,YAEA,SAAAC,gCACA,GAAAC,GAAAC,GAAA,CACA,KACAD,EAAArtB,SAAA0mB,cAAA,SACA2G,EAAAlpC,KAAA,OACA+0B,GAAAmU,GAAApvB,OACAovB,EAAAE,WACAD,GAAA,GAEa,MAAAE,GACbF,GAAA,EAEA,MAAAA,GAEA,QAAAG,sBACA,OAAAvU,GAAA8Q,UAAA9Q,GAAA+Q,UAAAvmC,SAAA6lC,UAAAC,UAAAjyB,MAAA,uCAEA,QAAAm2B,6BACA,GAAAzjB,OAAA4c,eAAA,CACA,GAAA7Q,GAAAkD,GAAA0N,mBACA,OAAAljC,UAAAsyB,EAAA2X,gBAEA,SAEA,QAAAC,kBACA,MAAAlqC,UAAAumB,OAAA4jB,eAEA,QAAAC,8BACA,QAAAJ,6BAGAE,iBAEA,QAAAG,8BACA,MAAArqC,UAAAsc,SAAA0mB,cAAA,SAAAsH,gBAEA,QAAAC,2BACA,IACA,QAAAhkB,OAAAikB,cAAAhV,GAAA2L,WAAA5a,OAAAikB,aAAAC,SACa,MAAAvlB,GACb,UAGA,QAAAwlB,0BACA,GAAAC,GAAAruB,SAAA0mB,cAAA,OACA,qBAAA2H,IAAA,eAAAA,IAAA,UAAAA,MAAAnV,GAAAmR,YAAAnR,GAAAqR,MA9CA,GAAA+D,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,CAwEA,OAxBAd,GAAAlB,+BACAqB,EAAAH,GAAApV,GAAAsN,uBACA+H,EAAAE,IAAAvV,GAAAiO,eACAqH,EAAAC,GAAAL,yBACAM,EAAAF,GAAA,WACA,GAAA/H,GAAAzmB,SAAA0mB,cAAA,QAEA,OADAD,GAAAtiC,KAAA,UACA,oBAAAsiC,GAAAzmB,SAAAkI,iBAAA,4BAEAymB,EAAAF,GAAAvV,GAAAgO,0BACA0H,EAAAH,GAAAE,GAAAV,0BACAY,EAAAJ,GAAAhB,qBACAqB,EAAAR,IAAA5qC,SAAAumB,OAAAolB,aAAAZ,GACAO,EAAAtB,4BACAqB,EAAAnB,iBACAqB,EAAAnB,6BACAoB,EAAAnB,6BACAoB,EAAAV,GAAA/qC,SAAAumB,OAAAgN,WACAmY,EAAA,WACA,QAAAX,KACAvV,GAAAiO,iBAAAjO,GAAAyR,iBAKA2E,cAAAb,EACAc,cAAAhB,EACAiB,iBAAAf,EACAjU,SAAAmU,EACAc,eAAAR,EACAS,kBAAAX,EACAY,kBAAAX,EACAY,gBAAA3lB,OAAA4lB,kBACAC,SAAAtB,EACAuB,WAAArB,EACAsB,gBAAAd,EACAe,cAAAd,EACAe,gBAAAf,EACAgB,mBAAA1B,EACA2B,MAAAzB,EACA0B,YAAAjB,EACAkB,OAAA1B,EACA2B,QAAApB,GAAAZ,EACAiC,aAAAtX,GAAA4Q,SACA2G,0BAAAvX,GAAAqR,MACAmG,UAAApC,EACAqC,WAAA7B,EACA8B,oBAAAnC,EACAoC,mBAAApC,EACAqC,eAAAjC,MAGA3V,GAAA6X,iBAAA,SAAAC,GACA,YACA,UAAAA,KAAAC,MAAA/X,GAAA2L,WAAAmM,EAAAC,QAEA/X,GAAAkP,QAAA,WACA,YACA,IAAA8I,GAAAC,EAAAC,KAAAC,KAAAC,KAAAC,EAAA,CACArY,IAAAxkB,OAAA3P,MACAksC,KAAA,SAAAO,EAAAC,GAaA,MAZA,KAAAF,GACAC,GACAJ,EAAAxmC,KAAA4mC,GAEAC,GACAJ,EAAAzmC,KAAA6mC,IAEiBF,OACjBE,KAAA9pC,MAAA,KAAAwpC,GACiBK,GACjBA,EAAA7pC,MAAA,KAAAupC,GAEAnsC,MAEA8hB,KAAA,SAAA9U,GAMA,MALA,KAAAw/B,EACAD,EAAA1mC,KAAAmH,GAEAA,EAAApK,MAAA,KAAAjE,SAAAytC,EAAAD,EAAAC,GAEApsC,MAEAM,QAAA,WAaA,MAZAksC,GAAA,EACAL,EAAAzkB,UACA2kB,EAAA1oC,QACAwwB,GAAAjlB,KAAAm9B,EAAA,SAAA/jC,EAAA0E,GACAA,EAAApK,MAAA,KAAAupC,KAGAI,EAAA5oC,QACAwwB,GAAAjlB,KAAAq9B,EAAA,SAAAjkC,EAAA0E,GACAA,EAAApK,MAAA,KAAAupC,KAGAnsC,MAEAwjC,QAAA,WAaA,MAZAgJ,MACAJ,EAAA1kB,UACA4kB,EAAA3oC,QACAwwB,GAAAjlB,KAAAo9B,EAAA,SAAAhkC,EAAA0E,GACAA,EAAApK,MAAA,KAAAwpC,KAGAG,EAAA5oC,QACAwwB,GAAAjlB,KAAAq9B,EAAA,SAAAjkC,EAAA0E,GACAA,EAAApK,MAAA,KAAAwpC,KAGApsC,SAIAm0B,GAAAwY,UAAA,SAAAC,EAAAC,GACA,YACA1Y,IAAAxkB,OAAA3P,MACA4sC,gBACAE,OAAA,WACA,MAAAD,GAAAD,OAIAzY,GAAA4Y,aAAA,SAAAC,GACA,YAeA,SAAAC,eACA,GAAAvL,GAAAzmB,SAAA0mB,cAAA,QA0CA,OAzCAD,GAAAhnB,aAAAyZ,GAAA4Y,aAAAG,oBAAAC,GACAzL,EAAAhnB,aAAA,QAAAzc,EAAA6O,OACAsgC,EAAAC,YAAApvC,EAAAqlB,SAAAoe,GACAzjC,EAAAqvC,SAAAnZ,GAAAiU,kBAAA6C,iBACAvJ,EAAAhnB,aAAA,sBAEAzc,EAAAsvC,aACA7L,EAAAhnB,aAAA,SAAAzc,EAAAsvC,aAEA7L,EAAAhnB,aAAA,eACAgnB,EAAAhnB,aAAA,OAAAzc,EAAAkC,MACAg0B,GAAAuN,GAAAluB,KACAg6B,SAAA,WACAC,MAAA,EACAC,IAAA,EACAC,WAAA,QACAC,SAAAzZ,GAAAoQ,OAAApQ,GAAAwQ,MAAA,iBACAkJ,OAAA,EACAC,QAAA,EACA5gC,OAAA,UACA+vB,QAAA,KAEA9I,GAAAuQ,OAAAvQ,GAAAuN,GAAAluB,KACAgE,OAAA,SAEAvZ,EAAA+Q,QAAAs4B,YAAA5F,GACAqM,EAAA1R,OAAAqF,EAAA,oBACAzjC,EAAA6B,SAAA4hC,KAEAqM,EAAA1R,OAAAqF,EAAA,uBACAvN,GAAAl2B,EAAA+Q,SAAAuD,SAAAtU,EAAA+vC,cAEAD,EAAA1R,OAAAqF,EAAA,sBACAvN,GAAAl2B,EAAA+Q,SAAAyD,YAAAxU,EAAA+vC,cAEAD,EAAA1R,OAAAqF,EAAA,mBACAvN,GAAAl2B,EAAA+Q,SAAAuD,SAAAtU,EAAAgwC,cAEAF,EAAA1R,OAAAqF,EAAA,kBACAvN,GAAAl2B,EAAA+Q,SAAAyD,YAAAxU,EAAAgwC,cAEAvM,EAzDA,GAWSA,GAAAyL,EAXTC,EAAAptC,KAAA+tC,EAAA,GAAA5Z,IAAA4T,eAAA9pC,GACAsvC,YAAA,KACAv+B,QAAA,KACAi/B,WAAA,yBACAX,SAAA,EACAU,WAAA,yBACAE,4BAAA,EACA5qB,UAAA,EACAnjB,KAAA,SACAL,SAAA,SAAA4hC,KACA50B,MAAA,KAEAqnB,IAAAxkB,OAAA1R,EAAA+uC,GACAG,EAAAhZ,GAAAgQ,cA8CAhQ,GAAAl2B,EAAA+Q,SAAAwE,KACAg6B,SAAA,WACAW,SAAA,SACAC,UAAA,QAEAja,GAAAxkB,OAAA3P,MACAquC,SAAA,WACA,MAAA3M,IAEA4M,YAAA,WACA,MAAAnB,IAEAE,YAAA,SAAAkB,EAAAC,GACA,GAAA9M,GAAA8M,GAAAxuC,KAAAquC,UACApwC,GAAAiwC,4BAAA/Z,GAAAuR,SAAAvR,GAAAyR,aAAAzR,GAAA2R,oBACApE,EAAAhnB,aAAA,eAEA6zB,EACA7M,EAAAhnB,aAAA,eAEAgnB,EAAA+M,gBAAA,aAIAC,eAAA,SAAAnB,GACAA,IAAAtvC,EAAAsvC,aACA7L,EAAAhnB,aAAA,SAAA6yB,IAGAvjB,MAAA,WACA0X,EAAAtY,YACA+K,GAAAuN,GAAAvoB,SAEAgb,GAAAl2B,EAAA+Q,SAAAyD,YAAAxU,EAAAgwC,YACAvM,EAAA,KACAA,EAAAuL,iBAGAvL,EAAAuL,eAEA9Y,GAAA4Y,aAAAG,oBAAA,eACA/Y,GAAAwa,WAAA,SAAAC,GACA,YAEA,SAAAC,cAAAC,GACA,GAAA3a,GAAA3wB,QAAAsrC,GAAA,CACA,GAAAlU,KAIA,OAHAzG,IAAAjlB,KAAA4/B,EAAA,SAAAxmC,EAAA/G,GACAq5B,EAAA/0B,KAAAzF,EAAAmB,MAEAq5B,EAEA,MAAAx6B,GAAA0uC,GAEA,QAAAC,gBAAAC,GACA,GAAA7a,GAAA3wB,QAAAwrC,GAAA,CACA,GAAApU,KAIA,OAHAzG,IAAAjlB,KAAA8/B,EAAA,SAAA1mC,EAAA2mC,GACArU,EAAA/0B,KAAAzF,EAAA8uC,EAAAD,OAEArU,EAEA,MAAAx6B,GAAA8uC,EAAAF,IAEA,QAAAG,iBAAAC,GACA,GAAAC,MAAAC,KAAAj6B,OAAA+5B,EASA,OARAjb,IAAAjlB,KAAAogC,EAAA,SAAA5oB,EAAA6oB,GACA,GAAAC,GAAAC,EAAAF,EACA5wC,UAAA6wC,GACArb,GAAAjlB,KAAAsgC,EAAA,SAAA/rC,EAAAisC,GACAL,EAAAxpC,KAAAzF,EAAAsvC,QAIAL,EA/BA,GAAAjvC,MAAA8uC,KAAkCO,KAAeE,KAAqBC,IAiCtEzb,IAAAxkB,OAAA3P,MACA6vC,QAAA,SAAAC,GACA,GAAAV,GAAAU,EAAAV,QAAAjb,GAAAib,OAAAW,WAAAxuC,EAAAnB,EAAAyF,MACA1F,KAAA2vC,EAAA3vC,KACA6vC,aAAAF,EAAA3vC,KACA8uC,KAAAa,EAAAb,KACAvjB,KAAA,MAAAokB,EAAApkB,QAAAokB,EAAApkB,KACA0jB,SACA/xB,KAAAyyB,EAAAzyB,OACiB,CAuBjB,OAtBAyyB,GAAAG,UACA7vC,EAAAmB,GAAA0uC,QAAAH,EAAAG,QACAtxC,SAAAixC,EAAAE,EAAAG,WACAL,EAAAE,EAAAG,aAEAL,EAAAE,EAAAG,SAAApqC,KAAAtE,IAEAuuC,EAAAI,eACA9vC,EAAAmB,GAAA2uC,aAAAJ,EAAAI,aACAvxC,SAAAgxC,EAAAG,EAAAI,gBACAP,EAAAG,EAAAI,kBAEAP,EAAAG,EAAAI,cAAArqC,KAAAtE,IAEAnB,EAAAmB,QACA2tC,EAAAY,EAAAb,MAAA1tC,EACA5C,SAAA8wC,EAAAL,KACAK,EAAAL,OAEAK,EAAAL,GAAAvpC,KAAAtE,GACAuuC,EAAAK,sBAAAL,EAAAK,qBAAA5uC,GACAqtC,EAAAwB,eAAA7uC,EAAA,KAAA6tC,GACA7tC,GAEA8uC,SAAA,SAAAC,GACA,MAAAnc,IAAA3Q,SAAA8sB,IAAAlwC,EAAAuD,OACAhF,SAAA2xC,EAAA/uC,GACAstC,aAAAyB,EAAA/uC,IACqB5C,SAAA2xC,EAAArB,KACrBF,eAAAuB,EAAArB,MACqBqB,EAAAlB,OACrBD,gBAAAmB,EAAAlB,QADqB,OAIrBjb,GAAAxkB,UAAAvP,GAAA,IAGAmwC,cAAA,SAAAhvC,GACA,GAAAivC,GAAA3B,aAAAttC,EACAivC,UACAA,GAAAnzB,MAGA2M,MAAA,WACA5pB,KACA8uC,KACAO,KACAG,MAEAa,UAAA,SAAAlvC,EAAAmvC,GACA,GAAAC,GAAAvwC,EAAAmB,GAAA6tC,OAAAwB,EAAAzc,GAAAzyB,QAAA+tC,EAAAkB,GAAApvC,EACAkuC,GAAAkB,GAAAE,OAAAD,EAAA,GACAxwC,EAAAmB,GAAA6tC,OAAAsB,EACA/xC,SAAA8wC,EAAAiB,KACAjB,EAAAiB,OAEAjB,EAAAiB,GAAA7qC,KAAAtE,GACAqtC,EAAAwB,eAAA7uC,EAAAovC,EAAAD,IAEAI,YAAA,SAAAvvC,EAAAwvC,GACA,GAAAC,GAAA5wC,EAAAmB,GAAA0tC,IACA7uC,GAAAmB,GAAA0tC,KAAA8B,EACA7B,EAAA6B,GAAAxvC,QACA2tC,GAAA8B,IAEAC,WAAA,SAAA1vC,EAAA2vC,GACA9wC,EAAAmB,GAAApB,KAAA+wC,GAEAC,WAAA,SAAA5vC,EAAA6vC,GACAhxC,EAAAmB,GAAAmqB,KAAA0lB,GAEAC,YAAA,SAAAC,EAAAC,GACAnxC,EAAAkxC,GAAAC,YAEAC,mBAAA,SAAAjwC,GACA,GAAA2uC,GAAA9vC,EAAAmB,GAAA2uC,YACA,OAAAA,GACAP,EAAAO,OAIAuB,cAAA,SAAAlwC,GACA,GAAA0uC,GAAA7vC,EAAAmB,GAAA0uC,OACA,OAAAL,GAAAK,OAIA9b,GAAAib,QACAW,WAAA,aACA2B,UAAA,YACAC,SAAA,WACAC,OAAA,SACAC,SAAA,WACAC,OAAA,SACAC,UAAA,YACAC,kBAAA,oBACAC,gBAAA,kBACAC,kBAAA,oBACAC,cAAA,gBACAC,cAAA,gBACAC,SAAA,WACAC,QAAA,WAEA,WACA,YACAne,IAAAoe,eACAC,SAAA,SAAAC,EAAAhrB,EAAA2N,GACAp1B,KAAAw3B,SAAAib,EAAAhrB,EAAA2N,IAEAsd,gBAAA,SAAAC,GACA,GAAAvF,GAAAptC,IACAm0B,IAAAjlB,KAAAyjC,EAAA,SAAAjsB,EAAAksB,GACAxF,EAAAyF,eAAAD,MAGApb,SAAA,SAAAp3B,EAAAqnB,EAAA2N,GACAp1B,KAAA8yC,kCACA,IAAA7C,GAAA,IAAAjwC,KAAA+yC,WAAApvC,OAAAwwB,GAAAgQ,cAAAnkC,KAAAgzC,gBAAAC,EAAA9e,GAAAtxB,KAAA,SAAAmgC,GACAhjC,KAAAkzC,gBACAlQ,OACA7iC,KAAAH,KAAAmzC,SAAAC,MAAAC,aACqBpD,EAAAqD,IACJtzC,MAAAuzC,EAAApf,GAAAtxB,KAAA,SAAA2wC,GACjBxzC,KAAAkzC,eAAAM,EAAAvD,EAAAqD,IACiBtzC,MAAAyzC,EAAAtf,GAAAtxB,KAAA,SAAAw7B,GACjB,GAAA2E,GAAA7O,GAAAiK,aAAAC,EACAr+B,MAAAkzC,gBACAlQ,OACA7iC,KAAAH,KAAAmzC,SAAAC,MAAAC,YAAA,QACqBpD,EAAAqD,IACJtzC,MAAA0zC,EAAAvf,GAAAtxB,KAAA,SAAA8wC,GACjB,GAAAC,GAAAD,EAAApV,SAAAoV,EAAApV,QAAA,IAAAyE,EAAA7O,GAAAiK,aAAAuV,EAAAtV,OAAAsV,EAAAv0C,KAAAw0C,EACA5zC,MAAAkzC,gBACAlQ,OACA7iC,KAAAwzC,EAAAxzC,MACqB8vC,EAAAqD,IACJtzC,MAAA6zC,EAAA1f,GAAAtxB,KAAA,SAAAixC,GACjB,GAAA3f,GAAA8M,QAAA6S,IAAA3f,GAAAiU,kBAAAmC,cAAA,CACA,GAAAzW,GAAAvwB,MAAA+M,UAAAxJ,MAAAkW,KAAA82B,EAAAhgB,OAAAsZ,EAAAptC,IACAm0B,IAAAjlB,KAAA4kB,EAAA,SAAAxrB,EAAA+U,GACA+vB,EAAA8F,eAAA71B,EAAA4yB,EAAAqD,SAGAtzC,MAAAkzC,eAAAY,EAAA7D,EAAAqD,IAEiBtzC,MAAA+zC,EAAA,WACjB5f,GAAA0M,WAAAzgC,KACAA,EAAAmD,MAAA+M,UAAAxJ,MAAAkW,KAAA5c,IAEAA,KAAAiV,OAAAjV,IACiBgtC,EAAAptC,KAAAszC,IACjBtzC,MAAAgzC,gBAAA/C,EACA7vC,IACA2zC,IACA5f,GAAAjlB,KAAA9O,EAAA,SAAAkI,EAAA0rC,GACA7f,GAAA4M,cAAAiT,GACAH,EAAAG,GACyB7f,GAAAoN,OAAAyS,GACzBf,EAAAe,GACyB7f,GAAA3Q,SAAAwwB,GACzBA,EAAAhR,MAAAgR,EAAA7zC,KACAozC,EAAAS,GAC6BA,EAAA3V,QAAA2V,EAAA7zC,MAC7BuzC,EAAAM,GAEyBA,EAAA3wB,SAAA,WAAA2wB,EAAA3wB,QAAAzM,cACzB68B,EAAAO,GAEA5G,EAAA5rC,IAAAwyC,EAAA,uDAGAh0C,KAAAwB,IAAA,YAAA8xC,EAAA3vC,OAAA,WACA3D,KAAAi0C,uBAAAX,EAAA7rB,EAAA2N,KAGA8e,OAAA,SAAA3yC,GACA,GAAA4yC,GAAAn0C,KAAAo0C,YAAA/D,UACA9uC,MAEA4yC,MAAA/E,SAAAjb,GAAAib,OAAA4C,kBACAhyC,KAAAwB,IAAA2yB,GAAAjyB,OAAA,2DAA0EX,EAAAvB,KAAAq0C,QAAA9yC,IAAA,SAE1EvB,KAAAs0C,SAAAJ,OAAA3yC,IAGAgzC,UAAA,WACA,GAAAC,MAAApH,EAAAptC,IACAm0B,IAAAxkB,OAAA6kC,EAAAx0C,KAAA+yC,YACA5e,GAAAjlB,KAAAslC,EAAA,SAAAlsC,EAAAmsC,GACArH,EAAA8G,OAAAO,KAEAz0C,KAAAs0C,SAAAC,aAEAtc,iBAAA,WACAj4B,KAAA+yC,eAEA2B,eAAA,SAAAnzC,GACA,GAAA4yC,GAAAn0C,KAAAo0C,YAAA/D,UACA9uC,MAEA,UAAA4yB,GAAAiU,kBAAAiD,QAAArrC,KAAAmzC,SAAA1d,SAAAC,WAGAye,EAAA/E,SAAAjb,GAAAib,OAAA0C,QACA9xC,KAAAwB,IAAA2yB,GAAAjyB,OAAA,yDAA6DX,EAAAvB,KAAAq0C,QAAA9yC,KAC7DvB,KAAA20C,YAAApzC,IACA,IAEAvB,KAAAwB,IAAA2yB,GAAAjyB,OAAA,sDAA4EX,EAAAvB,KAAAq0C,QAAA9yC,IAAA,UAE5E,KAEAqzC,WAAA,SAAArzC,GACA,MAAAvB,MAAA60C,gBAAAtzC,IAEAuzC,UAAA,SAAAC,GACA,MAAA/0C,MAAAs0C,SAAAU,QAAAD,IAEAE,cAAA,SAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAt3C,EAAAu3C,EAAA,GAAArhB,IAAAkP,OAgCA,OA/BArjC,MAAAy1C,iBACAF,EAAAv1C,KAAA01C,eAAAR,GACAj3C,GACAq3C,uBACAF,UAAA,EAAAA,EAAA,KACAO,MAAAP,EAAA,IAEAC,GAAAlhB,GAAAiU,kBAAA8C,gBACAqK,EAAAv1C,KAAAk3B,QAAAge,IAEA,MAAAK,EACAC,EAAAhS,SACAryB,UAAAgkC,EACAtxB,MAAA,2BAGA7jB,KAAAy1C,gBAAAG,SAAAL,EAAAJ,EAAAl3C,GAAAiuC,KAAA,SAAA2J,GACAL,EAAAl1C,QAAAu1C,IACyB,SAAA1kC,EAAAsmB,GACzB+d,EAAAhS,SACAryB,YACA0S,MAAA4T,GAAA,oCAKA+d,EAAAhS,SACAryB,UAAAgkC,EACAtxB,MAAA,mCAGA2xB,GAEAM,UAAA,SAAAZ,GACA,MAAAl1C,MAAA+1C,WAAA/1C,KAAAg2C,qBAAAd,KAEAe,YAAA,SAAAf,GACA,MAAAl1C,MAAAk2C,eAAAjb,IAAAia,IAEAhe,QAAA,SAAA6d,GACA,GACAoB,GADA94B,EAAArd,KAAAs0C,SAAApd,QAAA6d,EAUA,OARA13B,KACA84B,EAAAn2C,KAAAo0C,YAAA/D,UACA9uC,GAAAwzC,IAEAoB,IACA94B,EAAA84B,EAAA94B,OAGAA,GAAA,MAEA+4B,cAAA,WACA,MAAAp2C,MAAAo0C,YAAA/D,UACAjB,QAAAjb,GAAAib,OAAA2C,UAAA5d,GAAAib,OAAA6C,gBAAA9d,GAAAib,OAAAwC,UACiBjuC,QAEjB0wC,QAAA,SAAA9yC,GACA,MAAAvB,MAAAo0C,YAAA/D,UACA9uC,OACiBpB,MAEjBk2C,YAAA,SAAA90C,GACA,GAAA+0C,GAAAt2C,KAAAu2C,YACAh1C,OACiBgwC,EAAA,IAMjB,OALA+E,IACA33C,SAAA23C,EAAA/E,WACAA,EAAA+E,EAAA/E,UAGAA,GAEAiF,sBAAA,WACA,MAAAx2C,MAAAs0C,SAAAkC,yBAEAC,QAAA,SAAAl1C,GACA,MAAAvB,MAAAo0C,YAAA/D,UACA9uC,OACiBmqB,MAEjBgrB,cAAA,WACA,MAAA12C,MAAA22C,cAEAC,yBAAA,WACA,GAAAC,GAAA72C,KAAA82C,iBACA,OAAAD,GAAA,EACAA,EAAA72C,KAAA+2C,qBAEA,MAEAR,WAAA,SAAAjG,GACA,MAAAtwC,MAAAo0C,YAAA/D,SAAAC,IAEA0G,QAAA,SAAAz1C,GACA,MAAAvB,MAAAo0C,YAAA/D,UACA9uC,OACiB0tC,MAEjBgI,YAAA,SAAA11C,GACA,MAAAvB,MAAAs0C,SAAA4C,gBAAA31C,IAEAC,IAAA,SAAAwlB,EAAA4Y,IACA5/B,KAAAmzC,SAAAluB,OAAA2a,GAAA,SAAAA,EAEiBA,GAAA,SAAAA,GACjBzL,GAAA3yB,IAAA,kBAAA2yB,GAAAjX,QAAA,KAAA8J,EAAA4Y,GAFAzL,GAAA3yB,IAAA,kBAAA2yB,GAAAjX,QAAA,KAAA8J,IAKAmwB,YAAA,SAAA51C,GACA,GAAA4yC,GAAAn0C,KAAAo0C,YAAA/D,UACA9uC,MAEA,KAAA4yB,GAAAiU,kBAAAiD,QAAArrC,KAAAmzC,SAAA1d,SAAAC,QACA,QAEA,IAAAvB,GAAAzyB,SAAAyyB,GAAAib,OAAA2C,UAAA5d,GAAAib,OAAA6C,iBAAAkC,EAAA/E,SAAA,GACA,GAAApvC,KAAAs0C,SAAAjJ,MAAA9pC,GAEA,MADAvB,MAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA0C,SACA,CAEA9xC,MAAAwB,IAAA2yB,GAAAjyB,OAAA,mCAA0EX,EAAAvB,KAAAq0C,QAAA9yC,IAAA,aAG1EvB,MAAAwB,IAAA2yB,GAAAjyB,OAAA,wDAAyEX,EAAAvB,KAAAq0C,QAAA9yC,IAAA,QAEzE,WAEAgvC,cAAA,SAAAhvC,GACAvB,KAAAs0C,SAAA8C,QAAA71C,GACAvB,KAAAo0C,YAAA7D,cAAAhvC,IAEAyoB,MAAA,WACAhqB,KAAAwB,IAAA,yBACAxB,KAAAs0C,SAAAtqB,QACAhqB,KAAA+yC,cACA/yC,KAAAq3C,gBACAr3C,KAAAs3C,kBACAt3C,KAAAu3C,mBACAv3C,KAAA01C,kBACAvhB,GAAAjlB,KAAAlP,KAAAw3C,SAAA,SAAAlvC,EAAAQ,GACAA,EAAAkhB,UAEAhqB,KAAAy3C,aAAAztB,QACAhqB,KAAAk2C,eAAAlsB,QACAhqB,KAAA+2C,qBAAA,EACA/2C,KAAA22C,aAAA,EACA32C,KAAAo0C,YAAApqB,QACAhqB,KAAAg2C,wBACAh2C,KAAA03C,eAAA13C,KAAA03C,cAAA1tB,QACAhqB,KAAAmzC,SAAAwE,QAAAC,gBAAA53C,KAAA63C,sBACA73C,KAAA83C,kCACA93C,KAAA+3C,+BACA/3C,KAAAg4C,gBAAAh4C,KAAAg4C,eAAAhuB,QACAhqB,KAAAi4C,uBAAAjuB,SAEAiM,MAAA,SAAA10B,GACA,MAAAvB,MAAAk4C,aAAA32C,IAEA42C,WAAA,SAAA52C,EAAA62C,GACA,GAAAhL,GAAAptC,IACA,OAAAm0B,IAAAkkB,OAAA/nC,UAAA6nC,WAAA52C,EAAA62C,GACA52C,IAAA2yB,GAAAtxB,KAAAuqC,EAAA5rC,IAAA4rC,GACAlW,QAAA/C,GAAAtxB,KAAAuqC,EAAAlW,QAAAkW,GACA+G,WAAA/G,EAAAgH,eAGAkE,iBAAA,SAAAx0B,EAAAviB;AACAvB,KAAAu4C,oBAAAC,IAAA10B,EAAAviB,IAEAk3C,oBAAA,SAAAl3C,EAAAnB,GACAJ,KAAAi4C,uBAAAO,IAAAp4C,EAAAmB,IAEAm3C,2BAAA,SAAA50B,EAAAviB,GACAvB,KAAA24C,8BAAAH,IAAA10B,EAAAviB,IAEAq3C,sBAAA,SAAAxjB,EAAA7zB,GACAvB,KAAA64C,yBAAAL,IAAApjB,EAAA7zB,IAEAu3C,oBAAA,SAAArxB,EAAAlmB,GACAvB,KAAA+4C,uBAAAP,IAAA/wB,EAAAlmB,IAEAy3C,YAAA,SAAA5jB,EAAA7zB,GACAvB,KAAAk2C,eAAAsC,IAAApjB,EAAA7zB,IAEA03C,QAAA,SAAAC,GACAl5C,KAAAm5C,4BAAAD,IAEAE,aAAA,SAAAC,GACAr5C,KAAA82C,kBAAAuC,GAEAC,QAAA,SAAA/3C,EAAA2vC,GACAlxC,KAAAo0C,YAAAnD,WAAA1vC,EAAA2vC,IAEAla,UAAA,SAAAvP,EAAAlmB,GACAvB,KAAAy3C,aAAAe,IAAA/wB,EAAAlmB,IAEAg4C,QAAA,SAAAh4C,EAAAwvC,GACA,MAAA/wC,MAAAo0C,YAAAtD,YAAAvvC,EAAAwvC,IAEAN,UAAA,SAAAlvC,EAAAmvC,GACA,GAAA8I,GAAAx5C,KAAAu2C,YACAh1C,MAEA,KAAAi4C,EACA,SAAArlB,IAAA1D,MAAAlvB,EAAA,2BAEA,QAAAmvC,GACA,IAAAvc,IAAAib,OAAAkD,QACAtyC,KAAAy5C,kBAAAl4C,EAAA,QACA,MAEA,KAAA4yB,IAAAib,OAAAgD,cACApyC,KAAAy5C,kBAAAl4C,EAAA,QACA,MAEA,SACA,GAAAyuB,GAAA,+BAAA7vB,KAAA,6BAAAuwC,CAEA,MADA1wC,MAAAwB,IAAAwuB,GACA,GAAAmE,IAAA1D,MAAAT,KAGAiH,kBAAA,WACA,IAAAj3B,KAAA+yC,WAAApvC,OACA3D,KAAA05C,WAAA,gBAEA15C,KAAA25C,uBAIAxlB,GAAAylB,gBACA/G,eAAA,SAAAgH,GACA,GAAAzM,GAAAptC,IACA,OAAAA,MAAAo0C,YAAAvE,SACAZ,KAAA4K,EAAA5K,KACA9uC,KAAA05C,EAAA15C,KACAurB,KAAAmuB,EAAAnuB,KACA0jB,OAAAjb,GAAAib,OAAA8C,kBACA/B,qBAAA,SAAA5uC,GACAs4C,EAAAC,oBAAA1M,EAAAwL,sBAAAiB,EAAAC,mBAAAv4C,GACAs4C,EAAAE,kBAAA3M,EAAA0L,oBAAAe,EAAAE,iBAAAx4C,GACAs4C,EAAAG,eACA5M,EAAAsI,eAAAn0C,GAAAs4C,EAAAG,cAEA5M,EAAAuJ,eACAvJ,EAAA2J,2BAIAkD,sBAAA,SAAA58B,EAAA68B,GACA/lB,GAAAwM,OAAAtjB,KACAA,EAAA88B,WAAAn6C,KAAAo6C,aAAAF,KAGAG,YAAA,SAAAn2B,GACAlkB,KAAAmzC,SAAA7e,UAAAqC,QAAA,UAAAzS,EAAAvlB,SAEA27C,qBAAA,WACA,GAAAlN,GAAAptC,IACA,WAAAm0B,IAAAomB,yBACA5zB,OAAA3mB,KAAAmzC,SAAAyB,WAAAjuB,OAAAkG,cACA2tB,eAAAx6C,KAAAmzC,SAAAqH,eACAC,cAAAz6C,KAAAmzC,SAAAhe,QAAAG,SACAolB,cAAA16C,KAAA24C,8BACAgC,YAAA36C,KAAA+4C,uBACA6B,cAAA56C,KAAA64C,yBACAgC,KAAA76C,KAAAmzC,SAAA0H,KACAr5C,IAAA2yB,GAAAtxB,KAAAuqC,EAAA5rC,IAAA4rC,GACA0N,SAAA,SAAAv5C,GACA6rC,EAAA2N,UAAAx5C,GACA6rC,EAAA+F,SAAA7e,UAAAwmB,SAAAv5C,IAEAy5C,iBAAA,SAAAz5C,EAAA05C,EAAAC,GACA9N,EAAAqM,kBAAAl4C,EAAA05C,EAAAC,GACA9N,EAAA+F,SAAA7e,UAAA0mB,iBAAAz5C,EAAA05C,EAAAC,OAIAC,oBAAA,WACA,GAAA/N,GAAAptC,IACA,WAAAm0B,IAAAinB,cACAC,cAAAr7C,KAAAmzC,SAAAmI,MAAAD,cACA/mB,WACA9yB,IAAA2yB,GAAAtxB,KAAAuqC,EAAA5rC,IAAA4rC,GACAmO,cAAA,SAAAvY,GACAoK,EAAAoO,wBACAr7C,KAAA,kBACA6M,SAAAmnB,GAAAtxB,KAAAuqC,EAAA+F,SAAA7e,UAAAmnB,gBAAArO,EAAApK,GACAyJ,UAAAtY,GAAAtxB,KAAAuqC,EAAAsO,oBAAAtO,EAAApK,GACA2Y,WAAA,sBAMAC,aAAA,SAAAC,EAAAC,GACA,GAAAC,MAA8BC,EAAAH,EAAAI,KAAmDC,EAAAJ,EAAAK,EAAA,SAAAC,GACjF,MAAAjoB,IAAA3Q,SAAA44B,GACAjoB,GAAAxkB,UAA2CysC,GAE3CA,GACiBC,EAAA,WACjB,MAAAloB,IAAA2L,WAAAoc,GACAA,IAEAA,GACiBI,EAAA,SAAA/6C,EAAAg7C,GACjBL,GAAA/nB,GAAA3Q,SAAA+4B,IACApoB,GAAAxkB,OAAA4sC,EAAAF,KAEAJ,EAAA16C,IACA4yB,GAAAxkB,OAAA4sC,EAAAN,EAAA16C,IAGA,QACAi3C,IAAA,SAAAnlC,EAAA9R,GACA,MAAAA,GACAw6C,KACAC,EAAAG,EAAA9oC,IAEA0oC,EAAAx6C,GAAA46C,EAAA9oC,IAGA4nB,IAAA,SAAA15B,GACA,GAAAkM,EAOA,OALAA,GADA,MAAAlM,GAAAw6C,EAAAx6C,GACAw6C,EAAAx6C,GAEA46C,EAAAH,GAEAM,EAAA/6C,EAAAkM,GACA0uC,EAAA1uC,IAEA+uC,YAAA,SAAAj7C,EAAAkM,GACA0mB,GAAA3Q,SAAAu4B,KACA,OAAAx6C,EACA4yB,GAAA2L,WAAAryB,GACAyuC,EAAAzuC,GAEAyuC,QACA/nB,GAAAxkB,OAAAusC,EAAAzuC,KAGAwuC,EAAA16C,GAAA06C,EAAA16C,OACA4yB,GAAAxkB,OAAAssC,EAAA16C,GAAAkM,MAIA0L,OAAA,SAAA+7B,GACA,aAAA6G,GAAA7G,IAEAlrB,MAAA,WACA+xB,KACAE,KACAD,EAAAH,KAIAY,yBAAA,WACA,GAAArP,GAAAptC,IACA,WAAAm0B,IAAAwa,YACA0F,QAAA,SAAA9yC,GACA,MAAA6rC,GAAAiH,QAAA9yC,IAEAy1C,QAAA,SAAAz1C,GACA,MAAA6rC,GAAA4J,QAAAz1C,IAEAk1C,QAAA,SAAAl1C,GACA,MAAA6rC,GAAAqJ,QAAAl1C,IAEA6uC,eAAA,SAAA7uC,EAAAovC,EAAAD,GACAtD,EAAAsP,sBAAAn7C,EAAAovC,EAAAD,GACAtD,EAAA+F,SAAA7e,UAAA8b,eAAA7uC,EAAAovC,EAAAD,GACAtD,EAAAuP,kBAAAp7C,EAAAmvC,GACAtD,EAAA4K,gBACAn9B,WAAA,WACAuyB,EAAA4K,eAAA5H,eAAA7uC,EAAAovC,EAAAD,IAC6B,OAK7BkM,oBAAA,SAAA9M,GAEA,QAAA+M,iBACA,QAAA1oB,GAAAiU,kBAAAmC,kBACA6C,EAAA+F,SAAA2J,YAAAC,gBAAA5oB,GAAAqR,QAAArR,GAAAoR,QAAA6H,EAAA4P,oBAAAlmB,EAAA,WAGAn4B,SAAAmxC,EAAAxsB,SACA8pB,EAAA+F,SAAA7vB,SAEAwsB,EAAAxsB,WATA,GAAAxa,GAAAskC,EAAAptC,KAAAutC,EAAAuC,EAAAmN,QAAAj9C,KAAAmzC,SAAAtc,WAAA0W,YAAAzW,EAAAgZ,EAAAhZ,mBAAA92B,KAAAmzC,SAAAtc,WAAAC,iBA+BA,OAlBAhuB,GAAA,GAAAqrB,IAAA4Y,cACAQ,cACAv+B,QAAA8gC,EAAA9gC,QACAi/B,WAAAjuC,KAAAmzC,SAAAhkB,QAAA+tB,YACA5P,QAAAwC,EAAAxC,QACAU,WAAAhuC,KAAAmzC,SAAAhkB,QAAAguB,YACAjP,2BAAAluC,KAAAmzC,SAAA2J,YAAAM,iBACA95B,SAAAu5B,gBACA18C,KAAAH,KAAAmzC,SAAAhe,QAAAE,UACAv1B,SAAA,SAAA4hC,GACA0L,EAAAiQ,eAAA3b,IAEA50B,MAAA,MAAAgjC,EAAAhjC,MAAA9M,KAAAmzC,SAAAtlC,KAAAyvC,eAAAxN,EAAAhjC,QAEA9M,KAAAu9C,gBAAArV,YAAA,WACAp/B,EAAA6rB,YAEAyY,EAAAoK,SAAA3xC,KAAAiD,GACAA,GAEA00C,qBAAA,SAAAC,EAAAC,GACA,GAAAtQ,GAAAptC,KAAA29C,KAAoD1/C,GACpDgnB,MAAAjlB,KAAAmzC,SAAAluB,MACAu1B,eAAAx6C,KAAAmzC,SAAAqH,eACAK,KAAA76C,KAAAmzC,SAAA0H,KACAF,YAAA36C,KAAAy3C,aACAmD,cAAA56C,KAAAk2C,eACAzgB,SAAAz1B,KAAAmzC,SAAA1d,SACA8V,OAAAvrC,KAAAmzC,SAAA5H,OACA6H,MAAApzC,KAAAmzC,SAAAC,MACA5xC,IAAA2yB,GAAAtxB,KAAAuqC,EAAA5rC,IAAA4rC,GACAwQ,kBAAA59C,KAAAmzC,SAAAld,MAAA4nB,6BACAtnB,WAAA,SAAAh1B,EAAApB,EAAA29C,EAAAxmB,GACAwmB,EAAA,GAAAxmB,EAAA,IAGAqmB,EAAAp8C,GACAo8C,EAAAp8C,GAAAu8C,YAAAH,EAAAp8C,GAAA+1B,YACA8V,EAAA2Q,YAAAx8C,EAAApB,EAAA29C,EAAAxmB,GACA8V,EAAA+F,SAAA7e,UAAAiC,WAAAh1B,EAAApB,EAAA29C,EAAAxmB,KAGA8V,EAAA2Q,YAAAx8C,EAAApB,EAAA29C,EAAAxmB,GACA8V,EAAA+F,SAAA7e,UAAAiC,WAAAh1B,EAAApB,EAAA29C,EAAAxmB,IAEAqmB,EAAAp8C,IACAu8C,SACAxmB,WAGAb,WAAA,SAAAl1B,EAAApB,EAAAwlB,EAAAsL,SACA0sB,GAAAp8C,EACA,IAEyB8kC,GAFzB+I,EAAAhC,EAAAmJ,YACAh1C,OACyB6tC,MACzBA,KAAAjb,GAAAib,OAAA8C,mBAAA9C,IAAAjb,GAAAib,OAAA+C,gBAGA9L,EAAA+G,EAAA4Q,YAAAz8C,EAAApB,EAAAwlB,EAAAsL,GACAoV,YAAAlS,IAAAkP,QACAgD,EAAAvkB,KAAA,WACAsrB,EAAA+F,SAAA7e,UAAAmC,WAAAl1B,EAAApB,EAAAwlB,EAAAsL,KAGAmc,EAAA+F,SAAA7e,UAAAmC,WAAAl1B,EAAApB,EAAAwlB,EAAAsL,KAGAgtB,SAAA,SAAA18C,EAAApB,EAAA+9C,GACA,GAAA9a,GAAA,GAAAjP,IAAAkP,OAaA,OAZA+J,GAAAoO,wBACAr7C,KAAA,WACA6M,SAAAmnB,GAAAtxB,KAAAuqC,EAAA+F,SAAA7e,UAAA2pB,SAAA7Q,EAAA7rC,EAAApB,GACAusC,UAAAtJ,EAAAI,QACAiJ,UAAA,WACAyR,EAAAhS,KAAA,WACAkB,EAAA+Q,UAAA58C,EAAApB,KAEAijC,EAAA9iC,WAEAq7C,WAAAp6C,IAEA6hC,GAEAgb,aAAAjqB,GAAAtxB,KAAA7C,KAAAq+C,cAAAr+C,MACAm2B,SAAA,SAAA50B,EAAApB,GACAitC,EAAAkR,UAAA/8C,EAAApB,EACA,IAAAo+C,GAAAnR,EAAA+F,SAAA7e,UAAA6B,SAAA50B,EAAApB,EACA,OAAAg0B,IAAA6X,iBAAAuS,IACAnR,EAAA5rC,IAAA2yB,GAAAjyB,OAAA,+DAA+DX,IAC/Dg9C,IAEA,GAAApqB,IAAAkP,SAAA/iC,WAEAk+C,cAAA,SAAAj9C,EAAApB,EAAAs+C,GACArR,EAAAsR,eAAAn9C,EAAAk9C,EACA,IAAAE,GAAAvR,EAAA+F,SAAA7e,UAAAkqB,cAAAj9C,EAAApB,EAAAs+C,EACA,OAAAtqB,IAAA6X,iBAAA2S,IACAvR,EAAA5rC,IAAA2yB,GAAAjyB,OAAA,uEAAuEX,EAAAk9C,EAAA1oB,YACvE4oB,IAEA,GAAAxqB,IAAAkP,SAAA/iC,WAEAs+C,qBAAA,SAAAr9C,EAAAk9C,EAAA94B,EAAAsL,GACAmc,EAAAyR,sBAAAt9C,EAAAk9C,GACArR,EAAA+F,SAAA7e,UAAAsqB,qBAAAh8C,MAAAwqC,EAAA1lB,YAEAo3B,SAAA,SAAAv9C,EAAApB,EAAAs+C,EAAAM,GACA,MAAA3R,GAAA+F,SAAA7e,UAAAwqB,SAAAv9C,EAAApB,EAAAs+C,EAAAM,IAEAC,YAAA,SAAAz9C,EAAApB,EAAA8+C,EAAAhuB,GACA,MAAAmc,GAAA8R,aAAAt8C,MAAAwqC,EAAA1lB,YAEAy3B,cAAA,SAAA59C,EAAAwvC,GACA3D,EAAA5rC,IAAA,sCAAA4rC,EAAA4J,QAAAz1C,GAAA,SAAAwvC,EAAA,KACA3D,EAAAmM,QAAAh4C,EAAAwvC,IAEAsD,QAAAlgB,GAAAtxB,KAAAuqC,EAAAiH,QAAAjH,GACA4J,QAAA7iB,GAAAtxB,KAAAuqC,EAAA4J,QAAA5J,GACAqJ,QAAAtiB,GAAAtxB,KAAAuqC,EAAAqJ,QAAArJ,GACAgS,QAAAjrB,GAAAtxB,KAAAuqC,EAAAiS,SAAAjS,GACAkS,cAAA,SAAArQ,GACA,MAAA7B,GAAAmJ,YACAtH,UAGAsQ,SAAA,SAAAh+C,GACA,GAAA6tC,GAAAhC,EAAAmJ,YACAh1C,OACyB6tC,MACzB,OAAAA,KAAAjb,GAAAib,OAAAwC,QAAAxC,IAAAjb,GAAAib,OAAAsC,WAAAtC,IAAAjb,GAAAib,OAAA6C,iBAAA7C,IAAAjb,GAAAib,OAAA0C,QAEAN,mBAAApE,EAAAgH,YAAA5C,mBACAC,cAAArE,EAAAgH,YAAA3C,cACA+N,aAAA,SAAAj+C,GACA,MAAA6rC,GAAAmJ,YACAh1C,OACyB6tC,SAAAjb,GAAAib,OAAA2C,WAEzB0N,oBAAAtrB,GAAAtxB,KAAAuqC,EAAAsS,qBAAAtS,GACAqD,UAAA,SAAAlvC,EAAA6tC,GACAhC,EAAAgH,YAAA3D,UAAAlvC,EAAA6tC,IAYA,OATAjb,IAAAjlB,KAAAlP,KAAAmzC,SAAAhe,QAAA,SAAAxe,EAAAtD,GACApV,EAAA0Y,GAAAtD,IAEApV,EAAAy8C,cAAA16C,KAAAu4C,oBACAkF,GACAtpB,GAAAjlB,KAAAuuC,EAAA,SAAAxzB,EAAA5W,GACApV,EAAAgsB,GAAA5W,IAGA,GAAA8gB,IAAAwrB,wBAAA1hD,EAAAy/C,IAEAkC,oBAAA,SAAAr+C,GACAvB,KAAA+2C,uBACA/2C,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAuC,WAEAkO,YAAA,SAAAjd,GACA,OAAAA,EACA,MAAAA,GAAA5iC,KAAAmzC,SAAAtlC,KAAAiyC,YAAA,EAEA,IAAAr8C,KACA,GACAm/B,IAAA,IACAn/B,UACiBm/B,EAAA,IACjB,OAAAnrB,MAAAtS,IAAAy9B,EAAA,IAAAmd,QAAA,GAAA//C,KAAAmzC,SAAAtlC,KAAAiyC,YAAAr8C,IAEAu8C,0BAAA,WACA,GAAA5S,GAAAptC,IACAA,MAAAigD,qBACA9rB,GAAAjlB,KAAAlP,KAAAmzC,SAAA+M,aAAA,SAAA53C,EAAA63C,GACA,GAAA78B,GAAA68B,EAAA78B,SAAAuT,EAAA1C,GAAAxkB,UAA6Fy9B,EAAA+F,SAAAtc,YAAA,GAAAupB,EAAAjsB,GAAAxkB,UAAiEwwC,EAC9JxhD,UAAA2kB,IACAA,EAAA8pB,EAAA+F,SAAA7vB,UAEA88B,EAAAvpB,YACA1C,GAAAxkB,OAAAknB,EAAAspB,EAAAtpB,YAAA,GAEA1C,GAAAxkB,OAAAywC,GACA98B,WACAuT,eACqB,GACrBuW,EAAAiT,iBAAAD,MAGArK,WAAA,SAAA5I,GACA,GAAAmT,GAAAtgD,KAAAigD,kBAAA9S,EACA,OAAAmT,GACAA,EAAAtxC,QACiBm+B,IAAAntC,KAAAugD,iBACjBvgD,KAAAmzC,SAAArqC,OADiB,QAIjBsxC,aAAA,SAAAoG,GACA,GAAAC,GAAAC,EAAAC,EAAAH,CAIA,IAHAG,YAAAxsB,IAAAwY,YACAgU,IAAA/T,eAEA+T,IAAAxsB,GAAAoN,OAAAof,GAAA,CACA,GAAAxsB,GAAAwM,OAAAggB,GACA,MAAAA,GAAAxG,UACqB,cAAAwG,EAAAt9B,QAAAzM,eAAA,SAAA+pC,EAAAvhD,KAAAwX,cACrB,MAAA+pC,GAAApxB,aAAA4E,GAAA4Y,aAAAG,oBASA,IAPAuT,EAAAE,EAAAtjB,qBAAA,SACAlJ,GAAAjlB,KAAAuxC,EAAA,SAAAn4C,EAAAo5B,GACA,YAAAA,EAAAnS,aAAA,QAEA,MADAmxB,GAAAhf,GACA,IAGAgf,EACA,MAAAA,GAAAnxB,aAAA4E,GAAA4Y,aAAAG,uBAIAwS,qBAAA,SAAAxK,GACA,MAAAl1C,MAAAi4C,uBAAAhd,IAAAia,IAEA0L,gBAAA,WACA,MAAA5gD,MAAAo0C,YAAA/D,UACAjB,QAAAjb,GAAAib,OAAA2C,UAAA5d,GAAAib,OAAA6C,gBAAA9d,GAAAib,OAAAwC,OAAAzd,GAAAib,OAAAW,WAAA5b,GAAAib,OAAAsC,UAAAvd,GAAAib,OAAA0C,UACiBnuC,QAEjBk9C,mBAAA,SAAA1T,GACA,GAAAiT,GAAApgD,KAAAigD,kBAAA9S,EACA,OAAAiT,KAAAvpB,WAAA72B,KAAAmzC,SAAAtc,YAEAiqB,yBAAA,SAAAC,GACA,MAAAA,GAAA1jC,eAAA8W,IAAAwY,WAEAxsC,KAAAg0B,GAAAyT,YAAAmZ,EAAA1jC,KAAAuvB,eACAlhB,KAAAq1B,EAAA1jC,KAAAuvB,cAAAlhB,OAIAvrB,KAAAH,KAAAu2C,YACAh1C,GAAAw/C,EAAAx/C,KACqBpB,KACrBurB,KAAA1rB,KAAAu2C,YACAh1C,GAAAw/C,EAAAx/C,KACqBmqB,OAGrBs1B,0BAAA,SAAAC,GACA,GAAA7T,GAAAptC,KAAAkhD,IAIA,OAHA/sB,IAAAjlB,KAAA+xC,EAAA,SAAA34C,EAAAy4C,GACAG,EAAAr7C,KAAAunC,EAAA0T,yBAAAC,MAEAG,GAEAC,oBAAA,WACA,GAAAnhD,KAAAmzC,SAAAiO,OAAA5b,KAAArR,GAAAqR,MAAA,CACA,GAAA6b,GAAA,yBAAmDv4C,EAAA9I,KAAAmzC,SAAAiO,OAAAt4C,OAAAqkC,EAAArkC,EAAA9I,KAAAo6C,aAAAtxC,GAAA9I,KAAAugD,iBAAAe,EAAAthD,KAAAmzC,QACnDhG,QAAAntC,KAAAugD,mBACAe,EAAAthD,KAAAigD,kBAAA9S,IAEAmU,EAAAh+B,UAAA,EACA,OAAAg+B,EAAAzqB,WAAA0W,YACA+T,EAAAzqB,WAAA0W,YAAA8T,EAEAC,EAAAzqB,WAAA0W,aAAA,IAAA8T,EAEAltB,GAAAjlB,KAAAlP,KAAAw3C,SAAA,SAAAlvC,EAAAQ,GACA,GAAAA,EAAAwlC,gBAAAnB,EAGA,MAFArkC,GAAAukC,YAAAiU,EAAAh+B,UACAxa,EAAA4lC,eAAA4S,EAAA/T,cACA,MAKAiO,uBAAA,SAAAr3B,GACA,GAAAipB,GAAAptC,KAAAuhD,EAAAp9B,EAAAnX,UACA,OAAAmnB,IAAA6X,iBAAAuV,IACAvhD,KAAAwB,IAAA2iB,EAAAhkB,KAAA,kBAAAgkB,EAAAhkB,KAAA,gCAAAgkB,EAAAw3B,YACA4F,EAAArV,KAAA,SAAAsV,GACApU,EAAA5rC,IAAA2iB,EAAAhkB,KAAA,wBAAAgkB,EAAAw3B,YACAx3B,EAAAsoB,UAAA+U,IACqB,WACrBr9B,EAAAuoB,WACAU,EAAA5rC,IAAA2iB,EAAAhkB,KAAA,wBAAAgkB,EAAAw3B,YACAx3B,EAAAuoB,aAEAU,EAAA5rC,IAAA2iB,EAAAhkB,KAAA,wBAAAgkB,EAAAw3B,gBAIA4F,KAAA,EACAp9B,EAAAsoB,UAAA8U,GAEAp9B,EAAAuoB,WACA1sC,KAAAwB,IAAA2iB,EAAAhkB,KAAA,mCAAAgkB,EAAAw3B,WAAA,iCACAx3B,EAAAuoB,aAEA1sC,KAAAwB,IAAA2iB,EAAAhkB,KAAA,mCAAAgkB,EAAAw3B,WAAA,wBAGA4F,IAEArO,eAAA,SAAA71B,EAAA4yB,EAAAwR,GACA,GAAArU,GAAAptC,KAAAivC,EAAA9a,GAAAgQ,cAAAzY,KAAAvrB,EAAAg0B,GAAAyT,YAAAvqB,GAAAqkC,EAAArkC,EAAA2lB,MAAA3lB,EAAA3M,EAAA1Q,KAAA2hD,sBAAA3hD,KAAA2hD,sBAAAxtB,GAAAtxB,KAAAuqC,EAAAwU,sBAAAxU,IACAjZ,GAAA8M,QAAAygB,MAAAh2B,MAAA,IACAA,EAAAg2B,EAAAh2B,MAEAhb,EAAAgxC,EAAAvhD,EAAA8uC,EAAAvjB,EAAA+1B,EAAAxR,EAAAjwC,KAAAmzC,SAAAhe,QAAAG,UACA6e,WAAA/G,EAAAgH,YACAuG,YAAAvN,EAAAqK,aACAoK,iBAAA,SAAAtgD,EAAA8b,GACA+vB,EAAAkH,SAAA/tC,IAAAhF,EAAA8b,GACA+vB,EAAA2J,uBACA3J,EAAA0U,aAAAvgD,OAIAqgD,sBAAA,SAAAvkC,EAAAld,EAAA8uC,EAAAvjB,EAAAq2B,EAAA9R,GACA,GAAA1uC,GAAAvB,KAAAo0C,YAAAvE,SACAZ,OACA9uC,OACAurB,OACAukB,UACA5yB,QAEArd,MAAAs0C,SAAA/tC,IAAAhF,EAAA8b,GACArd,KAAA8hD,aAAAvgD,GACAvB,KAAA+2C,uBACAgL,EAAAl8C,MACAtE,KACA8b,UAGAq+B,oBAAA,SAAA1Y,EAAAgf,GACA,GAAAC,GAAAjf,EAAA5jC,KAAAkU,MAAA,QAAAnT,EAAA6hD,CACA,OAAA7hD,IACAA,EAAAH,KAAAmzC,SAAAmI,MAAAjI,aAEAlzC,GAAA,IAAA8hD,EACAjiD,KAAAw3B,UACAr3B,OACA6iC,UAGAkf,qBAAA,SAAA3gD,GACA,GAAAvB,KAAAu2C,YACAh1C,OACiB6tC,SAAAjb,GAAAib,OAAAkD,QAAA,CACjB,GAAAnyC,GAAAH,KAAAq0C,QAAA9yC,EACAvB,MAAA+2C,uBACA/2C,KAAA22C,eACA32C,KAAAs0C,SAAA8C,QAAA71C,GACAvB,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAkD,SACAtyC,KAAAwB,IAAA,uBAAArB,EAAA,sBAGAgiD,oBAAA,SAAA5gD,EAAA05C,GACA,GAAA96C,GAAAH,KAAAq0C,QAAA9yC,EACAvB,MAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAgD,eACApyC,KAAAwB,IAAA,uBAAArB,EAAA,yBACA86C,GAAAt8C,SAAAs8C,EAAArS,gBAGA5oC,KAAAmzC,SAAA7e,UAAAqC,QAAAp1B,EAAApB,EAAA,4CAAA86C,EAAA7L,OAAA6L,GAFAj7C,KAAAmzC,SAAA7e,UAAAqC,QAAAp1B,EAAApB,EAAA,wBAAA86C,IAKAoF,iBAAA,SAAAvQ,GACA,GAAAhnC,GAAA9I,KAAA48C,qBACAK,OAAAnN,EAAAjZ,WAAA0W,YACAzW,kBAAAgZ,EAAAjZ,WAAAC,kBACA9nB,QAAA8gC,EAAA9gC,QACAs+B,QAAAwC,EAAAxC,QACAhqB,SAAAwsB,EAAAxsB,SACAxW,MAAAgjC,EAAAwN,gBAEAt9C,MAAAigD,kBAAAn3C,EAAAwlC,eAAAwB,GAEAsS,0BAAA,WACApiD,KAAAqiD,aAAAluB,GAAAmuB,aAAA,GAAAnuB,IAAAmuB,YAAAtiD,KAAAmzC,SAAA/wB,KAAA+R,GAAAtxB,KAAA7C,KAAAi3B,kBAAAj3B,MAAAm0B,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,OACAA,KAAAqiD,cAAAriD,KAAAqiD,aAAAE,gBACAviD,KAAAy3C,aAAAz3C,KAAA47C,aAAA57C,KAAAmzC,SAAAhe,QAAA1N,OAAAznB,KAAAqiD,aAAAG,uBACAxiD,KAAAmzC,SAAAxf,WAAA3zB,KAAAqiD,aAAAI,cACAziD,KAAAqiD,aAAAK,cACA1iD,KAAAmzC,SAAAhe,QAAAC,SAAAp1B,KAAAqiD,aAAAK,cAGA1iD,KAAAy3C,aAAAz3C,KAAA47C,aAAA57C,KAAAmzC,SAAAhe,QAAA1N,SAGAk7B,kBAAA,WACA,SAAAxuB,GAAAomB,0BAAAv6C,KAAAmzC,SAAAyB,WAAAlf,YAGA11B,KAAAmzC,SAAA0H,KAAA+H,aACAzuB,GAAAiU,kBAAAwC,sBAGAzW,GAAAiU,kBAAAuC,oBAAA3qC,KAAAmzC,SAAA0H,KAAAgI,aAOA7F,oBAAA,SAAA8F,EAAAhb,GACA,GAAA9kB,IAAA,CACA,QAAA8/B,EAAAn/C,SAGAwwB,GAAAjlB,KAAA4zC,EAAA,SAAAx6C,EAAAy6C,GACA,GAAA5uB,GAAAvQ,SAAAm/B,GAAA,CACA,GAAAC,GAAA,GAAA9mC,QAAA,MAAA6mC,EAAA,QACA,UAAAjb,EAAAt1B,MAAAwwC,GAEA,MADAhgC,IAAA,GACA,KAIAA,IAEA02B,WAAA,SAAAuJ,EAAAC,EAAA/0C,GAEA,QAAAk2B,GAAAlkC,EAAAgjD,GACAj/B,IAAA+C,QAAA9mB,EAAAgjD,GAFA,GAAAC,GAAAC,EAAAn/B,EAAAlkB,KAAAmzC,SAAAjoC,SAAA+3C,GAAAnsB,KAAAzc,KAAAhF,OAAA6tC,GAAA/iD,EAAAka,EAAA,GAAA8yB,EAAAntC,KAAAo6C,aAAAjsC,GAAAm1C,EAAAtjD,KAAA6gD,mBAAA1T,EAqBA,OAjBAhZ,IAAAjlB,KAAAo0C,EAAAxsB,kBAAA,SAAAxuB,EAAAi7C,GACApvB,GAAAvQ,SAAA2/B,IACAzsB,EAAAjxB,KAAA09C,KAGAH,EAAAtsB,EAAAxa,KAAA,MAAA1F,cACAytB,EAAA,SAAyBrkC,KAAAmzC,SAAAqQ,eAAArjD,IACzBkkC,EAAA,eAA+B+e,GAC/B/e,EAAA,cAA8BrkC,KAAA6/C,YAAAyD,EAAA7wB,YAC9B4R,EAAA,iBAAiCrkC,KAAA6/C,YAAAyD,EAAA9wB,eACjC6wB,EAAAn/B,EAAA1R,MAAA,cACA,OAAA6wC,GACAlvB,GAAAjlB,KAAAm0C,EAAA,SAAA/6C,EAAA5I,GACA2kC,EAAA3kC,EAAA2a,EAAA/R,MAGAtI,KAAAmzC,SAAA7e,UAAAqC,QAAA,KAAAx2B,EAAA+jB,EAAAvlB,QACAulB,GAEAg0B,aAAA,SAAA32C,EAAAyL,GACA,GAAAhN,KAAAyjD,qBAAAliD,GAQA,MAPAvB,MAAA+2C,uBACA/2C,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA6C,iBACAjlC,EACAA,EAAAzL,GAEAvB,KAAAs0C,SAAAre,MAAA10B,IAEA,GAGAo7C,kBAAA,SAAAp7C,EAAA6tC,GACA,GAAAhC,GAAAptC,KAAA0jD,EAAA1jD,KAAA4gD,iBACAxR,KAAAjb,GAAAib,OAAA8C,kBACAlyC,KAAA83C,+BAAAjyC,KAAAtE,GACiB6tC,IAAAjb,GAAAib,OAAA+C,eACjBnyC,KAAA+3C,4BAAAlyC,KAAAtE,GAEA,IAAAmiD,IAAA1jD,KAAA83C,+BAAAn0C,QAAA3D,KAAA+3C,4BAAAp0C,SACAkX,WAAA,WACAuyB,EAAAuW,eAAAvW,EAAA0K,+BAAA1K,EAAA2K,8BACqB,IAGrBjF,iCAAA,WACA,GAAA1F,GAAAptC,IACA,IAAAA,KAAAmzC,SAAA2J,YAAA8G,mBAAAzvB,GAAAwR,UAAAxR,GAAA0R,YAIA,KAHAhrB,YAAA,WACAqK,OAAA2+B,MAAAzW,EAAA+F,SAAAjoC,SAAAwoB,+BACqB,GACrB,GAAAS,IAAA1D,MAAAzwB,KAAAmzC,SAAAjoC,SAAAwoB,+BAGAowB,8BAAA,SAAAviD,EAAApB,EAAAwjB,EAAAsN,GACA,IAAAtN,EAAArjB,QACA,GAAA2wB,GAAA,MAAAA,EAAAme,SAAAzrB,EAAAE,MACA7jB,KAAAmzC,SAAA7e,UAAAqC,QAAAp1B,EAAApB,EAAA,8BAAA8wB,EAAAme,OAAAne,OACqB,CACrB,GAAA8yB,GAAApgC,EAAAE,MAAAF,EAAAE,MAAA7jB,KAAAmzC,SAAAtlC,KAAAm2C,oBACAhkD,MAAAmzC,SAAA7e,UAAAqC,QAAAp1B,EAAApB,EAAA4jD,EAAA9yB,KAIAgzB,6CAAA,SAAAC,EAAAx2C,EAAAgZ,EAAAe,EAAA2N,GACA,GAAAgY,GAAAptC,IACA,IAAA0N,EAAA/J,OAAA+iB,EACA,GAAAw9B,IAAAlkD,KAAAmzC,SAAAtc,WAAAstB,uBACAtpC,WAAA,WACA,GAAAupC,GAAAhX,EAAA0T,yBAAApzC,EAAAgZ,IAAAymB,EAAAC,EAAAgN,aAAA1sC,EAAAgZ,GAAArJ,MAAAvU,EAAAskC,EAAA2I,WAAA5I,EACAC,GAAAoO,wBACAr7C,KAAA,aACA6M,SAAAmnB,GAAAtxB,KAAAuqC,EAAA+F,SAAA7e,UAAA+vB,WAAAjX,EAAAgX,EAAAt7C,GACA2jC,UAAAtY,GAAAtxB,KAAAuqC,EAAAkX,2BAAAlX,EAAA1/B,EAAAgZ,EAAAe,EAAA2N,GACAsX,UAAAvY,GAAAtxB,KAAAuqC,EAAAmX,2BAAAnX,EAAA1/B,EAAAgZ,EAAAe,EAAA2N,GACAumB,WAAA,SAAAyI,EAAAjkD,KAAA,YAAAikD,EAAA14B,QAEyB,OACJ,KAAAw4B,EACrB,KAA8Bx9B,EAAAhZ,EAAA/J,OAAqB+iB,IACnD0mB,EAAAwS,oBAAAlyC,EAAAgZ,GAAAnlB,KAKAoiD,eAAA,SAAAa,EAAAC,GACAzkD,KAAAg4C,gBAAAh4C,KAAAg4C,eAAA0M,cAAAF,EAAAC,EAAAzkD,KAAAu3C,iBACAv3C,KAAAmzC,SAAA7e,UAAAowB,cAAAvwB,GAAAxkB,UAAA60C,GAAArwB,GAAAxkB,UAAA80C,IACAzkD,KAAA83C,kCACA93C,KAAA+3C,gCAEAmH,aAAA,SAAA39C,EAAApB,EAAA8+C,EAAAhuB,EAAAjkB,GACA,GAAAogC,GAAAptC,IAEA,IADAotC,EAAAmK,gBAAAh2C,GAAA09C,EAAA7R,EAAA+F,SAAAld,MAAA4nB,8BACAzQ,EAAAuX,iBAAApjD,GAAA,CACA,GAAAqjD,GAAA,IAAAxX,EAAA+F,SAAAld,MAAA4uB,gBAaA,OAZAzX,GAAA0W,8BAAAlhD,MAAAwqC,EAAA1lB,WACA0lB,EAAA+F,SAAA7e,UAAA0qB,YAAAz9C,EAAApB,EAAAitC,EAAAiK,aAAA91C,IACA6rC,EAAA0X,mBAAAvjD,EAAApB,GACAitC,EAAAgH,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA6C,iBACA7E,EAAAkK,eAAA/1C,GAAAsZ,WAAA,WACAuyB,EAAA5rC,IAAA,sBAAArB,EAAA,OACA6M,EACAA,EAAAzL,GAEA6rC,EAAAkH,SAAAre,MAAA10B,IAEqBqjD,IACrB,IAGAE,mBAAA,SAAAvjD,EAAApB,GACAH,KAAAwB,IAAA,WAAAxB,KAAAmzC,SAAAld,MAAA4uB,iBAAA,4BAAA1kD,EAAA,QAEAsjD,qBAAA,SAAAliD,GACA,GAAAumC,GAAAnV,EAAA3yB,KAAA82C,iBACA,OAAA92C,MAAAu3C,gBAAAh2C,IACAvB,KAAAwB,IAAA,gCAAAD,EAAA,SACA,GACiBvB,KAAAs0C,SAAAU,QAAAzzC,IACjBumC,EAAA9nC,KAAAq0C,QAAA9yC,GACAvB,KAAAmzC,SAAA7e,UAAAywB,cAAAxjD,EAAAumC,MAAA,IAGAnV,EAAA,GAAA3yB,KAAA+2C,qBAAA,EAAApkB,GACA3yB,KAAA05C,WAAA,0BACA,IAEA15C,KAAAwB,IAAA,wBAAAsmC,EAAA,UAAAvmC,EAAA,SACA,MAEAvB,KAAAwB,IAAA,IAAAD,EAAA,qCACA,IAGA48C,UAAA,SAAA58C,EAAApB,GACAH,KAAA+2C,uBACAiO,aAAAhlD,KAAAs3C,eAAA/1C,GACA,IAAA0jD,GAAA9wB,GAAAzyB,QAAA1B,KAAA+yC,WAAAxxC,IACAvB,KAAAmzC,SAAAxf,YAAAsxB,GAAA,GACAjlD,KAAA+yC,WAAAlC,OAAAoU,EAAA,GAEAjlD,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAyC,WAEAmM,YAAA,SAAAz8C,EAAApB,EAAAwlB,EAAAsL,GAeA,MAdAtL,GAAArlB,SAOAqlB,EAAAq0B,eACAh6C,KAAA01C,eAAAn0C,GAAAokB,EAAAq0B,cAEAh6C,KAAA22C,eACA32C,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA8C,qBAVAlyC,KAAA+2C,uBACA/2C,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA+C,eACAxsB,EAAA3lB,KAAAmzC,SAAAld,MAAA4nB,iCAAA,IACA79C,KAAAu3C,gBAAAh2C,IAAA,IASAvB,KAAA8jD,8BAAAviD,EAAApB,EAAAwlB,EAAAsL,KACAtL,EAAArlB,SAEAy6C,UAAA,SAAAx5C,GACAvB,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAiD,WAEAoH,kBAAA,SAAAl4C,EAAA05C,EAAAC,GACAl7C,KAAAq0C,QAAA9yC,EACA25C,GACAl7C,KAAAmiD,oBAAA5gD,EAAA05C,GAEAj7C,KAAAkiD,qBAAA3gD,IAGA87C,eAAA,SAAA3b,GACA,GAAAwjB,EACA,IAAA/wB,GAAAiU,kBAAAmC,cAAA,CACA,IAAA2a,EAAA,EAAuCA,EAAAxjB,EAAA5N,MAAAnwB,OAAgCuhD,IACvEllD,KAAAi6C,sBAAAvY,EAAA5N,MAAAoxB,GAAAxjB,EAEA1hC,MAAAw3B,SAAAkK,EAAA5N,WACiB4N,GAAAljC,MAAAmF,OAAA,GACjB3D,KAAAw3B,SAAAkK,EAEAvN,IAAAjlB,KAAAlP,KAAAw3C,SAAA,SAAAlvC,EAAAQ,GACAA,EAAAkhB,WAGA+zB,YAAA,SAAAx8C,EAAApB,EAAA29C,EAAAxmB,GACAt3B,KAAAg4C,gBAAAh4C,KAAAg4C,eAAAmN,qBAAA5jD,EAAAu8C,EAAAxmB,IAEA8tB,UAAA,SAAA7jD,EAAApB,KACAklD,yBAAA,SAAA9jD,EAAApB,GACAH,KAAAolD,UAAAxiD,MAAA5C,KAAA0nB,WACA1nB,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAsC,WACA1xC,KAAAslD,aAAA1iD,MAAA5C,KAAA0nB,WACA1nB,KAAAmzC,SAAAxf,YACA3zB,KAAAmzC,SAAA7e,UAAA+B,YAAAzzB,MAAA5C,KAAA0nB,WACA1nB,KAAA20C,YAAApzC,KAEAvB,KAAAulD,eAAAhkD,GACAvB,KAAAmzC,SAAA7e,UAAA+B,YAAAzzB,MAAA5C,KAAA0nB,aAGAmtB,gBAAA,SAAAtzC,EAAAikD,EAAAC,GACA,GAAAC,GAAAzW,EAAAjvC,KAAAg3C,QAAAz1C,EAIA,OAHAikD,KACAE,EAAAvxB,GAAAtxB,KAAA2iD,EAAAxlD,KAAAuB,EAAA0tC,EAAAwW,IAEAzlD,KAAA2iD,qBACA3iD,KAAAw7C,wBACAr7C,KAAA,iBACA6M,SAAAmnB,GAAAtxB,KAAA7C,KAAAmzC,SAAA7e,UAAAqxB,eAAA3lD,KAAAuB,GACAkrC,UAAAiZ,GAAAvxB,GAAAtxB,KAAA7C,KAAA4lD,eAAAC,WAAA7lD,KAAAuB,EAAA0tC,EAAAwW,GACA9J,WAAAp6C,KAEA,IAEAvB,KAAAwB,IAAA,iCAAAD,EAAA,iIACA,IAGA+jD,aAAA,SAAA/jD,KACAukD,iBAAA,SAAAhI,EAAAxmB,GACAt3B,KAAAmzC,SAAA7e,UAAAyxB,gBAAAjI,EAAAxmB,IAEA+mB,cAAA,SAAA98C,KACA+8C,UAAA,SAAA/8C,EAAApB,GACAH,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAA2C,YAEA2M,eAAA,SAAAn9C,EAAAk9C,KACAI,sBAAA,SAAAt9C,EAAAk9C,IACAz+C,KAAAu3C,gBAAAh2C,IAAAvB,KAAAmzC,SAAAld,MAAAC,aACAl2B,KAAAq3C,aAAA91C,GAAA,IAGAm7C,sBAAA,SAAAn7C,EAAAovC,EAAAD,GACAA,IAAAvc,GAAAib,OAAA0C,QACAkT,aAAAhlD,KAAAs3C,eAAA/1C,KAGAykD,gCAAA,SAAA/E,GACA,GAAA7T,GAAAptC,IACAm0B,IAAAjlB,KAAA+xC,EAAA,SAAA34C,EAAAy4C,GACA3T,EAAAwS,oBAAAmB,EAAAx/C,OAGA0kD,gCAAA,SAAAC,EAAAx4C,EAAA+Z,EAAA2N,EAAAtsB,GACA,GAAAknB,GAAA2C,EAAA3yB,KAAA82C,kBAAAqP,EAAAnmD,KAAA+2C,oBACA,KAAApkB,GAAAwzB,GAAAxzB,EACAjlB,EAAA/J,OAAA,EACA3D,KAAAw7C,wBACAr7C,KAAA,aACA6M,SAAAmnB,GAAAtxB,KAAA7C,KAAAmzC,SAAA7e,UAAA+vB,WAAArkD,KAAAkmD,EAAA,GAAAp9C,GACA2jC,UAAAtY,GAAAtxB,KAAA7C,KAAAskD,2BAAAtkD,KAAA0N,EAAA,EAAA+Z,EAAA2N,GACAsX,UAAAvY,GAAAtxB,KAAA7C,KAAAukD,2BAAAvkD,KAAA0N,EAAA,EAAA+Z,EAAA2N,GACAumB,WAAA,SAAAjuC,EAAA,GAAA2P,KAAAld,KAAA,YAAAuN,EAAA,GAAA2P,KAAAqO,OAGA1rB,KAAA05C,WAAA,iBAGA15C,KAAAgmD,gCAAAt4C,GACAsiB,EAAAhwB,KAAAmzC,SAAAjoC,SAAAsoB,kBAAAvM,QAAA,gBAAiGk/B,GAAAl/B,QAAA,iBAA4D0L,GAC7J3yB,KAAAq6C,YAAArqB,KAGAu0B,2BAAA,SAAA72C,EAAAgZ,EAAAe,EAAA2N,GACA,GAAAgxB,GAAA1/B,EAAA,CACA1mB,MAAA4/C,oBAAAlyC,EAAAgZ,GAAAnlB,GAAAmM,EAAAgZ,GAAArJ,KAAAld,MACAH,KAAAikD,8CAAA,EAAAv2C,EAAA04C,EAAA3+B,EAAA2N,IAEAkvB,2BAAA,SAAA52C,EAAAgZ,EAAAe,EAAA2N,GACA,GAAAgY,GAAAptC,KAAAomD,EAAA1/B,EAAA,EAAA09B,EAAApkD,KAAA8gD,yBAAApzC,EAAAgZ,GACA1mB,MAAAqmD,wBAAA34C,EAAAgZ,GAAA09B,GAAAlY,KAAA,WACAkB,EAAAkZ,QAAA54C,EAAAgZ,GAAAnlB,GAAAkmB,EAAA2N,GACAgY,EAAA6W,8CAAA,EAAAv2C,EAAA04C,EAAA3+B,EAAA2N,IACiB,WACjBgY,EAAA6W,8CAAA,EAAAv2C,EAAA04C,EAAA3+B,EAAA2N,MAGA6e,uBAAA,SAAAvmC,EAAA+Z,EAAA2N,GACA,OAAA1nB,EAAA/J,OAEA,WADA3D,MAAA05C,WAAA,eAGA,IAAAwM,GAAAlmD,KAAAghD,0BAAAtzC,GAAAy/B,EAAAntC,KAAAo6C,aAAA1sC,EAAA,GAAA2P,MAAAvU,EAAA9I,KAAA+1C,WAAA5I,EACAntC,MAAAw7C,wBACAr7C,KAAA,kBACA6M,SAAAmnB,GAAAtxB,KAAA7C,KAAAmzC,SAAA7e,UAAAiyB,gBAAAvmD,KAAAkmD,EAAAp9C,GACA2jC,UAAAtY,GAAAtxB,KAAA7C,KAAAimD,gCAAAjmD,KAAAkmD,EAAAx4C,EAAA+Z,EAAA2N,EAAAtsB,GACA4jC,UAAAvY,GAAAtxB,KAAA7C,KAAAgmD,gCAAAhmD,KAAA0N,GACAiuC,WAAA,sBAGA6K,wBAAA,WACA,GAAApZ,GAAAptC,IACAA,MAAAu9C,gBAAAlhB,OAAAnX,OAAA,wBAAAxiB,GACA,GAAA0qC,EAAAgJ,gBAGA,MAFA1zC,MAAAwiB,OAAAI,MACA5iB,EAAAqjC,YAAAqH,EAAA+F,SAAAjoC,SAAAmoB,QACA+Z,EAAA+F,SAAAjoC,SAAAmoB,WAIAwkB,oBAAA,WACA,GAAAzK,GAAAptC,KAAA/B,EAAA+B,KAAAmzC,SAAAwE,OACAxjB,IAAAsyB,SAAA,MAAAzmD,KAAAmzC,SAAAwE,QAAAviB,WACAp1B,KAAA0mD,WACAvyB,GAAAxkB,OAAA1R,GACA48C,KAAA76C,KAAAmzC,SAAA0H,OAEA58C,EAAAuD,IAAA2yB,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,MACA/B,EAAA0oD,cAAAxyB,GAAAtxB,KAAA7C,KAAA6yC,eAAA7yC,MACAA,KAAA0mD,SAAA,GAAAvyB,IAAAsyB,QAAAxoD,IAEA4c,WAAA,WACAuyB,EAAAsZ,SAAAE,UAAA1a,KAAA,SAAAvoB,EAAAs3B,GACA7N,EAAAyZ,0BACAzZ,EAAA+F,SAAA7e,UAAAwyB,yBAAAnjC,GAAA,EAAAs3B,IACyB,SAAAt3B,EAAAs3B,GACzB7N,EAAA+F,SAAA7e,UAAAwyB,yBAAAnjC,GAAA,EAAAs3B,MAEqB,KAGrB4L,wBAAA,aACAxH,SAAA,SAAA99C,EAAA6vC,GACApxC,KAAAo0C,YAAAjD,WAAA5vC,EAAA6vC,GACApxC,KAAAg4C,gBAAAh4C,KAAAg4C,eAAA+O,UAAAxlD,IAEAojD,iBAAA,SAAApjD,GACA,GAAA4yC,GAAAn0C,KAAAo0C,YAAA/D,UACA9uC,MAEA,WAAAvB,KAAAu3C,gBAAAh2C,IAAAvB,KAAAmzC,SAAAld,MAAAC,YAAAie,EAAA/E,SAAAjb,GAAAib,OAAA0C,SACAnzC,SAAAqB,KAAAq3C,aAAA91C,KACAvB,KAAAq3C,aAAA91C,GAAA,GAEAvB,KAAAq3C,aAAA91C,GAAAvB,KAAAmzC,SAAAld,MAAA+wB,oBACAhnD,KAAAq3C,aAAA91C,IAAA,GACA,IAKAgkD,eAAA,SAAAhkD,GACAvB,KAAA+yC,WAAAltC,KAAAtE,IAEAugD,aAAA,SAAAvgD,GACA,GAAA4rC,EAEAA,GADAhZ,GAAAiU,kBAAAmC,cACAvqC,KAAAs0C,SAAApd,QAAA31B,GAAA44C,WAEAn6C,KAAAo6C,aAAAp6C,KAAAs0C,SAAAjG,SAAA9sC,IAEA4rC,IACAntC,KAAAg2C,qBAAAz0C,GAAA4rC,IAGAgM,4BAAA,SAAA8N,GACAjnD,KAAAmzC,SAAA/wB,KAAApT,QAAAi4C,EACAjnD,KAAAqiD,aAAAluB,GAAAmuB,aAAA,GAAAnuB,IAAAmuB,YAAAtiD,KAAAmzC,SAAA/wB,KAAA+R,GAAAtxB,KAAA7C,KAAAi3B,kBAAAj3B,MAAAm0B,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,OACAA,KAAAqiD,cAAAriD,KAAAqiD,aAAAE,iBACAviD,KAAAy3C,aAAA+E,YAAA,KAAAx8C,KAAAqiD,aAAAG,uBACAxiD,KAAAmzC,SAAAxf,WAAA3zB,KAAAqiD,aAAAI,cACAziD,KAAAqiD,aAAAK,aACA1iD,KAAAg5C,YAAAh5C,KAAAqiD,aAAAK,eAIA4D,QAAA,SAAA/kD,EAAAkmB,EAAA2N,GACA,GAAAj1B,GAAAH,KAAAq0C,QAAA9yC,EACAkmB,IACAznB,KAAAg3B,UAAAvP,EAAAlmB,GAEA6zB,GACAp1B,KAAAg5C,YAAA5jB,EAAA7zB,GAEAvB,KAAAw7C,wBACAr7C,KAAA,WACA6M,SAAAmnB,GAAAtxB,KAAA7C,KAAAmzC,SAAA7e,UAAA4yB,SAAAlnD,KAAAuB,EAAApB,GACAssC,UAAAtY,GAAAtxB,KAAA7C,KAAAqlD,yBAAArlD,KAAAuB,EAAApB,GACAusC,UAAAvY,GAAAtxB,KAAA7C,KAAA4/C,oBAAA5/C,KAAAuB,EAAApB,GACAw7C,WAAAp6C,KAGAozC,YAAA,SAAApzC,GACAvB,KAAAs0C,SAAAvd,OAAAx1B,IACAvB,KAAAo0C,YAAA3D,UAAAlvC,EAAA4yB,GAAAib,OAAAwC,SAGA+H,mBAAA,WAEA,IADA,GAAAwN,GAAAC,EAAAha,EAAAptC,KACAA,KAAA+yC,WAAApvC,QACAwjD,EAAAnnD,KAAA+yC,WAAA74B,QACAla,KAAA20C,YAAAwS,EAEAC,GAAApnD,KAAAu2C,YACAnH,OAAAjb,GAAAib,OAAAW,aACiBpsC,OACjByjD,IACAjzB,GAAA3yB,IAAA,qBAAA4lD,EAAA,yEACAvsC,WAAA,WACAuyB,EAAAuM,sBACqB,OAGrB0M,wBAAA,SAAAtF,EAAAqD,GACA,GAAAhX,GAAAptC,KAAAqd,EAAA,WACA,MAAA0jC,GAAA1jC,eAAA8W,IAAAwY,UACAoU,EAAA1jC,KAAAuvB,cAEAmU,EAAA1jC,QACiBld,EAAAikD,EAAAjkD,KAAAurB,EAAA04B,EAAA14B,KAAAyhB,EAAAntC,KAAAo6C,aAAA2G,EAAA1jC,MAAAimC,EAAAtjD,KAAA6gD,mBAAA1T,GAAAka,EAAA,GAAAlzB,IAAAkP,OAIjB,OAHAgkB,GAAAnb,KAAA,aAAkD,WAClDkB,EAAAwS,oBAAAmB,EAAAx/C,GAAApB,KAEAg0B,GAAA4M,cAAA1jB,KAAArd,KAAAg9C,oBAAAsG,EAAAxsB,kBAAA32B,IACAH,KAAA05C,WAAA,YAAAv5C,EAAAkd,GACAgqC,EAAA7jB,WAEAxjC,KAAAmzC,SAAAtc,WAAAywB,YAAA,IAAA57B,EAIAA,EAAA,GAAA43B,EAAA7wB,WAAA/G,EAAA43B,EAAA7wB,WACAzyB,KAAA05C,WAAA,YAAAv5C,EAAAkd,GACAgqC,EAAA7jB,WAEA9X,EAAA,GAAAA,EAAA43B,EAAA9wB,cACAxyB,KAAA05C,WAAA,eAAAv5C,EAAAkd,GACAgqC,EAAA7jB,YAEArP,GAAAozB,iBAAApzB,GAAAiU,kBAAA8C,eAAA/W,GAAAwM,OAAAtjB,GACA,GAAA8W,IAAAozB,gBAAAlqC,EAAA8W,GAAAtxB,KAAAuqC,EAAA5rC,IAAA4rC,IAAA7qB,SAAA+gC,EAAAkE,OAAAtb,KAAAmb,EAAA/mD,QAAA,SAAAmnD,GACAra,EAAAsM,WAAA+N,EAAA,aAAAtnD,EAAAkd,GACAgqC,EAAA7jB,YAGA6jB,EAAA/mD,UAEA+mD,IAnBArnD,KAAA05C,WAAA,aAAAv5C,EAAAkd,GACAgqC,EAAA7jB,YAoBAkkB,eAAA,WACA,GAAAta,GAAAua,EAAAhxC,CACAy2B,GAAAptC,KACA2nD,EAAA,SAAAxnD,EAAA6M,EAAA2a,GACA,GAAAigC,EACA,KACA,MAAA56C,GAAApK,MAAAwqC,EAAAzlB,GACqB,MAAAkgC,GACrBD,EAAAC,EAAA3jC,SAAA2jC,EAAA/3B,WACAsd,EAAA5rC,IAAA,wBAAArB,EAAA,gBAAAynD,EAAA,UAGA,KAAAjxC,IAAA3W,MAAAmzC,SAAA7e,WACA,WACA,GAAAwzB,GAAAC,CACAD,GAAAnxC,EACAoxC,EAAA3a,EAAA+F,SAAA7e,UAAAwzB,GACA1a,EAAA+F,SAAA7e,UAAAwzB,GAAA,WACA,MAAAH,GAAAG,EAAAC,EAAArgC,oBAOA,WACA,YACAyM,IAAAa,kBAAA,SAAAgY,GACA,GAAAI,GAAAptC,IACAA,MAAAmzC,UACAluB,OAAA,EACAnc,OAAA,KACAwa,UAAA,EACAk3B,eAAA,EACAwN,6BAAA,EACAr0B,YAAA,EACAs0B,kBAAA,EACA9yB,SACAulB,iBACAtlB,SAAA,iBACAI,cAAA,aACA0yB,gBAAA,EACA7yB,UAAA,SACA1O,OAAA,OACAwhC,mBAAA,EACA1gC,UACA2gC,cAAA,EACAC,oBAAA,EACA9yB,kBAAA,kBACAD,SAAA,UAEAuB,YACAC,qBACArE,UAAA,EACAD,aAAA,EACAG,UAAA,EACAwxB,wBAAA,EACA5W,YAAA,KACAia,OACAc,UAAA,EACAC,SAAA,EACAC,UAAA,EACAC,SAAA,GAEAnB,YAAA,GAEAhzB,WACA4yB,SAAA,SAAA3lD,EAAApB,KACAk2B,YAAA,SAAA90B,EAAApB,KACAs2B,WAAA,SAAAl1B,EAAApB,EAAA8+C,EAAAyJ,KACAhE,cAAA,SAAAF,EAAAC,KACAxG,SAAA,SAAA18C,EAAApB,KACAg2B,SAAA,SAAA50B,EAAApB,KACAq+C,cAAA,SAAAj9C,EAAApB,EAAAs+C,KACAG,qBAAA,SAAAr9C,EAAAk9C,EAAAQ,EAAAhuB,KACA6tB,SAAA,SAAAv9C,EAAAumC,EAAA2W,EAAAM,KACAxoB,WAAA,SAAAh1B,EAAApB,EAAA29C,EAAAxmB,KACAyuB,gBAAA,SAAAjI,EAAAxmB,KACAX,QAAA,SAAAp1B,EAAApB,EAAAs3B,EAAAkxB,KACA3J,YAAA,SAAAz9C,EAAApB,EAAAyoD,KACA7D,cAAA,SAAAxjD,EAAApB,KACAomD,gBAAA,SAAAsC,KACAxE,WAAA,SAAAwE,KACAlD,eAAA,SAAApkD,KACAu5C,SAAA,SAAAv5C,KACAy5C,iBAAA,SAAAz5C,EAAA05C,EAAAC,KACAO,gBAAA,SAAAzY,KACAoN,eAAA,SAAA7uC,EAAAovC,EAAAD,KACAoW,yBAAA,SAAAnjC,EAAArjB,EAAA26C,MAEA/vC,UACAuoB,UAAA,qEACAF,UAAA,yDACAJ,aAAA,4DACAN,WAAA,yDACAO,aAAA,sBACAI,kBAAA,6EACAT,oBAAA,qBACAC,mBAAA,qBACAC,oBAAA,4BACAC,mBAAA,4BACA41B,sBAAA,mDACAz1B,QAAA,8EACAK,6BAAA,6KAEAuC,OACAC,YAAA,EACA8wB,gBAAA,EACAnC,iBAAA,EACAhH,6BAAA,gBAEA1uB,SACAguB,YAAA,yBACAD,YAAA,0BAEAznB,UACAC,SAAA,EACAC,YACAD,SAAA,GAEAqzB,WAAA,EACAnzB,YACAG,UAAA,cACAD,eAAA,mBACAD,UAAA,cACAmzB,cAAA,kBACAhzB,WAAA,gBAEAizB,SAAA,SAAA1nD,GACA,YAEAjB,SACA80B,SAAA,KACAtR,QAAA,SAAAviB,GACA,aAEA2nD,aAAA,EACAviC,OAAA,OACAc,OAAA,SAAAlmB,GACA,aAEA4nD,mBAGA5d,QACA7V,SAAA,EACA0zB,gBAAA,EACAxzB,YACAyzB,SAAA,YAEAC,WAAA,SAAApU,GACA,WAGAsO,eAAA,SAAA+F,GACA,MAAAA,IAEA17C,MACAm2C,qBAAA,gCACA1G,eAAA,aACAwC,aAAA,gCAEAlL,YACAlf,SAAA,EACA/O,OAAA,SACAyO,SAAA,iBACAslB,iBACAjzB,WAEAozB,MACA+H,UAAA,EACA4G,iBAAA,EACA3G,UAAA,GAEAzP,OACAC,YAAA,aAEAiI,OACAD,cAAA,KACAhI,YAAA,gBAEA+N,QACA5b,KAAA,EACA18B,OAAA,MAEAo3C,gBACAvI,SACAviB,SAAA,KACA3N,UACAizB,iBACA9C,gBAAA,GAEAx1B,MACApT,QAAA,UACA2kB,YAAA,EACA81B,iBAAA,GAEAje,SACAke,cAAA,KACAC,cAAA,EACAC,QAAA,EACAC,YAAA,KACAC,eAAA,GACAC,YAAA,kBACAC,aAAA,EACAC,UAEAnN,aACAC,gBAAA,EACA6G,mBAAA,EACAxG,kBAAA,IAGAjpB,GAAAxkB,OAAA3P,KAAAmzC,SAAAnG,GAAA,GACAhtC,KAAAw3C,YACAx3C,KAAAigD,qBACAjgD,KAAAg2C,wBACAh2C,KAAA0nD,iBACA1nD,KAAAu9C,gBAAA,GAAAppB,IAAA4T,eACA/nC,KAAA+yC,cACA/yC,KAAAq3C,gBACAr3C,KAAAs3C,kBACAt3C,KAAAu3C,mBACAv3C,KAAA01C,kBACA11C,KAAA+2C,qBAAA,EACA/2C,KAAA22C,aAAA,EACA32C,KAAAo0C,YAAAp0C,KAAAy8C,2BACAz8C,KAAAoiD,4BACApiD,KAAAu4C,oBAAAv4C,KAAA47C,aAAA57C,KAAAmzC,SAAAhe,QAAAulB,eACA16C,KAAA24C,8BAAA34C,KAAA47C,aAAA57C,KAAAmzC,SAAAyB,WAAA8F,eACA16C,KAAA+4C,uBAAA/4C,KAAA47C,aAAA57C,KAAAmzC,SAAAyB,WAAAntB,QACAznB,KAAAk2C,eAAAl2C,KAAA47C,aAAA57C,KAAAmzC,SAAAhe,QAAAC,UACAp1B,KAAA64C,yBAAA74C,KAAA47C,aAAA57C,KAAAmzC,SAAAyB,WAAAxf,UACAp1B,KAAAs0C,SAAAt0C,KAAAw9C,uBACAx9C,KAAA4lD,eAAAzxB,GAAAomB,yBAAAv6C,KAAAs6C,uBACAt6C,KAAAmzC,SAAArqC,SACA9I,KAAAugD,iBAAAvgD,KAAA48C,qBACA5tC,QAAAhP,KAAAmzC,SAAArqC,OACAgE,MAAA9M,KAAAmzC,SAAAtlC,KAAAyvC,iBACiBhP,eAEjBtuC,KAAAggD,4BACAhgD,KAAAmhD,sBACAnhD,KAAAmzC,SAAAmI,MAAAD,gBACAlnB,GAAAinB,aACAp7C,KAAA03C,cAAA13C,KAAAm7C,sBAEAn7C,KAAAwB,IAAA,2CAGAxB,KAAAmzC,SAAA8U,kBAAAjoD,KAAAwmD,0BACAxmD,KAAAy1C,gBAAAthB,GAAA+1B,gBAAA,GAAA/1B,IAAA+1B,eAAA/1B,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,OACAA,KAAA63C,sBACA73C,KAAA83C,kCACA93C,KAAA+3C,+BACA/3C,KAAAmqD,QAAAh2B,GAAAkkB,QAAA,GAAAlkB,IAAAkkB,OAAAr4C,KAAAmzC,SAAA3H,QAAArX,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,WACAA,KAAAmqD,QAAAz0B,UACA11B,KAAA2hD,sBAAAxtB,GAAAtxB,KAAA7C,KAAAmqD,QAAAC,cAAApqD,KAAAmqD,UAEAh2B,GAAAk2B,eAAAl2B,GAAAiU,kBAAAkD,cACAtrC,KAAAg4C,eAAA,GAAA7jB,IAAAk2B,cAAAl2B,GAAAtxB,KAAA7C,KAAA8lD,iBAAA9lD,MAAA,SAAAuB,GACA,GAAA+oD,GAAAld,EAAAgH,YAAA/D,UACA9uC,MAEA,OAAA+oD,MAAA5+B,MAAA,KAGA1rB,KAAA82C,kBAAA92C,KAAAmzC,SAAAtc,WAAAlE,UACA3yB,KAAAi4C,uBAAAj4C,KAAA47C,gBAEAznB,GAAAa,kBAAA1kB,UAAA6jB,GAAAoe,cACApe,GAAAxkB,OAAAwkB,GAAAa,kBAAA1kB,UAAA6jB,GAAAylB,mBAEAzlB,GAAAo2B,cAAA,SAAAvd,GACA,YAiCA,SAAAwd,kBACA,MAAAr2B,IAAAzyB,SAAA,qBAAAzD,EAAA0oB,SAAA,EAEA,QAAA8jC,0BAAA3mC,GACA,GAAA4mC,IAAA,CAOA,OANAv2B,IAAAjlB,KAAAw7C,EAAA,SAAApiD,EAAAqiD,GACA,GAAAx2B,GAAAzyB,SAAA,8DAAAipD,GAAA,EAEA,MADAD,IAAA,GACA,IAGAA,EAEA,QAAAE,OAAA35B,GACA,MAAAhzB,GAAA48C,KAAA+H,UAAAjkD,SAAAsyB,EAAA2X,gBAEA,QAAAiiB,wBACA,GAAA5P,EAWA,QAVA/1B,OAAA4c,gBAAA5c,OAAA6c,iBACAkZ,EAAA9mB,GAAA0N,oBACAljC,SAAAs8C,EAAArS,kBACAqS,EAAA,GAAAnS,gBACAmS,EAAA3X,OAAA,aACA2X,EAAA1X,QAAA,aACA0X,EAAA6P,UAAA,aACA7P,EAAA8P,WAAA,eAGA9P,EAEA,QAAA+P,aAAAzpD,EAAA0pD,GACA,GAAAhQ,GAAAiQ,EAAA3pD,IAAA2pD,EAAA3pD,GAAA0vB,GAaA,OAZAgqB,KAEAA,EADAgQ,EACAA,EAEAhtD,EAAA48C,KAAA+H,SACAiI,uBAEA12B,GAAA0N,oBAGAqpB,EAAA3pD,GAAA0vB,IAAAgqB,GAEAA,EAEA,QAAAkQ,SAAA5pD,GACA,GAAA6pD,GAAA3nD,EAAA0wB,GAAAzyB,QAAA2pD,EAAA9pD,GAAA4D,EAAAlH,EAAAu8C,qBACA0Q,GAAA3pD,GACA8pD,EAAAxa,OAAAptC,EAAA,GACA4nD,EAAA1nD,QAAAwB,GAAA1B,EAAA0B,IACAimD,EAAAC,EAAAlmD,EAAA,GACAmmD,YAAAF,IAGA,QAAA30B,YAAAl1B,EAAAgqD,GACA,GAAAt6B,GAAA+5B,YAAAzpD,GAAAolB,EAAA1oB,EAAA0oB,OAAAu0B,EAAAqQ,KAAA,CACAJ,SAAA5pD,GACA25C,EACA15C,EAAAmlB,EAAA,gBAAAplB,EAAA,uBACaqpD,MAAA35B,IAAAu6B,qBAAAv6B,EAAAme,UACb8L,GAAA,EACA15C,EAAAmlB,EAAA,gBAAAplB,EAAA,+BAAA0vB,EAAAme,OAAA,UAEAnxC,EAAAw4B,WAAAl1B,EAAA0vB,EAAAiqB,GAEA,QAAAuQ,WAAAlqD;AACA,GAAAkmB,GAAAikC,EAAAR,EAAA3pD,GAAAoqD,iBAAAC,EAAA3tD,EAAA2tD,cAgBA,OAfA3tD,GAAA08C,YAAA1f,MACAxT,EAAAxpB,EAAA08C,YAAA1f,IAAA15B,IAEAmqD,GACAv3B,GAAAjlB,KAAAw8C,EAAA,SAAAvrD,EAAAkT,GACAoU,QACAA,EAAAtnB,GAAAkT,IAGAu4C,GACAz3B,GAAAjlB,KAAA08C,EAAA,SAAAzrD,EAAAkT,GACAoU,QACAA,EAAAtnB,GAAAkT,IAGAoU,EAEA,QAAA6jC,aAAA/pD,EAAAsqD,GACA,GAAA7rC,GAAAiR,EAAA+5B,YAAAzpD,EAAAsqD,GAAAllC,EAAA1oB,EAAA0oB,OAAAc,EAAAgkC,UAAAlqD,GAAAuqD,EAAAZ,EAAA3pD,GAAAuqD,OA2BA,OA1BA7tD,GAAA8tD,OAAAxqD,GACAye,EAAAgsC,UAAAzqD,EAAAkmB,EAAAyjC,EAAA3pD,GAAA0qD,uBACArB,MAAA35B,IACAA,EAAAqS,OAAA4oB,kBAAA3qD,GACA0vB,EAAAsS,QAAA4oB,mBAAA5qD,IAEA0vB,EAAAm7B,mBAAAC,8BAAA9qD,GAEA+qD,0BAAA/qD,GACA0vB,EAAAs7B,KAAA5lC,EAAA3G,GAAA,GACA/hB,EAAA48C,KAAA+H,UAAA3kD,EAAA48C,KAAA2O,kBAAAoB,MAAA35B,KACAA,EAAA2X,iBAAA,GAEA4jB,WAAAjrD,GACAC,EAAA,WAAAmlB,EAAA,gBAAAplB,GACAuqD,EACA76B,EAAAw7B,KAAAX,GACaY,IAAAjlC,EACbwJ,EAAAw7B,OACahlC,GAAAxpB,EAAA0uD,aAAA1uD,EAAA0uD,YAAA/1C,cAAAlV,QAAA,wCACbuvB,EAAAw7B,KAAAt4B,GAAAuS,QAAAjf,EAAA,KACaA,GAAAxpB,EAAA0uD,aAAA1uD,EAAA0uD,YAAA/1C,cAAAlV,QAAA,uBACbuvB,EAAAw7B,KAAA1oC,KAAA6oC,UAAAnlC,IAEAwJ,EAAAw7B,KAAAhlC,GAEAwJ,EAEA,QAAA+6B,WAAAzqD,EAAAkmB,EAAAwkC,GACA,GAAA72B,GAAAn3B,EAAA28C,cAAA3f,IAAA15B,GAAAsrD,EAAA3B,EAAA3pD,GAAAsrD,SAUA,OATAluD,SAAAkuD,IACAz3B,GAAA,IAAAy3B,GAEAH,GAAAjlC,IACA2N,EAAAjB,GAAAuS,QAAAjf,EAAA2N,IAEA62B,IACA72B,EAAAjB,GAAAuS,QAAAulB,EAAA72B,IAEAA,EAEA,QAAAi3B,+BAAA9qD,GACA,kBACA,IAAAypD,YAAAzpD,GAAAurD,YACAr2B,WAAAl1B,IAIA,QAAA+qD,2BAAA/qD,GACA,GAAAg1B,GAAAt4B,EAAAs4B,UACAA,KACAy0B,YAAAzpD,GAAAw1B,OAAAg0B,WAAA,SAAAroD,GACAA,EAAAqqD,kBACAx2B,EAAAh1B,EAAAmB,EAAAo7C,OAAAp7C,EAAA40B,SAKA,QAAA40B,mBAAA3qD,GACA,kBACAk1B,WAAAl1B,IAGA,QAAA4qD,oBAAA5qD,GACA,kBACAk1B,WAAAl1B,GAAA,IAGA,QAAAirD,YAAAjrD,GACA,GAAA0vB,GAAA+5B,YAAAzpD,GAAAm5C,EAAAz8C,EAAAy8C,cAAAsS,EAAA9B,EAAA3pD,GAAA0rD,sBAAuItmC,EAAA1oB,EAAA0oB,OAAAumC,IACvItC,OAAA35B,KACAhzB,EAAAkvD,cAAAl8B,EAAAm8B,iBAAA,SAAAnvD,EAAAkvD,cACAlvD,EAAAovD,qCACApvD,EAAA48C,KAAA+H,UAAA4H,mBAAAC,yBAAA/P,KACAzpB,EAAAm8B,iBAAA,qCACAn8B,EAAAm8B,iBAAA,+BAGAnvD,EAAA0uD,aAAA,SAAAhmC,GAAA,QAAAA,GACAsK,EAAAm8B,iBAAA,eAAAnvD,EAAA0uD,aAEAx4B,GAAAxkB,OAAAu9C,EAAA/4B,GAAA2L,WAAA4a,KAAAn5C,GAAAm5C,GACAvmB,GAAAxkB,OAAAu9C,EAAAF,GACA74B,GAAAjlB,KAAAg+C,EAAA,SAAA/sD,EAAAkT,GACA4d,EAAAm8B,iBAAAjtD,EAAAkT,MAIA,QAAAm4C,sBAAA8B,GACA,MAAAn5B,IAAAzyB,QAAAzD,EAAAsvD,wBAAAtvD,EAAA0oB,QAAA2mC,IAAA,EAEA,QAAAE,eAAAjsD,EAAAsqD,EAAAgB,EAAAlB,EAAAM,EAAAgB,EAAAnB,GACAZ,EAAA3pD,IACAsrD,YACAlB,mBACAM,wBACAgB,oBACAnB,UAEA,IAAA5nB,GAAAmnB,EAAAxlD,KAAAtE,EACA,IAAA2iC,GAAAjmC,EAAAu8C,eACA,MAAA8Q,aAAA/pD,EAAAsqD,GA5NA,GAAArqD,GAAAkrD,EAAArB,KAAAH,KAA0EjtD,GAC1EkvD,aAAA,KACAM,cAAA,sBACA9mC,OAAA,OACAgmC,YAAA,oCACAnS,eAAA,EACAE,iBACAE,iBACAD,eACAiR,kBACAyB,oCAAA,EACAE,yBACAG,QAAA,aACAC,OAAA,qBACAC,MAAA,qBACAC,KAAA,qBACAC,KAAA,MAEAjT,MACA+H,UAAA,EACA4G,iBAAA,GAEAhoD,IAAA,SAAAwlB,EAAA4Y,KACAmsB,OAAA,SAAAxqD,KACAk1B,WAAA,SAAAl1B,EAAA05C,EAAAC,KACA3kB,WAAA,KAIA,IAFApC,GAAAxkB,OAAA1R,EAAA+uC,GACAxrC,EAAAvD,EAAAuD,IACA2yB,GAAAzyB,QAAAzD,EAAAwvD,aAAAxvD,EAAA0oB,QAAA,EACA,SAAA8J,OAAA,IAAAxyB,EAAA0oB,OAAA,wDAiMA+lC,GAAA,QAAAzuD,EAAA0oB,QAAA,WAAA1oB,EAAA0oB,OACAwN,GAAAxkB,OAAA3P,MACA+tD,cAAA,SAAAxsD,GACA,GAAAigB,GAAAiG,EAAA3D,EAAAgoC,EAAAkC,EAAA/B,CACA,QACAgC,SAAA,SAAAC,GAEA,MADA1sC,GAAA0sC,EACAluD,MAEAmuD,WAAA,SAAAxC,GAEA,MADAlkC,GAAAkkC,EACA3rD,MAEAouD,gBAAA,SAAAC,GAEA,MADApC,GAAAoC,EACAruD,MAEAsuD,YAAA,SAAArB,GAEA,MADAnpC,GAAAmpC,EACAjtD,MAEAuuD,YAAA,SAAAC,GAEA,MADA1C,GAAA0C,EACAxuD,MAEAyuD,gBAAA,WAEA,MADAT,IAAA,EACAhuD,MAEAysD,KAAA,SAAAZ,GAIA,MAHAmC,IAAA75B,GAAAzyB,SAAA,gBAAAzD,EAAA0oB,SAAA,IACAc,EAAAinC,aAAA,GAAA/2C,OAAAC,WAEA41C,cAAAjsD,EAAAsqD,EAAArqC,EAAAiG,EAAAwkC,EAAAnoC,EAAAgoC,MAIA6C,SAAA,SAAAptD,GACA4pD,QAAA5pD,OAIA4yB,GAAAy6B,cAAA,SAAA9e,GACA,YACA,IAAAp8B,GAAAo8B,EAAAp8B,MAAAm7C,KAA8C5Q,EAAAvqC,EAAAuqC,SAAA5J,EAAA3gC,EAAA2gC,OAC9ClgB,IAAAxkB,OAAA3P,MACAuG,IAAA,SAAAhF,EAAAutD,GACAD,EAAAttD,GAAAutD,EACAD,EAAAttD,GAAAolC,SAEAuN,OAAA,SAAA3yC,GACA,GAAA6rC,GAAAptC,KAAAk+C,EAAA,GAAA/pB,IAAAkP,QAAA0rB,EAAA9Q,EAAA18C,EAAA8yC,EAAA9yC,GAAA28C,EACA6Q,GAAA7iB,KAAA,WACAkB,EAAA4H,QAAAzzC,KACAstD,EAAAttD,GAAAotD,UAAA,EACAvhB,EAAAgK,QAAA71C,IAEA28C,EAAA59C,aAGA82C,QAAA,SAAA71C,SACAstD,GAAAttD,IAEAytD,oBAAA,SAAAztD,GACA,MAAAstD,GAAAttD,GAAA0oB,KAEA+qB,QAAA,SAAAzzC,GACA,MAAA5C,UAAAkwD,EAAAttD,IAEAyoB,MAAA,WACA6kC,MAEAI,cAAA,SAAA1tD,GACA,MAAAstD,GAAAttD,IAEA2tD,qBAAA,SAAA3tD,EAAA4tD,GACAN,EAAAttD,GAAA0oB,IAAAklC,GAEAC,aAAA,SAAA7tD,GACA,QAAAstD,EAAAttD,GAAAotD,aAIAx6B,GAAAwrB,wBAAA,SAAA3S,EAAA0Q,GACA,YACA,IAAA2R,GAAA7tD,EAAAkP,EAAA4+C,EAAAtvD,KAAAuvD,GAAA,EAAAC,GAAA,EAAAvxD,GACA08C,eACAH,eAAA,EACA/kB,UACAC,SAAA,EACApS,UACAoS,SAAA,IAGAl0B,IAAA,SAAAwlB,EAAA4Y,KACArJ,WAAA,SAAAh1B,EAAAumC,EAAAgW,EAAAxmB,KACAb,WAAA,SAAAl1B,EAAAumC,EAAAnkB,EAAAsN,KACAgtB,SAAA,SAAA18C,EAAAumC,KACAsW,aAAA,SAAA78C,KACA40B,SAAA,SAAA50B,EAAAumC,KACA0W,cAAA,SAAAj9C,EAAAumC,EAAA2W,KACAG,qBAAA,SAAAr9C,EAAAk9C,EAAA96B,EAAAsN,KACA+tB,YAAA,SAAAz9C,EAAAumC,EAAAnkB,EAAAsN,KACA6tB,SAAA,SAAAv9C,EAAAumC,EAAA2W,EAAAM,KACAI,cAAA,SAAA59C,EAAAwvC,KACAsD,QAAA,SAAA9yC,KACA69C,QAAA,SAAA79C,EAAA6vC,KACAmO,SAAA,SAAAh+C,KACAiwC,mBAAA,SAAAjwC,KACAkwC,cAAA,SAAAlwC,KACAi+C,aAAA,SAAAj+C,MACSkuD,GACT3tC,KAAA,SAAAvgB,EAAAmuD,EAAA/rC,EAAAsN,GACA,GAAAwtB,GAAA/tC,EAAAi/C,cAAApuD,EAAAmuD,EACAh/C,GAAAu+C,cAAA1tD,GAAAquD,kBAAA,QACAl/C,GAAAu+C,cAAA1tD,GAAAolC,KAAAkpB,cAAAH,GACAh/C,EAAAu+C,cAAA1tD,GAAAu8C,QAAAW,EAAA/yB,KACAztB,EAAA2gD,qBAAAr9C,EAAAmP,EAAAo/C,yBAAArR,GAAA96B,EAAAsN,IAEA8+B,SAAA,SAAAxuD,GACA,GAAAmqB,GAAAztB,EAAAw4C,QAAAl1C,GAAApB,EAAAlC,EAAAo2C,QAAA9yC,EACAC,GAAA,qCAAAD,EAAA,qBACAmP,EAAAs/C,eAAAzuD,GAAA2qC,KAAA,SAAAvoB,EAAAsN,GACAzvB,EAAA,2BAAAD,EACA,IAAA0uD,GAAAl5B,EAAAm5B,kBAAAvsC,GAAA,EACA1lB,GAAAs4B,WAAAh1B,EAAApB,EAAAurB,KACAhb,EAAAy/C,+BAAA5uD,GACAw1B,EAAAq5B,QAAA7uD,EAAA0uD,EAAAh/B,IACiB,SAAAtN,EAAAsN,GACjB,GAAAo/B,GAAAt5B,EAAAm5B,kBAAAvsC,GAAA,EACAniB,GAAA,yCAAAD,EAAA,MAAA8uD,EAAAxsC,MAAA,UACAwsC,EAAArmC,OAAAiH,GAAAhzB,EAAAw3B,SAAAn1B,QAAA6oD,cAAAznD,QAAAuvB,EAAAme,SAAA,IACAqgB,EAAAzlC,MAAAzoB,GAEAtD,EAAA+gD,YAAAz9C,EAAApB,EAAAkwD,EAAAp/B,IACA8F,EAAAq5B,QAAA7uD,EAAA8uD,EAAAp/B,MAIAq/B,cAAA,SAAAZ,EAAAnuD,EAAAoiB,EAAAsN,GACA,GAAA9wB,GAAAlC,EAAAo2C,QAAA9yC,EACAC,GAAA,qCAAAD,EAAA,WAAAmuD,GACAh/C,EAAA6/C,iBAAAhvD,EAAAmuD,EACA,IAAAc,GAAAC,EAAA15B,EAAAm5B,kBAAAvsC,GAAA,EACA,IAAA8sC,EAAAzmC,MACAylC,EAAAzlC,MAAAzoB,OACiB,CACjB,GAAAmvD,GAAAhgD,EAAAu+C,cAAA1tD,GAAAk0B,SAAAk7B,UACAH,GAAAE,EAAAv8B,GAAAzyB,QAAAgvD,EAAAhB,MACAc,GAAA,IACA9/C,EAAAu+C,cAAA1tD,GAAAk0B,SAAAk7B,WAAA9f,OAAA2f,EAAA,GACA9/C,EAAAu+C,cAAA1tD,GAAAk0B,SAAAm7B,UAAA/oC,QAAA6nC,IAGAh/C,EAAAu+C,cAAA1tD,GAAAolC,KAAAkqB,gBACArB,IACA9+C,EAAAu+C,cAAA1tD,GAAAolC,KAAAkqB,eAAA,EACArvD,EAAA2yB,GAAAjyB,OAAA,mFAAsH6hB,KAAA6oC,UAAAtuD,OAAAwyD,KAAApgD,EAAAqgD,SAAAxvD,KAAAwiB,KAAA6oC,UAAAl8C,EAAAu+C,cAAA1tD,GAAAk0B,SAAAk7B,cACtHx8B,GAAAjlB,KAAAwB,EAAAqgD,SAAAxvD,GAAA,SAAAyvD,EAAAC,GACAzvD,EAAA2yB,GAAAjyB,OAAA,sDAA4FX,EAAAyvD,EAAAC,EAAAnE,aAC5FmE,EAAA9/B,QACA8/B,EAAAC,YAAA,IAEAxgD,EAAAygD,0BAAA5vD,GACA6vD,EAAAC,KAAA9vD,GAAA,IAEAtD,EAAA+gD,YAAAz9C,EAAApB,EAAAswD,EAAAx/B,IACA8F,EAAAq5B,QAAA7uD,EAAAkvD,EAAAx/B,KAIAqgC,aAAA,SAAA/vD,GACA,QAAAmP,EAAAu+C,cAAA1tD,GAAAk0B,SAAAm7B,UAAAjtD,QAEA4tD,SAAA,SAAAhwD,GACA,GAAAiwD,GAAA9gD,EAAAu+C,cAAA1tD,GAAAk0B,SAAAm7B,UAAA12C,OAIA,OAHAs3C,IAAA9gD,EAAA+gD,gBAAAlwD,KACAiwD,EAAA,MAEAA,GAEAxnC,MAAA,SAAAzoB,GACAC,EAAA,8FAAAD,EAAA,SACAmP,EAAAy/C,+BAAA5uD,GACAmP,EAAAghD,mBAAAnwD,GACAmP,EAAAu+C,cAAA1tD,GAAAu8C,OAAA,EACAptC,EAAAu+C,cAAA1tD,GAAAquD,kBAAA,GAEA+B,SAAA,SAAApwD,GACA,GAAAmqB,GAAAztB,EAAAw4C,QAAAl1C,GAAApB,EAAAlC,EAAAo2C,QAAA9yC,GAAAmuD,EAAAD,EAAA8B,SAAAhwD,GAAAk9C,EAAA/tC,EAAAi/C,cAAApuD,EAAAmuD,GAAAb,EAAAn+C,EAAAu+C,cAAA1tD,GAAA8nD,EAAAwF,EAAAe,iBAAAgC,EAAA/C,EAAAp5B,SAAAk7B,cAUA,IATA,MAAA9B,EAAA/Q,SACA+Q,EAAA/Q,OAAA,GAEAuL,GAAAprD,EAAA6gD,SAAAv9C,EAAApB,EAAAs+C,EAAAoQ,EAAA9P,qBAAA,IACA0Q,EAAAzlC,MAAAzoB,GACAmuD,EAAAD,EAAA8B,SAAAhwD,GACAk9C,EAAA/tC,EAAAi/C,cAAApuD,EAAAmuD,GACArG,GAAA,GAEA,MAAAqG,GAAA,IAAAkC,EAAAjuD,OACA8rD,EAAAM,SAAAxuD,OACiB,CACjBqwD,EAAA/rD,KAAA6pD,GACAh/C,EAAAu+C,cAAA1tD,GAAAk0B,SAAAk7B,WAAAiB,EACApC,GACA4B,EAAA7E,KAAAhrD,EAAAmuD,GAEAF,GAAA4B,EAAAS,aAAAnhD,EAAAu+C,cAAA1tD,GAAAk0B,SAAAm7B,UAAAjtD,QACA8rD,EAAAkC,SAAApwD,GAEA,IAAAk9C,EAAAzb,KAAAtX,OACAlqB,EAAA2yB,GAAAjyB,OAAA,+DAA2DwtD,EAAAnuD,GAAA,SAC3DkuD,EAAAa,cAAAZ,EAAAnuD,EAAA,oCAEA,IAAAuwD,GAAA7zD,EAAAugD,cAAAj9C,EAAApB,EAAAuQ,EAAAo/C,yBAAArR,GACAqT,GAAA5lB,KAAA,SAAA6lB,GACA,GAAA9zD,EAAAuhD,aAAAj+C,GAEyB,CACzBC,EAAA2yB,GAAAjyB,OAAA,oEAA2GX,EAAAmuD,EAAAjR,EAAAt4C,MAAA,EAAAs4C,EAAAn4C,IAAAolB,GAC3G,IAAAsmC,IACAtC,WACAnuD,KACA0wD,UAAAF,EACA1I,WAEA34C,GAAAwhD,YAAAF,GAAA9lB,KAAA,SAAAvoB,EAAAsN,GACAzvB,EAAA,wCAAAD,EAAA,WAAAmuD,GACAh/C,EAAA6/C,iBAAAhvD,EAAAmuD,EACA,IAAAkC,GAAAlhD,EAAAu+C,cAAA1tD,GAAAk0B,SAAAk7B,eAAAF,EAAA15B,EAAAm5B,kBAAAvsC,GAAA,GAAAwuC,EAAAh+B,GAAAzyB,QAAAkwD,EAAAlC,EACAluD,GAAA2yB,GAAAjyB,OAAA,8CAAmEwtD,EAAAnuD,IACnEkuD,EAAA3tC,KAAAvgB,EAAAmuD,EAAAe,EAAAx/B,GACAkhC,GAAA,GACAP,EAAA/gB,OAAAshB,EAAA,GAEAzhD,EAAA0hD,0BAAA7wD,GACAkuD,EAAA6B,aAAA/vD,IAAA,IAAAqwD,EAAAjuD,OAEiC8rD,EAAA6B,aAAA/vD,GACjCkuD,EAAAkC,SAAApwD,GAEAC,EAAA2yB,GAAAjyB,OAAA,oGAAoJX,EAAAwiB,KAAA6oC,UAAAgF,KAJpJnC,EAAAM,SAAAxuD,IAM6B,SAAAoiB,EAAAsN,GAC7Bw+B,EAAAa,cAAAZ,EAAAnuD,EAAAoiB,EAAAsN,KAC6BnP,KAAA,WAC7BpR,EAAA2hD,SAAA9wD,EAAAmuD,SA7BAluD,GAAA2yB,GAAAjyB,OAAA,6EAA4FX,EAAAmuD,KAgCvE,SAAA7rC,GACrB4rC,EAAAa,cAAAZ,EAAAnuD,EAAAsiB,EAAA,WAISutC,GACTkB,SACAC,eACAC,YACAX,UAAA,WACA,GAAA1sD,GAAAlH,EAAAu8C,eAAAiY,EAAA,EAAAC,EAAA,CAKA,OAJAv+B,IAAAjlB,KAAAkiD,EAAAmB,YAAA,SAAArd,EAAAyd,GACAF,IACAC,GAAAC,EAAAhvD,SAEAwB,GAAAisD,EAAAkB,MAAA3uD,OAAA8uD,EAAAC,IAEArB,KAAA,SAAA9vD,EAAAqxD,GACA,GAAAxH,GAAAyH,GAAAD,EAAAE,EAAA3+B,GAAAzyB,QAAA0vD,EAAAoB,SAAAjxD,GAAAwxD,EAAA5+B,GAAAzyB,QAAA0vD,EAAAkB,MAAA/wD,SACA6vD,GAAAmB,YAAAhxD,GACAw1B,EAAAi8B,eAAAzxD,YAAA4yB,IAAAwY,YACAnrC,EAAA,uCAAAD,EAAA,qCACAmP,GAAAu+C,cAAA1tD,GAAA8b,MAEAy1C,GAAA,EACA1B,EAAAoB,SAAA3hB,OAAAiiB,EAAA,GACiBD,GAAAE,GAAA,IACjB3B,EAAAkB,MAAAzhB,OAAAkiB,EAAA,GACA3H,EAAAgG,EAAAoB,SAAAt4C,QACAkxC,GAAA,IACAgG,EAAAkB,MAAAzsD,KAAAulD,GACAr0B,EAAA5wB,MAAAilD,MAIA6H,sBAAA,WACA,GAAAC,KAYA,OAXA/+B,IAAAjlB,KAAAkiD,EAAAmB,YAAA,SAAArd,EAAAie,GACAA,KAAAxvD,QACAuvD,EAAArtD,KAAAutD,SAAAle,MAGA/gB,GAAAjlB,KAAAkiD,EAAAkB,MAAA,SAAAhqD,EAAA4sC,GACAkc,EAAAmB,YAAArd,IACAge,EAAArtD,KAAAutD,SAAAle,MAGAge,IAAA79C,OAAA+7C,EAAAoB,WAGAa,kBAAA,SAAA9xD,GACA,MAAA4yB,IAAAzyB,QAAA0vD,EAAAkB,MAAA/wD,IAAA,GAEAgrD,KAAA,SAAAhrD,EAAAmuD,GAIA,MAHA,OAAAA,GACA0B,EAAAoB,SAAA3sD,KAAAtE,KAEA6vD,EAAAS,cACA,MAAAnC,GACA0B,EAAAoB,SAAAzrD,MACAqqD,EAAAkB,MAAAzsD,KAAAtE,KAEA,WACA,GAAA+xD,GAAAlC,EAAAmB,YAAAhxD,MACA+xD,GAAAztD,KAAA6pD,GACA0B,EAAAmB,YAAAhxD,GAAA+xD,MAGA,IAIAtpC,MAAA,WACAonC,EAAAoB,YACApB,EAAAkB,WAESiB,GACT9G,KAAA,SAAAlrD,EAAApB,GACA,GAAA0uD,GAAAn+C,EAAAu+C,cAAA1tD,EACA,OAAAstD,IAIAA,EAAA/Q,OAAA,EACAt8C,EAAA,qCAAAD,OACAmP,GAAA8iD,WAAAjyD,GAAA2qC,KAAA,SAAAvoB,EAAAkoC,GACArqD,EAAA,uCAAAD,EACA,IAAAkvD,GAAA15B,EAAAm5B,kBAAAvsC,GAAA,GAAA+H,EAAAztB,EAAAw4C,QAAAl1C,EACAtD,GAAAs4B,WAAAh1B,EAAApB,EAAAurB,KACAqL,EAAA08B,aAAAlyD,EAAAkvD,GACA15B,EAAAq5B,QAAA7uD,EAAAkvD,EAAA5E,IACiB,SAAAloC,EAAAkoC,GACjBrqD,EAAA,oCAAAD,EACA,IAAAkvD,GAAA15B,EAAAm5B,kBAAAvsC,GAAA,EACA1lB,GAAA+gD,YAAAz9C,EAAApB,EAAAswD,EAAA5E,IACA90B,EAAAq5B,QAAA7uD,EAAAkvD,EAAA5E,UAfArqD,GAAA,yEAAAD,EAAA,UAmBSw1B,GACTmd,OAAA,SAAA3yC,GACAC,EAAA,cAAAD,GACAtD,EAAA08C,YAAAxhC,OAAA5X,GACA6vD,EAAAC,KAAA9vD,IAEA6uD,QAAA,SAAA7uD,EAAAoiB,EAAAkoC,GACA,GAAA1rD,GAAAlC,EAAAo2C,QAAA9yC,EACAtD,GAAAw4B,WAAAl1B,EAAApB,EAAAwjB,EAAAkoC,GACAn7C,EAAAu+C,cAAA1tD,IACAmP,EAAAgjD,YAAAhjD,EAAAgjD,WAAAnyD,GAEA6vD,EAAAC,KAAA9vD,IAEAyxD,eAAA,SAAAzxD,GACA,MAAAmP,GAAAijD,UAAAjjD,EAAAijD,SAAApyD,IAAAmP,EAAAwmB,SAAAxmB,EAAAwmB,QAAA31B,IAEAqyD,YAAA,WACA,GAAAC,GAAAnW,EAAAvpB,GAAAupB,GAAAvpB,GAAA2/B,YAAAC,EAAA5/B,GAAAiU,kBAAAmC,cAAA,YACA75B,GAAA,GAAAmjD,GAAAE,EAAA,iBAAA91D,GACAwhD,oBAAAxhD,EAAAwhD,oBACAH,cAAArhD,EAAAqhD,cACAjL,QAAAp2C,EAAAo2C,QACAoC,QAAAx4C,EAAAw4C,QACAO,QAAA/4C,EAAA+4C,QACAx1C,MACAy8C,SAAAhgD,EAAAggD,SACA1nB,WAAAt4B,EAAAs4B,WACA4oB,cAAAlhD,EAAAkhD,cACA6U,aAAA,SAAAzyD,GACAtD,EAAAwyC,UAAAlvC,EAAA4yB,GAAAib,OAAA4C,sBAGAthC,EAAAujD,+BACAvjD,EAAAujD,iCAGAC,4BAAA,SAAA3yD,GACA,MAAAtD,GAAAshD,SAAAh+C,IAEA4yD,WAAA,SAAA5yD,EAAAyhC,GACA,MAAAA,KAAAtyB,EAAAwmB,QAAA31B,IAAAyhC,YAAA7O,IAAAwY,WACA1uC,EAAAmgD,aAAA78C,GACAC,EAAA,+CAAAD,GACAyhC,EAAA8J,SAAAZ,KAAA,SAAAkoB,GACA5yD,EAAA,mCAAAD,GACAmP,EAAA2jD,WAAA9yD,EAAA6yD,GACAn2D,EAAAmhD,QAAA79C,EAAA6yD,EAAA1oC,MACAhb,EAAAghD,mBAAAnwD,GACAw1B,EAAAu9B,uBAAA/yD,IACqB,SAAAyuB,GACrB,GAAAukC,KACAvkC,KACAukC,EAAA1wC,MAAAmM,GAEAxuB,EAAA2yB,GAAAjyB,OAAA,yDAA4FX,EAAAyuB,GAAA,SAC5F/xB,EAAAw4B,WAAAl1B,EAAAtD,EAAAo2C,QAAA9yC,GAAA4yB,GAAAxkB,OAAA4kD,EAAAlF,GAAA,MACAt4B,EAAAu9B,uBAAA/yD,GACA6vD,EAAAC,KAAA9vD,MAKA,GAFAw1B,EAAAu9B,uBAAA/yD,IAIA+yD,uBAAA,SAAA/yD,GACA,GAAAizD,GAAAv2D,EAAAuzC,mBAAAjwC,GAAAkzD,GAAA,CAeA,OAdAD,MAAA7wD,QACAnC,EAAA,0CAAAD,GACA4yB,GAAAjlB,KAAAslD,EAAA,SAAAlsD,EAAAosD,GACA,GAAA39B,EAAAm9B,4BAAAQ,IAAAhkD,EAAAwmB,QAAAw9B,GACAD,EAAAC,IAAAnzD,EACAw1B,EAAA49B,IAAAD,OACyB,IAAA39B,EAAAm9B,4BAAAQ,GACzB,aAIAD,GAAA,EACA19B,EAAA49B,IAAApzD,IAEAkzD,GAEAhB,aAAA,SAAAlyD,EAAAoiB,GACAhlB,SAAAglB,EAAAotB,SACA9yC,EAAAkhD,cAAA59C,EAAAoiB,EAAAotB,UAGAmf,kBAAA,SAAA0E,EAAApQ,GACA,GAAA7gC,GAAAixC,CAQA,OAPAzgC,IAAA3Q,SAAAoxC,KACAjxC,KACAwQ,GAAAvQ,SAAAgxC,KAAApQ,IACA7gC,EAAAE,MAAA+wC,IAGAjxC,EAAArjB,QAAAkkD,EACA7gC,GAEAgxC,IAAA,SAAApzD,GACA,GAAApB,GAAAlC,EAAAo2C,QAAA9yC,EACA,KAAA+tD,EAAAta,QAAAzzC,GACA,SAAA4yB,IAAA1D,MAAAlvB,EAAA,qCAEAtD,GAAAk4B,SAAA50B,EAAApB,GAAA+rC,KAAA,SAAAvoB,GACAA,KAAA0nB,OACAptC,EAAAwyC,UAAAlvC,EAAA4yB,GAAAib,OAAA0C,QACAphC,EAAA26B,MAAA9pC,GACA6vD,EAAAC,KAAA9vD,IAEAguD,GAAA7+C,EAAAmkD,qBAAAtzD,GACAkuD,EAAAkC,SAAApwD,GAEAgyD,EAAA9G,KAAAlrD,EAAApB,IAGiB,SAAA0jB,GAGjB,GAFAA,QACAriB,EAAAD,EAAA,qEAAAsiB,EAAA,UACA5lB,EAAA+gD,YAAAz9C,EAAApB,EAAA0jB,EAAAo7B,kBAA+E,CAC/E,GAAAt7B,GAAAoT,EAAAm5B,kBAAArsC,EAAAo7B,cAAA,EACAloB,GAAAq5B,QAAA7uD,EAAAoiB,OAIAxd,MAAA,SAAA5E,GACA,GAAAuzD,GAAA/9B,EAAAi8B,eAAAzxD,EACA,OAAAuzD,GACA/9B,EAAAo9B,WAAA5yD,EAAAuzD,IAEA/9B,EAAA49B,IAAApzD,IACA,IAIA4yB,IAAAxkB,OAAA3P,MACAuG,IAAA,SAAAhF,EAAA8b,GACA3M,EAAAnK,IAAA3D,MAAA5C,KAAA0nB,YAEAqP,OAAA,SAAAx1B,GACA,QAAA6vD,EAAA7E,KAAAhrD,IACAw1B,EAAA5wB,MAAA5E,IAIA00B,MAAA,SAAA10B,GAIA,MAHAiuD,KACA9+C,EAAAu+C,cAAA1tD,GAAAolC,KAAAkqB,eAAA,GAEAO,EAAAiC,kBAAA9xD,GACAw1B,EAAA5wB,MAAA5E,GAEA+tD,EAAAv4B,OAAAx1B,IAGA2yC,OAAA,SAAA3yC,GACA,GAAAwzD,GAAArkD,EAAAwjC,OAAA3yC,EACA4yB,IAAA6X,iBAAA+oB,GACAA,EAAA7oB,KAAA,WACAnV,EAAAmd,OAAA3yC,KAEiBwzD,KAAA,GACjBh+B,EAAAmd,OAAA3yC,IAGAgzC,UAAA,WACA,GAAA9wC,GAAAyvD,EAAA9B,EAAA6B,uBACA,IAAAC,EAAAvvD,OACA,IAAAF,EAAAyvD,EAAAvvD,OAAA,EAA2DF,GAAA,EAAQA,IACnE6rD,EAAApb,OAAAgf,EAAAzvD,GAGA2tD,GAAApnC,SAEAkN,QAAA,SAAA31B,GACA,MAAAmP,GAAAijD,UAAAjjD,EAAAijD,SAAApyD,GACAmP,EAAAijD,SAAApyD,GAAAqrC,cAEAl8B,EAAAwmB,SAAAxmB,EAAAwmB,QAAA31B,IAEAyzD,UAAA,SAAAzzD,GACA,SAAAmP,EAAAijD,WAAAjjD,EAAAijD,SAAApyD,KAEA8sC,SAAA,SAAA9sC,GACA,GAAAmP,EAAA29B,SACA,MAAA39B,GAAA29B,SAAA9sC,IAGAyoB,MAAA,WACAxoB,EAAA,4BACA8tD,EAAA/a,YACA6c,EAAApnC,QACAtZ,EAAAsZ,SAEAotB,QAAA,SAAA71C,GACA,GAAA+tD,EAAAta,QAAAzzC,GACA,MAAAmP,GAAA0mC,QAAA71C,IAGAyzC,QAAA,SAAAzzC,GACA,MAAAmP,GAAAskC,QAAAzzC,IAEA21C,gBAAA,SAAA31C,GACA,GAAA0oB,GAAAvZ,EAAAskC,QAAAzzC,IAAAmP,EAAAukD,oBAAAvkD,EAAAukD,mBAAA1zD,EACA,SAAA0oB,KACAkf,aAAA5C,QAAAtc,IAIAusB,sBAAA,WACA,MAAA9lC,GAAA8lC,sBACA9lC,EAAA8lC,4BAIAwY,oBAAA,SAAAztD,GACA,GAAA+tD,EAAAta,QAAAzzC,GACA,MAAAmP,GAAAs+C,oBAAAztD,IAGA8pC,MAAA,SAAA9pC,GACA,SAAA+tD,EAAArY,YAAA11C,IAAAmP,EAAA26B,OAAAikB,EAAAta,QAAAzzC,IAAAmP,EAAA26B,MAAA9pC,MACA6vD,EAAAC,KAAA9vD,GACAmP,EAAAygD,0BAAA5vD,IACA,IAIA2zD,mBAAA,SAAA3zD,GACA,QAAAmP,EAAAwkD,oBAAAxkD,EAAAwkD,mBAAA3zD,IAEA01C,YAAA,SAAA11C,GACA,QAAAmP,EAAAumC,aAAAvmC,EAAAumC,YAAA11C,MAGA4yB,GAAAxkB,OAAA1R,EAAA+uC,GACAxrC,EAAAvD,EAAAuD,IACA+tD,EAAAtxD,EAAAw3B,SAAAC,SAAAvB,GAAAiU,kBAAA3S,SACA+5B,EAAAD,GAAAtxD,EAAAw3B,SAAAE,WAAAD,QACA25B,EAAA,WACA,GAAA1rC,KAEA,OADAA,GAAA1lB,EAAA2/C,oBAAA,EACAj6B,KAEAoT,EAAA68B,eAEAz/B,GAAAghC,qBAAA,SAAAnoB,GACA,YACA,IAAA/uC,IACAuD,IAAA,SAAA0iB,EAAA0b,MACSw1B,IACTjhC,IAAAxkB,OAAA1R,EAAA+uC,GACA7Y,GAAAxkB,OAAA3P,MACAq1D,eAAA,SAAA9zD,EAAAyL,GACA,GAAAsoD,GAAA,SAAAhwC,GACAtY,EAAAsY,EAAAllB,MAEA8kB,QAAAolB,YACA8qB,EAAA7zD,GAAA4yB,GAAAjP,QAAAmX,OAAA,UAAAi5B,GAEA9zD,IAAA,kEAGA+zD,sBAAA,SAAAh0D,GACA,GAAA2jB,OAAAolB,YAAA,CACA,GAAAkrB,GAAAJ,EAAA7zD,EACAi0D,IACAA,SAMArhC,GAAAshC,kBAAA,SAAA3lB,GACA,YAIA,SAAA4lB,aAAAn0D,SACAo0D,GAAAp0D,GACAq0D,IACA5Q,aAAA6Q,EAAAt0D,UACAs0D,GAAAt0D,GACAu0D,EAAAP,sBAAAh0D,GAEA,IAAAw0D,GAAA96C,SAAA2F,eAAAlQ,EAAAslD,eAAAz0D,GACAw0D,KACAA,EAAAr7C,aAAA,2BACAyZ,GAAA4hC,GAAA58C,UAGA,QAAA88C,wBAAAC,GACA,MAAAA,GAAA5iD,MAAA,QAEA,QAAA6iD,qBAAAh2D,GACA,GAAA41D,GAAA5hC,GAAA6R,UAAA,yCAAqE7lC,EAAA,OAIrE,OAHA41D,GAAAr7C,aAAA,KAAAva,GACA41D,EAAA55B,MAAAC,QAAA,OACAnhB,SAAAm7C,KAAA9uB,YAAAyuB,GACAA,EAEA,QAAAM,6BAAAN,EAAA/oD,GACA,GAAAkpD,GAAAH,EAAAx0D,GAAA2zC,EAAA+gB,uBAAAC,GAAAjnB,EAAA+H,EAAA9B,EACAohB,GAAArnB,GAAAjiC,EACA2oD,EAAAzgB,GAAA/gB,GAAA4hC,GAAA15B,OAAA,kBACA3rB,EAAA29B,SAAA6G,KACA1zC,EAAA,mEAAA00D,EAAA,KACAL,EAAAK,GAAAr7C,WAAA,WACA,GAAAmV,GAAA,gEAAAkmC,CACA10D,GAAAwuB,EAAA,SACAhjB,GACA6W,MAAAmM,KAEqB,QAGrB8lC,EAAAT,eAAAa,EAAA,SAAAhyC,GACA1iB,EAAA,2CAAA0iB,EAAA,IACA,IAAAqyC,GAAA5yC,GAAAsyC,uBAAAC,GAAAxlD,EAAA8lD,mBAAAtyC,IAAA+qB,EAAAtrB,EAAAsrB,IACAA,IAAAqnB,EAAArnB,IACAztC,EAAA,qCAAA00D,GACAlR,aAAA6Q,EAAAK,UACAL,GAAAK,GACAxlD,EAAA+lD,iBAAAP,GACAK,EAAAD,EAAArnB,SACAqnB,GAAArnB,GACA6mB,EAAAP,sBAAAW,GACAK,EAAA5yC,IACiBsrB,GACjBztC,EAAA,IAAA0iB,EAAA,2CAtDA,GAAAjmB,GAAA6xC,EAAA7xC,QAAAyS,EAAA1Q,KAAA0T,EAAAo8B,EAAAp8B,MAAAgjD,EAAAviC,GAAAgQ,cAAAmyB,KAAsIX,KAAuBE,KAAgCD,EAAA33D,EAAA23D,OAAAvgC,EAAAp3B,EAAAo3B,UAAA2hB,EAAAtjC,EAAAsjC,QAAAx1C,EAAAkS,EAAAlS,IAAAs0D,EAAA,GAAA3hC,IAAAghC,sBAC7L3zD,OAyDA2yB,IAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAy6B,cAAA9e,IACA3b,GAAAyP,SAAA5jC,KAAA,SAAA8jC,GACA,OACAv9B,IAAA,SAAAhF,EAAAm/C,GACA5c,EAAAv9B,IAAAhF,GACAmgC,MAAAgf,IAEAA,EAAAhmC,aAAA,OAAA2a,GACAqrB,EAAAt3B,YACA+K,GAAAusB,GAAAvnC,UAGAi+B,QAAA,SAAA71C,GACAm0D,YAAAn0D,GACAuiC,EAAAsT,QAAA71C,IAEAyzC,QAAA,SAAAzzC,GACA,MAAAuiC,GAAAkR,QAAAzzC,IAAA5C,SAAA+R,EAAAu+C,cAAA1tD,GAAAmgC,UAIAvN,GAAAxkB,OAAA3P,MACAquC,SAAA,SAAA9sC,GACA,MAAAmP,GAAAu+C,cAAA1tD,GAAAmgC,OAEAi1B,iBAAA,SAAAZ,EAAA/oD,GACA,GAAA4pD,EACAhB,GACAS,4BAAAN,EAAA/oD,GAEA2oD,EAAAI,EAAAx0D,IAAA4yB,GAAA4hC,GAAA15B,OAAA,kBAEA,GADA76B,EAAA,yBAAAu0D,EAAAx0D,IACAw0D,EAAA3sC,WAAA,CAGA,IACA,GAAA2sC,EAAAc,iBAAAd,EAAAc,gBAAAT,MAAA,SAAAL,EAAAc,gBAAAT,KAAAlwB,UACA,OAEyB,MAAAriB,GACzBriB,EAAA,8EAAAqiB,EAAAK,QAAA,aACA0yC,GACAt2D,SAAA,GAGA0M,EAAA4pD,OAIAE,cAAA,SAAAv1D,GACA,GAAA20D,GAAAxlD,EAAAslD,eAAAz0D,EACA,OAAA40D,qBAAAD,IAEAO,iBAAA,SAAAl1D,GACA5C,SAAAg3D,EAAAp0D,KACAo0D,EAAAp0D,WACAo0D,GAAAp0D,KAGAy0D,eAAA,SAAA9gB,GACA,MAAAA,GAAA,IAAAwhB,GAEAK,mBAAA,SAAAjnB,GACA,GAAAnpB,GAAAmpB,EAAAnpB,OAAAyO,EAAA0a,EAAA1a,SAAA3N,EAAAqoB,EAAAroB,OAAA2gC,EAAAtY,EAAAsY,aAAA4O,EAAAlnB,EAAAknB,WAAA50C,EAAA+R,GAAA6R,UAAA,iBAAArf,EAAA,2CAAA3G,EAAAoV,CAUA,OATAgzB,GACAj0B,GAAAkT,WAAA5f,EAAArF,GAEApC,EAAAmU,GAAAuS,QAAAjf,EAAA2N,GAEAhT,EAAA1H,aAAA,SAAAsF,GACAoC,EAAA1H,aAAA,SAAAs8C,GACA50C,EAAA+Z,MAAAC,QAAA,OACAnhB,SAAAm7C,KAAA9uB,YAAAllB,GACAA,GAEAo0C,mBAAA,SAAAS,GACA,GAAAtzC,KACA,KACAA,EAAAwQ,GAAAoT,UAAA0vB,GACiB,MAAApzC,GACjBriB,EAAA,0DAAAqiB,EAAAK,QAAA,aAEA,MAAAP,OAIAwQ,GAAA+iC,iBAAA,SAAApnB,GACA,YAcA,SAAA3e,OAAA5vB,GACA4yB,GAAAjlB,KAAAwB,EAAAqgD,SAAAxvD,GAAA,SAAA41D,EAAAlmC,GACA,GAAAmmC,GAAA1mD,EAAA2mD,kBAAA91D,EAAA41D,EACAlmC,GAAAm7B,mBAAA,KACAn7B,EAAA8F,OAAAg0B,WAAA,KACA95B,EAAAE,QACAimC,KAAAzI,UAAAyI,EAAAzI,SAAAptD,KAnBA,GAAAmP,GAAA1Q,KAAA09C,EAAA5N,EAAA7xC,QAAAy/C,UAAAhqC,EAAAo8B,EAAAp8B,MAAA+hB,EAAAqa,EAAA7xC,QAAAw3B,SAAA6hC,EAAA,SAAA/1D,GACA,GAAAstD,GAAAn+C,EAAAu+C,cAAA1tD,EACA,IAAAstD,EAAAh5B,UACA,MAAAg5B,GAAAh5B,SAEA,IAAAA,GAAAJ,EAAAwzB,QAKA,OAJA90B,IAAA2L,WAAAjK,KACAA,IAAAt0B,EAAAk1C,EAAAl1C,KAEAstD,EAAAh5B,YACAA,GAES0V,EAAAuE,EAAA7xC,QAAAstC,OAAAgsB,EAAA9hC,GAAAqa,EAAA7xC,QAAAw3B,SAAAC,SAAAvB,GAAAiU,kBAAA3S,SAAA+hC,EAAAjsB,GAAAuE,EAAA7xC,QAAAstC,OAAA7V,SAAA6hC,GAAApjC,GAAAiU,kBAAAmD,OAAA8I,EAAA3gC,EAAA2gC,QAAAoC,EAAA/iC,EAAA+iC,QAAAO,EAAAtjC,EAAAsjC,QAAAf,EAAAviC,EAAAuiC,YAAAqJ,EAAA5rC,EAAA4rC,cAAAH,EAAAzrC,EAAAyrC,cAAA5oB,EAAA7iB,EAAA6iB,WAAA/0B,EAAAkS,EAAAlS,IAAAi+C,EAAA/rC,EAAA+rC,mBAUTtrB,IAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAy6B,cAAA9e,IACA3b,GAAAyP,SAAA5jC,KAAA,SAAA8jC,GACA,OACAv9B,IAAA,SAAAhF,EAAAk2D,GACA,GAAAtjC,GAAAwM,OAAA82B,IAAAtjC,GAAAoN,OAAAk2B,GACA3zB,EAAAv9B,IAAAhF,GACA8b,KAAAo6C,QAEqB,MAAAA,YAAAtjC,IAAAwY,WAKrB,SAAAlc,OAAA,2CAJAqT,GAAAv9B,IAAAhF,GACAmS,MAAA+jD,IAKA/mD,EAAAgnD,eAAAn2D,GACAi2D,GAAA9mD,EAAAinD,uBAAAp2D,IAEA61C,QAAA,SAAA71C,GACA4vB,MAAA5vB,GACAmP,EAAAy/C,+BAAA5uD,GACAmP,EAAAgjD,WAAAnyD,GACAuiC,EAAAsT,QAAA71C,OAIA4yB,GAAAxkB,OAAA3P,MACAuwD,iBAAA,SAAAhvD,EAAAmuD,GACA,GAAAb,GAAAn+C,EAAAu+C,cAAA1tD,EACAstD,UACAA,GAAAloB,KAAAixB,aAAAlI,IAGA2C,SAAA,SAAA9wD,EAAAmuD,GACA,GAAAmI,GAAAnnD,EAAAu+C,cAAA1tD,GAAAolC,IACAkxB,GAAAC,YACAD,GAAAC,KAAApI,GAEAmI,EAAAE,sBACAF,GAAAE,eAAArI,IAGAM,eAAA,SAAAzuD,EAAAy2D,GACA,GAAAC,GAAAvnD,EAAA+gD,gBAAAlwD,GAAA,EAAA0vB,EAAAvgB,EAAAwnD,QAAA32D,EAAA02D,EACA,OAAAD,IACA,GAAA7jC,IAAAkP,SAAA/iC,QAAA03D,EAAA/mC,OAEA,GAAAkD,IAAAkP,SAAA/iC,WAAkD2wB,IAElDiG,QAAA,SAAA31B,GACA,MAAAmP,GAAAskC,QAAAzzC,IAAAmP,EAAAu+C,cAAA1tD,GAAA8b,MAEAs2C,SAAA,SAAApyD,GACA,MAAAmP,GAAAskC,QAAAzzC,IAAAmP,EAAAu+C,cAAA1tD,GAAAmS,OAEA8iC,sBAAA,WACA,GAAA2hB,KAiBA,OAhBAznD,GAAA0nD,sBAAA,SAAAnuC,EAAAkqB,GACAzjC,EAAAygD,0BAAA,KAAAhd,EAAA1e,SAAAk7B,WAAAxc,EAAA1e,SAAAm7B,UACA,IAAAxwD,IACAD,KAAAg0C,EAAAh0C,KACAywD,UAAAzc,EAAA1e,SAAAm7B,UACAllC,KAAAyoB,EAAAzoB,KACAujB,KAAAkF,EAAAlF,KAEAkF,GAAAlqB,MACA7pB,EAAA6pB,IAAAkqB,EAAAlqB,KAEAkqB,EAAA4K,mBACA3+C,EAAA2+C,iBAAA5K,EAAA4K,kBAEAoZ,EAAAtyD,KAAAzF,KAEA+3D,GAEAjD,mBAAA,SAAA3zD,GACA,MAAAmP,GAAAu+C,cAAA1tD,GAAAquD,kBAEA3Y,YAAA,SAAA11C,GACA,QAAAk0B,GAAA/kB,EAAAskC,QAAAzzC,KAAAmP,EAAAu+C,cAAA1tD,GAAA82D,cAEAlH,0BAAA,SAAA5vD,EAAA+2D,EAAAC,GACA,GAAA1J,GAAAn+C,EAAAu+C,cAAA1tD,OAA+Di3D,EAAA3J,EAAAp5B,aAA0Ck7B,EAAA2H,GAAAE,EAAA7H,WAAAC,EAAA2H,GAAAC,EAAA5H,SACzGD,KACAnvD,EAAA2yB,GAAAjyB,OAAA,yDAA0E6hB,KAAA6oC,UAAA+D,KAC1EA,EAAA8H,UACAtkC,GAAAjlB,KAAAyhD,EAAA,SAAAroD,EAAAonD,GACAkB,EAAA/oC,QAAA6nC,KAEAiB,EAAAhtD,OAAA,IAGA0nC,MAAA,SAAA9pC,GACA,GAAAmP,EAAAskC,QAAAzzC,GAIA,MAHAC,GAAA2yB,GAAAjyB,OAAA,4DAAiEX,EAAA8yC,EAAA9yC,KACjEmP,EAAAu+C,cAAA1tD,GAAAm3D,QAAA,EACAvnC,MAAA5vB,IACA,GAGAmwD,mBAAA,SAAAnwD,GACA,GAAAk0B,GAAA/kB,EAAAskC,QAAAzzC,GAAA,CACA,GAAAo3D,GAAAl1D,EAAA+oC,EAAA97B,EAAAu+C,cAAA1tD,EAIA,UAHAirC,GAAA/W,SACA+W,EAAA/W,YACAkjC,EAAAjoD,EAAA+gD,gBAAAlwD,GACAo3D,EAAA,GAAAljC,EAAAszB,UAAA,CAIA,IAHAvc,EAAA/W,SAAAC,SAAA,EACA8W,EAAA/W,SAAA9F,MAAAgpC,EACAnsB,EAAA/W,SAAAm7B,aACAntD,EAAA,EAAmCA,EAAAk1D,EAAiBl1D,IACpD+oC,EAAA/W,SAAAm7B,UAAA/qD,KAAApC,EAEAiN,GAAAgnD,eAAAn2D,OAEAirC,GAAA/W,SAAAC,SAAA,IAIA2+B,WAAA,SAAA9yD,EAAAq3D,GACAloD,EAAAskC,QAAAzzC,KACAmP,EAAAu+C,cAAA1tD,GAAA8b,KAAAu7C,IAGAlF,WAAA,SAAAnyD,GACA,GAAAs2D,GAAAnnD,EAAAu+C,cAAA1tD,GAAAolC,IACAxS,IAAAjlB,KAAA2oD,EAAAE,eAAA,SAAAc,SACAhB,GAAAE,eAAAc,KAEA1kC,GAAAjlB,KAAA2oD,EAAAC,KAAA,SAAAe,SACAhB,GAAAC,KAAAe,MAGAC,WAAA,SAAAv3D,EAAAw3D,GACA,MAAAroD,GAAAsoD,aAAAz3D,EAAAw3D,EAAA5kC,GAAA0N,sBAEAw1B,kBAAA,SAAA91D,EAAAw3D,GACA,GAAArJ,GAAA,MAAAqJ,MACA,OAAAroD,GAAAu+C,cAAA1tD,GAAAolC,KAAAoxB,eAAArI,IAEAC,cAAA,SAAApuD,EAAA03D,GACA,GAAApjC,GAAAyhC,EAAA/1D,GAAA23D,EAAAziB,EAAAl1C,GAAAihC,EAAA9xB,EAAAwmB,QAAA31B,GAAA43D,EAAAtjC,EAAAojC,EAAAG,EAAAD,EAAAtjC,GAAAqjC,IAAAC,EAAAtjC,EAAA8iC,EAAAjoD,EAAA+gD,gBAAAlwD,GAAAq2D,EAAA53D,KAAAivD,cAAA1tD,GAAAolC,KAAAixB,aAAA50B,EAAA40B,EAAAqB,IAAA9kC,GAAAoO,UAAAC,EAAA22B,EAAAC,EAEA,OADAxB,GAAAqB,GAAAj2B,GAEAq2B,KAAAJ,EACA9yD,MAAAgzD,EACA7yD,IAAA8yD,EACA7tC,MAAAotC,EACA31B,OACAtX,KAAA0tC,EAAAD,IAGArJ,yBAAA,SAAArR,GACA,OACA1oB,UAAA0oB,EAAA4a,KACAC,UAAA7a,EAAAt4C,MAAA,EACAozD,QAAA9a,EAAAn4C,IACA0vB,WAAAyoB,EAAAlzB,QAGA0pC,mBAAA,SAAA1zD,GACA,GAAAi4D,GAAA,MAAAr5D,EAAAk0C,EAAA9yC,GAAAmqB,EAAA+qB,EAAAl1C,GAAAs0B,EAAAyhC,EAAA/1D,GAAA6zB,EAAA6gB,EAAA10C,GAAA+nD,EAAA/d,EAAA+d,WAAA/nD,GAAAk4D,EAAAtlC,GAAAjyB,OAAA,2BAAqOw7C,EAAA8b,EAAAr5D,EAAAurB,EAAAmK,EAAAT,EAIrO,OAHAk0B,GAAAhoC,QAAA,SAAA2I,GACAwvC,GAAA,IAAAxvC,IAEAwvC,GAEAC,aAAA,SAAAn4D,GACA,MAAAmP,GAAAwmB,QAAA31B,GAAAnC,MAEAu6D,oBAAA,SAAAp4D,GACA,MAAAmP,GAAAu+C,cAAA1tD,GAAAk0B,UAEAg8B,gBAAA,SAAAlwD,GACA,GAAAk0B,EAAA,CACA,GAAAyjC,GAAAziB,EAAAl1C,GAAAs0B,EAAAyhC,EAAA/1D,EACA,OAAAkW,MAAAmiD,KAAAV,EAAArjC,KAGAqiC,QAAA,SAAA32D,EAAAw3D,GACA,GAAArJ,GAAA,MAAAqJ,MACA,OAAAroD,GAAAu+C,cAAA1tD,GAAAolC,KAAAmxB,KAAApI,IAEAqB,SAAA,SAAAxvD,GACA,MAAAmP,GAAAu+C,cAAA1tD,GAAAolC,KAAAmxB,MAEAM,sBAAA,SAAAprD,GACAwqD,GACArjC,GAAAjlB,KAAAi6B,aAAA,SAAAlf,EAAA9b,GACA,GAAuD,IAAvD8b,EAAAvoB,QAAAyyB,GAAAjyB,OAAA,aAAuDw7C,IAAA,CACvD,GAAAvJ,GAAApwB,KAAAC,MAAA7V,EACAnB,GAAAid,EAAAkqB,OAKAujB,eAAA,SAAAn2D,GACAmP,EAAAu+C,cAAA1tD,GAAAolC,MACAoxB,kBACAlI,iBACAiI,QACAF,kBAGAiC,kBAAA,SAAAt4D,GACAmP,EAAAu+C,cAAA1tD,GAAA82D,cAAA,GAEAlI,+BAAA,SAAA5uD,GACA,GAAAk4D,EACA,UAAAjC,GAAA9mD,EAAAumC,YAAA11C,KACAk4D,EAAA/oD,EAAAukD,mBAAA1zD,GACAk4D,GAAAtwB,aAAA5C,QAAAkzB,OACAtwB,aAAA2wB,WAAAL,IACA,IAKA9B,uBAAA,SAAAp2D,GACA,GAAAk4D,GAAAM,EAAAvtB,EAAA97B,EAAAu+C,cAAA1tD,EACAi2D,IAAA74D,SAAA6tC,EAAAviB,MACAwvC,EAAA/oD,EAAAukD,mBAAA1zD,GACAw4D,EAAA5wB,aAAA5C,QAAAkzB,GACAM,IACAA,EAAAh2C,KAAAC,MAAA+1C,GACAza,EAAAya,EAAA9qB,MACAv+B,EAAAmpD,kBAAAt4D,IAEAC,EAAA2yB,GAAAjyB,OAAA,0DAAoFX,EAAA8yC,EAAA9yC,KACpF49C,EAAA59C,EAAAw4D,EAAA9qB,MACAzC,EAAAviB,IAAA8vC,EAAA9vC,IACAuiB,EAAA/W,SAAAskC,EAAAtkC,SACA+W,EAAAsR,OAAAic,EAAAjc,OACAtR,EAAAuS,iBAAAgb,EAAAhb,iBACAvS,EAAAojB,kBAAA,EACAl/C,EAAAygD,0BAAA5vD,OAKA6wD,0BAAA,SAAA7wD,GACA,GAAAk4D,GAAAM,EAAAvtB,EAAA97B,EAAAu+C,cAAA1tD,EACA,IAAAi2D,GAAA9mD,EAAAumC,YAAA11C,GAAA,CACA,GAAAw9C,GAAAU,EAAAl+C,EACAk4D,GAAA/oD,EAAAukD,mBAAA1zD,GACAw4D,GACA55D,KAAAk0C,EAAA9yC,GACAmqB,KAAA+qB,EAAAl1C,GACA0tC,KAAA+H,EAAAz1C,GACA0oB,IAAAuiB,EAAAviB,IACAwL,SAAA+W,EAAA/W,SACAqoB,OAAAtR,EAAAsR,OACAkc,YAAAriD,KAAAg9C,OAEA5V,IACAgb,EAAAhb,mBAEA,KACA5V,aAAAC,QAAAqwB,EAAA11C,KAAA6oC,UAAAmN,IACqB,MAAAl2C,GACrBriB,EAAA2yB,GAAAjyB,OAAA,0DAA4FX,EAAAsiB,EAAAiM,YAAA,WAI5FmqC,yBAAA,SAAA14D,EAAAmuD,EAAA75B,GACA,GAAA5E,GAAAvgB,EAAAwnD,QAAA32D,EAAAmuD,GAAAvvD,EAAAk0C,EAAA9yC,GAAA24D,GACA3G,OAAA,SAAAzV,EAAAxmB,GACA,GAAA4hC,GAAAziB,EAAAl1C,EACAu8C,KAAAxmB,EACAf,EAAAh1B,EAAApB,EAAA+4D,KAEA3iC,EAAAh1B,EAAApB,EAAA29C,GAAAob,IAAA,EAAApb,EAAAob,IAGAzJ,QAAA,SAAA3R,EAAAxmB,GACA,GAAAu4B,GAAAn/C,EAAAu+C,cAAA1tD,GAAAolC,KAAAkpB,cAAAsK,EAAAzpD,EAAAu+C,cAAA1tD,GAAAu8C,OAAAsc,EAAAtc,EAAAuc,EAAA/iC,EAAA0xB,EAAAvS,EAAAl1C,GAAA+4D,EAAAF,GAAAC,EAAAxkC,GAAA0kC,EAAAJ,CACAtK,GAAAH,GAAA4K,EACAnmC,GAAAjlB,KAAA2gD,EAAA,SAAAH,EAAA8K,GACAD,GAAAC,IAEAjkC,EAAAh1B,EAAApB,EAAAo6D,EAAAvR,IAGA/3B,GAAA8F,OAAAg0B,WAAA,SAAAroD,GACA,GAAAA,EAAAqqD,iBAAA,CACA,GAAA3tD,GAAA,MAAAy2B,EAAA,kBACAqkC,GAAA96D,GAAAsD,EAAAo7C,OAAAp7C,EAAA40B,UAIA0hC,aAAA,SAAAz3D,EAAAw3D,EAAA9nC,EAAAwpC,GACA,GAAAC,GAAA,MAAA3B,OAAAlB,EAAAnnD,EAAAu+C,cAAA1tD,GAAAolC,IAOA,OANAkxB,GAAAC,KAAAD,EAAAC,SACAD,EAAAE,eAAAF,EAAAE,mBACAF,EAAAC,KAAA4C,GAAAzpC,EACAwpC,IACA5C,EAAAE,eAAA2C,GAAAD,GAEAxpC,GAEAgjC,8BAAA,WACA,GAAA0G,GAAApvB,EAAA6d,eACA14C,GAAA0nD,sBAAA,SAAAnuC,EAAAkqB,GACA,GAAAymB,GAAA,GAAAjjD,MAAAw8B,EAAA6lB,YACAY,GAAAC,QAAAD,EAAAE,UAAAH,GACAC,EAAAhjD,WAAAD,KAAAg9C,QACAnzD,EAAA,2CAAAyoB,GACAkf,aAAA2wB,WAAA7vC,OAIA4qC,qBAAA,SAAAtzD,GACA,GAAAirC,GAAA97B,EAAAu+C,cAAA1tD,EACA,IAAAirC,EAIA,MAHAA,GAAA/W,UACA/kB,EAAAghD,mBAAAnwD,GAEAirC,EAAA/W,SAAAC,YAKAvB,GAAAomB,wBAAA,SAAAvN,GACA,YAmBA,SAAA+tB,qBACA,eAAA98D,EAAA0oB,OAAAkG,eAEAmuC,QAAA,aArBA,GAAAC,GAAAh9D,GACA0oB,OAAA,SACA8zB,cAAA,SACAG,iBACAJ,eAAA,EACAE,cAAA,SAAAn5C,GACA,UAEAo5C,eACAE,MACA+H,UAAA,EACA4G,iBAAA,GAEAhoD,IAAA,SAAAwlB,EAAA4Y,KACAkb,SAAA,SAAAv5C,KACAy5C,iBAAA,SAAAz5C,EAAA05C,EAAAC,KAEA/mB,IAAAxkB,OAAA1R,EAAA+uC,GASAiuB,EAAA9mC,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAo2B,eACA4C,aAAA,mBACAM,cAAA,iBACA9mC,OAAA1oB,EAAA0oB,OACAi0B,cAAA38C,EAAA28C,cACAD,YAAA18C,EAAA08C,YACAiR,eAAAmP,oBACAvgB,eAAAv8C,EAAAu8C,eACAE,cAAA,SAAAn5C,GACA,MAAAtD,GAAAy8C,cAAAzf,IAAA15B,IAEAC,IAAAvD,EAAAuD,IACAuqD,OAAA9tD,EAAA68C,SACArkB,WAAAx4B,EAAA+8C,iBACAH,KAAA58C,EAAA48C,QAEA1mB,GAAAxkB,OAAA3P,MACA6lD,WAAA,SAAAtkD,EAAA0tC,EAAAwW,GACA,GAAAhI,GAAAgI,KACAxnD,GAAAuD,IAAA,sCAAAD,GACA,WAAAtD,EAAA0oB,OACAs0C,EAAAlN,cAAAxsD,GAAA0sD,SAAAhf,GAAAkf,WAAA1Q,GAAAgP,QAEAhP,EAAAx/C,EAAAw8C,eAAAxL,EACAgsB,EAAAlN,cAAAxsD,GAAA4sD,WAAA1Q,GAAAgP,YAKA,WACA,QAAAyO,mBAAAC,GACA,GAAAC,GAAAC,EAAAF,EAAAG,aAAAC,EAAAJ,EAAAK,cAAAn9B,EAAApjB,SAAA0mB,cAAA,SACA,OAAA05B,GAAAE,EAAA,UACAl9B,EAAA/mB,MAAA+mB,EAAA7mB,OAAA,EACA4jD,EAAA/8B,EAAAo9B,WAAA,MACAL,EAAAM,UAAAP,GAAAE,EAAA,KACA,IAAAD,EAAAO,aAAA,SAAAv7D,KAAA,IAKA,QAAAw7D,sBAAAT,EAAAE,EAAAE,GACA,GAAAH,GAAAh7D,EAAAy7D,EAAAC,EAAAz9B,EAAApjB,SAAA0mB,cAAA,UAAAo6B,EAAA,EAAAC,EAAAT,EAAAU,EAAAV,CAMA,KALAl9B,EAAA/mB,MAAA,EACA+mB,EAAA7mB,OAAA+jD,EACAH,EAAA/8B,EAAAo9B,WAAA,MACAL,EAAAM,UAAAP,EAAA,KACA/6D,EAAAg7D,EAAAO,aAAA,MAAAJ,GAAAn7D,KACA67D,EAAAF,GACAF,EAAAz7D,EAAA,GAAA67D,EAAA,MACA,IAAAJ,EACAG,EAAAC,EAEAF,EAAAE,EAEAA,EAAAD,EAAAD,GAAA,CAGA,OADAD,GAAAG,EAAAV,EACA,IAAAO,EAAA,EAAAA,EAEA,QAAAI,sBAAAf,EAAAn4B,EAAA/kC,EAAAk+D,GACA,GAAA99B,GAAApjB,SAAA0mB,cAAA,UAAArD,EAAArgC,EAAAqgC,MAAA,aAAA8E,EAAA,GAAAjP,IAAAkP,OAIA,OAHA+4B,qBAAAjB,EAAAn4B,EAAA3E,EAAApgC,EAAAk+D,GAAAjwB,KAAA,WACA9I,EAAA9iC,QAAA+9B,EAAAI,UAAAH,EAAArgC,EAAAsgC,SAAA,OAEA6E,EAEA,QAAAi5B,qCAAAvsB,GACA,GAAAwsB,GAAA,MACA,KAAAnoC,GAAAqR,MACA,SAAArR,IAAA1D,MAAA,kEAEA,IAAAqf,EAAAysB,WAAAzsB,EAAA0sB,UAAAF,EACA,OACAG,UAAAhlD,KAAA8Y,MAAA9Y,KAAAilD,KAAAJ,GAAAxsB,EAAAysB,WAAAzsB,EAAA0sB,aACAG,SAAAllD,KAAA8Y,MAAA9Y,KAAAilD,KAAAJ,GAAAxsB,EAAA0sB,UAAA1sB,EAAAysB,eAIA,QAAAH,qBAAAjB,EAAAn4B,EAAA3E,EAAApgC,EAAAk+D,GACA,GAAAS,GAAAvB,EAAAF,EAAAG,aAAAC,EAAAJ,EAAAK,cAAAlkD,EAAArZ,EAAAqZ,MAAAE,EAAAvZ,EAAAuZ,OAAA4jD,EAAA/8B,EAAAo9B,WAAA,MAAAr4B,EAAA,GAAAjP,IAAAkP,OAEA,OADA+3B,GAAAyB,OACA5+D,EAAAwO,OACAqwD,sCACA95B,OACA3E,SACAmpB,MAAA2T,EACA4B,YAAAxB,EACAyB,WAAA3B,EACA4B,YAAAh/D,EAAAg/D,YACAxwD,OAAAxO,EAAAwO,OACAywD,aAAA1lD,EACA2lD,YAAA7lD,KAGA6c,GAAAiU,kBAAAsD,2BACAkxB,EAAAP,qCACAG,UAAAllD,EACAilD,WAAA/kD,IAEAolD,IACAzoC,GAAA3yB,IAAA2yB,GAAAjyB,OAAA,iFAAmHoV,EAAAE,EAAAolD,EAAAD,SAAAC,EAAAH,WAAA,QACnHnlD,EAAAslD,EAAAD,SACAnlD,EAAAolD,EAAAH,YAGAW,oBAAA/+B,EAAA/mB,EAAAE,EAAAvZ,EAAAg/D,aACA9oC,GAAAqR,OACA,WACA01B,kBAAAC,KACAE,GAAA,EACAE,GAAA,EAEA,IAAA8B,GAAAC,EAAAC,EAAAC,EAAA,KAAAC,EAAAxiD,SAAA0mB,cAAA,UAAA+7B,EAAAvB,EAAAP,qBAAAT,EAAAE,EAAAE,GAAA,EAAAoC,EAAAlmD,KAAAmiD,KAAA4D,EAAAlmD,EAAA+jD,GAAAuC,EAAAnmD,KAAAmiD,KAAA4D,EAAAhmD,EAAA+jD,EAAAmC,GAAA3B,EAAA,EAAA8B,EAAA,CAGA,KAFAJ,EAAAnmD,MAAAmmD,EAAAjmD,OAAAgmD,EACAH,EAAAI,EAAAhC,WAAA,MACAM,EAAAR,GAAA,CAGA,IAFA+B,EAAA,EACAC,EAAA,EACAD,EAAAjC,GACAgC,EAAAS,UAAA,IAAAN,KACAH,EAAA3B,UAAAP,GAAAmC,GAAAvB,GACAX,EAAAM,UAAA+B,EAAA,IAAAD,IAAAD,EAAAM,EAAAF,EAAAC,GACAN,GAAAE,EACAD,GAAAI,CAEA5B,IAAAyB,EACAK,GAAAD,EAEAxC,EAAA2C,UACAN,EAAAJ,EAAA,QAGAjC,EAAAM,UAAAP,EAAA,IAAA7jD,EAAAE,GAEA6mB,EAAA2/B,iBAAA3/B,EAAA2/B,kBACA56B,EAAA9iC,UACA8iC,GAEA,QAAA05B,sCAAAmB,GACA,GAAAj7B,GAAAi7B,EAAAj7B,KAAAwkB,EAAAyW,EAAAzW,MAAAuV,EAAAkB,EAAAlB,YAAAC,EAAAiB,EAAAjB,WAAAC,EAAAgB,EAAAhB,YAAA75B,EAAA,GAAAjP,IAAAkP,QAAA52B,EAAAwxD,EAAAxxD,OAAAyxD,EAAAjjD,SAAA0mB,cAAA,UAAAw8B,EAAAD,EAAAzC,WAAA,MAAA2C,EAAAH,EAAA5/B,OAAA6+B,EAAAe,EAAAf,aAAAC,EAAAc,EAAAd,WAgBA,OAfAC,qBAAAc,EAAAlB,EAAAD,EAAAE,GACAmB,EAAA5mD,OAAA0lD,EACAkB,EAAA9mD,MAAA6lD,EACAgB,EAAAzC,UAAAlU,EAAA,KACA/6C,GACAu2B,OACAxrB,OAAA0lD,EACA1V,QACA0W,eACAE,eACA9mD,MAAA6lD,IACajxB,KAAA,WACbkyB,EAAAJ,iBAAAI,EAAAJ,kBACA56B,EAAA9iC,WACa8iC,EAAAI,SACbJ,EAEA,QAAAg6B,qBAAA/+B,EAAA/mB,EAAAE,EAAAylD,GACA,OAAAA,GACA,OACA,OACA,OACA,OACA5+B,EAAA/mB,MAAAE,EACA6mB,EAAA7mB,OAAAF,CACA,MAEA,SACA+mB,EAAA/mB,QACA+mB,EAAA7mB,SAEA,GAAA4jD,GAAA/8B,EAAAo9B,WAAA,KACA,QAAAwB,GACA,OACA7B,EAAAiD,UAAA/mD,EAAA,GACA8jD,EAAAzlB,SAAA,EACA,MAEA,QACAylB,EAAAiD,UAAA/mD,EAAAE,GACA4jD,EAAAkD,OAAA7mD,KAAA8mD,GACA,MAEA,QACAnD,EAAAiD,UAAA,EAAA7mD,GACA4jD,EAAAzlB,MAAA,KACA,MAEA,QACAylB,EAAAkD,OAAA,GAAA7mD,KAAA8mD,IACAnD,EAAAzlB,MAAA,KACA,MAEA,QACAylB,EAAAkD,OAAA,GAAA7mD,KAAA8mD,IACAnD,EAAAiD,UAAA,GAAA7mD,EACA,MAEA,QACA4jD,EAAAkD,OAAA,GAAA7mD,KAAA8mD,IACAnD,EAAAiD,UAAA/mD,GAAAE,GACA4jD,EAAAzlB,SAAA,EACA,MAEA,QACAylB,EAAAkD,WAAA7mD,KAAA8mD,IACAnD,EAAAiD,WAAA/mD,EAAA,IAOA,QAAAknD,cAAAC,EAAAC,GACA,GAAAtxB,GAAAptC,IACAklB,QAAAkN,MAAAqsC,YAAArsC,QACA,WACA,GAAA+oC,GAAA,GAAA1vD,OAAAkzD,EAAAz5C,OAAAy5C,KAAAz5C,OAAAy5C,IAAAC,gBAAA15C,OAAAy5C,IAAAz5C,OAAA25C,WAAA35C,OAAA25C,UAAAD,gBAAA15C,OAAA25C,UAAA,IACA,KAAAF,EACA,KAAAluC,OAAA,uDAEA0qC,GAAA3mD,IAAAmqD,EAAAC,gBAAAH,GACArxB,EAAApK,KAAAy7B,EACAA,EAAAtD,KAGAsD,EAAAnD,cAAAmD,EAAAjD,gBACAiD,EAAAn7B,OAAA,WACA,GAAAw7B,GAAA1xB,EAAA2xB,kBACAD,KACA1xB,EAAA2xB,mBAAA,KACAlkD,WAAA,WACA,OAAApX,GAAA,EAAAygC,EAAA46B,EAAAn7D,OAAmEF,EAAAygC,EAASzgC,IAC5Eq7D,EAAAr7D,MAEyB,KAGzBg7D,EAAAl7B,QAAAm7B,EACA1+D,KAAA++D,uBAEA/+D,KAAAy+D,WAEAD,aAAAluD,UAAA0uD,OAAA,SAAA9+D,EAAAjC,GACAA,OACA,IAAAkR,GAAAi+B,EAAAptC,KAAAi/D,EAAAj/D,KAAAy+D,SAAAnD,aAAA4D,EAAAl/D,KAAAy+D,SAAAjD,cAAAlkD,EAAArZ,EAAAqZ,MAAAE,EAAAvZ,EAAAuZ,OAAA+wC,EAAAtqD,EAAAsqD,SAAAD,EAAArqD,EAAAqqD,UAAA6T,GAAAn8D,KAAAgjC,MAAA,eAAAhjC,KAAAgjC,KAAA5jC,KAAAikB,EAAAnjB,EAAAmjB,QAAAzM,aACA,OAAA5W,MAAA++D,uBACA/+D,MAAA++D,mBAAAl5D,KAAA,WACAunC,EAAA4xB,OAAA9+D,EAAAjC,MAIAqZ,IAAAE,EACAA,EAAA0nD,EAAA5nD,EAAA2nD,GAAA,EACaznD,IAAAF,EACbA,EAAA2nD,EAAAznD,EAAA0nD,GAAA,GAEA5nD,EAAA2nD,EACAznD,EAAA0nD,GAEA3W,GAAAjxC,EAAAixC,IACAjxC,EAAAixC,EACA/wC,EAAA0nD,EAAA5nD,EAAA2nD,GAAA,GAEA3W,GAAA9wC,EAAA8wC,IACA9wC,EAAA8wC,EACAhxC,EAAA2nD,EAAAznD,EAAA0nD,GAAA,GAEA/vD,GACAmI,QACAE,UACa2c,GAAAjlB,KAAAjR,EAAA,SAAAkhE,EAAAC,GACbjwD,EAAAgwD,GAAAC,IAEA,QAAA/7C,GACA,WACA,GAAAg8C,GAAAn/D,EAAAsU,GACA0nD,sBAAA9uB,EAAAqxB,SAAArxB,EAAApK,KAAA7zB,EAAAgtD,GAAAjwB,KAAA,SAAAxN,GACAx+B,EAAAsU,IAAAkqB,EACA2gC,IAAAn/D,EAAAsU,KAAAtU,EAAAojC,cAGa,WAAAjgB,GACb+4C,oBAAAp8D,KAAAy+D,SAAAz+D,KAAAgjC,KAAA9iC,EAAAiP,EAAAgtD,QAEA,kBAAAn8D,MAAAs/D,UACAt/D,KAAAs/D,SAAAp/D,MAGAi0B,GAAAqqC,6BAEArqC,GAAA+1B,eAAA,SAAA1oD,GACA,YACA,SAAA+9D,OAAAhwD,GACA,cAAAA,EAAA8T,QAAAzM,cAEA,QAAA4oD,UAAAjwD,GACA,iBAAAA,EAAA8T,QAAAzM,cAEA,QAAA6oD,sBACA,MAAA9gE,WAAA,GAAA8M,QAAAi0D,YAEA,QAAAC,qBACA,GAAAthC,GAAApjB,SAAA0mB,cAAA,SACA,OAAAtD,GAAAo9B,YAAAp9B,EAAAo9B,WAAA,MAEA,QAAAmE,yBAAAC,GACA,GAAAC,GAAAD,EAAAvsD,MAAA,KAAAnT,EAAA2/D,IAAAn8D,OAAA,GAAA2P,MAAA,QAAA2uC,EAAA9tB,GAAAuT,aAAAvnC,EAEA,QADA8hD,OAAArrC,eAEA,WACA,UACA,kBAEA,WACA,iBAEA,WACA,iBAEA,WACA,iBAEA,YACA,UACA,oBAGA,QAAAmpD,eAAA//C,GACA,GAAAggD,GAAAC,EAAAC,EAAAC,EAAAllD,SAAA0mB,cAAA,IAKA,OAJAw+B,GAAAC,KAAApgD,EACAggD,EAAAG,EAAAE,SACAH,EAAAC,EAAAvxC,KACAqxC,EAAAE,EAAAG,SACAN,EAAAppD,gBAAAsO,OAAAq7C,SAAAF,SAAAzpD,gBAGAqpD,EAAArpD,gBAAAsO,OAAAq7C,SAAAD,SAAA1pD,eAGAspD,IAAAh7C,OAAAq7C,SAAA3xC,OAAAuF,GAAAoQ,MAKA,QAAAi8B,0BAAArF,EAAA/3B,GACA+3B,EAAA73B,OAAA,WACA63B,EAAA73B,OAAA,KACA63B,EAAA53B,QAAA,KACAH,EAAA9iC,QAAA66D,IAEAA,EAAA53B,QAAA,WACA43B,EAAA73B,OAAA,KACA63B,EAAA53B,QAAA,KACA/hC,EAAA,sCACA4hC,EAAAI,QAAA23B,EAAA,+BAGA,QAAAsF,iCAAApiC,EAAA+E,GACA/E,EAAA2/B,gBAAA,WACA56B,EAAA9iC,QAAA+9B,IAGA,QAAAqiC,mCAAAvrB,EAAA/R,GACA,GAAAu9B,GAAApB,MAAApqB,IAAAqqB,SAAArqB,EASA,OARAoqB,OAAApqB,GACAqrB,yBAAArrB,EAAA/R,GACao8B,SAAArqB,GACbsrB,gCAAAtrB,EAAA/R,IAEAA,EAAAI,QAAA2R,GACA3zC,EAAA2yB,GAAAjyB,OAAA,iDAA2DizC,EAAA9xB,SAAA,UAE3Ds9C,EAEA,QAAAC,MAAAp+B,EAAArxB,EAAAlT,GACA,GAAA4iE,GAAA,GAAA1sC,IAAAkP,QAAAsY,EAAA,GAAAxnB,IAAA2sC,SAAAt+B,EAAAhhC,GAAA4zC,EAAAn3C,EAAAm3C,QAAAwU,EAAA,MAAA3rD,EAAA2rD,QAAA3rD,EAAA2rD,OAAAmX,EAAA,WACA5vD,EAAAoyB,QAAA,KACApyB,EAAAmyB,OAAA,KACA9hC,EAAA,4DACAq/D,EAAAr9B,QAAAryB,EAAA,gCAgCA,OA9BAwqC,GAAAqlB,gBAAA90B,KAAA,SAAA5N,GACA,GAAA2iC,IACAj9C,MAAA,WACA,UAAAmQ,IAAAkP,SAAA/iC,YAEiB4gE,EAAAtX,EAAA,GAAAz1B,IAAAgtC,KAAA3+B,EAAAhhC,GAAAy/D,EAAAG,EAAA,GAAAjtC,IAAAqqC,aAAAh8B,EAAAu+B,EACjBL,mCAAAvvD,EAAA0vD,IACAK,EAAAl9C,QAAAkoB,KAAA,SAAAg1B,GACA,GAAAjE,GAAAiE,KAAAG,WACAD,GAAApC,OAAA7tD,GACAo3C,SAAAnT,EACAkT,UAAAlT,EACA6nB,cACA3+B,OACA7xB,OAAAxO,EAAAq3C,wBAEqB,SAAAgsB,GACrB9/D,EAAA2yB,GAAAjyB,OAAA,iEAAwEo/D,IACxEF,EAAApC,OAAA7tD,GACAo3C,SAAAnT,EACAkT,UAAAlT,EACA9W,OACA7xB,OAAAxO,EAAAq3C,0BAIa,WACb9zC,EAAA,mBACAq/D,EAAAr9B,QAAAryB,EAAA,qBAEA0vD,EAEA,QAAAU,0BAAAvhD,EAAAwhD,EAAAZ,EAAAxrB,EAAAE,GACA,GAAAmsB,GAAA,GAAAh2D,OAAAi2D,EAAA,GAAAvtC,IAAAkP,OACAq9B,mCAAAe,EAAAC,GACA3B,cAAA//C,KACAyhD,EAAA/B,YAAA,aAEA+B,EAAAjtD,IAAAwL,EACA0hD,EAAAx1B,KAAA,WACAw0B,kCAAAc,EAAAZ,EACA,IAAAQ,GAAA,GAAAjtC,IAAAqqC,aAAAiD,EACAL,GAAApC,OAAAwC,GACAjZ,SAAAnT,EACAkT,UAAAlT,EACA9W,KAAAshC,wBAAA5/C,GACAvT,OAAA6oC,KAEasrB,EAAAp9B;CAEb,QAAAm+B,gCAAA3hD,EAAAm7C,EAAAyF,EAAAxrB,GACAsrB,kCAAAvF,EAAAyF,GACAzsC,GAAAgnC,GAAA3nD,KACA+0C,SAAAnT,EAAA,KACAkT,UAAAlT,EAAA,OAEA+lB,EAAA3mD,IAAAwL,EAEA,QAAA4hD,aAAA5hD,EAAA7O,EAAAlT,GACA,GAAA2iE,GAAA,GAAAzsC,IAAAkP,QAAAsS,EAAA13C,EAAA03C,MAAAP,EAAAO,EAAA13C,EAAAm3C,QAAA,IAgBA,OAfAO,IAAA4pB,MAAApuD,GACAwuD,oBACAI,cAAA//C,KAAAy/C,qBACAkC,+BAAA3hD,EAAA7O,EAAAyvD,EAAAxrB,GAEAmsB,yBAAAvhD,EAAA7O,EAAAyvD,EAAAxrB,GAGAusB,+BAAA3hD,EAAA7O,EAAAyvD,EAAAxrB,GAEaoqB,SAAAruD,GACbowD,yBAAAvhD,EAAA7O,EAAAyvD,EAAAxrB,GACasrB,kCAAAvvD,EAAAyvD,KACbzvD,EAAAqD,IAAAwL,GAEA4gD,EAEAzsC,GAAAxkB,OAAA3P,MACA41C,SAAA,SAAAisB,EAAA1wD,EAAAlT,GACA,MAAAk2B,IAAAvQ,SAAAi+C,IACArgE,EAAA,4DACAogE,YAAAC,EAAA1wD,EAAAlT,SAEAuD,EAAA,iDACAo/D,KAAAiB,EAAA1wD,EAAAlT,WAIA+B,KAAA8hE,YACA9hE,KAAA8hE,SAAAvC,YACAv/D,KAAA8hE,SAAAtC,kBACAx/D,KAAA8hE,SAAA/B,4BACA//D,KAAA8hE,SAAAlC,iDAEAzrC,GAAAgtC,KAAA,SAAA3+B,EAAAhhC,GACA,YAOA,SAAAugE,mBAAAC,GAEA,IADA,GAAAr8C,GAAA,EAAA6K,EAAA,EACAwxC,EAAAr+D,OAAA,GACAgiB,GAAAytC,SAAA4O,EAAAl1C,UAAA,SAAArV,KAAA+Y,IAAA,EAAAA,GACAwxC,IAAAl1C,UAAA,EAAAk1C,EAAAr+D,QACA6sB,GAAA,CAEA,OAAA7K,GAEA,QAAAs8C,YAAAC,EAAA9+B,GACA,GAAA++B,GAAAD,EAAAE,EAAAh/B,CAkBA,OAjBAzkC,UAAAwjE,IACAA,EAAA,EACAC,EAAA,GAAAjuC,IAAAkP,SAEAlP,GAAA4O,cAAAP,EAAA2/B,EAAA,GAAAj2B,KAAA,SAAA81B,GACA,GAAAK,GAAA7vD,EAAA,cAAA2rB,KAAA6jC,EACAxvD,GACA,MAAAA,EAAA,IACA6vD,EAAAjP,SAAA4O,EAAAl7D,MAAA,SACAm7D,WAAAE,EAAAE,EAAA,EAAAD,IAEAA,EAAA9hE,QAAA6hE,GAGAC,EAAA5+B,QAAA,iCAGA4+B,EAEA,QAAAE,iBACA,GAAAl/B,GAAA,GAAAjP,IAAAkP,OAYA,OAXAlP,IAAA4O,cAAAP,EAAA,KAAA0J,KAAA,SAAA81B,GACA,IAAAA,EAAAtgE,QAAA,QACA0hC,EAAAI,QAAA,qBAEAy+B,aAAA/1B,KAAA,SAAAg2B,GACA9+B,EAAA9iC,QAAA4hE,IACqB,SAAAr+C,GACrBuf,EAAAI,QAAA3f,OAIAuf,EAEA,QAAAm/B,gBAAAC,GACA,GAAAp/B,GAAA,GAAAjP,IAAAkP,OAIA,OAHAlP,IAAA4O,cAAAP,EAAAggC,EAAA,MAAAt2B,KAAA,SAAA81B,GACA5+B,EAAA9iC,QAAA,SAAA0hE,KAEA5+B,EAEA,QAAAq/B,kBAAAD,EAAAE,GACA,GAAAt/B,GAAA,GAAAjP,IAAAkP,OAQA,OAPAlP,IAAA4O,cAAAP,EAAAggC,EAAA,MAAAt2B,KAAA,SAAA81B,GACA,MAAAU,GACAt/B,EAAA9iC,QAAAyhE,kBAAAC,QAEA5+B,GAAA9iC,QAAA8yD,SAAA4O,EAAA,OAGA5+B,EAEA,QAAAu/B,QAAAH,EAAAI,GACA,GAAAV,GAAAM,EAAA,GAAA5/B,EAAA,GAAAggC,CACA,OAAAzuC,IAAA4O,cAAAP,EAAA0/B,EAAAt/B,GAEA,QAAAigC,eAAAC,GAEA,IADA,GAAAloC,MAAAsnC,EAAA,EACAA,EAAA,IAAAY,EAAAn/D,QACAi3B,EAAA/0B,KAAAi9D,EAAAh8D,MAAAo7D,IAAA,KACAA,GAAA,EAEA,OAAAtnC,GAEA,QAAAmoC,cAAAL,EAAAE,GACA,GAAAI,GAAA,GAAAC,EAAA9uC,GAAAxkB,UAAAuzD,GAAAC,IAcA,OAbAhvC,IAAAjlB,KAAA0zD,EAAA,SAAAt6D,EAAAgiD,GACA,GAAA8Y,GAAA//C,EAAAggD,EAAAC,EAAAhZ,EAAAxjD,MAAA,KAAAvF,EAAAmhE,EAAAX,kBAAAuB,GAAAlQ,SAAAkQ,EAAA,IAAAC,EAAAN,EAAAvhE,QAAAH,EAQA,IAPAgiE,GAAA,IACAlgD,EAAAmgD,EAAAjiE,GAAApB,KACAkjE,EAAAG,EAAAjiE,GAAAqhC,MACAwgC,EAAA9Y,EAAAxjD,MAAAk8D,IAAA,EAAAK,GACAF,EAAA9/C,GAAAq/C,EAAAX,kBAAAqB,GAAAhQ,SAAAgQ,EAAA,IACAH,EAAApyB,OAAA0yB,EAAA,IAEA,IAAAN,EAAAt/D,OACA,WAGAw/D,EAhGA,GAAAD,IAAA,KAAAM,GACAC,KACAtjE,KAAA,cACAyiC,MAAA,GA+FAzO,IAAAxkB,OAAA3P,MACAgkB,MAAA,WACA,GAAAxL,GAAA,GAAA2b,IAAAkP,QAAAqgC,EAAA,SAAAx/C,GACA1iB,EAAA2yB,GAAAjyB,OAAA,kCAAgEgiB,IAChE1L,EAAAgrB,QAAAtf,GAgBA,OAdAo+C,iBAAAp2B,KAAA,SAAAy3B,GACAniE,EAAA2yB,GAAAjyB,OAAA,mDAAkFvD,SAAA6jC,EAAAriC,KAAA,OAAAqiC,EAAAriC,OAClFoiE,eAAAoB,GAAAz3B,KAAA,SAAAw2B,GACAlhE,EAAA2yB,GAAAjyB,OAAA,+BAA4DwgE,EAAA,iBAC5DD,iBAAAkB,EAAAjB,GAAAx2B,KAAA,SAAA03B,GACApiE,EAAA2yB,GAAAjyB,OAAA,kCAAmD0hE,IACnDjB,OAAAgB,EAAAC,GAAA13B,KAAA,SAAA42B,GACA,GAAAF,GAAAC,cAAAC,GAAAe,EAAAd,aAAAL,EAAAE,EACAphE,GAAA,sCACAgX,EAAAlY,QAAAujE,IAC6BH,IACJA,IACJA,IACJA,GACjBlrD,KAGAxY,KAAA8hE,YACA9hE,KAAA8hE,SAAAC,qCAEA5tC,GAAA2sC,SAAA,SAAAt+B,EAAAhhC,GACA,YACA,SAAAsiE,gBAAAC,EAAAC,GACA,GAAAC,IAAA,EAAAC,KAAA7uD,OAAA0uD,EAOA,OANA5vC,IAAAjlB,KAAAg1D,EAAA,SAAA57D,EAAA67D,GACA,OAAAH,EAAAtiE,QAAAyiE,GAEA,MADAF,IAAA,GACA,IAGAA,EAEA9vC,GAAAxkB,OAAA3P,MACAghE,cAAA,WACA,GAAA5zB,GAAAptC,KAAA27C,EAAA,GAAAxnB,IAAAkP,QAAA+gC,GAAA,EAAAjkE,EAAAxB,SAAA6jC,EAAAriC,KAAA,OAAAqiC,EAAAriC,IA0BA,OAzBAqB,GAAA2yB,GAAAjyB,OAAA,gEAA4D/B,IAC5DqB,EAAA,oDACAxB,KAAAqkE,qBACA7iE,EAAA,sDACA2yB,GAAA4O,cAAAP,EAAA,KAAA0J,KAAA,SAAA81B,GACA7tC,GAAAjlB,KAAAk+B,EAAAk3B,uBAAA,SAAAhmC,EAAAsE,GACA,GAAAkhC,eAAAlhC,EAAAo/B,GAKA,OAJA,eAAA1jC,GAAAnK,GAAAiU,kBAAAqD,gBACA24B,GAAA,EACAzoB,EAAAr7C,QAAAg+B,KAEA,IAGA98B,EAAA2yB,GAAAjyB,OAAA,iDAAiD/B,EAAAikE,EAAA,WACjDA,GACAzoB,EAAAnY,WAEqB,WACrBhiC,EAAA,+BAAArB,EAAA,gDACAw7C,EAAAnY,aAGAmY,EAAAnY,UAEAmY,GAEA0oB,kBAAA,WACA,GAAAE,GAAA/hC,EAAApjC,KAAAolE,EAAArwC,GAAAzyB,QAAApD,OAAAwyD,KAAA9wD,KAAAskE,wBAAAC,IAAA,EAAAH,GAAA,EAAAjkE,EAAAxB,SAAA6jC,EAAAriC,KAAA,OAAAqiC,EAAAriC,IASA,OARAqkE,KAEAJ,EADA,eAAAG,GACApwC,GAAAiU,kBAAAqD,eAKA24B,GAAA5iE,EAAArB,EAAA,gEACAikE,MAIAjwC,GAAA2sC,SAAAxwD,UAAAg0D,wBACAG,aAAA,SACAC,YAAA,SACAC,YAAA,SACAC,YAAA,OACAC,cAAA,wBAEA1wC,GAAAozB,gBAAA,SAAAvkB,EAAAxhC,GACA,YACA,SAAAsjE,kBAAAC,GACA,GAAAC,IAAA,CAOA,OANA7wC,IAAAjlB,KAAA61D,EAAA,SAAAE,EAAAzmE,GACA,GAAAA,EAAA,EAEA,MADAwmE,IAAA,GACA,IAGAA,EAEA,QAAAE,kBACA,GAAAC,GAAA,GAAAhxC,IAAAkP,OAoBA,OAnBA,IAAAlP,IAAA2sC,SAAA99B,EAAAxhC,GAAAw/D,gBAAA90B,KAAA,WACA,GAAAsb,GAAA,GAAA/7C,OAAAuU,EAAAkF,OAAAy5C,KAAAz5C,OAAAy5C,IAAAC,gBAAA15C,OAAAy5C,IAAAz5C,OAAA25C,WAAA35C,OAAA25C,UAAAD,gBAAA15C,OAAA25C,UAAA,IACA7+C,IACAwnC,EAAAjkB,QAAA,WACA/hC,EAAA,qEACA2jE,EAAA3hC,WAEAgkB,EAAAlkB,OAAA,WACA6hC,EAAA7kE,SACAgX,MAAAtX,KAAAsX,MACAE,OAAAxX,KAAAwX,UAGAgwC,EAAAhzC,IAAAwL,EAAA4+C,gBAAA57B,KAEAxhC,EAAA,wEACA2jE,EAAA3hC,YAEa2hC,EAAA3hC,SACb2hC,EAEA,QAAAC,iBAAAL,EAAAM,GACA,GAAAC,EAqBA,OApBAnxC,IAAAjlB,KAAA61D,EAAA,SAAAQ,EAAAC,GACA,GAAAA,EAAA,GACA,GAAAC,GAAA,0BAAAtnC,KAAAonC,GAAAG,EAAAD,EAAA,GAAA74C,OAAA,GAAAhW,cAAA6uD,EAAA,GAAA3+D,MAAA,GAAA6+D,EAAAN,EAAAK,EACA,QAAAD,EAAA,IACA,UACA,GAAAE,EAAAH,EAEA,MADAF,GAAAC,GACA,CAEA,MAEA,WACA,GAAAI,EAAAH,EAEA,MADAF,GAAAC,GACA,MAMAD,EAEAtlE,KAAAuiB,SAAA,SAAAwiD,GACA,GAAAa,GAAA,GAAAzxC,IAAAkP,OAcA,OAbA7hC,GAAA,iCACAsjE,iBAAAC,GACAG,iBAAAh5B,KAAA,SAAAm5B,GACA,GAAAC,GAAAF,gBAAAL,EAAAM,EACAC,GACAM,EAAApiC,QAAA8hC,GAEAM,EAAAtlE,WAEiBslE,EAAAtlE,SAEjBslE,EAAAtlE,UAEAslE,IAGAzxC,GAAAsyB,QAAA,SAAA3W,GACA,YAUA,SAAA+1B,qBAAAliD,GACA,QAAAwQ,GAAA3wB,QAAAmgB,QAGA1lB,GAAAuD,IAAA,6CAEA,QAAAskE,iBAAAC,EAAAzlE,EAAA26C,EAAA7X,GACA,GAAA4iC,IAAA,CACA1lE,MAAAulE,oBAAAE,GACAzlE,GACA6zB,GAAAjlB,KAAA62D,EAAA,SAAAz9D,EAAAwmD,GACA,SAAAA,EAAA7f,KACA+2B,GAAA,EACA/nE,EAAAuD,IAAA2yB,GAAAjyB,OAAA,oEAAuEoG,GAAA,aAClD,UAAAwmD,EAAA3uD,KACrB6lE,GAAA,EACA/nE,EAAAuD,IAAA2yB,GAAAjyB,OAAA,oEAAuEoG,GAAA,aAEvE,KAEA,MADArK,GAAA0oD,cAAAmI,IACA,EACyB,MAAA7sC,GACzB+jD,GAAA,EACA/nE,EAAAuD,IAAAygB,EAAAiC,QAAA,SAGA,WAGAkf,EAAA9iC,IAAA0lE,EAAA,qBAAAD,EAAA9qB,GAtCA,GAAAh9C,IACAm3B,SAAA,KACA3N,UACAizB,iBACAG,QACA8L,cAAA,SAAA9M,KACAr4C,IAAA,SAAA0iB,EAAA0b,KAEAzL,IAAAxkB,OAAA1R,EAAA6xC,GAAA,GAgCA9vC,KAAA4mD,QAAA,WACA,GAAAqf,GAAA,GAAA9xC,IAAAkP,QAAA6iC,EAAA,SAAAviD,EAAArjB,EAAA26C,GACA6qB,gBAAAniD,EAAArjB,EAAA26C,EAAAgrB,IACaE,EAAAhyC,GAAAxkB,UAAiC1R,GAAAg9D,EAAA,GAAA9mC,IAAAiyC,qBAAAjyC,GAAAxkB,OAAAw2D,GAC9C1vC,WAAAyvC,IAGA,OADAjL,GAAAoL,cACAJ,IAGA9xC,GAAAiyC,qBAAA,SAAAt2B,GACA,YAaA,SAAArZ,YAAAl1B,EAAA05C,EAAAC,GACA,GAAAv3B,GAAA,IACA,UAAAs3B,EAAAtjB,aACA,IACAhU,EAAAwQ,GAAAoT,UAAA0T,EAAAtjB,cACiB,MAAA1V,GACjBhkB,EAAAuD,IAAA,qCAAAygB,EAAAiC,QAAA,SACAg3B,GAAA,EAGAj9C,EAAAw4B,WAAA9S,GAAAu3B,EAAAD,GAtBA,GAAAggB,GAAAh9D,GACAm3B,SAAA,KACAslB,iBACAjzB,UACAozB,MACA+H,UAAA,EACA4G,iBAAA,GAEA/yB,WAAA,SAAA9S,EAAArjB,EAAA26C,KACAz5C,IAAA,SAAAwlB,EAAA4Y,KAEAzL,IAAAxkB,OAAA1R,EAAA6xC,GAaAmrB,EAAA9mC,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAo2B,eACA4C,aAAA,mBACAM,cAAA,OACA9mC,OAAA,MACAi0B,eACA3f,IAAA,WACA,MAAAh9B,GAAAm3B,WAGAslB,cAAAz8C,EAAAy8C,cACAl5C,IAAAvD,EAAAuD,IACAi1B,sBACAokB,KAAA58C,EAAA48C,QAEA1mB,GAAAxkB,OAAA3P,MACAqmE,YAAA,WACA,GAAA5+C,GAAA0M,GAAAxkB,UAAyC1R,EAAAwpB,OACzCxpB,GAAAuD,IAAA,0BACAy5D,EAAAlN,cAAA,kBAAAI,WAAA1mC,GAAAgnC,kBAAAhC,WAIAt4B,GAAAkkB,OAAA,SAAAvI,EAAAtuC,GACA,YACA,IAAA8zC,GAAAxF,EAAA4Z,cAAA4c,EAAAx2B,EAAA6Z,aAAAC,EAAA9Z,EAAA8Z,OAAAC,EAAA/Z,EAAA+Z,YAAAC,EAAAha,EAAAga,eAAA,IAAAyc,EAAAz2B,EAAAia,YAAAC,EAAAla,EAAAka,YAAAC,EAAAjqD,KAAAwmE,gBAAA12B,EAAAma,MACA91B,IAAAxkB,OAAA3P,MACA01B,QAAAvB,GAAAiU,kBAAAoD,SAAAye,EAAAtmD,OAAA,EACA8iE,eAAA,SAAAC,EAAAC,EAAAC,GACA,GAAAx5B,GAAAptC,KAAA6mE,KAAAC,EAAAF,EAAA5jC,KAAA4jC,EAAA5jC,KAAA4jC,EAAAjrB,EAAA,GAAAxnB,IAAA2sC,SAAAgG,EAAAtlE,EAyCA,OAxCAm6C,GAAA0oB,qBACAlwC,GAAAjlB,KAAA+6C,EAAA,SAAA3hD,EAAAy+D,GACA,GAAAC,GAAA55B,EAAA65B,sBACApd,cACAqd,cAAAH,EAAA3nE,KACA+nE,QAAAL,EAAA1nE,MAEAynE,GAAAhhE,MACAopC,KAAA9a,GAAAgQ,cACAhkC,KAAAitC,EAAAg6B,SAAAT,GACAxmE,KAAA4mE,EAAA5mE,KACAf,KAAA4nE,EACAG,QAAAL,EAAA1nE,OAEA4jC,KAAA,GAAA7O,IAAAwY,UAAAm6B,EAAA3yC,GAAAtxB,KAAAuqC,EAAAi6B,qBAAAj6B,GACAkI,uBACAF,QAAA2xB,EAAA3xB,QACAwU,SACAxqD,KAAA4nE,EACAzoC,QAAAurB,EACAwd,WAAAf,EACAvc,cACAxoD,aAIAqlE,EAAAhhE,MACAopC,KAAAy3B,EACAvmE,KAAAwmE,EACAj7C,KAAAo7C,EAAAp7C,KACAsX,KAAAsjC,EAAAQ,EAAA,QAGAD,EAAAhhE,MACAopC,KAAAy3B,EACAvmE,KAAAwmE,EACAj7C,KAAAo7C,EAAAp7C,KACAsX,KAAA8jC,IAGAD,GAEAzc,cAAA,SAAA/sC,EAAAld,EAAA8uC,EAAAvjB,EAAAq2B,EAAA9R,EAAAwK,EAAA8sB,GACA,GAAAn6B,GAAAptC,KAAAwnE,GAAAnqD,EAAA88B,YAAA98B,EAAA2lB,MAAA3lB,EAAA2lB,KAAAmX,eAAAstB,EAAA,KAAA5lB,EAAA0lB,EAAA1lB,iBAAA1N,EAAAozB,EAAApzB,WAAAwG,EAAA4sB,EAAA5sB,YAAAzK,EAAA/b,GAAAgQ,aACAhQ,IAAAjlB,KAAAk+B,EAAAq5B,eAAAx3B,EAAA9uC,EAAAkd,GAAA,SAAA/U,EAAAkoC,GACA,GAAAjvC,GAAAmmE,EAAAl3B,EAAA9kB,IACA8kB,GAAAxN,eAAA7O,IAAAwY,YACA+6B,MAEAnmE,EAAA4yC,EAAAtE,SACAZ,KAAAuB,EAAAvB,KACA9uC,KAAAqwC,EAAArwC,KACAurB,KAAAg8C,EACAz3B,UACAC,iBAEAM,EAAAxN,eAAA7O,IAAAwY,UACA66B,EAAA3hE,KAAAtE,GAEAkmE,EAAAlmE,EAEAivC,EAAAxN,MACA6e,EAAAtgD,EAAAivC,EAAAxN,MACA+e,EAAAl8C,MACAtE,KACA8b,KAAAmzB,EAAAxN,QAGAmR,EAAA1D,UAAAlvC,EAAA4yB,GAAAib,OAAAuC,YAGA,OAAA81B,IACAtzC,GAAAjlB,KAAAs4D,EAAA,SAAAl/D,EAAAq/D,GACA,GAAAlgD,IACAmgD,aAAAzzB,EAAA9D,UACA9uC,GAAAkmE,IAC6Bx4B,KAC7B44B,aAAA1zB,EAAA9D,UACA9uC,GAAAkmE,IAC6B/7C,KAE7BjE,GAAAgzB,GAAAtG,EAAA9D,UACA9uC,GAAAomE,IACyB14B,KACzBkF,EAAA9C,YAAAs2B,EAAAF,GACA9sB,EAAA6B,YAAAmrB,EAAAlgD,KAEA+/C,EAAA7jE,SACA,WACA,GAAAgd,KACAA,GAAA85B,GAAAtG,EAAA9D,UACA9uC,GAAAkmE,IAC6Bx4B,KAC7B0L,EAAA6B,YAAAirB,EAAA9mD,WAOAwT,GAAAxkB,OAAAwkB,GAAAkkB,OAAA/nC,WACA6nC,WAAA,SAAA52C,EAAA62C,EAAAmvB,GACA,YACA,KAAApzC,GAAAiU,kBAAAoD,QACA,SAAArX,IAAA1D,MAAA,4CAEA,IAAAq3C,GAAA,GAAA3zC,IAAAkP,QAAA7hC,EAAA+lE,EAAA/lE,IAAA6b,EAAAkqD,EAAArwC,QAAA31B,GAAA4yC,EAAAozB,EAAApzB,WAAA9D,UACA9uC,OACapB,EAAAg0C,KAAAh0C,KAAA8uC,EAAAkF,KAAAlF,KAAA84B,GACbre,cAAAtR,EAAAsR,cACAC,cAAA,EACAC,OAAAxR,EAAAwR,OACAC,YAAAzR,EAAAh5C,MAAA,KACA0qD,eAAA1R,EAAA7Z,QACAgoC,kBAAA,kBACAtc,QACA9pD,KAAA,GACAi1C,QAAAgD,EAAAhD,WAEa4yB,EAAA,GAAA7zC,IAAAkkB,OAAA0vB,EAAAvmE,EAeb,OAdA2yB,IAAAkkB,QAAAlkB,GAAAiU,kBAAA8C,eAAA7tB,EAIA8W,GAAAtxB,KAAA,WACA,GAAA2tC,GAAAw3B,EAAAvB,eAAAx3B,EAAA9uC,EAAAkd,GAAA,EACAmzB,MAAAxN,eAAA7O,IAAAwY,UACA6D,EAAAxN,KAAA8J,SAAAZ,KAAA47B,EAAAxnE,QAAAwnE,EAAAtkC,UAEAhiC,EAAAD,EAAA,qCACAumE,EAAAtkC,YAEiBxjC,SAXjB8nE,EAAAtkC,UACAhiC,EAAA,iDAAAD,EAAA,iGAYAumE,GAEAb,qBAAA,SAAAn3B,GACA,YACA,IAAAo3B,GAAAp3B,EAAAo3B,cAAArd,EAAA/Z,EAAA+Z,YAAAoe,EAAAn4B,EAAAq3B,OACA,OAAAtd,IAAAqd,EAMAA,GAGA/yC,GAAAzyB,QAAApD,OAAAwyD,KAAA38B,GAAA2sC,SAAAxwD,UAAAg0D,wBAAA4C,IAAA,EACA,eAAAA,EACA/yC,GAAAiU,kBAAAqD,aAAAy7B,EAAArd,EAEAqd,EANArd,EANA,eAAAoe,EACA,YAEAA,GAaAb,SAAA,SAAAp3B,EAAAk4B,GACA,YACA,IAAAC,GAAAn4B,EAAA9jB,YAAA,KAAAk8C,EAAAF,EAAA9oE,MAAA,YAAA6oE,EAAAC,EAAAf,QAAAkB,EAAA,GAAAC,EAAAn0C,GAAAuT,aAAAsI,GAAAu4B,EAAA,EAaA,OAZAL,GAAA/nE,MAAA+nE,EAAA/nE,KAAAuW,OAAA/S,SACA4kE,EAAA,KAAAL,EAAA/nE,KAAA,KAEAgoE,GAAA,GACAE,EAAAr4B,EAAAl2B,OAAA,EAAAquD,GACAF,IAAAG,IACAE,EAAAF,EAAA90D,MAAA,SAEA+0D,GAAAE,EAAA,IAAAD,GAEAD,EAAAr4B,EAAAu4B,EAEAF,GAEA7B,gBAAA,SAAAvc,GACA,YAEA,OADAA,GAAA91B,GAAAxkB,UAAAs6C,GACAA,EAAAp0C,KAAA,SAAAC,EAAAC,GACA,MAAAD,GAAAs/B,QAAAr/B,EAAAq/B,QACA,EAEAt/B,EAAAs/B,QAAAr/B,EAAAq/B,WAGA,KAGAiyB,qBAAA,SAAAv3B,EAAA04B,GACA,YACA,IAAAp7B,GAAAptC,KAAAs1C,EAAAxF,EAAAwF,qBAAA9zC,EAAAsuC,EAAAtuC,IAAA4zC,EAAAtF,EAAAsF,QAAAwU,EAAA9Z,EAAA8Z,OAAAxqD,EAAA0wC,EAAA1wC,KAAAm/B,EAAAuR,EAAAvR,QAAA+oC,EAAAx3B,EAAAw3B,WAAAtd,EAAAla,EAAAka,aAAA,eAAAwe,EAAAppE,MAAA,eAAAA,EAAA0oE,EAAA,GAAA3zC,IAAAkP,QAAAolC,EAAA,GAAAt0C,IAAA+1B,eAAA1oD,GAAA68B,EAAApjB,SAAA0mB,cAAA,SA2BA,OA1BAngC,GAAA,6CAAAgnE,EAAAroE,MACAsoE,EAAA7yB,SAAA4yB,EAAAnqC,GACA+W,UACAwU,SACAtU,yBACapJ,KAAA,WACb,GAAAw8B,GAAArqC,EAAAI,UAAAr/B,EAAAm/B,GAAAoqC,EAAA,WACAnnE,EAAA,yCAAAgnE,EAAAroE,KACA,IAAA6iC,GAAA7O,GAAAqK,cAAAkqC,EACAZ,GAAAxnE,QAAA0iC,GAEAgnB,GACA5c,EAAAw7B,kBAAAJ,EAAAE,EAAAlnE,GAAA0qC,KAAA,SAAA28B,GACAH,EAAAG,EACAF,KACqB,WACrBnnE,EAAA,iGACAmnE,MAGAA,KAEa,WACbnnE,EAAA,iDAAAgnE,EAAAroE,KAAA,SACA2nE,EAAAtkC,QAAA8jC,KAEAQ,GAEAc,kBAAA,SAAAE,EAAAJ,EAAAlnE,GACA,YACA,IAAAunE,GAAA,GAAA72C,YAAA82C,EAAA,GAAA70C,IAAAkP,QAAA4lC,EAAA,EAUA,OATAF,GAAAzlC,OAAA,WACA2lC,EAAAF,EAAApjD,OACAqjD,EAAA1oE,QAAA6zB,GAAA+0C,aAAAnL,QAAAkL,EAAAP,KAEAK,EAAAxlC,QAAA,WACA/hC,EAAA,mBAAAsnE,EAAA3oE,KAAA,oEACA6oE,EAAAxlC,WAEAulC,EAAAI,cAAAL,GACAE,GAEAI,eAAA,SAAA1qC,GACA,YACA,IAAAE,GAAAE,EAAAH,EAAAE,CAYA,OAVAD,GADAF,EAAAprB,MAAA,QAAA5R,QAAA,aACA49B,KAAAZ,EAAAprB,MAAA,SAEAisB,UAAAb,EAAAprB,MAAA,SAEAwrB,EAAAJ,EAAAprB,MAAA,QAAAA,MAAA,QAAAA,MAAA,KAAqE,GACrEqrB,EAAA,GAAAa,aAAAZ,EAAAj7B,QACAk7B,EAAA,GAAAY,YAAAd,GACAxK,GAAAjlB,KAAA0vB,EAAA,SAAAt2B,EAAAo3B,GACAb,EAAAv2B,GAAAo3B,EAAAC,WAAA,KAEA3/B,KAAAqpE,YAAA1qC,EAAAG,IAEAuqC,YAAA,SAAAjpE,EAAAk+B,GACA,YACA,IAAAU,GAAA9Z,OAAA8Z,aAAA9Z,OAAA+Z,mBAAA/Z,OAAAga,gBAAAha,OAAAia,cAAAC,EAAAJ,GAAA,GAAAA,EACA,OAAAI,IACAA,EAAAnsB,OAAA7S,GACAg/B,EAAAC,QAAAf,IAEA,GAAAlM,OAAAhyB,IACAhB,KAAAk/B,OAKAnK,GAAA+0C,aAAA,WACA,GAAAA,KAmGA,OAlGAA,GAAAI,QAAA,oEACAJ,EAAAK,SAAA,SAAA7nC,GACA,GAAA8nC,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,GAAAC,EAAA,GAAAC,EAAA,GAAAtmE,EAAA,CACA,GACA+lE,GAAA9nC,EAAAj+B,KACAgmE,EAAA/nC,EAAAj+B,KACAqmE,EAAApoC,EAAAj+B,KACAimE,EAAAF,GAAA,EACAG,GAAA,EAAAH,IAAA,EAAAC,GAAA,EACAG,GAAA,GAAAH,IAAA,EAAAK,GAAA,EACAC,EAAA,GAAAD,EACAx6C,MAAAm6C,GACAG,EAAAG,EAAA,GACiBz6C,MAAAw6C,KACjBC,EAAA,IAEAF,IAAA7pE,KAAAspE,QAAA18C,OAAA88C,GAAA1pE,KAAAspE,QAAA18C,OAAA+8C,GAAA3pE,KAAAspE,QAAA18C,OAAAg9C,GAAA5pE,KAAAspE,QAAA18C,OAAAm9C,GACAP,EAAAC,EAAAK,EAAA,GACAJ,EAAAC,EAAAC,EAAAG,EAAA,SACatmE,EAAAi+B,EAAA/9B,OACb,OAAAkmE,IAEAX,EAAAnL,QAAA,SAAAiM,EAAAC,GACA,GAAAC,GAAA,yBACA,KAAAF,EAAAx3D,MAAA03D,GACA,MAAAD,EAEA,IAAAE,GAAAnqE,KAAAoqE,SAAAJ,EAAA/iD,QAAAijD,EAAA,KACAG,EAAArqE,KAAAsqE,eAAAH,GACA3iB,EAAAxnD,KAAAuqE,iBAAAN,EAAAI,EACA,OAAAH,GAAAlqE,KAAAupE,SAAA/hB,IAEA0hB,EAAAqB,iBAAA,SAAAN,EAAAI,GACA,GAAAG,GAAAxqE,KAAAyqE,aAAAJ,GAAAK,EAAA1qE,KAAA2qE,WAAAV,EAAAO,GAAAI,EAAA,GAAAnrC,YAAAirC,EACA,OAAAE,IAEA1B,EAAAuB,aAAA,SAAAJ,GAEA,OADAQ,GACAC,EAAA,EAA2BA,EAAAT,EAAA1mE,OAAqBmnE,IAEhD,GADAD,EAAAR,EAAAS,GACA,KAAAD,EAAA,QAAAA,EAAA,GACA,MAAAA,EAGA,WAEA3B,EAAAyB,WAAA,SAAAV,EAAAO,GACA,GAAAO,GAAAd,EAAAhjD,QAAA,0BAAuE,IAAA+jD,EAAAhrE,KAAAoqE,SAAAW,GAAAE,EAAAD,EAAAtpE,QAAA,OAAAwpE,EAAAF,EAAAlkE,MAAA,EAAAmkE,GAAAE,EAAAH,EAAAlkE,MAAAmkE,GAAAG,EAAAF,CAGvE,OAFAE,KAAA/1D,OAAAm1D,GACAY,IAAA/1D,OAAA81D,IAGAjC,EAAAoB,eAAA,SAAAe,GAEA,IADA,GAAAC,GAAA,EAAAjB,OACA,CACA,QAAAgB,EAAAC,GAAA,KAAAD,EAAAC,EAAA,GACA,KAEA,SAAAD,EAAAC,GAAA,KAAAD,EAAAC,EAAA,GACAA,GAAA,MACiB,CACjB,GAAA3nE,GAAA,IAAA0nE,EAAAC,EAAA,GAAAD,EAAAC,EAAA,GAAAC,EAAAD,EAAA3nE,EAAA,EAAAknE,EAAAQ,EAAAvkE,MAAAwkE,EAAAC,EACAlB,GAAAxkE,KAAAglE,GACAS,EAAAC,EAEA,GAAAD,EAAAD,EAAA1nE,OACA,MAGA,MAAA0mE,IAEAnB,EAAAkB,SAAA,SAAA1oC,GACA,GAAA8nC,GAAAC,EAAAC,EAAAC,EAAAC,EAAAE,EAAA,GAAAC,EAAA,GAAAtmE,EAAA,EAAAunE,KACAQ,EAAA,qBACA,IAAAA,EAAArtC,KAAAuD,GACA,SAAAjR,OAAA,uHAEAiR,KAAAza,QAAA,yBACA,GACAyiD,GAAA1pE,KAAAspE,QAAA5nE,QAAAggC,EAAA9U,OAAAnpB,MACAkmE,EAAA3pE,KAAAspE,QAAA5nE,QAAAggC,EAAA9U,OAAAnpB,MACAmmE,EAAA5pE,KAAAspE,QAAA5nE,QAAAggC,EAAA9U,OAAAnpB,MACAsmE,EAAA/pE,KAAAspE,QAAA5nE,QAAAggC,EAAA9U,OAAAnpB,MACA+lE,EAAAE,GAAA,EAAAC,GAAA,EACAF,GAAA,GAAAE,IAAA,EAAAC,GAAA,EACAE,GAAA,EAAAF,IAAA,EAAAG,EACAiB,EAAAnlE,KAAA2jE,GACA,IAAAI,GACAoB,EAAAnlE,KAAA4jE,GAEA,IAAAM,GACAiB,EAAAnlE,KAAAikE,GAEAN,EAAAC,EAAAK,EAAA,GACAJ,EAAAC,EAAAC,EAAAG,EAAA,SACatmE,EAAAi+B,EAAA/9B,OACb,OAAAqnE,IAEA9B,KAEA/0C,GAAAk2B,cAAA,SAAAr9C,EAAAypC,GACA,YACA,IAAAg1B,MAAgCC,EAAA,EAAAC,EAAA,EAAAC,KAAAC,KAAAC,EAAA,SAAAhuB,EAAAxmB,GAChCwmB,IAAA8tB,GAAAt0C,IAAAu0C,GACA7+D,EAAA8wC,EAAAxmB,GAEAs0C,EAAA9tB,EACA+tB,EAAAv0C,GACSy0C,EAAA,SAAAtnB,EAAAunB,GACT,GAAAC,IAAA,CAOA,OANA93C,IAAAjlB,KAAAu1C,EAAA,SAAAn8C,EAAA4jE,GACA,GAAA/3C,GAAAzyB,QAAAsqE,EAAAE,IAAA,EAEA,MADAD,IAAA,GACA,IAGAA,GACShuB,EAAA,SAAA18C,GACT4qE,EAAA5qE,eACAkqE,GAAAlqE,IACSmjD,EAAA,SAAAF,EAAAC,EAAAunB,IACT,IAAAvnB,EAAA9gD,QAAAooE,EAAAtnB,EAAAunB,MACAF,EAAAH,KACA3rE,KAAAgqB,UAESoiD,EAAA,SAAA7qE,GACT,GAAAmqB,GAAA+qB,EAAAl1C,EACAmqB,GAAA,IACAygD,EAAA5qE,EAAA,EAAAmqB,GACA+/C,EAAAlqE,IACAu8C,OAAA,EACAxmB,MAAA5L,KAGSygD,EAAA,SAAA5qE,EAAA8qE,EAAAC,GACT,GAAAC,GAAAd,EAAAlqE,GAAAkqE,EAAAlqE,GAAAu8C,OAAA,EAAA0uB,EAAAf,EAAAlqE,GAAAkqE,EAAAlqE,GAAA+1B,MAAA,CACA+0C,SAAAC,QACAZ,GAAAa,EACAZ,GAAAa,IAEAH,IACAX,GAAAW,EAAAE,GAEAD,IACAX,GAAAW,EAAAE,IAGAV,EAAAJ,EAAAC,GAEAx3C,IAAAxkB,OAAA3P,MACA0kD,gBACAtU,eAAA,SAAA7uC,EAAAovC,EAAAD,GACAA,IAAAvc,GAAAib,OAAAyC,UAAAnB,IAAAvc,GAAAib,OAAAuC,SACAsM,EAAA18C,GACiBmvC,IAAAvc,GAAAib,OAAAW,YACjBq8B,EAAA7qE,IAGA4jD,qBAAA,SAAA5jD,EAAAu8C,EAAAxmB,GACA60C,EAAA5qE,EAAAu8C,EAAAxmB,GACAm0C,EAAAlqE,IACAu8C,SACAxmB,UAGAyvB,UAAA,SAAAxlD,GACA6qE,EAAA7qE,IAEAyoB,MAAA,WACAyhD,KACAC,EAAA,EACAC,EAAA,MAIAx3C,GAAAinB,aAAA,SAAApO,GACA,YASA,SAAAy/B,SAAAt+D,GACA,MAAAA,GAAA/O,MAAA,IAAA+O,EAAA/O,KAAAsC,QAAA,UAEA,QAAAgrE,wBACAC,EAAAx4C,GAAAl2B,EAAAo9C,eAAAhf,OAAA,iBAAA/W,GACA,GAAAsnD,GAAAtnD,EAAAsnD,aACAA,IACAz4C,GAAAjlB,KAAA09D,EAAAl/D,MAAA,SAAApF,EAAA6F,GACA,GAAAs+D,QAAAt+D,GAAA,CACA,GAAA60B,GAAA70B,EAAA0+D,WACA5uE,GAAAq2B,UAAAinB,cAAAvY,QAMA,QAAA8pC,0BACAH,GACAA,IA1BA,GAAA1uE,GAAA0uE,CACA1uE,IACAo9C,cAAA,KACA/mB,WACA9yB,IAAA,SAAA0iB,EAAA0b,KACA2b,cAAA,SAAAvY,OAwBA7O,GAAAxkB,OAAA1R,EAAA+uC,GACA0/B,uBACAv4C,GAAAxkB,OAAA3P,MACAgqB,MAAA,WACA8iD,6BAIA34C,GAAAmuB,YAAA,SAAArkD,EAAA8uE,EAAAvrE,GACA,YAaA,SAAAwrE,sBAAAC,GACAA,EAAA19C,aAAA,YACA6d,EAAAsV,YAAAuqB,EAAA19C,aAAA,WAGA,QAAA29C,cAAAD,EAAAE,GACA,QAAAF,EAAAG,gBAAAH,EAAAG,mBACA5rE,EAAA,sEACA2rE,MAKA,QAAAE,qBAAAJ,GACA,GAAAE,GAAAF,EAAAK,MACAn5C,IAAA84C,GAAA5wC,OAAA,kBAAA/W,GACAA,KAAAJ,OAAAI,MACAA,EAAAhR,eACAgR,EAAAhR,iBAEAgR,EAAAygB,aAAA,EAEAmnC,aAAAD,EAAAE,IAAAJ,MAEAE,EAAAK,OAAA,WACAJ,aAAAD,EAAAE,IAAAJ,KAGA,QAAAQ,iBAAAN,GAWA,MAVAA,KACA94C,GAAAvQ,SAAAqpD,KACAA,EAAAhyD,SAAA2F,eAAAqsD,IAEAA,IACAzrE,EAAA,8BACAwrE,qBAAAC,GACAxjB,GAAA4jB,oBAAAJ,KAGAA,EAnDA,GAAA7/B,GAAAptC,KAAAypD,EAAAxrD,EAAAwrD,gBAAAwjB,EAAAhvE,EAAA+Q,QAAA2kB,EAAA11B,EAAA01B,UACAQ,IAAAxkB,OAAA3P,MACA0iD,YAAA,KACAD,cAAA9uB,EACA4uB,gBAAA,EACAC,sBAAA,WACA,aAAAyqB,EACA,KAEA7/B,EAAAogC,UAAAP,MA4CAA,EAAAM,gBAAAN,GACAjtE,KAAAuiD,iBAAA0qB,GAEA94C,GAAAxkB,OAAAwkB,GAAAmuB,YAAAhyC,WACAk9D,UAAA,SAAAprD,GACA,YACA,IAAA/jB,MAAwBovE,EAAA,SAAAruE,GACxB,GAAAsuE,IAAA,kCACA,OAAAv5C,IAAAzyB,QAAAgsE,EAAAtuE,EAAAwX,eAAA,GACa+2D,EAAA,SAAAvuE,GACb,MAAA+0B,IAAAzyB,SAAA,oBAAAtC,EAAAwX,gBAAA,GACag3D,EAAA,SAAAr+D,GACb,SAAAo+D,EAAAp+D,EAAAnQ,OAAAmQ,EAAAlG,UAGAkG,EAAAi5B,UAAA,WAAAj5B,EAAAnQ,KAAAwX,eACai3D,EAAA,SAAAh6D,GACb,GAAArV,GAAA,IAOA,OANA21B,IAAAjlB,KAAAilB,GAAAtgB,GAAA0pB,WAAA,SAAAj1B,EAAAk1B,GACA,cAAAA,EAAAna,QAAAzM,eAAA4mB,EAAAx4B,SAEA,MADAxG,GAAAg/B,EAAAh/B,OACA,IAGAA,EAYA,OAVA21B,IAAAjlB,KAAAkT,EAAAc,SAAA,SAAA5a,EAAAiH,GACA,IAAA4kB,GAAA8M,QAAA1xB,GAAA,iBAAAA,EAAA8T,QAAAzM,gBAAA62D,EAAAl+D,EAAAnQ,OAAAwuE,EAAAr+D,IAEiB,cAAAA,EAAA8T,QAAAzM,gBAAAg3D,EAAAr+D,GAAA,CACjB,GAAA/Q,GAAAqvE,EAAAt+D,EACA,QAAA/Q,IACAH,EAAAkR,EAAApP,MAAA3B,QAJAH,GAAAkR,EAAApP,MAAAoP,EAAA/Q,QAQAH,KAGA81B,GAAA2/B,YAAA3/B,GAAA2/B,gBACA3/B,GAAA2/B,YAAA2B,kBAAA,SAAAx3D,EAAAyV,GACA,YAEA,SAAAo6D,sBAAAvsE,EAAAw0D,GACA,GAAApyC,GAAAoqD,EAAAC,CACA,KACAD,EAAAhY,EAAAc,iBAAAd,EAAAkY,cAAAhzD,SACA+yD,EAAAD,EAAA3X,KAAAlwB,UACA1kC,EAAA,yCACAA,EAAA,eAAAwsE,GACAA,KAAAx7D,MAAA,YACAw7D,EAAAD,EAAA3X,KAAA34B,sBAAA1mB,WAEA4M,EAAAjT,EAAA8lD,mBAAAwX,GACa,MAAAnqD,GACbriB,EAAA,wDAAAqiB,EAAAK,QAAA,aACAP,GACArjB,SAAA,GAGA,MAAAqjB,GAEA,QAAAuqD,YAAA3sE,EAAAw0D,GACA,GAAAtuC,GAAAxpB,EAAA08C,YAAA1f,IAAA15B,GAAAolB,EAAA,QAAA1oB,EAAA0oB,OAAA/P,cAAA,aAAAwe,EAAAn3B,EAAA28C,cAAA3f,IAAA15B,GAAApB,EAAAk0C,EAAA9yC,EAGA,OAFAkmB,GAAAxpB,EAAAq3B,UAAA0hB,EAAAz1C,GACAkmB,EAAAxpB,EAAAu3B,eAAAr1B,EACAuQ,EAAAqmD,oBACApwC,SACAyO,WACA3N,SACA2gC,aAAAnqD,EAAAmqD,aACA4O,WAAAjB,EAAA51D,OA7BA,GAAAuQ,GAAA1Q,KAAAq0C,EAAA3gC,EAAA2gC,QAAA2C,EAAAtjC,EAAAsjC,QAAAx1C,EAAAkS,EAAAlS,GAgCAxB,MAAAwzD,WAAA,SAAAjyD,GACA,GAAA6gB,GAAAsf,EAAAhxB,EAAA29B,SAAA9sC,GAAAw0D,EAAArlD,EAAAomD,cAAAv1D,GAAA6hC,EAAA,GAAAjP,IAAAkP,OAmBA,OAlBAjhB,GAAA8rD,WAAA3sE,EAAAw0D,GACA3zC,EAAAklB,YAAA5F,GACAhxB,EAAAimD,iBAAAZ,EAAA,SAAAoY,GACA3sE,EAAA,gBACA,IAAAmiB,GAAAwqD,IAAAL,qBAAAvsE,EAAAw0D,EACArlD,GAAA+lD,iBAAAl1D,GACAtD,EAAA48C,KAAA+H,UACAzuB,GAAA4hC,GAAA58C,SAEAwK,EAAArjB,QACA8iC,EAAA9iC,QAAAqjB,GAEAyf,EAAAI,QAAA7f,KAGAniB,EAAA,8BAAAD,GACA6gB,EAAAkrD,SACAn5C,GAAA/R,GAAAjJ,SACAiqB,GAEAjP,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAshC,mBACAx3D,SACA23D,OAAA33D,EAAA48C,KAAA+H,SACAvtB,UAAAp3B,EAAAo3B,WAEA3hB,OACAuqC,SAAAhgD,EAAAggD,SACA5J,UACA2C,UACAx1C,WAIA2yB,GAAA2/B,YAAA3/B,GAAA2/B,gBACA3/B,GAAA2/B,YAAAoD,iBAAA,SAAApnB,EAAAp8B,GACA,YACA,IAAAhD,GAAA1Q,KAAAq0C,EAAA3gC,EAAA2gC,QAAAoC,EAAA/iC,EAAA+iC,QAAAO,EAAAtjC,EAAAsjC,QAAAx1C,EAAAkS,EAAAlS,IAAA4sE,EAAAt+B,EAAAoY,gBAAApY,EAAAsY,aAAAimB,EAAA,SAAA9sE,EAAAkmB,EAAAg3B,GACA,GAAA/yB,GAAA+qB,EAAAl1C,GAAApB,EAAAk0C,EAAA9yC,EACAuuC,GAAAqY,oBACA1gC,EAAAqoB,EAAAra,SAAAG,WAAAG,WAAA0oB,EAAA4a,KACA5xC,EAAAqoB,EAAAra,SAAAG,WAAAE,gBAAA2oB,EAAAt4C,MACAshB,EAAAqoB,EAAAra,SAAAG,WAAAC,WAAA4oB,EAAA/yB,KACAjE,EAAAqoB,EAAAra,SAAAG,WAAAI,YAAAyoB,EAAAlzB,MACA9D,EAAAqoB,EAAAva,mBAAA7J,GAEA0iD,IAAAt+B,EAAAqY,oBACA1gC,EAAAqoB,EAAAta,eAAAr1B,IAESmuE,EAAA,GAAAn6C,IAAA2/B,YAAAya,4BACT1zB,KAAA/K,EAAA+K,KACAzlB,SAAA0a,EAAAra,SAAAn1B,QAAA80B,SACAtR,QAAAgsB,EAAAra,SAAAn1B,QAAAwjB,QACAolC,YAAApZ,EAAAra,SAAAn1B,QAAA4oD,YACA1nD,MACAmlB,OAAAmpB,EAAAra,SAAAn1B,QAAAqmB,OACAc,OAAAqoB,EAAAra,SAAAn1B,QAAAmnB,SACS+mD,EAAA,SAAAjtE,EAAA0vB,GACT,GAAAmS,GAAA,GAAAjP,IAAAkP,OAWA,OAVApS,GAAAm7B,mBAAA,WACA,OAAAn7B,EAAA67B,WAAA,CACA,GAAAnnC,GAAA8oD,EAAAltE,EAAA0vB,EACAtL,GAAArlB,QACA8iC,EAAA9iC,QAAAqlB,EAAAhC,SAAAsN,GAEAmS,EAAAI,QAAA7d,EAAAhC,SAAAsN,KAIAmS,GACSsrC,EAAA,SAAAntE,GACT,GAAAkmB,GAAAqoB,EAAA6K,YAAA1f,IAAA15B,GAAApB,EAAAk0C,EAAA9yC,GAAAmqB,EAAA+qB,EAAAl1C,EAKA,OAJAkmB,GAAAqoB,EAAAxa,UAAA0hB,EAAAz1C,GACAkmB,EAAAqoB,EAAAta,eAAAr1B,EACAsnB,EAAAqoB,EAAAva,mBAAA7J,EACAjE,EAAAqoB,EAAAra,SAAAG,WAAAI,YAAAtlB,EAAA+gD,gBAAAlwD,GACAkmB,GACSknD,EAAA,SAAA19C,EAAAtN,GACT,MAAAwQ,IAAAzyB,SAAA,qBAAAuvB,EAAAme,QAAA,GAAAU,EAAAuY,qBAAA1kC,EAAArjB,SAAAqjB,EAAAqG,OACSykD,EAAA,SAAAltE,EAAA0vB,GACT,GAAAtN,EAIA,OAHAniB,GAAA,sCAAAD,GACAC,EAAA,kBAAAyvB,EAAA0G,cACAhU,EAAAirD,GAAA,EAAA39C,IAEA3wB,SAAAquE,EAAA19C,EAAAtN,GACAA,aAESirD,EAAA,SAAA73C,EAAA9F,GACT,GAAAtN,KACA,KACAniB,EAAA2yB,GAAAjyB,OAAA,4CAAwE+uB,EAAAme,OAAAne,EAAA0G,eACxEhU,EAAAwQ,GAAAoT,UAAAtW,EAAA0G,cACa,MAAA9T,GACbkT,GAAA+Y,EAAAuY,oBAAA7mD,EAAA,qDAAAqiB,EAAAK,QAAA,aAEA,MAAAP,IACSkrD,EAAA,SAAAttE,GACT,GAAA6hC,GAAA,GAAAjP,IAAAkP,OAMA,OALAirC,GAAAQ,SAAAvtE,EAAAmP,EAAAooD,WAAAv3D,GAAAmtE,EAAAntE,GAAAuuC,EAAA4K,cAAAzf,IAAA15B,IAAA2qC,KAAA,SAAAjb,GACAmS,EAAA9iC,QAAAsuE,GAAA,EAAA39C,OACa,SAAAA,GACbmS,EAAAI,QAAAorC,GAAA,EAAA39C,QAEAmS,GACS2rC,EAAA,SAAAC,GACT,GAOAvnD,GAPA+a,EAAAwsC,EAAAxsC,WACAjhC,EAAAytE,EAAAztE,GACA0vB,EAAA+9C,EAAA/9C,IACAg+C,EAAAD,EAAAC,iBACAC,EAAAF,EAAAE,iBACAC,EAAAH,EAAAvnD,WACA2nD,EAAAH,EAAAxnD,WAEA0f,EAAAinC,EAAA,GAAAxsC,UAAA,KAAAjb,EAAAsoD,EAAAtoD,QAAAmpB,EAAAnpB,OAAAyO,EAAA65C,EAAA75C,UAAA0a,EAAA8K,cAAA3f,IAAA15B,GAAApB,EAAAk0C,EAAA9yC,GAAAmqB,EAAA+qB,EAAAl1C,EAuBA,OAtBAuuC,GAAAqY,mBACA1gC,EAAA0M,GAAAxkB,UAAqCu/D,GACrC/6C,GAAAxkB,OAAA8X,EAAA2nD,KAEA3nD,EAAA0M,GAAAxkB,UAAqCu/D,GACrC/6C,GAAAxkB,OAAA8X,EAAA2nD,GACAj7C,GAAAxkB,OAAA8X,EAAA0nD,GACA1nD,EAAAqoB,EAAAxa,UAAA0hB,EAAAz1C,GACAkmB,EAAAqoB,EAAAta,eAAAr1B,EACAiuE,EACA3mD,EAAAqoB,EAAAva,mBAAA7J,EACiBokB,EAAAsY,eACjB3gC,EAAAqoB,EAAAza,WAAAl1B,IAGA2vC,EAAAsY,eACAhzB,EAAAjB,GAAAuS,QAAAjf,EAAA2N,IAEAnE,EAAAs7B,KAAA5lC,EAAAyO,GAAA,GACA0a,EAAA+K,KAAA+H,UAAA9S,EAAA+K,KAAA2O,kBACAv4B,EAAA2X,iBAAA,GAEAwlC,GACAt+B,EAAAsY,cACAj0B,GAAA+S,aAAAzf,EAAA0f,GAEAA,EAAAl0B,OAAA68B,EAAAza,UAAAmN,GACA2E,GAEA3E,GACS6sC,EAAA,SAAAC,GACT,GAAAC,GAAAD,EAAAC,gBACAhuE,EAAA+tE,EAAA/tE,GACA0vB,EAAAq+C,EAAAr+C,GACA,IAAAs+C,EACAp7C,GAAAjlB,KAAAqgE,EAAA,SAAAC,EAAAC,GACAx+C,EAAAm8B,iBAAAoiB,EAAAC,SAEa,CACb,GAAAC,GAAA5/B,EAAA4K,cAAAzf,IAAA15B,GAAAihC,EAAA9xB,EAAAwmB,QAAA31B,EACA0vB,GAAAm8B,iBAAA,6BACAn8B,EAAAm8B,iBAAA,qCACAn8B,EAAAm8B,iBAAA,4BACAghB,IACAn9C,EAAAm8B,iBAAA,2CACAn8B,EAAAm8B,iBAAA,cAAA5qB,EAAApjC,OAEA+0B,GAAAjlB,KAAAwgE,EAAA,SAAAvvE,EAAAkT,GACA4d,EAAAm8B,iBAAAjtD,EAAAkT,MAIA8gB,IAAAxkB,OAAA3P,MACAkyD,YAAA,SAAAyd,GACA,GAIAvsC,GAAAwsC,EAAAV,EAJA3tE,EAAAouE,EAAApuE,GACAmuD,EAAAigB,EAAAjgB,SACAuC,EAAA0d,EAAA1d,cACA5I,EAAAsmB,EAAAtmB,SACA5K,EAAA/tC,EAAAi/C,cAAApuD,EAAAmuD,GAAAz+B,EAAAvgB,EAAAooD,WAAAv3D,EAAAmuD,GAAAjoC,IAsBA,OArBA2b,GAAAorC,EAAAjtE,EAAA0vB,GACAvgB,EAAAupD,yBAAA14D,EAAAmuD,EAAAjR,EAAA/yB,MACAwjD,EAAAp/B,EAAA6K,YAAA1f,IAAA15B,GACA8sE,EAAA9sE,EAAAkmB,EAAAg3B,GACA4K,IACA5hC,EAAAqoB,EAAAvE,OAAA3V,WAAAyzB,WAAA,GAEAumB,EAAAb,GACAvsC,WAAAic,EAAAzb,KACAzhC,KACA2tE,eACAznD,SACAwJ,MACAg+C,aAAAhd,IAEAod,GACAE,gBAAAtd,EAAAnuC,QACAviB,KACA0vB,QAEAA,EAAAw7B,KAAAmjB,GACAxsC,GAEAowB,WAAA,SAAAjyD,GACA,GAAA6hC,GAAAnS,EAAAi+C,EAAAU,EAAAptC,EAAA9xB,EAAAwmB,QAAA31B,EAgBA,OAfA0vB,GAAAvgB,EAAAooD,WAAAv3D,GACAmP,EAAAupD,yBAAA14D,GACA6hC,EAAAorC,EAAAjtE,EAAA0vB,GACAi+C,EAAAp/B,EAAA6K,YAAA1f,IAAA15B,GACAquE,EAAAb,GACAvsC,aACAjhC,KACA2tE,eACAj+C,QAEAo+C,GACA9tE,KACA0vB,QAEAA,EAAAw7B,KAAAmjB,GACAxsC,KAGAjP,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAA+iC,kBACAj5D,QAAAk2B,GAAAxkB,QACA+tC,UAAA,eACa5N,GACbp8B,MAAAygB,GAAAxkB,QACAsmC,YAAAnG,EAAA8K,cAAA3f,KACavnB,MAEbygB,GAAAyP,SAAA5jC,KAAA,SAAA8jC,GACA,OACAksB,eAAA,SAAAzuD,GAEA,MADAmS,GAAAsgD,aAAAzyD,GACAuuC,EAAAra,SAAAn1B,QAAA80B,SACAy5C,EAAAttE,GAEAuiC,EAAAksB,eAAAzuD,EAAA4yB,GAAAtxB,KAAA+rE,EAAA5uE,MAAA,SAMAm0B,GAAA2/B,YAAAya,2BAAA,SAAAvhC,GACA,YACA,IAAAiuB,GAAAh9D,GACA48C,MACAgI,UAAA,EACAD,UAAA,EACA4G,iBAAA,GAEAp0B,SAAA,KACA5zB,IAAA,SAAAwlB,EAAA4Y,KACAjZ,OAAA,QACSkpD,KAAeC,GACxB70C,IAAA,SAAA15B,GACA,MAAA4yB,IAAA2L,WAAA7hC,EAAAm3B,UACAn3B,EAAAm3B,SAAA7zB,GAEAtD,EAAAm3B,UAGAjB,IAAAxkB,OAAA1R,EAAA+uC,GACAiuB,EAAA9mC,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAo2B,eACA4C,aAAA,mBACAR,YAAA1uD,EAAAirD,YAAA,uDACAuE,cAAAxvD,EAAA0oB,QACAA,OAAA1oB,EAAA0oB,OACAi0B,cAAAk1B,EACAziB,oCAAA,EACAxS,KAAA58C,EAAA48C,KACAr5C,IAAAvD,EAAAuD,IACAi1B,WAAA,SAAAl1B,EAAA0vB,EAAAiqB,GACA,GAAA9X,GAAAysC,EAAAtuE,SACAsuE,GAAAtuE,GACA25C,EACA9X,EAAAI,QAAAvS,GAEAmS,EAAA9iC,QAAA2wB,OAIAkD,GAAAxkB,OAAA3P,MACA8uE,SAAA,SAAAvtE,EAAA0vB,EAAAxJ,EAAA3D,GACA,GAAAsf,GAAA,GAAAjP,IAAAkP,OAIA,OAHAplC,GAAAuD,IAAA,0CAAAD,GACAsuE,EAAAtuE,GAAA6hC,EACA63B,EAAAlN,cAAAxsD,GAAA4sD,WAAAlwD,EAAAwpB,OAAAlmB,IAAAkmB,GAAA6mC,YAAArwD,EAAA6lB,QAAAviB,IAAAuiB,GAAA2oC,KAAAx7B,GACAmS,MAIAjP,GAAAC,YAAA,SAAA4Y,GACA,YAWA,SAAA+iC,oBAAAj8C,EAAAk8C,GACA,GAAAC,GAAA1sE,MAAA+M,UAAAxJ,MAAAkW,KAAA8W,EACA71B,GAAAq2B,UAAA47C,QAAA,WAAAp8C,EAAAnwB,OAAA,mBACAqsE,EAAAG,cAAA,GACAlyE,EAAAq2B,UAAAC,+BAAA07C,EAAAD,EAAAI,cAEA,QAAAC,kBAAA/lB,GACA,GAAAgmB,GAAA,GAAAn8C,IAAAkP,OA6BA,OA5BAinB,GAAA3pB,OACA2pB,EAAAjtC,KAAA,SAAAA,GACAA,EAAAkzD,OAAAC,qBAAAlmB,GACAmmB,EAAA5qE,KAAAwX,GACAizD,EAAAhwE,WACiB,SAAAowE,GACjBzyE,EAAAq2B,UAAA47C,QAAA,oBAAA5lB,EAAAqmB,SAAA,sBAAAD,EAAAztB,KAAA,aACAqtB,EAAA9sC,YAEa8mB,EAAAsmB,aACbC,oBAAAvmB,GAAApe,KAAA,SAAAtR,GACA,GAAAk2C,GAAAl2C,EAAAj3B,MACAwwB,IAAAjlB,KAAA0rB,EAAA,SAAAtyB,EAAAgiD,GACA+lB,iBAAA/lB,GAAAxoC,KAAA,WACAgvD,GAAA,EACA,IAAAA,GACAR,EAAAhwE,cAIAs6B,EAAAj3B,QACA2sE,EAAAhwE,WAEiB,SAAAowE,GACjBzyE,EAAAq2B,UAAA47C,QAAA,oBAAA5lB,EAAAqmB,SAAA,sBAAAD,EAAAztB,KAAA,aACAqtB,EAAA9sC,YAGA8sC,EAEA,QAAAE,sBAAAlmB,GACA,GAAAnqD,GAAAmqD,EAAAnqD,KAAAwwE,EAAArmB,EAAAqmB,SAAAI,EAAAJ,EAAAzkD,YAAA/rB,EAKA,OAJAwwE,KAAA72D,OAAA,EAAAi3D,GACA,MAAAJ,EAAA/jD,OAAA,KACA+jD,IAAA72D,OAAA,IAEA62D,EAEA,QAAAE,qBAAAvmB,EAAAye,EAAAiI,EAAAC,GACA,GAAA7tC,GAAA6tC,GAAA,GAAA98C,IAAAkP,QAAA6tC,EAAAnI,GAAAze,EAAA6mB,cAWA,OAVAD,GAAAE,YAAA,SAAAx2C,GACA,GAAAy2C,GAAAL,IAAA37D,OAAAulB,IACAA,GAAAj3B,OACAkX,WAAA,WACAg2D,oBAAAvmB,EAAA4mB,EAAAG,EAAAjuC,IACqB,GAErBA,EAAA9iC,QAAA+wE,IAEajuC,EAAAI,SACbJ,EAEA,QAAAkuC,oBAAArvC,EAAA+tC,GACA,GAAAuB,MAAAC,EAAA,GAAAr9C,IAAAkP,OAiCA,OAhCAplC,GAAAq2B,UAAAm9C,yBACAzB,EAAAG,cAAA,GACAluC,EAAAnO,MAAAnwB,OAAA,IAAA1F,EAAAyzE,oBACAzzE,EAAAq2B,UAAAC,mCACAt2B,EAAAq2B,UAAAq9C,UAAA,wBACA3B,EAAAG,cAAA,GACAqB,EAAAhuC,YAEAitC,KACAt8C,GAAA6N,sBAAAC,GACA9N,GAAAjlB,KAAA+yB,EAAAv0B,MAAA,SAAApF,EAAA6F,GACA,GAAAm8C,GAAAn8C,EAAA+zB,kBACAooB,KACAA,EAAA3pB,OACA8vC,EAAA5qE,KAAAsI,EAAA0+D,aAEA0E,EAAA1rE,KAAAwqE,iBAAA/lB,GAAAxoC,KAAA,WACAyvD,EAAAxqE,MACA,IAAAwqE,EAAA5tE,QACA6tE,EAAAlxE,gBAOAmwE,EAAAxuC,EAAAnO,MAEA,IAAAy9C,EAAA5tE,QACA6tE,EAAAlxE,WAGAkxE,EAEA,QAAAI,eAAAC,GACA,GAAAC,GAAA,GAAA39C,IAAA49C,gBACAC,wBACAhjE,QAAA6iE,EACAI,QAAA,SAAAvvE,GACAyxB,GAAA09C,GAAAt/D,SAAAtU,EAAAkxB,QAAA0E,YACAnxB,EAAAoY,mBAEAo3D,sBAAA,SAAAxvE,GACAyxB,GAAA09C,GAAAp/D,YAAAxU,EAAAkxB,QAAA0E,aAEAs+C,OAAA,SAAAzvE,GACA4uE,mBAAA5uE,EAAAu/B,aAAA6vC,GAAA5lC,KAAA,WACA6jC,mBAAAU,EAAAqB,IACqB,WACrB7zE,EAAAq2B,UAAA47C,QAAA,mFASA,OALAniC,GAAA7F,YAAA,WACA4pC,EAAAn9C,YAEAR,GAAA09C,GAAA7zC,aAAAo0C,IAAAj+C,GAAA09C,GAAA34D,OACAm5D,EAAAxsE,KAAAisE,GACAA,EAEA,QAAAQ,YAAAC,GACA,GAAAC,EAOA,OANAr+C,IAAAjlB,KAAAqjE,EAAAtwC,aAAAwwC,MAAA,SAAAxoD,EAAA5W,GACA,aAAAA,EAEA,MADAm/D,IAAA,GACA,IAGAA,EAEA,QAAAE,oBAAAhwE,GACA,MAAAyxB,IAAA4Q,SACAriC,EAAAooE,EAAA,GAAApoE,EAAA2O,EAAA,EAEA,IAAA3O,EAAAooE,GAAA,IAAApoE,EAAA2O,EAEA,QAAAshE,iBACA,GAAAC,GAAA30E,EAAAo2B,iBAAAw+C,EAAA,WACAh4D,WAAA,WACAsZ,GAAAjlB,KAAA0jE,EAAA,SAAAtqE,EAAAwpE,GACA39C,GAAA29C,GAAA9zC,aAAAo0C,IAAAj+C,GAAA29C,GAAA54D,OACAib,GAAA29C,GAAAr/D,YAAAxU,EAAAkxB,QAAA0E,eAEiB,IAEjBM,IAAAjlB,KAAA0jE,EAAA,SAAAtqE,EAAAwpE,GACA,GAAA9B,GAAA4B,cAAAE,EACAc,GAAAjvE,QAAAwwB,GAAAiU,kBAAA2C,UACAgD,EAAA1R,OAAAphB,SAAA,qBAAAvY,IACAstE,EAAAG,gBAAAmC,WAAA5vE,IACAyxB,GAAAjlB,KAAA0jE,EAAA,SAAAtqE,EAAAwpE,GACAA,YAAAgB,cAAA3+C,GAAA29C,GAAA9zC,aAAAo0C,IACAj+C,GAAA29C,GAAAt+D,KACA4oB,QAAA,gBAQA2R,EAAA1R,OAAAphB,SAAA,qBAAAvY,GACAgwE,mBAAAhwE,IACAmwE,MAGA9kC,EAAA1R,OAAAlI,GAAAlZ,UAAAsiB,WAAA,yBAAA76B,GACAmwE,MAEA9kC,EAAA1R,OAAAphB,SAAA,gBAAAvY,GACA4vE,WAAA5vE,KACAA,EAAA4R,iBACAu+D,OAGA9kC,EAAA1R,OAAAphB,SAAA+2D,EAAAa,GA3LA,GAAA50E,GAAA+zE,EAAA,eAAAI,EAAA,mBAAAC,KAAA5B,KAAA1iC,EAAA,GAAA5Z,IAAA4T,cACA9pC,IACAo2B,oBACAq9C,oBAAA,EACAviD,SACA0E,WAAA,MAEAS,UAAA,GAAAH,IAAAC,YAAAE,WAEAH,GAAAxkB,OAAA1R,EAAA+uC,GAAA,GAoLA2lC,gBACAx+C,GAAAxkB,OAAA3P,MACA00B,mBAAA,SAAA1lB,GACA/Q,EAAAo2B,iBAAAxuB,KAAAmJ,GACA4iE,cAAA5iE,IAEA+jE,eAAA,SAAA/jE,GACA,GAAAvL,GAAAuvE,EAAA/0E,EAAAo2B,gBACA,KAAA5wB,IAAAuvE,GACA,GAAAA,EAAAvvE,KAAAuL,EACA,MAAAgkE,GAAAniC,OAAAptC,EAAA,IAIAkxB,QAAA,WACAoZ,EAAApZ,UACAR,GAAAjlB,KAAAmjE,EAAA,SAAA/pE,EAAAwpE,GACAA,EAAAn9C,eAIA30B,KAAA8hE,YACA9hE,KAAA8hE,SAAA0O,2CAEAr8C,GAAAC,YAAAE,UAAA,WACA,YACA,QACAm9C,uBAAA,aACAl9C,+BAAA,SAAAT,EAAAm/C,KACAtB,UAAA,SAAA1uB,EAAAiwB,GACA/+C,GAAA3yB,IAAA,2BAAAyhD,EAAA,2BAAAiwB,EAAA,cAEAhD,QAAA,SAAAhsD,EAAA0b,GACAzL,GAAA3yB,IAAA0iB,EAAA0b,MAIAzL,GAAA49C,eAAA,SAAA/kC,GACA,YAWA,SAAAmmC,4BACA,MAAAh/C,IAAA4Q,UAAA5Q,GAAAgR,WAAAhR,GAAAiR,UAEA,QAAAguC,oBAAA1wE,GACA2wE,IACAF,yBACAplC,EAAA1R,OAAAphB,SAAA,oBAAAvY,GACAA,EAAA4R,mBAGAy5B,EAAA1R,OAAAphB,SAAA,oBAAAvY,GACAA,EAAAu/B,eACAv/B,EAAAu/B,aAAAqxC,WAAA,OACA5wE,EAAA4R,oBAIA++D,GAAA,GAGA,QAAAE,iBAAA7wE,GACA,IAAAyxB,GAAAiU,kBAAA2C,SACA,QAEA,IAAAyoC,GAAAC,EAAA/wE,EAAAu/B,aAAAyxC,EAAAv/C,GAAA4Q,QAEA,OADAyuC,MAAAr/C,GAAAoQ,OAAApQ,GAAAiU,kBAAA2C,WAAA,SAAA0oC,EAAAE,cACAF,GAAAD,IAAAC,EAAA3/C,OAAA2/C,EAAA3/C,MAAAnwB,SAAA+vE,GAAAD,EAAAhB,MAAA91C,UAAA82C,EAAAhB,MAAA91C,SAAA,UAAA82C,EAAAhB,MAAApkE,UAAAolE,EAAAhB,MAAApkE,SAAA,UAEA,QAAAulE,qBAAA1rE,GAIA,MAHAvJ,UAAAuJ,IACA2rE,EAAA3rE,GAEA2rE,EAEA,QAAAC,yBAEA,QAAAC,sBACAC,EAAA/4D,SAAAg5D,YAAA,SACAD,EAAAE,UAAAj2E,EAAA+zE,uBAAA,MAHA,GAAAgC,EAKA,IAAA9uD,OAAAivD,YACA,IACAH,EAAA,GAAAG,aAAAl2E,EAAA+zE,uBACiB,MAAA/vD,GACjB8xD,yBAGAA,qBAEA94D,UAAAm5D,cAAAJ,GAEA,QAAAK,gBACAtmC,EAAA1R,OAAArtB,EAAA,oBAAAtM,GACA,GAAA6wE,gBAAA7wE,GAAA,CAGA,GAAA4xE,GAAAngD,GAAAoQ,MAAApQ,GAAAiU,kBAAA2C,SAAA,KAAAroC,EAAAu/B,aAAA0xC,aACA,UAAAW,GAAA,aAAAA,EACA5xE,EAAAu/B,aAAAqxC,WAAA,OAEA5wE,EAAAu/B,aAAAqxC,WAAA,OAEA5wE,EAAAoY,kBACApY,EAAA4R,oBAEAy5B,EAAA1R,OAAArtB,EAAA,qBAAAtM,GACA,IAAAkxE,sBAAA,CACA,IAAAL,gBAAA7wE,GACA,MAEAzE,GAAAg0E,QAAAvvE,MAGAqrC,EAAA1R,OAAArtB,EAAA,qBAAAtM,GACA,GAAA6wE,gBAAA7wE,GAAA,CAGAzE,EAAAo1B,QAAA3wB,EACA,IAAA6xE,GAAAt5D,SAAAu5D,iBAAA9xE,EAAA+xE,QAAA/xE,EAAAgyE,QACAvgD,IAAAn0B,MAAA28B,SAAA43C,IAGAt2E,EAAAi0E,sBAAAxvE,MAEAqrC,EAAA1R,OAAArtB,EAAA,gBAAAtM,GACA,IAAAkxE,sBAAA,CACA,IAAAL,gBAAA7wE,GACA,MAEAA,GAAA4R,iBACA5R,EAAAoY,kBACA7c,EAAAk0E,OAAAzvE,GACAoxE,2BAtGA,GAAA71E,GAAA+Q,EAAA6kE,EAAAR,EAAAtlC,EAAA,GAAA5Z,IAAA4T,cACA9pC,IACA+Q,QAAA,KACAijE,QAAA,SAAAvvE,KACA2wB,QAAA,SAAA3wB,KACAwvE,sBAAA,SAAAxvE,KACAyvE,OAAA,SAAAzvE,MAEAyxB,GAAAxkB,OAAA1R,EAAA+uC,GACAh+B,EAAA/Q,EAAA+Q,QAiGAokE,qBACAiB,eACAlgD,GAAAxkB,OAAA3P,MACAmwE,aAAA,SAAAjoE,GACA,MAAA0rE,qBAAA1rE,IAEAysB,QAAA,WACAoZ,EAAApZ,WAEAy7C,WAAA,WACA,MAAAphE,MAGAhP,KAAA8hE,YACA9hE,KAAA8hE,SAAAyR,iCAEA,WACA,YACAp/C,IAAAwgD,aACAjiC,gBAAA,SAAAC,GACA3yC,KAAA40E,QAAAtkE,UAAAoiC,gBAAA9vC,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAAC,iBAEA78C,iBAAA,WACAj4B,KAAA40E,QAAAtkE,UAAA2nB,iBAAAr1B,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAAE,cAEAC,iBAAA,SAAAhmE,GACAhP,KAAAi1E,MAAAj1E,KAAAi1E,KAAAvgD,mBAAA1lB,IAEAkmE,oBAAA,SAAAlmE,GACA,GAAAhP,KAAAi1E,KACA,MAAAj1E,MAAAi1E,KAAAlC,eAAA/jE,IAGAmmE,gBAAA,SAAA5zE,GACA,IAAAvB,KAAA60E,YAAAO,gBAAA7zE,GACA,MAAAvB,MAAA60E,YAAAQ,iBAAA9zE,IAGAyoB,MAAA,WACAhqB,KAAA40E,QAAAtkE,UAAA0Z,MAAApnB,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA7qD,SACAhqB,KAAAmzC,SAAArqC,QAAA9I,KAAA60E,YAAA/+B,cACA91C,KAAAugD,iBAAAvgD,KAAA48C,qBACA5tC,QAAAhP,KAAA60E,YAAA/+B,YACAhpC,MAAA9M,KAAAmzC,SAAAtlC,KAAAyvC,iBACqBhP,eAErBtuC,KAAAi1E,OACAj1E,KAAAi1E,KAAAtgD,UACA30B,KAAAi1E,KAAAj1E,KAAAs1E,qBAEAt1E,KAAAu1E,mBAAA,EACAv1E,KAAAw1E,uBAAA,EACAx1E,KAAAy1E,mCAEAn8B,QAAA,SAAA/3C,EAAA2vC,GACA,GAAAwkC,GAAA11E,KAAAmzC,SAAAqQ,eAAAtS,EACAlxC,MAAA40E,QAAAtkE,UAAAgpC,QAAA12C,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAAc,eAAAp0E,EAAAm0E,IAEAv+B,YAAA,SAAA51C,GACA,GAAAm3D,GAAA14D,KAAA40E,QAAAtkE,UAAA6mC,YAAAv0C,MAAA5C,KAAA0nB,UAEA,OADAgxC,IAAA14D,KAAA60E,YAAAe,aAAAr0E,GACAm3D,GAEAhkB,eAAA,SAAAnzC,GACA,GAAAs0E,GAAA71E,KAAA40E,QAAAtkE,UAAAokC,eAAA9xC,MAAA5C,KAAA0nB,UAEA,OADAmuD,IAAA71E,KAAA60E,YAAAiB,gBAAAv0E,GACAs0E,GAEAE,MAAA,SAAAC,GACA,MAAAh2E,MAAA60E,YAAAoB,UAAAD,IAEAE,cAAA,SAAAhhC,GACA,GAAA73B,GAAArd,KAAAk3B,QAAAge,EACA,OAAA73B,GAAA84D,eAGAhiD,GAAAiiD,cACArgC,WAAA,SAAA5I,GACA,GAAArkC,GAAA9I,KAAA40E,QAAAtkE,UAAAylC,WAAAnzC,MAAA5C,KAAA0nB,UAMA,OALA5e,IACAqkC,IAAAntC,KAAAugD,mBACAz3C,EAAA9I,KAAA60E,YAAA/+B,aAGAhtC,GAEAutE,gBAAA,SAAAnhC,GACAl1C,KAAA60E,YAAAyB,WAAAphC,IAEAugC,gCAAA,WACAz1E,KAAAu2E,yBAAApiD,GAAAqiD,yBAAAx2E,KAAAy2E,6BACAz2E,KAAA02E,wBAAAviD,GAAAgR,UACAnlC,KAAA22E,2BACA32E,KAAA42E,sBAAA52E,KAAA62E,0BACA72E,KAAA82E,6BAAA92E,KAAA+2E,iCACA/2E,KAAAg3E,2BAAAh3E,KAAAi3E,iCAGA3B,kBAAA,WACA,GAAAloC,GAAAptC,KAAAq0B,EAAAr0B,KAAAmzC,SAAA+jC,YAAAC,eAAAC,EAAAp3E,KAAA60E,YAAAwC,EAAAD,EAAAE,aAEA,OADAD,IAAAhjD,EAAAxuB,KAAAwxE,GACA,GAAAljD,IAAAC,aACAC,mBACAq9C,mBAAA1xE,KAAAmzC,SAAA7vB,SACA6L,SACA0E,WAAA7zB,KAAAmzC,SAAAhkB,QAAA0E,YAEAS,WACAm9C,uBAAA,WACA2F,EAAAG,sBAEAhjD,+BAAA,SAAAT,EAAAm/C,GACAmE,EAAAI,qBACArjD,GAAAjlB,KAAA4kB,EAAA,SAAAxrB,EAAA+U,GACAA,EAAA84D,aAAAlD,IAEAn/C,EAAAnwB,QACAypC,EAAA5V,SAAA1D,EAAA,YAGA69C,UAAA,SAAA1uB,EAAAw0B,GACArqC,EAAAsM,WAAAuJ,EAAAw0B,IAEAvH,QAAA,SAAAhsD,EAAA0b,GACAwN,EAAA5rC,IAAA0iB,EAAA0b,QAKA62C,2BAAA,WACA,GAAArpC,GAAAptC,IACA,WAAAm0B,IAAAqiD,yBACAY,WAAAp3E,KAAA60E,YACArzE,IAAA,SAAA0iB,EAAAwzD;AACAtqC,EAAA5rC,IAAA0iB,EAAAwzD,IAEAC,aAAA,SAAAziC,GACA9H,EAAAwH,WAAAM,IAEA+I,SAAA,SAAA/I,GACA9H,EAAA8G,OAAAgB,IAEA0iC,QAAA,SAAA1iC,GACA9H,EAAAnX,MAAAif,IAEA2iC,QAAA,SAAA3iC,GACA9H,EAAA+J,YAAAjC,IAEA4iC,WAAA,SAAA5iC,GACA9H,EAAAsH,eAAAQ,IAEA6iC,UAAA,SAAA7iC,GACA,MAAA9H,GAAAiH,QAAAa,OAIAyhC,uBAAA,WACA,MAAA32E,MAAA60E,YAAAmD,2BAAAh4E,KAAAmzC,SAAAxf,YAAAQ,GAAA8jD,sBAAA9jD,GAAA+jD,2BAAA/jD,GAAA+jD,2BAEAC,qBAAA,WACA,GAAA/qC,GAAAptC,KAAAo3E,EAAAp3E,KAAA60E,WACA,QACAuC,aACA51E,IAAA,SAAA0iB,EAAAwzD,GACAtqC,EAAA5rC,IAAA0iB,EAAAwzD,IAEAU,kBAAA,SAAAljC,GACA,MAAA9H,GAAAmJ,YACAh1C,GAAA2zC,IACyB9F,QAEzB2oC,UAAA,SAAA7iC,GACA,MAAA9H,GAAAiH,QAAAa,IAEAmjC,UAAA,SAAA92E,EAAA2vC,GACA9D,EAAAkM,QAAA/3C,EAAA2vC,IAEAonC,sBAAA,SAAA/2E,EAAAg3E,GACA,GAAAC,GAAArkD,GAAAijD,EAAAqB,aAAAl3E,IAAAm3E,EAAAvkD,GAAAijD,EAAA/B,iBAAA9zE,GACAg3E,IACAC,EAAAjmE,SAAA,cACA6kE,EAAAuB,aAAAp3E,GACA61E,EAAAwB,aAAAr3E,KAEAi3E,EAAA/lE,YAAA,cACA2kE,EAAAyB,aAAAt3E,GACA61E,EAAA0B,aAAAv3E,IAEAm3E,EAAAnmE,SAAA,WAAAE,YAAA,cAIAiqC,sBAAA,SAAAn7C,EAAAovC,EAAAD,GACA1wC,KAAA40E,QAAAtkE,UAAAosC,sBAAA95C,MAAA5C,KAAA0nB,WACA1nB,KAAA22E,0BACA32E,KAAA60E,YAAAQ,iBAAA9zE,IAAAmvC,IAAAvc,GAAAib,OAAAsC,YACA1xC,KAAA60E,YAAAkE,qBAAAx3E,GACAvB,KAAA60E,YAAA+D,aAAAr3E,IAGAovC,IAAAxc,GAAAib,OAAA6C,iBAAAvB,IAAAvc,GAAAib,OAAA2C,WACA/xC,KAAA60E,YAAAmE,UAAAz3E,GACAvB,KAAA60E,YAAAoE,cAAA13E,GACA4yB,GAAAn0B,KAAA60E,YAAAQ,iBAAA9zE,IAAAkR,YAAAzS,KAAAk5E,SAAAC,WACiBzoC,IAAAvc,GAAAib,OAAA+C,eACjBnyC,KAAA60E,YAAAuE,UAAA73E,IAGAw1E,+BAAA,WACA,GAAAjnC,GAAA3b,GAAAxkB,UAAuC3P,KAAAm4E,uBACvC,WAAAhkD,IAAAklD,4BAAAvpC,IAEAmnC,6BAAA,WACA,GAAAnnC,GAAA3b,GAAAxkB,UAAuC3P,KAAAm4E,uBACvC,WAAAhkD,IAAA+jD,0BAAApoC,IAEA+mC,wBAAA,WACA,GAAA/mC,GAAA3b,GAAAxkB,UAAuC3P,KAAAm4E,uBACvC,WAAAhkD,IAAA8jD,qBAAAnoC,IAEAyV,eAAA,SAAAhkD,GACAvB,KAAA40E,QAAAtkE,UAAAi1C,eAAA3iD,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAAyE,YAAA/3E,IAEAoiD,eAAA,SAAAa,EAAAC,GACAzkD,KAAA40E,QAAAtkE,UAAAqzC,eAAA/gD,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA0E,sBAEAn0B,UAAA,SAAA7jD,EAAApB,GACA,GAAAkd,GAAArd,KAAAk3B,QAAA31B,EACA8b,MAAAkzD,QAAAvwE,KAAAmzC,SAAA+jC,YAAAsC,sBACAx5E,KAAAy3C,aAAA+E,YAAAj7C,GACAk4E,OAAAp8D,EAAAkzD,SAGAvwE,KAAA40E,QAAAtkE,UAAA80C,UAAAxiD,MAAA5C,KAAA0nB,WACA1nB,KAAA05E,WAAAn4E,EAAApB,IAEAmlD,aAAA,SAAA/jD,GACAvB,KAAA22E,2BACA32E,KAAA60E,YAAAkE,qBAAAx3E,GACAvB,KAAA60E,YAAAiE,aAAAv3E,GACAvB,KAAA02E,wBACA12E,KAAAg3E,2BAAA2C,WAAA35E,KAAA60E,YAAA4D,aAAAl3E,MAIAw8C,YAAA,SAAAx8C,EAAApB,EAAA29C,EAAAxmB,GACAt3B,KAAA40E,QAAAtkE,UAAAytC,YAAAn7C,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA+E,eAAAr4E,EAAAu8C,EAAAxmB,GACA,IAAAA,GAAA,MAAA7f,KAAA8Y,MAAAutB,EAAAxmB,EAAA,MACAt3B,KAAA60E,YAAAgF,WAAAt4E,GACAvB,KAAA60E,YAAAuE,UAAA73E,GACAvB,KAAA60E,YAAAiF,aAAAv4E,GACAvB,KAAA60E,YAAAoE,cAAA13E,EAAAvB,KAAAmzC,SAAAtlC,KAAAksE,oBACA/5E,KAAAg6E,iBAAAz4E,IAEAvB,KAAAg6E,iBAAAz4E,EAAAu8C,EAAAxmB,IAGAwuB,iBAAA,SAAAhI,EAAAxmB,GACAt3B,KAAA40E,QAAAtkE,UAAAw1C,iBAAAljD,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA1I,oBAAAruB,EAAAxmB,IAEA0mB,YAAA,SAAAz8C,EAAApB,EAAAwlB,EAAAsL,GAEA,QAAAgpD,gBAAAt0D,GACAquB,IAGAojC,EAAA6B,cAAA13E,GACA4yB,GAAA6f,GAAAvhC,YAAA26B,EAAA8rC,SAAAC,UACA/B,EAAA0C,aAAAv4E,GACA6rC,EAAAmJ,YACAh1C,OACqB6tC,SAAAjb,GAAAib,OAAA+C,eACrBilC,EAAAyC,WAAAt4E,GAEA61E,EAAAkC,YAAA/3E,GACAokB,EAAArlB,QACA8sC,EAAA8sC,sBAAA34E,IAEA4yB,GAAA6f,GAAAzhC,SAAA66B,EAAA8rC,SAAAiB,MACA/C,EAAAgD,WAAA74E,GACA61E,EAAAiD,oBAAAjtC,EAAAmK,gBAAAh2C,KACA4yB,GAAA6f,GAAAzhC,SAAA66B,EAAA8rC,SAAAlN,WACAoL,EAAAkD,UAAA/4E,IAEA6rC,EAAAmtC,2BAAAh5E,EAAAokB,KAvBA,GAAA60D,GAAAx6E,KAAA40E,QAAAtkE,UAAA0tC,YAAAp7C,MAAA5C,KAAA0nB,WAAA0vD,EAAAp3E,KAAA60E,YAAA7gC,EAAAojC,EAAA/B,iBAAA9zE,GAAA6rC,EAAAptC,IAiCA,OAPAw6E,aAAArmD,IAAAkP,QACAm3C,EAAA14D,KAAA,SAAA24D,GACAR,eAAAQ,KAGAR,eAAAt0D,GAEA60D,GAEAN,sBAAA,SAAA34E,GACA,GAAA61E,GAAAp3E,KAAA60E,WACA70E,MAAA2iD,qBACAy0B,EAAAsD,iBAAAn5E,GAEA4yB,GAAAijD,EAAA/B,iBAAA9zE,IAAAgR,SAAAvS,KAAAk5E,SAAA54E,SACAN,KAAA26E,sBAAAp5E,IAEA88C,cAAA,SAAA98C,GACAvB,KAAA40E,QAAAtkE,UAAA+tC,cAAAz7C,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA+F,YAAAr5E,IAEA+8C,UAAA,SAAA/8C,EAAApB,GACA,GAAAq6E,GAAAx6E,KAAA40E,QAAAtkE,UAAAguC,UAAA17C,MAAA5C,KAAA0nB,UAEA,OADA1nB,MAAA60E,YAAA+F,YAAAr5E,GACAi5E,GAEA97B,eAAA,SAAAn9C,EAAAk9C,GACAz+C,KAAA40E,QAAAtkE,UAAAouC,eAAA97C,MAAA5C,KAAA0nB,WACA+2B,EAAA1oB,UAAA,GAAA/1B,KAAAs0C,SAAA2C,YAAA11C,IACAvB,KAAA60E,YAAAgG,WAAAt5E,IAGA48C,UAAA,SAAA58C,EAAApB,GACAH,KAAA40E,QAAAtkE,UAAA6tC,UAAAv7C,MAAA5C,KAAA0nB,WACA1nB,KAAAq2E,gBAAA90E,GACA,IAAAvB,KAAA4gD,mBACA5gD,KAAA60E,YAAA0E,sBAGAz0B,mBAAA,SAAAvjD,GACA,GAAAu5E,GAAAC,EAAAC,CACAh7E,MAAA40E,QAAAtkE,UAAAw0C,mBAAAliD,MAAA5C,KAAA0nB,WACA1nB,KAAAi7E,gBAAA15E,GACAvB,KAAAmzC,SAAAld,MAAAilD,oBACAJ,EAAA96E,KAAAq3C,aAAA91C,GACAw5E,EAAA/6E,KAAAmzC,SAAAld,MAAA+wB,gBACAg0B,EAAAh7E,KAAAmzC,SAAAld,MAAAklD,cAAAl0D,QAAA,gBAAuF6zD,GACvFE,IAAA/zD,QAAA,eAA8D8zD,GAC9D/6E,KAAA60E,YAAAoE,cAAA13E,EAAAy5E,GACA7mD,GAAAn0B,KAAA60E,YAAAQ,iBAAA9zE,IAAAgR,SAAAvS,KAAAk5E,SAAAC,YAGA11B,qBAAA,SAAAliD,GACA,MAAAvB,MAAA40E,QAAAtkE,UAAAmzC,qBAAA7gD,MAAA5C,KAAA0nB,YACA1nB,KAAA60E,YAAAuG,cAAA75E,GACA4yB,GAAAn0B,KAAA60E,YAAAQ,iBAAA9zE,IAAAkR,YAAAzS,KAAAk5E,SAAAiB,MACAn6E,KAAA60E,YAAAoE,cAAA13E,GACAvB,KAAA60E,YAAA+F,YAAAr5E,GACAvB,KAAAi7E,gBAAA15E,IACA,IAEA4yB,GAAAn0B,KAAA60E,YAAAQ,iBAAA9zE,IAAAgR,SAAAvS,KAAAk5E,SAAAlN,WACAhsE,KAAA60E,YAAAyF,UAAA/4E,IACA,IAGAszC,gBAAA,SAAAtzC,GACA,GAAAikD,GAAArxB,GAAAtxB,KAAA7C,KAAAq7E,uBAAAr7E,KACAA,MAAA40E,QAAAtkE,UAAAukC,gBAAA73B,KAAAhd,KAAAuB,EAAAikD,IAEA61B,uBAAA,SAAA95E,EAAA0tC,EAAAwW,GACAzlD,KAAAmzC,SAAAyB,WAAA0mC,aACAt7E,KAAAu7E,mBAAA34E,MAAA5C,KAAA0nB,WAEA1nB,KAAAw7E,mBAAA54E,MAAA5C,KAAA0nB,YAGA+xB,kBAAA,SAAAl4C,EAAA0vB,EAAAiqB,GACAl7C,KAAA40E,QAAAtkE,UAAAmpC,kBAAA72C,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAAyE,YAAA/3E,GACA25C,GACAl7C,KAAA60E,YAAAoE,cAAA13E,EAAAvB,KAAAmzC,SAAAyB,WAAA6mC,oBACAz7E,KAAA60E,YAAA6F,iBAAAn5E,IAEAvB,KAAAq2E,gBAAA90E,IAGAi6E,mBAAA,SAAAj6E,EAAA0tC,EAAAwW,GACAzlD,KAAA60E,YAAA6G,iBAAAn6E,GACAvB,KAAA60E,YAAA+F,YAAAr5E,GACAvB,KAAA60E,YAAAoE,cAAA13E,EAAAvB,KAAAmzC,SAAAyB,WAAA+mC,oBACA37E,KAAA4lD,eAAAC,WAAAjjD,MAAA5C,KAAA0nB,YAEA6zD,mBAAA,SAAAh6E,EAAA0tC,EAAA2c,GACA,GAA+HvlB,GAA/HyB,EAAA9nC,KAAAq0C,QAAA9yC,GAAAq6E,EAAA57E,KAAAmzC,SAAAyB,WAAAgnC,eAAA30D,QAAA,gBAA+H6gB,GAAA+zC,GAAA77E,KAAAg3C,QAAAz1C,GAAAmmB,WAAA0lB,EAAAptC,IAC/HqmC,GAAArmC,KAAAmzC,SAAA2oC,YAAAF,GACAznD,GAAA6X,iBAAA3F,GACAA,EAAA6F,KAAA,WACAkB,EAAAouC,mBAAA54E,MAAAwqC,EAAAyuC,KAEiBx1C,KAAA,GACjB+G,EAAAouC,mBAAA54E,MAAAwqC,EAAAyuC,IAGAnC,WAAA,SAAAn4E,EAAApB,EAAA47E,GACA,GAAAC,GAAAxrC,EAAAyrC,EAAA,EAAAC,EAAAl8E,KAAAs0C,SAAA0gB,UAAAzzD,IAAAvB,KAAAmzC,SAAA3H,QAAA2wC,UACAn8E,MAAAmzC,SAAA/W,QAAAggD,eACAp8E,KAAAu1E,mBAAA,GAAAv1E,KAAAw1E,uBAAA,IACAyG,EAAAj8E,KAAAw1E,uBAAA,GAEAwG,GACAt1D,MAAAu1D,IAGAF,IACA/7E,KAAAmzC,SAAA6U,8BAAA7zB,GAAAiU,kBAAAmC,eACAvqC,KAAA60E,YAAAwH,gBAEAr8E,KAAAmzC,SAAA7vB,WACAktB,EAAAxwC,KAAAu2C,YACAh1C,OAEAvB,KAAAs8E,mBAAAt8E,KAAAs8E,oBAAA9rC,EAAAN,aACAM,EAAAN,eAAAlwC,KAAAs8E,oBAAA9rC,EAAAN,eACAlwC,KAAAs0C,SAAAC,YACAv0C,KAAAu8E,aACAv8E,KAAAs8E,mBAAA,QAIAP,GACA/7E,KAAA60E,YAAA2H,eAAAj7E,EAAAvB,KAAAmzC,SAAAqQ,eAAArjD,GAAA67E,EAAAE,GACAl8E,KAAA60E,YAAA4H,gBAAAl7E,EAAAvB,KAAA01C,eAAAn0C,IAAA,EAAAvB,KAAAmzC,SAAAupC,WAAAhzB,iBAEA1pD,KAAA60E,YAAAhlC,QAAAtuC,EAAAvB,KAAAmzC,SAAAqQ,eAAArjD,GAAA67E,EAAAE,GACAl8E,KAAA60E,YAAA8H,gBAAAp7E,EAAAvB,KAAAk3B,QAAA31B,GAAAvB,KAAAmzC,SAAAupC,WAAAhzB,gBAEA1pD,KAAAw1E,wBAAA,GACAuG,GAAA/7E,KAAAmzC,SAAA/W,QAAAwgD,kBAAAzoD,GAAAiU,kBAAAmC,gBACAvqC,KAAAg6E,iBAAAz4E,IAGAg7E,WAAA,WACAv8E,KAAA60E,YAAAE,aACA/0E,KAAAi4B,oBAEA+hD,iBAAA,SAAAz4E,EAAAs7E,EAAAlR,GACA,GAAAjgD,GAAA1rB,KAAAy2C,QAAAl1C,GAAAu7E,EAAA98E,KAAA6/C,YAAAn0B,EACAA,IAAA,IACA/sB,SAAAk+E,GAAAl+E,SAAAgtE,IACAmR,EAAA98E,KAAA+8E,gBAAAF,EAAAlR,IAEA3rE,KAAA60E,YAAA1jC,WAAA5vC,EAAAu7E,KAGAC,gBAAA,SAAAC,EAAArR,GAEA,QAAAtnC,GAAAlkC,EAAAgjD,GACAj/B,IAAA+C,QAAA9mB,EAAAgjD,GAFA,GAAAj/B,GAAAlkB,KAAAmzC,SAAAtlC,KAAAovE,cAMA,OAFA54C,GAAA,YAA4B5sB,KAAA8Y,MAAAysD,EAAArR,EAAA,MAC5BtnC,EAAA,eAA+BrkC,KAAA6/C,YAAA8rB,IAC/BznD,GAEAq2D,2BAAA,SAAAh5E,EAAAoiB,GACA,GAAAjP,GAAAwoE,EAAAC,CACAzoE,GAAA1U,KAAAmzC,SAAAiqC,wBAAA1oE,KACAwoE,EAAAl9E,KAAAmzC,SAAAiqC,wBAAAF,iBACA,WAAAxoE,GACAyoE,EAAAx5D,EAAAu5D,GACAC,IACAA,EAAAn9E,KAAAmzC,SAAAtlC,KAAAwvE,YAEAr9E,KAAA60E,YAAAoE,cAAA13E,EAAA47E,GACAn9E,KAAAmzC,SAAAiqC,wBAAAE,eACAt9E,KAAAu9E,aAAAh8E,EAAA47E,IAEiB,YAAAzoE,EACjB1U,KAAA60E,YAAAoE,cAAA13E,EAAAvB,KAAAmzC,SAAAtlC,KAAAwvE,YACiB,SAAA3oE,GACjB1U,KAAAwB,IAAA,0CAAAkT,EAAA,0BAGA6oE,aAAA,SAAAh8E,EAAAsM,GACA7N,KAAA60E,YAAAQ,iBAAA9zE,GAAAuL,MAAAe,GAEAotE,gBAAA,SAAA15E,GACAvB,KAAAmzC,SAAA6U,8BAAA7zB,GAAAiU,kBAAAmC,eACAvqC,KAAA60E,YAAAuF,WAAA74E,IAGAm4C,WAAA,SAAAuJ,EAAA9iD,EAAAgO,GACA,GAAA+V,GAAAlkB,KAAA40E,QAAAtkE,UAAAopC,WAAA92C,MAAA5C,KAAA0nB,UACA1nB,MAAAmzC,SAAAqqC,YAAAt5D,IAEAm2B,YAAA,SAAAn2B,GACAlkB,KAAA40E,QAAAtkE,UAAA+pC,YAAAz3C,MAAA5C,KAAA0nB,WACA1nB,KAAAmzC,SAAAqqC,YAAAt5D,IAEAu5D,kBAAA,WACA,GAAArwC,GAAAptC,IACAA,MAAAmzC,SAAA7e,UAAAmnB,gBAAA,WACA,GAAAv3B,GAAAkpB,EAAA+F,SAAAmI,MAAAoiC,kBAAAC,EAAAvwC,EAAA+F,SAAAmI,MAAAjI,WACA,OAAAjG,GAAA+F,SAAAyqC,WAAA15D,EAAAy5D,KAGA/9B,oBAAA,SAAAr+C,EAAApB,GACAH,KAAAu1E,oBAAA,EACAv1E,KAAA40E,QAAAtkE,UAAAsvC,oBAAAh9C,MAAA5C,KAAA0nB,YAEAusB,uBAAA,SAAAvmC,EAAA+Z,EAAA2N,GACAp1B,KAAAu1E,mBAAA7nE,EAAA/J,OACA3D,KAAAw1E,uBAAA,EACAx1E,KAAA40E,QAAAtkE,UAAA2jC,uBAAArxC,MAAA5C,KAAA0nB,YAEAizD,sBAAA,SAAAzlC,GACA,GAAA8E,GAAAh6C,KAAA01C,eAAAR,GAAA2oC,EAAA79E,KAAAu2C,YACAh1C,GAAA2zC,IACiB9F,MACjByuC,KAAA1pD,GAAAib,OAAAkD,UAAA0H,IAAAh6C,KAAAmzC,SAAAupC,WAAAoB,aAAAC,mBAAA5pD,GAAAiU,kBAAA8C,eACAlrC,KAAA60E,YAAA4H,gBAAAvnC,EAAA8E,EAAAh6C,KAAAmzC,SAAAupC,WAAAhzB,gBAGA7W,eAAA,SAAAgH,GACA,GAAAt4C,GAAAvB,KAAA40E,QAAAtkE,UAAAuiC,eAAAjwC,MAAA5C,KAAA0nB,UAKA,OAJA1nB,MAAA05E,WAAAn4E,EAAAvB,KAAAq0C,QAAA9yC,IAAA,GACAvB,KAAA60E,YAAAyE,YAAA/3E,GACAvB,KAAA60E,YAAAgF,WAAAt4E,GACAvB,KAAAk6E,sBAAA34E,GACAA,GAEA89C,SAAA,SAAA99C,EAAA6vC,GACApxC,KAAA40E,QAAAtkE,UAAA+uC,SAAAz8C,MAAA5C,KAAA0nB,WACA1nB,KAAA60E,YAAA1jC,WAAA5vC,EAAAvB,KAAA6/C,YAAAzO,KAEAyV,wBAAA,WACA7mD,KAAA60E,YAAAC,gBACA90E,KAAA40E,QAAAtkE,UAAAu2C,wBAAAjkD,MAAA5C,KAAA0nB,gBAIAyM,GAAA6pD,aAAA,SAAAhxC,EAAA0Q,GACA,YACA,IAAAtQ,GAAAptC,IACAA,MAAA40E,QAAAl3B,EAAAvpB,GAAAupB,GAAA1oB,kBAAAb,GAAAa,kBACAh1B,KAAA40E,QAAAhyE,MAAA5C,KAAA0nB,WACAyM,GAAAxkB,OAAA3P,KAAAmzC,UACAnkC,QAAA,KACAlG,OAAA,KACAm1E,YAAA,KACA/G,aACAC,kBACAqC,sBAAA,GAEA3rE,MACAovE,eAAA,6BACAI,WAAA,gBACAtD,mBAAA,gBACArhB,OAAA,UAEAx6D,SAAA,cACAixB,SACAgqD,SAAA,qBACAnN,UAAA,sBACA1rE,QAAA,oBACA65E,KAAA,iBACAnlE,SAAA,cACAkE,KAAA,UACA2a,WAAA,8BAEAupD,yBACA1oE,KAAA,UACAwoE,iBAAA,QACAI,eAAA,GAEApyE,UACAgzE,kBAAA,6BACAC,mBAAA,kFAEAloD,OACAilD,mBAAA,EACAC,cAAA,oCAEAvmC,YACA0mC,cAAA,EACAM,eAAA,8CACAD,mBAAA,cACAF,mBAAA,iBAEAr/C,SACAwgD,kBAAA,EACAR,cAAA,GAEA9gC,OACA8iC,eAAA,EACAV,kBAAA,0BAEAhB,YACAhzB,cAAA,KACA20B,SAAA,EACAP,cACAC,mBAAA,EACAO,iBAAA,KACAC,YAAA,MAEAC,kBAAA,KAEAhzC,SACA2wC,YAAA,GAEAqB,YAAA,SAAAt5D,GACA,MAAAkpB,GAAAynC,YAAA4J,UAAA,SACArxC,EAAAynC,YAAA6J,WAAA,QAAAx6D,OAEArJ,YAAA,WACAqK,OAAA2+B,MAAA3/B,IACqB,IAGrB43D,YAAA,SAAA53D,GACA,MAAAkpB,GAAAynC,YAAA4J,UAAA,WACArxC,EAAAynC,YAAA6J,WAAA,UAAAx6D,GAEAgB,OAAAy5D,QAAAz6D,IAGA05D,WAAA,SAAA15D,EAAA06D,GACA,MAAAxxC,GAAAynC,YAAA4J,UAAA,UACArxC,EAAAynC,YAAA6J,WAAA,SAAAx6D,EAAA06D,GAEA15D,OAAAlJ,OAAAkI,EAAA06D,MAGS,GACTzqD,GAAAxkB,OAAA3P,KAAAmzC,SAAAnG,GAAA,GACAhtC,KAAA60E,YAAA,GAAA1gD,IAAA0qD,YACAr9E,IAAA2yB,GAAAtxB,KAAA7C,KAAAwB,IAAAxB,MACA8+E,eAAA9+E,KAAAmzC,SAAAj1C,SACA6gF,YAAA/+E,KAAAmzC,SAAAnkC,QACAgwE,gBAAAh/E,KAAAmzC,SAAA8qC,YACAn1E,OAAA9I,KAAAmzC,SAAArqC,OACA2/D,eAAAzoE,KAAAy1C,gBACAtmB,SACAjW,KAAAlZ,KAAAmzC,SAAAhkB,QAAAjW,KACAlE,SAAAhV,KAAAmzC,SAAAhkB,QAAAna,UAEA+vD,QACAka,UAAAj/E,KAAAmzC,SAAAupC,WAAA2B,SACAG,kBAAAx+E,KAAAmzC,SAAAupC,WAAA8B,mBAEAV,cACAoB,gBAAAl/E,KAAAmzC,SAAAupC,WAAAoB,aAAAC,kBACAoB,sBAAAn/E,KAAAmzC,SAAAupC,WAAAoB,aAAAQ,iBACAc,oBAAAp/E,KAAAmzC,SAAAupC,WAAAoB,aAAAS,aAEA1wE,KAAA7N,KAAAmzC,SAAAtlC,OAEA7N,KAAAmzC,SAAA2J,YAAA8G,mBAAAzvB,GAAAwR,UAAAxR,GAAA0R,YACA7lC,KAAA60E,YAAAwK,cAAAr/E,KAAAmzC,SAAAjoC,SAAAwoB,+BACSS,GAAAiU,kBAAAuD,WAAA3rC,KAAAmzC,SAAA0H,KAAA+H,WAAAzuB,GAAAiU,kBAAAwD,WACT5rC,KAAA60E,YAAAwK,cAAAr/E,KAAAmzC,SAAAjoC,SAAAizE,qBAEAn+E,KAAA0nD,iBACA1nD,KAAA60E,YAAA7V,SACAh/D,KAAAk5E,SAAAl5E,KAAAmzC,SAAAhkB,SACAnvB,KAAAmzC,SAAArqC,QAAA9I,KAAA60E,YAAA/+B,cACA91C,KAAAugD,iBAAAvgD,KAAA48C,qBACA5tC,QAAAhP,KAAA60E,YAAA/+B,YACAhpC,MAAA9M,KAAAmzC,SAAAtlC,KAAAyvC,iBACiBhP,eAEjBtuC,KAAAy1E,kCACAthD,GAAAC,aAAAD,GAAAiU,kBAAA2C,WACA/qC,KAAAi1E,KAAAj1E,KAAAs1E,qBAEAt1E,KAAAmzC,SAAAmI,MAAAD,eAAAr7C,KAAAmzC,SAAAmI,MAAA8iC,gBACAjqD,GAAAinB,aACAp7C,KAAAy9E,oBAEAz9E,KAAAwB,IAAA,4CAGAxB,KAAAu1E,mBAAA,EACAv1E,KAAAw1E,uBAAA,IAGArhD,GAAAxkB,OAAAwkB,GAAA6pD,aAAA1tE,UAAA6jB,GAAAoe,eACApe,GAAAxkB,OAAAwkB,GAAA6pD,aAAA1tE,UAAA6jB,GAAAylB,gBACAzlB,GAAAxkB,OAAAwkB,GAAA6pD,aAAA1tE,UAAA6jB,GAAAwgD,aACAxgD,GAAAxkB,OAAAwkB,GAAA6pD,aAAA1tE,UAAA6jB,GAAAiiD,cACAjiD,GAAA0qD,WAAA,SAAA/uC,GACA,YACA,IAwDiCtuC,GAAA89E,EAAAC,EAAAC,EAAAruE,EAAA4wC,EAAA09B,EAAAC,EAxDjCC,EAAA,aAAAC,EAAA,cAAAC,EAAA,cAAAC,EAAA,kBAAAC,EAAA,mBAAAC,EAAA,oBAAAC,EAAA,iBAAAC,EAAA,oBAAAC,GACAzwE,QAAAuL,SAAAmlE,yBACAxyE,QACSyyE,GAAA,EAAAC,EAAA,EAAAC,GAAA,EAAAC,KAAAC,KAAAxiF,GACTuD,IAAA,KACAujE,QACAka,UAAA,EACAT,kBAAA,KAEAM,eAAA,cACAC,YAAA,KACAC,gBAAA,KACAl2E,OAAA,KACA2/D,eAAA,KACAt5C,SACAjW,KAAA,UACAlE,SAAA,eAEA8oE,cACAoB,iBAAA,EACAC,sBAAA,KACAC,oBAAA,MAEAvxE,MACA6qD,OAAA,WAESgoB,GACT53E,OAAA,4BACA63E,YAAA,2BACAC,mBAAA,4BACAC,cAAA,6BACAC,cAAA,6BACAC,eAAA,wBACAC,aAAA,4BACAC,SAAA,uBACAC,KAAA,+BACA7kE,KAAA,0BACA8kE,qBAAA,qCACA71C,YAAA,2BACA81C,0BAAA,2CACAC,iBAAA,iCACAhkE,KAAA,0BACAikE,QAAA,6BACA51D,KAAA,0BACAwoB,OAAA,4BACA7I,MAAA,2BACAk2C,eAAA,8BACAC,aAAA,4BACAvrD,MAAA,2BACAwrD,WAAA,iCACAC,kBAAA,4BACAC,aAAA,iCACAC,SAAA,oCACAC,eAAA,8BACAC,sBAAA,sCACAC,UAAA,yBACSC,KAAwBC,EAAA,GAAA9tD,IAAAkP,QAAA6+C,EAAA,GAAA/tD,IAAAkP,QAAA8+C,EAAA,WACjC,GAAAC,GAAAnkF,EAAA6/E,aAAAqB,sBAAAkD,EAAApkF,EAAA6/E,aAAAsB,oBAAAtvC,GACAsF,QAAAqrC,EACA9qC,MAAA+pC,EAEAD,KACA2C,EACAnkF,EAAAwqE,eAAA7yB,SAAAwsC,EAAA,GAAA32E,OAAAqkC,GAAA5D,KAAA,SAAAo2C,GACAL,EAAA3hF,QAAAgiF,IACqB,WACrBL,EAAAz+C,UACAhiC,EAAA,wDAAA4gF,EAAA,WAGAH,EAAAz+C,UAEA6+C,EACApkF,EAAAwqE,eAAA7yB,SAAAysC,EAAA,GAAA52E,OAAAqkC,GAAA5D,KAAA,SAAAo2C,GACAJ,EAAA5hF,QAAAgiF,IACqB,WACrBJ,EAAA1+C,UACAhiC,EAAA,gEAAA6gF,EAAA,WAGAH,EAAA1+C,YAGS++C,EAAA,SAAAR,GACT,GAAAS,GAAA,GAAAruD,IAAAkP,OAiBA,OAhBA6+C,GAAAh2C,KAAA,SAAAivB,GACAsnB,EAAAtnB,EAAA4mB,GACAA,EAAAvtE,IAQAguE,EAAAliF,WAPAyhF,EAAAvtE,IAAA2mD,EAAA3mD,IACAutE,EAAAz+C,OAAA,WACAy+C,EAAAz+C,OAAA,KACArrB,GAAA8pE,GACAS,EAAAliF,aAKa,WACb4Y,EAAA6oE,GACAS,EAAAliF,YAEAkiF,GACSE,EAAA,SAAAnhF,EAAAyhC,EAAA8M,GACT,GAAAiyC,GAAAY,EAAAphF,EAGA,OAFAC,GAAA,gCAAAD,GACAyhC,EAAA4/C,cAAArhF,EACAtD,EAAAwqE,eAAA7yB,SAAA5S,EAAA++C,EAAAjyC,GAAA5D,KAAA,WACAo0C,IACAroE,GAAA8pE,GACAC,EAAAzgF,GAAAjB,WACa,WACb0hF,EAAAzgF,GAAAiiC,UACAvlC,EAAA6/E,aAAAoB,iBACA2D,EAAAthF,EAAAwgF,MAGSe,EAAA,WACT,GAAAtC,EAAA78E,OAAA,CACA48E,GAAA,CACA,IAAAwC,GAAAvC,EAAAtmE,OACA6oE,GAAAC,OACAC,EAAAF,GAEAG,EAAAH,OAGAxC,IAAA,GAES4C,EAAA,SAAA5hF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAxsC,SACSmvC,EAAA,SAAA9hF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAa,iBACS+B,EAAA,SAAAlkF,GACT,MAAAgkF,GAAAjyE,EAAAuvE,EAAAthF,EAAA,YACSmkF,EAAA,SAAAhiF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAc,eACSgC,EAAA,WACT,MAAAJ,GAAAjyE,EAAAuvE,EAAAmB,iBACS4B,EAAA,SAAAliF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAiB,eACSzqD,EAAA,SAAA31B,GACT,MAAA4+E,GAAAvyE,IAAArM,IAAA4yB,GAAA4tB,GAAAzkB,gBAAAsiD,EAAAr+E,IACSqmC,EAAA,SAAArmC,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAArjE,OACSqmE,EAAA,SAAAniF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAr1C,QACSs4C,EAAA,SAAApiF,GACT,aAAAA,EACA6hF,EAAAjyE,EAAAuvE,EAAAU,4BAAAgC,EAAAjyE,EAAAuvE,EAAAW,kBAEA+B,EAAAlsD,EAAA31B,GAAAm/E,EAAAS,uBAAAiC,EAAAlsD,EAAA31B,GAAAm/E,EAAAp1C,cACSs4C,EAAA,SAAAriF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAzqD,QACSwgB,EAAA,SAAAl1C,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAh1D,OACSm4D,EAAA,SAAAtiF,GACT,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAY,UACS8B,EAAA,SAAAtyD,EAAAgzD,GACT,MAAAhzD,IAAAqD,GAAArD,GAAAwM,gBAAAwmD,IACSnB,EAAA,SAAAphF,GACT,MAAAk+E,IAAA2D,EAAAlsD,EAAA31B,GAAAm/E,EAAAqB,YACS7oE,EAAA,SAAA3J,GACTA,GAAA4kB,GAAA5kB,GAAAgD,SAAAtU,EAAAkxB,QAAAjW,OACSupE,EAAA,SAAA/iF,EAAAqiF,GACT,GAAAx5B,GAAA7oD,EAAAy8B,MAAAosB,SAAAD,EAAA5oD,EAAAy8B,MAAAmsB,SACAA,IAAAC,IAAAw5B,EAAA5lD,MAAAosB,WAAAw5B,EAAA5lD,MAAAmsB,WACAn0B,GAAA4tD,GAAAvuE,KACA+0C,WACAD,eAGSu6B,EAAA,SAAAthF,EAAAwgF,GACT,GAAAgC,GAAA/B,EAAAzgF,KAAA,GAAA4yB,IAAAkP,SAAAG,UAAAwgD,EAAA,GAAA7vD,IAAAkP,OAcA,OAbA4+C,GAAA/1C,KAAA,SAAAivB,GACA4oB,EAAA73C,KAAA,WACA83C,EAAA1jF,WACiB,WACjBmiF,EAAAtnB,EAAA4mB,GACAA,EAAAz+C,OAAA,WACAy+C,EAAAz+C,OAAA,KACA0gD,EAAA1jF,WAEAyhF,EAAAvtE,IAAA2mD,EAAA3mD,IACAyD,GAAA8pE,OAGAiC,GACSC,EAAA,WACT,GAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA1S,EAAAkQ,EAAAF,EAAA2C,EAAAC,CAEA,IADAjjF,EAAA,oBACA,MAAAvD,EAAA6gF,eACA,SAAAruD,OAAA,oDAEA,IAAA0D,GAAAvQ,SAAA3lB,EAAA6gF,gBAAA,CAEA,GADAoF,EAAAjpE,SAAA2F,eAAA3iB,EAAA6gF,gBACA,OAAAoF,EACA,SAAAzzD,OAAA0D,GAAAjyB,OAAA,0CAAoFjE,EAAA6gF,gBAEpFqF,GAAAD,EAAAh+C,cACa,CACb,GAAAvnC,SAAAV,EAAA6gF,eAAA54C,UACA,SAAAzV,OAAA,gGAEA0zD,GAAAlmF,EAAA6gF,eAAA54C,UA8CA,GA5CAi+C,EAAAhwD,GAAAmM,QAAA6jD,GACAE,EAAAppE,SAAA0mB,cAAA,OACA0iD,EAAA/8C,YAAAnT,GAAA6R,UAAAm+C,IACAM,EAAAtwD,GAAAkwD,GAAA/mD,gBAAAojD,EAAAO,UACAhjF,EAAA6K,SACAy7E,EAAApwD,GAAAkwD,GAAA/mD,gBAAAojD,EAAA53E,QACAy7E,GACApwD,GAAAowD,GAAAprE,UAGAgb,GAAAC,aAAAD,GAAAiU,kBAAA2C,WACA82C,EAAA1tD,GAAAkwD,GAAA/mD,gBAAAojD,EAAAmB,gBACAA,GACA1tD,GAAA0tD,GAAA1oE,UAGA04D,EAAA19C,GAAAkwD,GAAA/mD,gBAAAojD,EAAAQ,MACArP,IAAA19C,GAAAC,cACA5yB,EAAA,kCACA2yB,GAAA09C,GAAA14D,UAEAgb,GAAAiU,kBAAA2C,SAOa5W,GAAAswD,GAAAzmD,aAAAgiD,IAAAnO,IACb2S,EAAArwD,GAAA09C,GAAAv0C,gBAAAojD,EAAAkB,UACA4C,GAAArwD,GAAAqwD,GAAArrE,WARAsrE,EAAAh2C,gBAAAuxC,GACAnO,GAAA19C,GAAA09C,GAAA7zC,aAAA+hD,IACA5rD,GAAA09C,GAAAr+D,KACA4oB,QAAA,UAOA2lD,EAAA5tD,GAAAkwD,GAAA/mD,gBAAAojD,EAAAqB,WACAtC,EAEasC,IACbtB,EAAArtB,SAAA2uB,EAAAxyD,aAAAswD,IACAY,IAAA,EAAAA,EAAA,KACAf,EAAAvrD,GAAA4tD,GAAA/jD,aAAA8hD,IAJAiC,GAAA5tD,GAAA4tD,GAAA5oE,SAMAsmE,KAAAsC,EACAzC,EAAAnrD,GAAAkwD,GAAAlnD,WAAAujD,EAAAgB,mBAAA/9E,OAAA,EACA47E,EAAAprD,GAAAkwD,GAAAlnD,WAAAujD,EAAAzqD,OAAAtyB,OAAA,EACAygF,EAAAjwD,GAAAkwD,GAAA/mD,gBAAAojD,EAAArkE,MACA,MAAA+nE,EACA,SAAA3zD,OAAA,0DAQA,OANA6zD,GAAAF,EAAA7mD,SAAA,GAAAmnD,WAAA,GACAN,EAAAl+C,UAAA,GACAm+C,EAAAhnD,qBAAA,UAAA15B,QACAsX,SAAA0mB,cAAA,UAEAngC,EAAA,8BAEAtD,SAAAmmF,EACAM,aAAAL,IAESM,EAAA,SAAAr1E,EAAAmX,EAAAq7B,GACT,GAAA8iC,GAAA9iC,EAAA+iC,EAAAD,EAAApnD,UACA/W,GAAA,IACAo+D,EAAA3wD,GAAA0wD,GAAAtnD,WAAA7W,GAAAiX,aAEAknD,EAAA9rE,aAAAxJ,EAAAu1E,IACS5B,EAAA,SAAAH,GACT,GAAAxhF,GAAAwhF,EAAAxhF,GAAAwjF,EAAAhC,EAAAgC,cAAAC,EAAAD,KAAAnC,cAAAb,EAAAY,EAAAphF,GAAAuuC,GACAwF,qBAAAytC,EAAAztC,qBACAF,QAAAqrC,EACA72B,QAAA,EACAjU,OAAA,EAEAxhB,IAAAiU,kBAAA8C,cACA62C,EACA9jF,EAAA8mE,OAAAka,WAAAhhF,EAAA8mE,OAAAka,WAAAqB,GACAuC,EAAAthF,EAAAwgF,GACAe,KAEAP,EAAAR,GAAAjgE,KAAA,WACAkgE,EAAAzgF,GAAA,GAAA4yB,IAAAkP,QACA2+C,EAAAzgF,GAAAugB,KAAA,WACAjH,WAAAioE,EAAA7kF,EAAA8mE,OAAAyZ,qBAEA,MAAAwG,EACAC,GAAA1jF,EAAAyjF,GAEAtC,EAAAnhF,EAAAwjF,EAAAj1C,KAKAgzC,IAEaf,IACbQ,EAAAR,GACAe,MAESG,EAAA,SAAAF,GACT,GAAAxhF,GAAAwhF,EAAAxhF,GAAAy4C,EAAA+oC,EAAA/oC,aAAAkrC,EAAAnC,EAAAmC,eAAAnD,EAAAY,EAAAphF,GAAAuuC,GACAwF,qBAAAytC,EAAAztC,qBACAK,MAAA+pC,EACAtqC,QAAAqrC,EAEA,IAAAsB,EACA,GAAA/nC,EAAA,CACA,KAAA/7C,EAAA8mE,OAAAka,WAAAhhF,EAAA8mE,OAAAka,WAAAqB,GAOA,MAHA4E,IACA3C,EAAAR,GAEA9jF,EAAAwqE,eAAA7yB,SAAAoE,EAAA+nC,EAAAjyC,GAAA5D,KAAA,WACAj0B,GAAA8pE,GACAzB,IACAzlE,WAAAioE,EAAA7kF,EAAA8mE,OAAAyZ,oBACyB,WACzBqE,EAAAthF,EAAAwgF,GACAlnE,WAAAioE,EAAA7kF,EAAA8mE,OAAAyZ,oBAZAqE,GAAAthF,EAAAwgF,GACAe,QAeAD,GAAAthF,EAAAwgF,GACAe,KAGSqC,GAAA,SAAA5jF,EAAA6jF,GACT,GAAAC,GAAA1B,EAAApiF,GAAA+jF,EAAA,MAAA/jF,EAAAm/E,EAAAW,iBAAAX,EAAAp1C,WACA+5C,KAAAlxD,GAAAkxD,GAAAhqE,SAAAiqE,KACAD,EAAAlxD,GAAAkxD,GAAA/nD,gBAAAgoD,IAEAD,IACAlxD,GAAAkxD,GAAA7xE,KACA8D,MAAA8tE,EAAA,MAEAC,EAAA3qE,aAAA,gBAAA0qE,KAESntE,GAAA,SAAA1I,GACTA,GAAA4kB,GAAA5kB,GAAAkD,YAAAxU,EAAAkxB,QAAAjW,OACS+rE,GAAA,SAAAM,EAAAC,GACT,GAAAC,GAAA9C,EAAA4C,GAAAG,EAAA/C,EAAA6C,EACAhkF,GAAA2yB,GAAAjyB,OAAA,qFAAoGqjF,EAAAC,MACpGxD,EAAAwD,GAAAt5C,KAAA,WACAo0C,IACA0B,EAAAuD,GAAAjlF,UACAkB,EAAA2yB,GAAAjyB,OAAA,uEAAkGsjF,EAAAD,IAClGE,EAAAjxE,IAAAkxE,EAAAlxE,IACAyD,GAAAwtE,IACa,WACbzD,EAAAuD,GAAA/hD,UACAvlC,EAAA6/E,aAAAoB,iBACA2D,EAAA0C,EAAAE,KAIAtxD,IAAAxkB,OAAA1R,EAAA6xC,GACAtuC,EAAAvD,EAAAuD,IACA2yB,GAAAiU,kBAAA8C,gBACAjtC,EAAA8mE,OAAAyZ,kBAAA,EACAvgF,EAAA8mE,OAAAka,UAAA,GAEA9tE,EAAAlT,EAAA8gF,YACAU,EAAA9gF,SAAAV,EAAAwqE,eACA+W,EAAAyE,IACA9B,IACAhuD,GAAAxkB,OAAA3P,MACAg/D,OAAA,WACAx9D,EAAA,8BACA8+E,EAAA,EACAnvE,EAAAm2B,YAAAk4C,EAAAthF,SAAAwmF,WAAA,IACAxrE,EAAAsqE,KACAxjF,KAAA2lF,oBACA5jC,EAAA9jD,EAAA+gF,iBAAAoE,EAAAjyE,EAAAuvE,EAAArkE,MACA7a,EAAA,gCAEA69E,cAAA,SAAAn7D,GACA,GAAA0hE,GAAAzxD,GAAA6R,UAAA9hB,EACA/S,GAAA+0B,UAAA,GACA/0B,EAAAm2B,YAAAs+C,IAEA57D,MAAA,WACA7Y,EAAA+0B,UAAA,GACAlmC,KAAAg/D,UAEA+V,WAAA,WACAhzB,EAAA7b,UAAA,IAEAm2C,cAAA,WACAgE,GAAA,GAEAxwC,QAAA,SAAAtuC,EAAApB,EAAA0lF,EAAAC,EAAAC,GACA,GAAAC,GAAAC,EAAAzG,EAAAmF,aAAAD,WAAA,GAAAwB,EAAA9C,EAAA6C,EAAAvF,EAAArjE,MAAAonE,EAAArB,EAAAjyE,EAAAuvE,EAAAO,UAAAjtC,EAAA+xC,EAAA5F,EAAAzwE,QAAAqyC,CACAgkC,KACA5F,EAAAvyE,IAAArM,GAAA0kF,GAEA9xD,GAAA8xD,GAAA1zE,SAAAqtE,EAAAr+E,GACAkjF,EAAAh2C,gBAAAuxC,GACAkG,IACA/xD,GAAA+xD,GAAAtoD,QAAAz9B,GACA+lF,EAAAxrE,aAAA,QAAAva,IAEA8lF,EAAAvrE,aAAAilE,EAAAp+E,GACAskF,EACAjB,EAAAqB,EAAAJ,EAAAn/D,MAAAstB,GAEAA,EAAA1M,YAAA2+C,GAEAH,GACAG,EAAA9pD,MAAAC,QAAA,OACAjI,GAAA8xD,GAAA1zE,SAAA2tE,KAEAhnE,EAAAyqE,EAAApiF,IACA2X,EAAAu9B,EAAAl1C,IACA2X,EAAAqqE,EAAAhiF,IACA2X,EAAA0qE,EAAAriF,IACA2X,EAAAwqE,EAAAniF,IACA2X,EAAAmqE,EAAA9hF,IACA8+E,GACArgF,KAAA65E,WAAAt4E,GAEAykF,EAAArD,EAAAphF,GACAykF,MAAAxxE,KACA0tE,EAAAh2C,KAAA,SAAAi6C,GACAH,EAAAxxE,IAAA2xE,EAAA3xE,IACA2xE,EAAAhqD,MAAAmsB,WAAA69B,EAAAhqD,MAAAosB,UACAp0B,GAAA6xD,GAAAxyE,KACA80C,UAAA69B,EAAAhqD,MAAAmsB,UACAC,SAAA49B,EAAAhqD,MAAAosB,WAGAtwC,GAAA+tE,OAKAxJ,eAAA,SAAAj7E,EAAApB,EAAA0lF,EAAAC,GACA9lF,KAAA6vC,QAAAtuC,EAAApB,EAAA0lF,EAAAC,GAAA,IAEAhR,cAAA,WACA/yB,EAAAza,YAAA64C,EAAAzwE,SACAywE,EAAAzwE,QAAAuL,SAAAmlE,yBACAD,EAAAvyE,QAEA0oE,WAAA,SAAA/0E,GACA4yB,GAAA+C,EAAA31B,IAAA4X,UAEA88D,UAAA,SAAA1mE,GACA,GAAA62E,GAAA72E,CACA,IAAA62E,EAAA,CACA,WAAAA,EAAA72D,aAAAowD,IACAyG,IAAAh9D,UAEA,OAAAgqC,UAAAgzB,EAAA72D,aAAAowD,MAGA0G,YAAA,WACA,MAAAtkC,IAEAg3B,qBAAA,SAAAx3E,GACA,GAAAszB,GAAA+S,EAAArmC,EACAszB,IAAAV,GAAAU,GAAAtiB,SAAAtU,EAAAkxB,QAAAna,WAEA2gE,eAAA,SAAAp0E,EAAApB,GACA,GAAAmmF,GAAA1+C,EAAArmC,EACA+kF,KACAnyD,GAAAmyD,GAAA1oD,QAAAz9B,GACAmmF,EAAA5rE,aAAA,QAAAva,KAGAw4E,aAAA,SAAAp3E,GACA2X,EAAA0uB,EAAArmC,KAEAs3E,aAAA,SAAAt3E,GACA0W,GAAA2vB,EAAArmC,KAEAglF,WAAA,SAAAh3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAArjE,OAEAy4B,UAAA,WACA,MAAA73C,GAAA6K,QAAAs6E,EAAAjyE,EAAAuvE,EAAA53E,SAEA0uE,mBAAA,WACAt+D,EAAAsqE,MAEAjM,mBAAA,WACAt/D,GAAAurE,MAEAlM,YAAA,WACA,MAAA8L,GAAAjyE,EAAAuvE,EAAAQ,OAEAlJ,uBAAA,WACA,MAAAsH,IAEAtG,UAAA,SAAAz3E,GACA2X,EAAA0qE,EAAAriF,KAEA84E,gBAAA,WACA,MAAAkF,IAEAjF,UAAA,SAAA/4E,GACA0W,GAAA2rE,EAAAriF,KAEA8zE,iBAAA,SAAA9zE,GACA,MAAA21B,GAAA31B,IAEAu3E,aAAA,SAAAv3E,GACA,GAAAwL,GAAA02E,EAAAliF,EACAwL,IAAAonB,GAAApnB,GAAAwF,SAAAtU,EAAAkxB,QAAAna,WAEAogE,gBAAA,SAAA7zE,GACA,MAAA4yB,IAAA+C,EAAA31B,IAAA8Z,SAAA6kE,IAEAtH,aAAA,SAAAr3E,GACA,GAAAwL,GAAA02E,EAAAliF,EACAwL,IAAAonB,GAAApnB,GAAA0F,YAAAxU,EAAAkxB,QAAAna,WAEAwxE,WAAA,SAAAj3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAiB,cAAA,IAEAlJ,aAAA,SAAAl3E,GACA,MAAA6hF,GAAAlsD,EAAA31B,GAAAm/E,EAAAgB,oBAEA+E,YAAA,SAAAl3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAgB,mBAAA,IAEA9H,eAAA,SAAAr4E,EAAAu8C,EAAAxmB,GACA,GAAA8tD,GAAAC,EAAA1B,EAAApiF,EACA8jF,IAAA/tD,EAAA,IACA8tD,EAAA3tE,KAAA8Y,MAAAutB,EAAAxmB,EAAA,KACA,MAAA8tD,EACAlsE,EAAAmsE,GAEAptE,GAAAotE,GAEAF,GAAA5jF,EAAA6jF,KAGAjZ,oBAAA,SAAAruB,EAAAxmB,GACAt3B,KAAA45E,eAAA,KAAA97B,EAAAxmB,IAEAwiD,aAAA,SAAAv4E,GACA,GAAA8jF,GAAA1B,EAAApiF,EACA8jF,IAAAnsE,EAAAmsE,IAEAM,kBAAA,WACA3lF,KAAA85E,gBAEAsB,cAAA,SAAA75E,GACA4jF,GAAA5jF,EAAA,GACAvB,KAAA2lF,kBAAApkF,IAEAg4E,mBAAA,WACAv5E,KAAAo7E,iBAEAhB,WAAA,SAAA74E,GACA,IAAA8+E,EAAA,CACA,GAAAnsC,GAAAivC,EAAA5hF,EACA2yC,IAAA/f,GAAA+f,GAAAzhC,YAAAxU,EAAAkxB,QAAAjW,QAGA2gE,WAAA,SAAAt4E,GACA2X,EAAAiqE,EAAA5hF,KAEAmlF,SAAA,SAAAn3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAxsC,QAAA,IAEA2mC,WAAA,SAAAt5E,GACA0W,GAAAyrE,EAAAniF,IACA2X,EAAAmqE,EAAA9hF,KAEAq0E,aAAA,SAAAr0E,GACAvB,KAAAi5E,cAAA13E,EAAAtD,EAAA4P,KAAA6qD,QACA14D,KAAA2mF,oBAAAplF,GACA2X,EAAA2qE,EAAAtiF,KAEA63E,UAAA,SAAA73E,GACA2X,EAAAwqE,EAAAniF,KAEAqlF,QAAA,SAAAr3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAr1C,OAAA,IAEAw7C,iBAAA,SAAAt3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAa,gBAAA,IAEAoF,oBAAA,SAAAplF,GACA0W,GAAAorE,EAAA9hF,IACA2X,EAAAwqE,EAAAniF,KAEAu0E,gBAAA,SAAAv0E,GACAvB,KAAAi5E,cAAA13E,EAAA,IACAvB,KAAA66E,WAAAt5E,GACA0W,GAAA4rE,EAAAtiF,KAEAm5E,iBAAA,SAAAn5E,GACA0W,GAAAsrE,EAAAhiF,KAEAm6E,iBAAA,SAAAn6E,GACA2X,EAAAqqE,EAAAhiF,KAEAulF,eAAA,SAAAv3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAc,cAAA,IAEAuF,QAAA,SAAAx3E,GACA,MAAA4kB,IAAA5kB,GAAA8L,SAAAqlE,EAAAzqD,OAAA,IAEAkb,WAAA,SAAA5vC,EAAAsM,GACA,GAAA6d,GAAA+qB,EAAAl1C,EACAmqB,KACAzT,GAAAyT,GACAyI,GAAAzI,GAAAkS,QAAA/vB,KAGAorE,cAAA,SAAA13E,EAAAsM,GACA,GAAAm5E,GAAA5D,EAAAlsD,EAAA31B,GAAAm/E,EAAAe,WACAuF,KACA,MAAAn5E,EACAsmB,GAAA6yD,GAAAjpD,YAEA5J,GAAA6yD,GAAAppD,QAAA/vB,KAIAyrE,YAAA,SAAA/3E,GACA4yB,GAAA+C,EAAA31B,IAAAkR,YAAAwtE,GACA/mE,EAAA2qE,EAAAtiF,KAEAq5E,YAAA,SAAAr5E,GACA4yB,GAAA+C,EAAA31B,IAAAgR,SAAA0tE,GACAhoE,GAAA4rE,EAAAtiF,KAEAo7E,gBAAA,SAAAp7E,EAAAwjF,EAAAzvC,GACAt1C,KAAAo1E,gBAAA7zE,KACAi/E,EAAA36E,MACAtE,KACA+zC,uBACAyvC,mBAEAxE,GAAAuC,MAGArG,gBAAA,SAAAl7E,EAAAy4C,EAAAkrC,EAAA5vC,GACAt1C,KAAAo1E,gBAAA7zE,KACAi/E,EAAA36E,MACAyvC,uBACA0tC,QAAA,EACAzhF,KACAy4C,eACAkrC,oBAEA3E,GAAAuC,MAGArE,UAAA,SAAAr/E,GACA,MAAA+0B,IAAAiU,kBAAAyC,iBAAAy4C,EAAAlkF,IAEAs/E,WAAA,SAAAt/E,EAAA8kB,EAAA06D,GACA,GAAAqI,GAAA3D,EAAAlkF,GAAA8nF,EAAA9D,EAAA6D,EAAAvG,EAAAI,eAAAqG,EAAAF,EAAA5pD,qBAAA,YAAA+pD,EAAAhE,EAAA6D,EAAAvG,EAAAE,oBAAAyG,EAAAjE,EAAA6D,EAAAvG,EAAAK,gBAAA39C,EAAA,GAAAjP,IAAAkP,QAAAikD,EAAA,WACAF,EAAA3qD,oBAAA,QAAA8qD,GACAF,KAAA5qD,oBAAA,QAAA+qD,GACApkD,EAAAI,WACiB+jD,EAAA,WACjBH,EAAA3qD,oBAAA,QAAA8qD,GACAN,EAAAQ,SACiBD,EAAA,WACjBP,EAAAxqD,oBAAA,QAAA6qD,GACAD,EAAA5qD,oBAAA,QAAA+qD,GACAP,EAAAQ,QACArkD,EAAA9iC,QAAA6mF,KAAA3oF,OAUA,OARAyoF,GAAA3qD,iBAAA,QAAAgrD,GACAF,EAAA9qD,iBAAA,QAAAirD,GACAF,KAAA/qD,iBAAA,QAAAkrD,GACAL,IACAA,EAAA3oF,MAAAogF,GAEAsI,EAAAppD,YAAA5Z,EACA+iE,EAAAS,YACAtkD,MAIAjP,GAAAwzD,eAAA,SAAAvmE,EAAAwmE,GACA,YAcA,SAAAjO,YAAA3qE,GACAi5B,EAAA5L,OAAArtB,EAAA8gC,EAAApmB,UAAA,SAAApE,GACAA,KAAAJ,OAAAI,KACA,IAAAplB,GAAAolB,EAAAplB,QAAAolB,EAAAuiE,UACA/3C,GAAAg4C,UAAA5nF,EAAAolB,KAjBA,GAAA2iB,GAAA,GAAA9T,IAAA4T,eAAA+H,GACApmB,UAAA,QACAq+D,SAAA,KACAD,UAAA,SAAA5nF,EAAAolB,KAEA6O,IAAAxkB,OAAA3P,MACA25E,WAAA,SAAA3qE,GACA2qE,WAAA3qE,IAEA2lB,QAAA,WACAsT,EAAAtT,aAUAR,GAAAxkB,OAAAi4E,GACAI,kBAAA,SAAA75E,GACA,MAAAA,GAAA85E,UAEAC,kBAAA,WACA,MAAAjgD,MAGA9T,GAAAxkB,OAAAmgC,EAAA1uB,GACA0uB,EAAAi4C,UACApO,WAAA7pC,EAAAi4C,WAGA5zD,GAAAqiD,wBAAA,SAAAp1D,GACA,YA2BA,SAAA+mE,cAAAjoF,EAAAolB,GACA6O,GAAAjlB,KAAAk5E,EAAA,SAAAC,EAAA33E,GACA,GAAAwkC,GAAAozC,EAAAD,EAAAz7D,OAAA,GAAAC,cAAAw7D,EAAAvhF,MAAA,EACA,IAAAgpC,EAAAsnC,WAAA,KAAAkR,GAAApoF,GAKA,MAJAg1C,GAAApF,EAAAsnC,WAAAnB,UAAA/1E,GACAi0B,GAAA7f,eAAAgR,GACAwqB,EAAAtuC,IAAA2yB,GAAAjyB,OAAA,+DAAmG4tC,EAAAioC,UAAA7iC,OACnGxkC,EAAAwkC,IACA,IAlCA,GAAAqzC,MAAqCz4C,GACrCsnC,WAAA,KACA51E,IAAA,SAAA0iB,EAAAwzD,KACAC,aAAA,SAAAziC,KACA+I,SAAA,SAAA/I,KACA0iC,QAAA,SAAA1iC,KACA2iC,QAAA,SAAA3iC,KACA4iC,WAAA,SAAA5iC,KACA6iC,UAAA,SAAA7iC,MACSkzC,GACTl0C,OAAA,SAAA3yC,GACAuuC,EAAAmO,SAAA18C,IAEA00B,MAAA,SAAA10B,GACAuuC,EAAA8nC,QAAAr2E,IAEAigF,aAAA,SAAAjgF,GACAuuC,EAAA6nC,aAAAp2E,IAEA8pC,MAAA,SAAA9pC,GACAuuC,EAAA+nC,QAAAt2E,IAEAggF,eAAA,SAAAhgF,GACAuuC,EAAAgoC,WAAAv2E,IAeA4yB,IAAAxkB,OAAAmgC,EAAA1uB,GACA0uB,EAAApmB,UAAA,QACAomB,EAAAg4C,UAAAK,aACAr4C,EAAAi4C,SAAAj4C,EAAAsnC,WAAAiP,cACAlyD,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAwzD,eAAA73C,EAAAy4C,KAEAp0D,GAAA8jD,qBAAA,SAAA72D,GACA,YAYA,SAAA+mE,cAAAjoF,EAAAolB,GACA,GAAAwqB,EAAAsnC,WAAAmP,WAAArmF,IAAA4vC,EAAAsnC,WAAAoP,WAAAtmF,GAAA,CACA,GAAAg1C,GAAApF,EAAAsnC,WAAAnB,UAAA/1E,GAAAkvC,EAAAU,EAAAsoC,kBAAAljC,EACA9F,KAAAjb,GAAAib,OAAAsC,YACA5B,EAAAtuC,IAAA2yB,GAAAjyB,OAAA,4DAAgG4tC,EAAAioC,UAAA7iC,OAChG/gB,GAAA7f,eAAAgR,GACAijE,EAAAC,mBAAAtzC,EAAAh1C,GAAA,KAjBA,GAAAqoF,MAAqCz4C,GACrCsnC,WAAA,KACA51E,IAAA,SAAA0iB,EAAAwzD,KACAvoD,SACA9R,KAAA,iBACAskE,aAAA,yBAEAvJ,kBAAA,SAAAljC,KACA6iC,UAAA,SAAA7iC,KAEA/gB,IAAAxkB,OAAAmgC,EAAA1uB,GAWA0uB,EAAApmB,UAAA,QACAomB,EAAAg4C,UAAAK,aACAh0D,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAs0D,oBAAA34C,EAAAy4C,KAEAp0D,GAAAklD,4BAAA,SAAAj4D,EAAAmnE,GACA,YASA,SAAAG,kBAAAxoF,EAAAolB,GACA,GAAAwqB,EAAAsnC,WAAAqP,YAAAvmF,GAAA,CACA,GAAAg1C,GAAApF,EAAAsnC,WAAAnB,UAAA/1E,GAAAkvC,EAAAU,EAAAsoC,kBAAAljC,EACA9F,KAAAjb,GAAAib,OAAAsC,YACA5B,EAAAtuC,IAAA2yB,GAAAjyB,OAAA,kEAAsG4tC,EAAAioC,UAAA7iC,OACtGqzC,EAAAC,mBAAAtzC,EAAAh1C,KAbA,GAAA4vC,IACAsnC,WAAA,KACAgB,kBAAA,SAAAljC,KACA1zC,IAAA,SAAA0iB,EAAAwzD,KAEA6Q,KACAA,MAWAz4C,EAAApmB,UAAA,UACAomB,EAAAg4C,UAAAY,iBACAv0D,GAAAxkB,OAAAmgC,EAAA1uB,GACA+S,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAs0D,oBAAA34C,EAAAy4C,KAEAp0D,GAAA+jD,0BAAA,SAAApoC,GACA,YACAA,GAAApmB,UAAA,QACAomB,EAAAi4C,SAAA,KACA5zD,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAklD,4BAAAvpC,QAEA3b,GAAAs0D,oBAAA,SAAArnE,EAAAmnE,GACA,YASA,SAAAI,0BAAAzzC,GACA,GAAA0zC,GAAA94C,EAAAioC,UAAA7iC,GAAAvN,EAAAihD,EAAA18D,YAAA,IAIA,OAHAyb,GAAA,IACAihD,IAAA9uE,OAAA,EAAA6tB,IAEAihD,EAEA,QAAAC,sBAAA3zC,GACA,GAAA4zC,GAAAh5C,EAAAioC,UAAA7iC,EACA,OAAA/gB,IAAAuT,aAAAohD,GAEA,QAAAC,kBAAAC,EAAA9zC,GACA,GAAA+zC,GAAA/3C,EAAA83C,EAAAxqF,KACAG,UAAAuyC,GAAA/c,GAAAmM,QAAA4Q,GAAAvtC,OAAA,IACAslF,EAAAJ,qBAAA3zC,GACAv2C,SAAAsqF,IACA/3C,IAAA,IAAA+3C,GAEAn5C,EAAAuoC,UAAAnjC,EAAAhE,IAEApB,EAAAwoC,sBAAApjC,GAAA,GAEA,QAAAg0C,0BAAA/B,EAAAjyC,GACAqzC,EAAAL,oBAAA7rD,OAAA8qD,EAAA,kBACA4B,iBAAA5B,EAAAjyC,KAGA,QAAAi0C,8BAAAhC,EAAAjyC,GACAqzC,EAAAL,oBAAA7rD,OAAA8qD,EAAA,iBAAA7hE,GACA,GAAA29B,GAAA39B,EAAA1K,SAAA0K,EAAAyD,KACA,MAAAk6B,GACA8lC,iBAAA5B,EAAAjyC,KAvCA,GAAApF,IACAsnC,WAAA,KACA51E,IAAA,SAAA0iB,EAAAwzD,KACAU,kBAAA,SAAAljC,KACA6iC,UAAA,SAAA7iC,KACAmjC,UAAA,SAAAnjC,EAAAhE,KACAonC,sBAAA,SAAApjC,EAAAqjC,KAqCApkD,IAAAxkB,OAAAmgC,EAAA1uB,GACA0uB,EAAAi4C,SAAAj4C,EAAAsnC,WAAAiP,cACAlyD,GAAAxkB,OAAA3P,KAAA,GAAAm0B,IAAAwzD,eAAA73C,EAAAy4C,IACAp0D,GAAAxkB,OAAA44E,GACAC,mBAAA,SAAAjnF,EAAArB,EAAAkpF,GACA,GAAAJ,GAAAl5C,EAAAsnC,WAAAqB,aAAAl3E,EACAuuC,GAAAwoC,sBAAA/2E,GAAA,GACAynF,EAAAxqF,MAAAmqF,yBAAApnF,GACA6nF,GACAJ,EAAAngF,QAEAqgF,yBAAAF,EAAAznF,GACA4nF,6BAAAH,EAAAznF,QAIC2jB,SnDs/JKmkE,KACA,SAAS3rF,EAAQC,EAASC,GoDt/YhC,YAEAF,GAAAC,QAAAC,EAAA,OpD6/YM0rF,KACA,SAAS5rF,EAAQC,EAASC,GqDhgZhC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,IrDwgZzFyrF,KACA,SAAS7rF,EAAQC,EAASC,GAE/B,YAEAU,QAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI2K,GAAavL,EAAoB,IAErCD,GAAQK,SsD9+YTmC,KAAA,wBACAiJ,QAAAD,EAAA1K,atDo/YM+qF,KACA,SAAS9rF,EAAQC,EAASC,GAE/B,YAcA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAZvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIirF,GAAY7rF,EAAoB,MAEhC8rF,EAAatrF,uBAAuBqrF,GuDniZzCE,EAAA/rF,EAAA,MvDuiZKgsF,EAAoBxrF,uBAAuBurF,EAI/ChsF,GAAQK,SuDxiZTmC,KAAA,kBACAiJ,QAAAsgF,EAAA1rF,SACAwC,YAAAqpF,MAAAD,EAAA5rF,WvD8iZM8rF,KACA,SAASpsF,EAAQC,EAASC,GwD7jZhCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,iGAAwH,IAAQ2b,QAAA,EAAAC,SAAA,8CAAA9C,SAAA+C,SAAA,yCAAAC,KAAA,uBAAAC,gBAAA,kGAAmRC,WAAA,iBxDskZ7YwsE,KACA,SAASrsF,EAAQC,GyD5kZvBD,EAAAC,QAAA,8yBzDklZMqsF,KACA,SAAStsF,EAAQC,G0DnlZvBD,EAAAC,QAAA;E1DylZMssF,KACA,SAASvsF,EAAQC,EAASC,G2D1lZhC,GAAAC,GAAAC,CACAD,GAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,I3DkmZzFosF,KACA,SAASxsF,EAAQC,EAASC,G4DtmZhC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAAuF2O,WAAA,GACvF3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,S5D4nZM6rE,KACA,SAASzsF,EAAQC,EAASC,GAE/B,YAgCA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GA9BvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI45B,GAAkBx6B,EAAoB,IAEtCy6B,EAAmBj6B,uBAAuBg6B,GAE1CE,EAAmB16B,EAAoB,IAEvC26B,EAAmBn6B,uBAAuBk6B,GAE1C8xD,EAAgBxsF,EAAoB,IAEpCysF,EAAgBjsF,uBAAuBgsF,GAEvC5xD,EAA8B56B,EAAoB,IAElD66B,EAA8Br6B,uBAAuBo6B,GAErDE,EAAa96B,EAAoB,IAEjC+6B,EAAav6B,uBAAuBs6B,G6D9pZzCnrB,EAAA3P,EAAA,IACAgB,EAAAhB,EAAA,I7DmqZKiB,EAAWT,uBAAuBQ,G6DhqZlB0rF,E7DoqZI,SAAUC,GAG9B,QAASD,qBAEL,OADA,EAAI/xD,EAAiBv6B,SAASgC,KAAMsqF,oBAC7B,EAAI7xD,EAA4Bz6B,SAASgC,MAAOsqF,kBAAkBzxD,YAAa,EAAIR,EAAiBr6B,SAASssF,oBAAoB1nF,MAAM5C,KAAM0nB,YAmDxJ,OAvDA,EAAIiR,EAAW36B,SAASssF,kBAAmBC,IAO3C,EAAIF,EAAcrsF,SAASssF,oBACvBrgE,IAAK,QACLzrB,MAAO,S6DxqZNgsF,GAUF,MATAA,GAAQA,GAASxqF,KAAKuB,GAClBipF,GACAxqF,KAAKyqF,SAAU,EACfzqF,KAAK0qF,KAAK,wCACNC,UAAWH,GACZxqF,KAAK4qF,aAERppF,UAAIqiB,MAAM,8DAEP7jB,Q7D2qZNiqB,IAAK,OACLzrB,MAAO,S6DtqZPklB,GACG1jB,KAAKuB,GACLvB,KAAKgjF,OAAOhjF,KAAM0jB,IAElB1jB,KAAKyqF,SAAU,EACfzqF,KAAK0qF,KAAK,sCACN5+B,QAAS9rD,MACVA,KAAK4qF,WAAY5qF,KAAK0jB,SAASA,Q7D0qZrCuG,IAAK,SACLzrB,MAAO,S6DvqZL4B,EAAMsjB,GACT1jB,KAAKyqF,SAAU,EACfzqF,KAAK0qF,KAAK,sCACNC,UAAW3qF,KAAKuB,GAChBuqD,QAAS1rD,GACVJ,KAAK4qF,WAAY5qF,KAAK0jB,SAASA,O7D0qZjCuG,IAAK,SACLzrB,MAAO,S6DxqZLklB,GAAU,GAAAkB,GAAA5kB,IACbA,MAAKyqF,SAAU,EACfzqF,KAAK0qF,KAAK,sCACNC,UAAW3qF,KAAKuB,IACjB,iBAAMqjB,GAAKwS,MAAM,YAAYp3B,KAAK0jB,SAASA,Q7D+qZ1C4mE,mB6D5tZmCO,Q7D+tZ9CltF,GAAQK,Q6D/tZYssF,G7DmuZfQ,KACA,SAASptF,EAAQC,EAASC,GAE/B,YAgCA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GA9BvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAI45B,GAAkBx6B,EAAoB,IAEtCy6B,EAAmBj6B,uBAAuBg6B,GAE1CE,EAAmB16B,EAAoB,IAEvC26B,EAAmBn6B,uBAAuBk6B,GAE1C8xD,EAAgBxsF,EAAoB,IAEpCysF,EAAgBjsF,uBAAuBgsF,GAEvC5xD,EAA8B56B,EAAoB,IAElD66B,EAA8Br6B,uBAAuBo6B,GAErDE,EAAa96B,EAAoB,IAEjC+6B,EAAav6B,uBAAuBs6B,G8DlwZzCnrB,EAAA3P,EAAA,IACAgB,EAAAhB,EAAA,I9DuwZKiB,EAAWT,uBAAuBQ,G8DpwZlBmsF,E9DwwZL,SAAUR,GAGrB,QAASQ,YAEL,OADA,EAAIxyD,EAAiBv6B,SAASgC,KAAM+qF,WAC7B,EAAItyD,EAA4Bz6B,SAASgC,MAAO+qF,SAASlyD,YAAa,EAAIR,EAAiBr6B,SAAS+sF,WAAWnoF,MAAM5C,KAAM0nB,YAetI,OAnBA,EAAIiR,EAAW36B,SAAS+sF,SAAUR,IAOlC,EAAIF,EAAcrsF,SAAS+sF,WACvB9gE,IAAK,QACLzrB,MAAO,S8D3wZNwsF,EAAWC,GAOb,MANID,IAAaC,GACbjrF,KAAKyqF,SAAU,EACfzqF,KAAK0qF,KAAK,yBAA0BQ,QAASF,EAAWG,IAAKF,GAAajrF,KAAK4qF,aAE/EppF,UAAIqiB,MAAM,wDAEP7jB,S9D8wZH+qF,U8D5xZ0BF,Q9D+xZrCltF,GAAQK,Q8D/xZY+sF,G9DoyZfK,KACA,SAAS1tF,EAAQC,EAASC,GAE/B,YAyBA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAvBvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,IAEXb,EAAQ0tF,QAAU1tF,EAAQ2tF,QAAU3sF,MAEpC,IAAIy5B,GAAkBx6B,EAAoB,IAEtCy6B,EAAmBj6B,uBAAuBg6B,GAE1CE,EAAmB16B,EAAoB,IAEvC26B,EAAmBn6B,uBAAuBk6B,GAE1CE,EAA8B56B,EAAoB,IAElD66B,EAA8Br6B,uBAAuBo6B,GAErDE,EAAa96B,EAAoB,IAEjC+6B,EAAav6B,uBAAuBs6B,G+Dh0ZzCnrB,EAAA3P,EAAA,IAGa0tF,E/Dm0ZE3tF,E+Dn0ZF2tF,Q/Dm0ZoB,SAAU1yD,G+Dl0ZvC,QAAA0yD,SAAYrtF,IAAS,EAAAs6B,EAAAv6B,SAAAgC,KAAAsrF,QAAA,IAAAr9E,IAAA,EAAAwqB,EAAAz6B,SAAAgC,MAAAsrF,QAAAzyD,YAAA,EAAAR,EAAAr6B,SAAAstF,UAAAtuE,KAAAhd,KACX/B,GADW,OAEjBgQ,GAAK1L,SAAS6O,GAAK,WACnBnD,EAAK1L,SAASu2B,MAAQ,UACtB7qB,EAAKs9E,OAAS,QAJGt9E,E/Dg1ZpB,OAbA,EAAI0qB,EAAW36B,SAASstF,QAAS1yD,GAa1B0yD,S+Dj1ZiB5/E,QASlB2/E,aAAU,GAAIC,IAAUxyD,O/D40ZlCn7B,GAAQK,Q+D30ZMqtF,G/D+0ZTG,KACA,SAAS9tF,EAAQC,EAASC,GAE/B,YA0CA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAxCvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIitF,GAAU7tF,EAAoB,KAE9B8tF,EAAWttF,uBAAuBqtF,GAElCrsE,EAAOxhB,EAAoB,IAE3ByhB,EAAQjhB,uBAAuBghB,GgEttZpCusE,EAAA/tF,EAAA,KhE0tZKguF,EAAYxtF,uBAAuButF,GgEztZxCE,EAAAjuF,EAAA,MhE6tZKkuF,EAAa1tF,uBAAuBytF,GgE5tZzCE,EAAAnuF,EAAA,MhEguZKouF,EAAsB5tF,uBAAuB2tF,GgE/tZlDE,EAAAruF,EAAA,MhEmuZKsuF,EAAmB9tF,uBAAuB6tF,GgEluZ/CE,EAAAvuF,EAAA,MhEsuZKwuF,EAAahuF,uBAAuB+tF,GgEruZzCE,EAAAzuF,EAAA,KhEyuZK0uF,EAAmBluF,uBAAuBiuF,GgExuZ/CE,EAAA3uF,EAAA,MhE4uZK4uF,EAAYpuF,uBAAuBmuF,EAIvC5uF,GAAQK,SgE7uZTwC,YAAAisF,eAAAP,EAAAluF,SACAoL,QAAAgjF,EAAApuF,SACAkB,OACAgsF,SACA9rF,KAAAd,OACAN,QAFA,WAEA,UAAA4tF,GAAA5tF,UAEA0uF,UACAttF,KAAAd,OACAN,QAFA,WAGA,UAAA8tF,GAAA9tF,SACAoC,MACAusF,SAAA,SACAvtF,KAAA,YAKAwtF,UACAxtF,KAAAK,QACAzB,SAAA,IAGA6uF,QAxBA,WAwBA,GAAA5+E,GAAAjO,IAEAwsF,GAAAxuF,QAAA8uF,IAAA,qBAAA7+E,EAAA8+E,WAAAP,EAAAxuF,QAAAgvF,YAEA5sF,KA5BA,WA6BA,OACA2sF,WAAAP,EAAAxuF,QAAAgvF,SACAC,qBAAA,EACAC,iBACA3rF,GAAA,QACAQ,MAAA/B,KAAAqL,EAAA,WAEA9J,GAAA,OACAQ,MAAA/B,KAAAqL,EAAA,QACApJ,OAAA,eACAwL,OAAA6+E,EAAAtuF,QACA4P,IAAA,SAAAO,GACA,OAAA3P,MAAA2P,EAAA5M,GAAAsM,KAAAM,EAAApM,UAGAR,GAAA,cACAQ,MAAA/B,KAAAqL,EAAA,eACA8hF,KAAA,IAEAh2D,SAAA,IAGA/1B,UACA6yB,QADA,WAEA,MAAAj0B,MAAA4sF,WAAA5sF,KAAA8zB,MAAAnwB,QAEAypF,QAJA,WAKA,MAAA3tF,SAAAO,KAAA0sF,SAAA1sE,KAAAhgB,KAAAitF,sBAEAI,gBAPA,WAQA,cAAArtF,KAAA0sF,SAAAC,UAEAW,YAVA,WAWA,GAAA1tF,GAAA,SAAAI,KAAA0sF,SAAAC,QACA,SACAprF,GAAA,MACAQ,MAAA/B,KAAAqL,EAAA,OACApJ,OAAA,YACArC,aAEA2B,GAAA,WACAQ,MAAA/B,KAAAqL,EAAA,QACAzL,aAEA2B,GAAA,SACAQ,MAAA/B,KAAAqL,EAAA,UACApJ,OAAA,mBACArC,aAEA2B,GAAA,OACAQ,MAAA/B,KAAAqL,EAAA,aACApJ,OAAA,iBACArC,aAEA2B,GAAA,WACAQ,MAAA/B,KAAAqL,EAAA,YACApJ,OAAA,WACArC,cAGAohB,OAtCA,WAuCA,MAAAhhB,MAAAktF,eAAA73E,OAAArV,KAAAutF,cAAAl4E,OAAArV,KAAAstF,cAEAC,aAzCA,WA0CA,GAAAvtF,KAAA+sF,WAAA,CACA,GAAAt/E,KAAAtN,KAAA,GAAA2M,MAAA,KAAAuI,OAAAm3E,EAAAxuF,QAAAoC,KACA,SACAmB,GAAA,cACAQ,MAAA/B,KAAA0sF,SAAAvrF,QAAAnB,KAAA0sF,SAAAvrF,OAAA6e,IAAAhgB,KAAAqL,EAAA,4BAAArL,KAAAqL,EAAA,UACApJ,OAAA,eACAwL,SACAG,IAAA,SAAAO,GACA,OAAA3P,MAAA2P,EAAAhO,KAAA0N,KAAAM,EAAArB,UAKA,UAEA0gF,aAzDA,WA0DA,MAAAxtF,MAAA0sF,mBAAAV,GAAAhuF,SAEAg2B,gBA5DA,WA6DA,GAAAy5D,GAAApuE,EAAArhB,QAAA0vF,UAAAruE,EAAArhB,QAAA0vF,SAAAD,UACA,IAAAztF,KAAA4sF,UAAAa,EAAA,CACA,GAAAhmE,KACA,oBAAAznB,MAAAkrF,UACAzjE,GAAAyjE,QAAAlrF,KAAAkrF,QAAA3pF,KAEAvB,KAAA0sF,SAAAnrF,KACAvB,KAAAwtF,aACA/lE,EAAAkjE,UAAA3qF,KAAA0sF,SAAAnrF,GAEAkmB,EAAA0jE,IAAAnrF,KAAA0sF,SAAAnrF,GAGA,IAAAosF,GAAA3tF,KAAA0sF,SAAAnrF,GAAA,UACAqsF,EAAA5tF,KAAAwtF,aAAA,wBACAp4D,EAAA,UAAAu4D,EAAAC,EAAA,UACA,OAAAH,GAAAr4D,GAAAy4D,OAAApmE,MAGAxmB,QACA6sF,oBAAA,SAAAvsF,EAAA81B,EAAAC,GACAt3B,KAAAm3B,SAAA1f,KAAA8Y,MAAA,IAAA8G,EAAAC,IAEAy2D,oBAAA,SAAAxsF,EAAAoiB,GAKA,GAJA3jB,KAAAwtF,cACAxtF,KAAAkrF,QAAA8C,UAAAnmE,QAAAlE,GAGA3jB,KAAAmK,MAAAiY,KAAA,CACA,GAAAtV,GAAA9M,KAAAmK,MAAAiY,KAAAa,YAAAnW,OAAA9M,KAAA0sF,SAAA5/E,KACAA,KACA6W,EAAA7W,SAGA9M,KAAA0sF,SAAA9B,YAAAvsF,IAAAslB,IACA3jB,KAAAiuF,eAGApuF,SACAquF,OADA,WAEAluF,KAAAitF,qBAAA,EACAjtF,KAAA0sF,SAAAC,SAAA,SACA3sF,KAAA4sF,UAAA,GAEAqB,WANA,WAOAjuF,KAAA0sF,SAAAC,SAAA,OACA3sF,KAAA4sF,UAAA,GAEA3pE,UAVA,WAYA,GAAA0C,IAAA,EAAA+lE,EAAA1tF,YAAAgC,KAAA0sF,SAAA1sF,KAAAmK,MAAAiY,KAAAa,YAAAjjB,KAAAmuF,iBAMA,cADAxoE,GAAAyoE,OACAzoE,GAEAwoE,eApBA,WAyBA,IAAAnuF,KAAAmK,MAAAiY,KAAAD,MAAA,QAEA,IAAA5S,GAAAvP,KAAAmK,MAAAiY,KAAAD,MAAAnZ,cAAA,6BACA,OAAAuG,IAEApO,QAAAhB,KAAAoP,EAAA/Q,MAAA+Q,EAAA/Q,MAAA,WAEA+jB,SAhCA,WAiCA,MAAAviB,MAAAmK,MAAAiY,KAAAG,YAEAmB,SAnCA,SAmCAC,GACA,MAAA3jB,MAAAmK,MAAAiY,KAAAsB,SAAAC,OhEmvZM0qE,KACA,SAAS3wF,EAAQC,EAASC,GiE3kahCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,gtCAAuuC,IAAQ2b,QAAA,EAAAC,SAAA,8CAAA9C,SAAA+C,SAAA,qaAAAC,KAAA,WAAAC,gBAAA,stCAAuvDC,WAAA,iBjEolah+F+wE,KACA,SAAS5wF,EAAQC,GkE1lavBD,EAAAC,QAAA,oxClEgmaM4wF,KACA,SAAS7wF,EAAQC,EAASC,GmEjmahC,GAAAC,GAAAC,CACAF,GAAA,MACAC,EAAAD,EAAA,MACAE,EAAAF,EAAA,MACAF,EAAAC,QAAAE,MACAH,EAAAC,QAAAI,aAAAL,EAAAC,QAAAD,EAAAC,QAAAK,SACAF,KACA,kBAAAJ,GAAAC,QAAAD,EAAAC,QAAAM,UAAAP,EAAAC,QAAAM,YAA+FP,EAAAC,SAAAO,SAAAJ,InEymazF0wF,KACA,SAAS9wF,EAAQC,EAASC,GoE9mahC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAA0F2O,WAAA,GAC1F3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O,SpEooaMmwE,KACA,SAAS/wF,EAAQC,EAASC,GAE/B,YAcA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAZvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIkwF,GAAQ9wF,EAAoB,KAE5B+wF,EAASvwF,uBAAuBswF,GAEhCxvE,EAAgBthB,EAAoB,KAEpCuhB,EAAgB/gB,uBAAuB8gB,EAI3CvhB,GAAQK,SqE1paLqO,MADW,WACH,GAAAoV,IAAA,EAAAC,GAAA,EAAAC,EAAAhjB,MAAA,KACJ,OAAAijB,GAAAC,GAAA,EAAA1C,EAAAnhB,UAAmB,EAAA2wF,EAAA3wF,SAAYgC,KAAKuC,SAASqsF,cAA7CntE,GAAAG,EAAAC,EAAAra,QAAAsa,MAAAL,GAAA,EAAyD,IAA9CO,GAA8CJ,EAAApjB,KACrDwB,MAAK6uF,SAAS7sE,EAAMhiB,KAAKuC,SAASqsF,UAAU5sE,KAF5C,MAAAC,GAAAP,GAAA,EAAAC,EAAAM,EAAA,aAAAR,GAAAI,EAAAK,QAAAL,EAAAK,SAAA,WAAAR,EAAA,KAAAC,MAKR9hB,SACIgvF,SADK,SACI7sE,EAAMtR,GAAS,GAAAzC,GAAAjO,KACd8uF,EAAY9sE,EAAK1O,MAAM,KAAK,GAE5By7E,EAAO,QAAPA,QACF,MAA8BpwF,UAA1BsP,EAAK9D,MAAM2kF,OACXj0E,YAAWk0E,KAAM,OAGrB9gF,GAAK+gF,OAAL,SAAqBhtE,EAAQtR,EAAQ7N,KAAKoL,IAE9C8gF,SrE0raNE,KACA,SAASvxF,EAAQC,EAASC,GAE/B,YAkDA,SAASQ,wBAAuBC,GAAO,MAAOA,IAAOA,EAAIN,WAAaM,GAAQL,QAASK,GAhDvFC,OAAOC,eAAeZ,EAAS,cAC3Ba,OAAO,GAGX,IAAIitF,GAAU7tF,EAAoB,KAE9B8tF,EAAWttF,uBAAuBqtF,GAElCrsE,EAAOxhB,EAAoB,IsEnmahC+tF,GtEqmaavtF,uBAAuBghB,GsErmapCxhB,EAAA,MACAiuF,GtEwmaiBztF,uBAAuButF,GsExmaxC/tF,EAAA,OtE4maKkuF,EAAa1tF,uBAAuBytF,GsE3mazCE,EAAAnuF,EAAA,MtE+maKouF,EAAsB5tF,uBAAuB2tF,GsE7malDmD,EAAAtxF,EAAA,KtEinaKuxF,EAAU/wF,uBAAuB8wF,GsEhnatCE,EAAAxxF,EAAA,MtEonaKyxF,EAASjxF,uBAAuBgxF,GsEnnarCE,EAAA1xF,EAAA,KtEunaK2xF,EAASnxF,uBAAuBkxF,GsEtnarCE,EAAA5xF,EAAA,KtE0naK6xF,EAASrxF,uBAAuBoxF,GsEznarCE,EAAA9xF,EAAA,KtE6naK+xF,EAAYvxF,uBAAuBsxF,GsE3naxCE,EAAAhyF,EAAA,MtE+naKiyF,EAAczxF,uBAAuBwxF,EAIzCjyF,GAAQK,SsEhoaTmC,KAAA,iBACAK,YAAAsvF,MAAAX,EAAAnxF,QAAA+xF,aAAAV,EAAArxF,QAAAgyF,QAAAT,EAAAvxF,QAAAiyF,SAAAR,EAAAzxF,SACAoL,QAAAumF,EAAA3xF,QAAA6xF,EAAA7xF,SACAoC,KAJA,WAKA,OACA8vF,MAAA,EACAvR,SAAA,EACAuM,QAAAlrF,KAAAgC,gBAAAkpF,QACAwB,YACAyD,WAAA,KACAvD,UAAA,EACAS,iBAAA,EACA+C,WAAAzxF,SAGAyC,UACAivF,SADA,WAEA,MAAArwF,MAAAwtF,aACAxtF,KAAAswF,MAAAC,GAAAF,SAAArwF,KAAA0sF,UAEA1sF,KAAAswF,MAAAC,GAAAF,SAAArwF,KAAAkrF,UAGAsC,aARA,WASA,MAAAxtF,MAAA0sF,mBAAAV,GAAAhuF,UAGAiD,QACAuvF,eAAA,WACAxwF,KAAAmwF,YACAnwF,KAAAywF,IAAAzwF,KAAAmwF,cAIAO,OACAtwF,KADA,WACA,GAAA6N,GAAAjO,IACA,IAAAA,KAAA2wF,OAAAC,QAAAjtF,OAAA,GAEA,GAAA2E,GAAAtI,KAAA2wF,OAAAC,QAAAjtF,OAAA,EACAqV,EAAAhZ,KAAA2wF,OAAAC,QAAAtoF,EACAtI,MAAAmwF,YACAhwF,KAAA6Y,EAAAtI,QAAAvQ,KACAsnB,OAAAzO,EAAAyO,QAGAznB,KAAA2wF,OAAAxwF,KAAAkO,SAAA,cACArO,KAAA0sF,SAAA,GAAAV,GAAAhuF,QACAgC,KAAA0sF,SAAA5zD,MAAA94B,KAAA2wF,OAAAlpE,OAAA0jE,KACAnrF,KAAA0sF,SAAAmE,MAAA,qBAEA5iF,EAAA6iF,WAAA7iF,EAAAy+E,SAAAmE,MAAA,UAAA5iF,EAAA8iF,eAEA/wF,KAAAkrF,QAAAT,QAEAzqF,KAAA8wF,WAAA9wF,KAAAkrF,QAAA2F,MAAA,UAAA7wF,KAAAgxF,uBAGAhxF,KAAAgxF,yBAGAC,WA1BA,WA2BAjxF,KAAA8wF,aACA9wF,KAAA8wF,WAAA33E,SACAnZ,KAAA8wF,WAAAnyF,UAIAkB,SACAq0C,OADA,WAEAl0C,KAAA2+E,QACA3+E,KAAA2+E,SAAA,EACA3+E,KAAAkwF,OAAAlwF,KAAA4sF,SACA5sF,KAAAkwF,MAAA,EACAlwF,KAAA4sF,WACA5sF,KAAAmK,MAAAiY,KAAAwqE,UAAA,IAGA71D,OAVA,WAWA/2B,KAAAmK,MAAAiY,KAAAwqE,UAAA,GAEA/vB,KAbA,WAcA,GAAA16C,GAAAniB,KAAAmK,MAAAiY,IACA,IAAAD,EAAAI,WAQA,MAPAviB,MAAAowF,WAAApwF,KAAAqL,EAAA,mCACArL,KAAAwtF,eACA,EAAA9B,EAAA1tF,SAAAgC,KAAA0sF,SAAAvqE,EAAAc,aACAjjB,KAAA0sF,SAAA7vB,KAAA16C,EAAAuB,WAEA1jB,KAAAkrF,QAAAgG,cAAA/uE,EAAAc,YAAAd,EAAAuB,WAEA,GAGAqtE,WA1BA,WA2BA/wF,KAAAC,UAAA,UACAkxF,WAAA,EACArkF,MAAA9M,KAAAqL,EAAA,iBACA8Y,QAAAnkB,KAAAowF,aAEApwF,KAAAmK,MAAAinF,MAAA3J,SAEA4J,iBAlCA,WAmCArxF,KAAAowF,WAAApwF,KAAAqL,EAAA,mCACArL,KAAAwtF,aACAxtF,KAAA0sF,SAAA4E,SAEAtxF,KAAAkrF,QAAAqG,gBAAAvxF,KAAA0sF,SAAAnrF,KAGAyvF,sBA1CA,WA2CA,GAAA7F,GAAAnrF,KAAA2wF,OAAAlpE,OAAA0jE,IACA/qF,EAAAJ,KAAAkrF,QAAA8C,UAAAh9E,KAAA,SAAA07E,GAAA,MAAAA,GAAAnrF,KAAA4pF,GACA/qF,KACAJ,KAAA0sF,SAAA,GAAAZ,GAAA9tF,SAAAoC,SACAJ,KAAA8wF,WAAA9wF,KAAAkrF,QAAA2F,MAAA,UAAA7wF,KAAA+wF,eAIAnC,WACA4C,gBAAA,SAAA5E,GACA5sF,KAAA4sF,YAEA6E,uBAAA,SAAApE,GACArtF,KAAAqtF,sBtEyoaMqE,KACA,SAASh0F,EAAQC,EAASC,GuE14ahCD,EAAAD,EAAAC,QAAAC,EAAA,MAKAD,EAAAkI,MAAAnI,EAAA6D,GAAA,8GAAqI,IAAQ2b,QAAA,EAAAC,SAAA,+CAAA9C,SAAA+C,SAAA,kDAAAC,KAAA,YAAAC,gBAAA,gHAAgSC,WAAA,iBvEm5avao0E,KACA,SAASj0F,EAAQC,GwEz5avBD,EAAAC,QAAA,4yGxE+5aMi0F,KACA,SAASl0F,EAAQC,EAASC,GyE75ahC,GAAA8R,GAAA9R,EAAA,KACA,iBAAA8R,SAAAhS,EAAA6D,GAAAmO,EAAA,KAEA9R,GAAA,IAAA8R,GAA0F2O,WAAA,GAC1F3O,GAAA4O,SAAA5gB,EAAAC,QAAA+R,EAAA4O","file":"chunks/2.614b3e73b072982fd9b1.js","sourcesContent":["webpackJsonp([2,31],{\n\n/***/ 344:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1642)\n\t__vue_script__ = __webpack_require__(1415)\n\t__vue_template__ = __webpack_require__(1517)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 984:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.BaseField = exports.FieldComponentMixin = undefined;\n\t\n\tvar _logger = __webpack_require__(19);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tvar _utils = __webpack_require__(314);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _vue = __webpack_require__(57);\n\t\n\tvar _vue2 = _interopRequireDefault(_vue);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar FieldComponentMixin = exports.FieldComponentMixin = {\n\t props: {\n\t field: {\n\t type: Object,\n\t default: function _default() {\n\t return {};\n\t }\n\t },\n\t model: Object,\n\t value: null,\n\t description: null,\n\t property: Object,\n\t required: Boolean,\n\t placeholder: String,\n\t readonly: Boolean\n\t },\n\t methods: {\n\t onChange: function onChange(evt) {\n\t this.$dispatch('field:value-change', evt.target.value);\n\t }\n\t }\n\t};\n\t\n\tvar BaseField = exports.BaseField = {\n\t name: 'base-field',\n\t data: function data() {\n\t return {\n\t errors: [],\n\t success: undefined,\n\t isField: true\n\t };\n\t },\n\t\n\t components: {\n\t 'text-input': __webpack_require__(1048),\n\t 'number-input': __webpack_require__(1046),\n\t 'hidden-input': __webpack_require__(1044),\n\t 'select-input': __webpack_require__(1041),\n\t 'select-input-group': __webpack_require__(1047),\n\t 'markdown-editor': __webpack_require__(1045),\n\t 'date-picker': __webpack_require__(1040),\n\t 'checkbox': __webpack_require__(1043)\n\t },\n\t events: {\n\t 'field:value-change': function fieldValueChange(value) {\n\t this.$dispatch('field:change', this, value);\n\t return true;\n\t }\n\t },\n\t props: {\n\t field: {\n\t type: Object,\n\t default: function _default() {\n\t return {};\n\t },\n\t\n\t required: true\n\t },\n\t model: {\n\t type: Object,\n\t default: function _default() {\n\t return {};\n\t },\n\t\n\t required: true\n\t },\n\t schema: {\n\t type: Object,\n\t default: function _default() {\n\t return {};\n\t },\n\t\n\t required: true\n\t }\n\t },\n\t computed: {\n\t description: function description() {\n\t var property = this.property;\n\t return property && property.hasOwnProperty('description') ? property.description : undefined;\n\t },\n\t property: function property() {\n\t if (!this.schema.properties.hasOwnProperty(this.field.id)) {\n\t _logger2.default.warn('Field \"' + this.field.id + '\" not found in schema');\n\t return {};\n\t }\n\t\n\t return this.schema.properties[this.field.id];\n\t },\n\t required: function required() {\n\t if (!this.field || !this.schema.hasOwnProperty('required')) {\n\t return false;\n\t }\n\t return this.schema.required.indexOf(this.field.id) >= 0;\n\t },\n\t is_bool: function is_bool() {\n\t return this.property && this.property.type === 'boolean';\n\t },\n\t is_hidden: function is_hidden() {\n\t return this.field && this.field.type === 'hidden';\n\t },\n\t value: function value() {\n\t var value = void 0;\n\t if (this.model && this.field) {\n\t value = _utils2.default.getattr(this.model, this.field.id);\n\t }\n\t if ((value === undefined || value === null) && this.property && this.property.hasOwnProperty('default')) {\n\t value = this.property.default;\n\t }\n\t return value;\n\t },\n\t placeholder: function placeholder() {\n\t return this.field.placeholder || this.field.label || '';\n\t },\n\t readonly: function readonly() {\n\t return this.$parent.readonly || this.field.readonly || false;\n\t },\n\t widget: function widget() {\n\t var widget = void 0;\n\t if (this.field.widget) {\n\t widget = this.field.widget;\n\t } else if (this.property.type === 'boolean') {\n\t widget = 'checkbox';\n\t } else if (this.property.type === 'integer') {\n\t widget = 'number-input';\n\t } else if (this.property.type === 'string') {\n\t if (this.property.format === 'markdown') {\n\t widget = 'markdown-editor';\n\t } else if (this.property.enum) {\n\t widget = 'select-input';\n\t }\n\t }\n\t widget = widget || 'text-input';\n\t\n\t if (!_vue2.default.util.resolveAsset(this.$options, 'components', widget)) {\n\t this.$options.components[widget] = function (resolve, reject) {\n\t __webpack_require__.e/* require */(33, function(__webpack_require__) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(1099)(\"./\" + widget + '.vue')]; (resolve.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));}.bind(this));\n\t };\n\t }\n\t return widget;\n\t }\n\t },\n\t watch: {\n\t value: function value(_value) {\n\t this.$dispatch('field:change', this, _value);\n\t }\n\t }\n\t};\n\t\n\texports.default = BaseField;\n\n/***/ },\n\n/***/ 987:\n[971, 88, 44],\n\n/***/ 988:\n[972, 75],\n\n/***/ 989:\n[970, 199, 988, 987, 75, 315, 316],\n\n/***/ 990:\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(1035), __esModule: true };\n\n/***/ },\n\n/***/ 1034:\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _from = __webpack_require__(990);\n\t\n\tvar _from2 = _interopRequireDefault(_from);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = function (arr) {\n\t if (Array.isArray(arr)) {\n\t for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n\t arr2[i] = arr[i];\n\t }\n\t\n\t return arr2;\n\t } else {\n\t return (0, _from2.default)(arr);\n\t }\n\t};\n\n/***/ },\n\n/***/ 1035:\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(134);\n\t__webpack_require__(1038);\n\tmodule.exports = __webpack_require__(13).Array.from;\n\n\n/***/ },\n\n/***/ 1036:\n[969, 58, 100],\n\n/***/ 1037:\n[973, 44],\n\n/***/ 1038:\n[977, 199, 51, 87, 988, 987, 315, 1036, 316, 1037],\n\n/***/ 1040:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1074)\n\t__vue_script__ = __webpack_require__(1051)\n\t__vue_template__ = __webpack_require__(1065)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1041:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1056)\n\t__vue_template__ = __webpack_require__(1070)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1042:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1072)\n\t__vue_script__ = __webpack_require__(1049)\n\t__vue_template__ = __webpack_require__(1063)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1043:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1073)\n\t__vue_script__ = __webpack_require__(1050)\n\t__vue_template__ = __webpack_require__(1064)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1044:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1052)\n\t__vue_template__ = __webpack_require__(1066)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1045:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1075)\n\t__vue_script__ = __webpack_require__(1053)\n\t__vue_template__ = __webpack_require__(1067)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1046:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1054)\n\t__vue_template__ = __webpack_require__(1068)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1047:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1055)\n\t__vue_template__ = __webpack_require__(1069)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1048:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1057)\n\t__vue_template__ = __webpack_require__(1071)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1049:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _moment = __webpack_require__(15);\n\t\n\tvar _moment2 = _interopRequireDefault(_moment);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar VIEWS = ['days', 'months', 'years'];\n\tvar MONTH_FORMAT = 'MMMM YYYY';\n\t\n\tfunction optionalMoment(value) {\n\t return value ? (0, _moment2.default)(value) : null;\n\t}\n\t\n\texports.default = {\n\t name: 'calendar',\n\t props: {\n\t selected: {\n\t type: _moment2.default,\n\t coerce: optionalMoment,\n\t default: null\n\t },\n\t min: {\n\t type: _moment2.default,\n\t coerce: optionalMoment,\n\t default: null\n\t },\n\t max: {\n\t type: _moment2.default,\n\t coerce: optionalMoment,\n\t default: null\n\t },\n\t view: {\n\t type: String,\n\t default: 'days'\n\t }\n\t },\n\t data: function data() {\n\t var current = this.selected || (0, _moment2.default)();\n\t return {\n\t current: current,\n\t today: (0, _moment2.default)()\n\t };\n\t },\n\t\n\t computed: {\n\t days: function days() {\n\t var days = [];\n\t var weekdays = _moment2.default.weekdaysMin();\n\t var first = _moment2.default.localeData().firstDayOfWeek();\n\t for (var i = 0; i < 7; i++) {\n\t days.push(weekdays[(i + first) % 7]);\n\t }\n\t return days;\n\t },\n\t months: function months() {\n\t return _moment2.default.monthsShort();\n\t },\n\t monthDisplay: function monthDisplay() {\n\t return this.current.format(MONTH_FORMAT);\n\t },\n\t rangeDisplay: function rangeDisplay() {\n\t if (this.view == 'days') {\n\t return this.current.format(MONTH_FORMAT);\n\t } else if (this.view == 'months') {\n\t return this.current.year();\n\t } else if (this.view == 'years') {\n\t var start = this.current.clone().subtract(5, 'years');\n\t var end = this.current.clone().add(6, 'years');\n\t return start.year() + '-' + end.year();\n\t }\n\t },\n\t yearsRange: function yearsRange() {\n\t var start = this.current.clone().subtract(5, 'years');\n\t var years = [];\n\t\n\t for (var i = 0; i < 12; i++) {\n\t years.push(start.clone().add(i, 'years').year());\n\t }\n\t return years;\n\t },\n\t nextValue: function nextValue() {\n\t var value = this.current.clone();\n\t if (this.view === 'days') {\n\t value.add(1, 'months');\n\t } else if (this.view === 'months') {\n\t value.add(1, 'years');\n\t } else if (this.view === 'years') {\n\t value.add(12, 'years');\n\t }\n\t return value;\n\t },\n\t previousValue: function previousValue() {\n\t var value = this.current.clone();\n\t if (this.view === 'days') {\n\t value.subtract(1, 'months');\n\t } else if (this.view === 'months') {\n\t value.subtract(1, 'year');\n\t } else if (this.view === 'years') {\n\t value.subtract(12, 'years');\n\t }\n\t return value;\n\t },\n\t nextDisabled: function nextDisabled() {\n\t if (!this.max) return;\n\t switch (this.view) {\n\t case 'days':\n\t return this.nextValue.isAfter(this.max, 'month');\n\t case 'months':\n\t return this.nextValue.isAfter(this.max, 'year');\n\t case 'years':\n\t return this.yearsRange.slice(-1).pop() >= this.max.year();\n\t }\n\t },\n\t previousDisabled: function previousDisabled() {\n\t if (!this.min) return;\n\t switch (this.view) {\n\t case 'days':\n\t return this.previousValue.isBefore(this.min, 'month');\n\t case 'months':\n\t return this.previousValue.isBefore(this.min, 'year');\n\t case 'years':\n\t return this.yearsRange[0] <= this.min.year();\n\t }\n\t }\n\t },\n\t methods: {\n\t monthDays: function monthDays(date) {\n\t var start = date.clone().startOf('month').startOf('week');\n\t var end = date.clone().endOf('month').endOf('week');\n\t var days = [];\n\t var row = void 0;\n\t\n\t for (var i = 0; i <= end.diff(start, 'days'); i++) {\n\t if (i % 7 === 0) {\n\t row = [];\n\t days.push(row);\n\t }\n\t row.push(start.clone().add(i, 'days'));\n\t }\n\t return days;\n\t },\n\t next: function next() {\n\t this.current = this.nextValue;\n\t },\n\t previous: function previous() {\n\t this.current = this.previousValue;\n\t },\n\t zoomOut: function zoomOut() {\n\t if (VIEWS.indexOf(this.view) + 1 < VIEWS.length) {\n\t this.view = VIEWS[VIEWS.indexOf(this.view) + 1];\n\t }\n\t },\n\t pickDay: function pickDay(day) {\n\t this.selected = day;\n\t this.$dispatch('calendar:date:selected', day);\n\t },\n\t pickMonth: function pickMonth(month) {\n\t this.current = this.current.month(month);\n\t this.view = 'days';\n\t this.$dispatch('calendar:month:selected', month);\n\t },\n\t pickYear: function pickYear(year) {\n\t this.current = this.current.year(year);\n\t this.view = 'months';\n\t this.$dispatch('calendar:year:selected', year);\n\t },\n\t isOld: function isOld(day) {\n\t return day.isBefore(this.current.startOf('month'));\n\t },\n\t isNew: function isNew(day) {\n\t return day.isAfter(this.current.endOf('month'));\n\t },\n\t isDisabled: function isDisabled(day) {\n\t var isBeforeMin = this.min && day.isBefore(this.min, 'day');\n\t var isAfterMax = this.max && day.isAfter(this.max, 'day');\n\t return isBeforeMin || isAfterMax;\n\t },\n\t isMonthDisabled: function isMonthDisabled(idx) {\n\t var month = this.current.clone().month(idx);\n\t var isBeforeMin = this.min && month.isBefore(this.min, 'month');\n\t var isAfterMax = this.max && month.isAfter(this.max, 'month');\n\t return isBeforeMin || isAfterMax;\n\t },\n\t isYearDisabled: function isYearDisabled(year) {\n\t var isBeforeMin = this.min && year < this.min.year();\n\t var isAfterMax = this.max && year > this.max.year();\n\t return isBeforeMin || isAfterMax;\n\t },\n\t dayClasses: function dayClasses(day) {\n\t return {\n\t old: this.isOld(day),\n\t new: this.isNew(day),\n\t today: day.isSame(this.today, 'day'),\n\t active: day.isSame(this.selected, 'day')\n\t };\n\t },\n\t focus: function focus() {\n\t var button = this.$el.querySelector('main button.active:not(:disabled)') || this.$el.querySelector('main button:not(:disabled)');\n\t if (button) button.focus();\n\t },\n\t clear: function clear() {\n\t this.selected = null;\n\t this.current = this.today.clone();\n\t this.view = 'days';\n\t this.$dispatch('calendar:date:cleared');\n\t }\n\t },\n\t watch: {\n\t selected: function selected(value) {\n\t if (!value) return;\n\t this.current = value.clone();\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1050:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'Checkbox',\n\t mixins: [_baseField.FieldComponentMixin],\n\t methods: {\n\t onChange: function onChange(evt) {\n\t this.$dispatch('field:value-change', evt.target.checked);\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1051:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _moment = __webpack_require__(15);\n\t\n\tvar _moment2 = _interopRequireDefault(_moment);\n\t\n\tvar _calendar = __webpack_require__(1042);\n\t\n\tvar _calendar2 = _interopRequireDefault(_calendar);\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar DEFAULT_FORMAT = 'L';\n\tvar ISO_FORMAT = 'YYYY-MM-DDTHH:mm:ss';\n\t\n\texports.default = {\n\t name: 'date-picker',\n\t mixins: [_baseField.FieldComponentMixin],\n\t props: {\n\t serializable: {\n\t type: Boolean,\n\t default: true\n\t }\n\t },\n\t components: { Calendar: _calendar2.default },\n\t data: function data() {\n\t return {\n\t picking: false,\n\t ISO_FORMAT: ISO_FORMAT\n\t };\n\t },\n\t\n\t computed: {\n\t dateFormat: function dateFormat() {\n\t return this.field.format || DEFAULT_FORMAT;\n\t }\n\t },\n\t events: {\n\t 'calendar:date:selected': function calendarDateSelected(date) {\n\t this.value = date;\n\t this.picking = false;\n\t return true;\n\t },\n\t 'calendar:date:cleared': function calendarDateCleared() {\n\t this.value = null;\n\t this.picking = false;\n\t return true;\n\t }\n\t },\n\t methods: {\n\t onFocus: function onFocus() {\n\t if (!this.picking) this.$nextTick(this.$refs.calendar.focus);\n\t this.picking = true;\n\t },\n\t onChange: function onChange(e) {\n\t try {\n\t this.value = (0, _moment2.default)(e.target.value, this.dateFormat);\n\t } catch (e) {}\n\t },\n\t onOutside: function onOutside() {\n\t this.picking = false;\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1052:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'hidden-input',\n\t mixins: [_baseField.FieldComponentMixin]\n\t};\n\n/***/ },\n\n/***/ 1053:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _jquery = __webpack_require__(12);\n\t\n\tvar _jquery2 = _interopRequireDefault(_jquery);\n\t\n\tvar _config = __webpack_require__(22);\n\t\n\tvar _config2 = _interopRequireDefault(_config);\n\t\n\tvar _i18n = __webpack_require__(133);\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\tvar _markdown = __webpack_require__(321);\n\t\n\tvar _markdown2 = _interopRequireDefault(_markdown);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar EXCERPT_TOKEN = '<!--- excerpt -->';\n\t\n\t__webpack_require__(1058);\n\t\n\t_jquery2.default.fn.markdown.messages[_config2.default.lang] = {\n\t 'Bold': (0, _i18n._)('Bold'),\n\t 'Italic': (0, _i18n._)('Italic'),\n\t 'Heading': (0, _i18n._)('Heading'),\n\t 'URL/Link': (0, _i18n._)('URL/Link'),\n\t 'Image': (0, _i18n._)('Image'),\n\t 'List': (0, _i18n._)('List'),\n\t 'Preview': (0, _i18n._)('Preview'),\n\t 'strong text': (0, _i18n._)('strong text'),\n\t 'emphasized text': (0, _i18n._)('emphasized text'),\n\t 'heading text': (0, _i18n._)('heading text'),\n\t 'enter link description here': (0, _i18n._)('enter link description here'),\n\t 'Insert Hyperlink': (0, _i18n._)('Insert Hyperlink'),\n\t 'enter image description here': (0, _i18n._)('enter image description here'),\n\t 'Insert Image Hyperlink': (0, _i18n._)('Insert Image Hyperlink'),\n\t 'enter image title here': (0, _i18n._)('enter image title here'),\n\t 'list text here': (0, _i18n._)('list text here')\n\t};\n\t\n\texports.default = {\n\t name: 'markdown-editor',\n\t props: ['rows'],\n\t mixins: [_baseField.FieldComponentMixin],\n\t ready: function ready() {\n\t (0, _jquery2.default)(this.$el).markdown({\n\t language: _config2.default.lang,\n\t autofocus: false,\n\t savable: false,\n\t resize: 'both',\n\t iconlibrary: 'fa',\n\t onPreview: function onPreview(e) {\n\t return (0, _markdown2.default)(e.getContent());\n\t },\n\t additionalButtons: [[{\n\t name: 'extras',\n\t data: [{\n\t name: 'btnSummary',\n\t title: (0, _i18n._)('Summary'),\n\t icon: 'fa fa-scissors',\n\t callback: function callback(e) {\n\t var selected = e.getSelection(),\n\t cursor = selected.start;\n\t\n\t e.replaceSelection(EXCERPT_TOKEN);\n\t e.setSelection(cursor, cursor + EXCERPT_TOKEN.length);\n\t }\n\t }]\n\t }]]\n\t });\n\t }\n\t};\n\n/***/ },\n\n/***/ 1054:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'number-input',\n\t mixins: [_baseField.FieldComponentMixin]\n\t};\n\n/***/ },\n\n/***/ 1055:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'select-input-group',\n\t mixins: [_baseField.FieldComponentMixin],\n\t props: {\n\t groups: {\n\t type: Object,\n\t default: function _default() {\n\t return {};\n\t }\n\t }\n\t },\n\t computed: {\n\t options: function options() {\n\t if (!this.property && !this.field) return [];\n\t\n\t if (this.field.values) {\n\t if (this.field.values instanceof _base.List) {\n\t return this.field.values.items;\n\t }\n\t return this.field.values;\n\t } else if (this.property.enum && this.field.labels) {\n\t return this.property.enum.map(function (value) {\n\t return { value: value, text: this.field.labels[value] };\n\t });\n\t } else if (this.property.enum) {\n\t return this.property.enum.map(function (value) {\n\t return { value: value, text: value };\n\t });\n\t }\n\t\n\t return [];\n\t }\n\t },\n\t filters: {\n\t extract: function extract(items, group) {\n\t var _this = this;\n\t\n\t if (this.field.map) {\n\t items = items.map(this.field.map);\n\t return items.filter(function (item) {\n\t return _this.field.groups[group].map(function (license) {\n\t return license.value;\n\t }).includes(item.value);\n\t });\n\t }\n\t return items;\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1056:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'select-input',\n\t mixins: [_baseField.FieldComponentMixin],\n\t computed: {\n\t options: function options() {\n\t if (!this.property && !this.field) return [];\n\t\n\t if (this.field.values) {\n\t if (this.field.values instanceof _base.List) {\n\t return this.field.values.items;\n\t }\n\t return this.field.values;\n\t } else if (this.property.enum && this.field.labels) {\n\t return this.property.enum.map(function (value) {\n\t return { value: value, text: this.field.labels[value] };\n\t });\n\t } else if (this.property.enum) {\n\t return this.property.enum.map(function (value) {\n\t return { value: value, text: value };\n\t });\n\t }\n\t\n\t return [];\n\t }\n\t },\n\t filters: {\n\t extract: function extract(items) {\n\t if (this.field.map) {\n\t return items.map(this.field.map);\n\t }\n\t return items;\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1057:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'text-input',\n\t mixins: [_baseField.FieldComponentMixin]\n\t};\n\n/***/ },\n\n/***/ 1058:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery) {/* ===================================================\n\t * bootstrap-markdown.js v2.10.0\n\t * http://github.com/toopay/bootstrap-markdown\n\t * ===================================================\n\t * Copyright 2013-2016 Taufan Aditya\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * ========================================================== */\n\t\n\t(function(factory){\n\t if (true) {\n\t //RequireJS\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(12)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else if (typeof exports === 'object') {\n\t //Backbone.js\n\t factory(require('jquery'));\n\t } else {\n\t //Jquery plugin\n\t factory(jQuery);\n\t }\n\t}(function($){\n\t \"use strict\"; // jshint ;_;\n\t\n\t /* MARKDOWN CLASS DEFINITION\n\t * ========================== */\n\t\n\t var Markdown = function (element, options) {\n\t // @TODO : remove this BC on next major release\n\t // @see : https://github.com/toopay/bootstrap-markdown/issues/109\n\t var opts = ['autofocus', 'savable', 'hideable', 'width', \n\t 'height', 'resize', 'iconlibrary', 'language', \n\t 'footer', 'fullscreen', 'hiddenButtons', 'disabledButtons'];\n\t $.each(opts,function(_, opt){\n\t if (typeof $(element).data(opt) !== 'undefined') {\n\t options = typeof options == 'object' ? options : {}\n\t options[opt] = $(element).data(opt)\n\t }\n\t });\n\t // End BC\n\t\n\t // Class Properties\n\t this.$ns = 'bootstrap-markdown';\n\t this.$element = $(element);\n\t this.$editable = {el:null, type:null,attrKeys:[], attrValues:[], content:null};\n\t this.$options = $.extend(true, {}, $.fn.markdown.defaults, options, this.$element.data('options'));\n\t this.$oldContent = null;\n\t this.$isPreview = false;\n\t this.$isFullscreen = false;\n\t this.$editor = null;\n\t this.$textarea = null;\n\t this.$handler = [];\n\t this.$callback = [];\n\t this.$nextTab = [];\n\t\n\t this.showEditor();\n\t };\n\t\n\t Markdown.prototype = {\n\t\n\t constructor: Markdown\n\t\n\t , __alterButtons: function(name,alter) {\n\t var handler = this.$handler, isAll = (name == 'all'),that = this;\n\t\n\t $.each(handler,function(k,v) {\n\t var halt = true;\n\t if (isAll) {\n\t halt = false;\n\t } else {\n\t halt = v.indexOf(name) < 0;\n\t }\n\t\n\t if (halt === false) {\n\t alter(that.$editor.find('button[data-handler=\"'+v+'\"]'));\n\t }\n\t });\n\t }\n\t\n\t , __buildButtons: function(buttonsArray, container) {\n\t var i,\n\t ns = this.$ns,\n\t handler = this.$handler,\n\t callback = this.$callback;\n\t\n\t for (i=0;i<buttonsArray.length;i++) {\n\t // Build each group container\n\t var y, btnGroups = buttonsArray[i];\n\t for (y=0;y<btnGroups.length;y++) {\n\t // Build each button group\n\t var z,\n\t buttons = btnGroups[y].data,\n\t btnGroupContainer = $('<div/>', {\n\t 'class': 'btn-group'\n\t });\n\t\n\t for (z=0;z<buttons.length;z++) {\n\t var button = buttons[z],\n\t buttonContainer, buttonIconContainer,\n\t buttonHandler = ns+'-'+button.name,\n\t buttonIcon = this.__getIcon(button.icon),\n\t btnText = button.btnText ? button.btnText : '',\n\t btnClass = button.btnClass ? button.btnClass : 'btn',\n\t tabIndex = button.tabIndex ? button.tabIndex : '-1',\n\t hotkey = typeof button.hotkey !== 'undefined' ? button.hotkey : '',\n\t hotkeyCaption = typeof jQuery.hotkeys !== 'undefined' && hotkey !== '' ? ' ('+hotkey+')' : '';\n\t\n\t // Construct the button object\n\t buttonContainer = $('<button></button>');\n\t buttonContainer.text(' ' + this.__localize(btnText)).addClass('btn-default btn-sm').addClass(btnClass);\n\t if(btnClass.match(/btn\\-(primary|success|info|warning|danger|link)/)){\n\t buttonContainer.removeClass('btn-default');\n\t }\n\t buttonContainer.attr({\n\t 'type': 'button',\n\t 'title': this.__localize(button.title) + hotkeyCaption,\n\t 'tabindex': tabIndex,\n\t 'data-provider': ns,\n\t 'data-handler': buttonHandler,\n\t 'data-hotkey': hotkey\n\t });\n\t if (button.toggle === true){\n\t buttonContainer.attr('data-toggle', 'button');\n\t }\n\t buttonIconContainer = $('<span/>');\n\t buttonIconContainer.addClass(buttonIcon);\n\t buttonIconContainer.prependTo(buttonContainer);\n\t\n\t // Attach the button object\n\t btnGroupContainer.append(buttonContainer);\n\t\n\t // Register handler and callback\n\t handler.push(buttonHandler);\n\t callback.push(button.callback);\n\t }\n\t\n\t // Attach the button group into container dom\n\t container.append(btnGroupContainer);\n\t }\n\t }\n\t\n\t return container;\n\t }\n\t , __setListener: function() {\n\t // Set size and resizable Properties\n\t var hasRows = typeof this.$textarea.attr('rows') !== 'undefined',\n\t maxRows = this.$textarea.val().split(\"\\n\").length > 5 ? this.$textarea.val().split(\"\\n\").length : '5',\n\t rowsVal = hasRows ? this.$textarea.attr('rows') : maxRows;\n\t\n\t this.$textarea.attr('rows',rowsVal);\n\t if (this.$options.resize) {\n\t this.$textarea.css('resize',this.$options.resize);\n\t }\n\t\n\t this.$textarea.on({\n\t 'focus' : $.proxy(this.focus, this),\n\t 'keyup' : $.proxy(this.keyup, this),\n\t 'change' : $.proxy(this.change, this),\n\t 'select' : $.proxy(this.select, this)\n\t });\n\t\n\t if (this.eventSupported('keydown')) {\n\t this.$textarea.on('keydown', $.proxy(this.keydown, this));\n\t }\n\t\n\t if (this.eventSupported('keypress')) {\n\t this.$textarea.on('keypress', $.proxy(this.keypress, this))\n\t }\n\t\n\t // Re-attach markdown data\n\t this.$textarea.data('markdown',this);\n\t }\n\t\n\t , __handle: function(e) {\n\t var target = $(e.currentTarget),\n\t handler = this.$handler,\n\t callback = this.$callback,\n\t handlerName = target.attr('data-handler'),\n\t callbackIndex = handler.indexOf(handlerName),\n\t callbackHandler = callback[callbackIndex];\n\t\n\t // Trigger the focusin\n\t $(e.currentTarget).focus();\n\t\n\t callbackHandler(this);\n\t\n\t // Trigger onChange for each button handle\n\t this.change(this);\n\t\n\t // Unless it was the save handler,\n\t // focusin the textarea\n\t if (handlerName.indexOf('cmdSave') < 0) {\n\t this.$textarea.focus();\n\t }\n\t\n\t e.preventDefault();\n\t }\n\t\n\t , __localize: function(string) {\n\t var messages = $.fn.markdown.messages,\n\t language = this.$options.language;\n\t if (\n\t typeof messages !== 'undefined' &&\n\t typeof messages[language] !== 'undefined' &&\n\t typeof messages[language][string] !== 'undefined'\n\t ) {\n\t return messages[language][string];\n\t }\n\t return string;\n\t }\n\t\n\t , __getIcon: function(src) {\n\t return typeof src == 'object' ? src[this.$options.iconlibrary] : src;\n\t }\n\t\n\t , setFullscreen: function(mode) {\n\t var $editor = this.$editor,\n\t $textarea = this.$textarea;\n\t\n\t if (mode === true) {\n\t $editor.addClass('md-fullscreen-mode');\n\t $('body').addClass('md-nooverflow');\n\t this.$options.onFullscreen(this);\n\t } else {\n\t $editor.removeClass('md-fullscreen-mode');\n\t $('body').removeClass('md-nooverflow');\n\t\n\t if (this.$isPreview == true) this.hidePreview().showPreview()\n\t }\n\t\n\t this.$isFullscreen = mode;\n\t $textarea.focus();\n\t }\n\t\n\t , showEditor: function() {\n\t var instance = this,\n\t textarea,\n\t ns = this.$ns,\n\t container = this.$element,\n\t originalHeigth = container.css('height'),\n\t originalWidth = container.css('width'),\n\t editable = this.$editable,\n\t handler = this.$handler,\n\t callback = this.$callback,\n\t options = this.$options,\n\t editor = $( '<div/>', {\n\t 'class': 'md-editor',\n\t click: function() {\n\t instance.focus();\n\t }\n\t });\n\t\n\t // Prepare the editor\n\t if (this.$editor === null) {\n\t // Create the panel\n\t var editorHeader = $('<div/>', {\n\t 'class': 'md-header btn-toolbar'\n\t });\n\t\n\t // Merge the main & additional button groups together\n\t var allBtnGroups = [];\n\t if (options.buttons.length > 0) allBtnGroups = allBtnGroups.concat(options.buttons[0]);\n\t if (options.additionalButtons.length > 0) {\n\t // iterate the additional button groups\n\t $.each(options.additionalButtons[0], function(idx, buttonGroup){\n\t \n\t // see if the group name of the addional group matches an existing group\n\t var matchingGroups = $.grep(allBtnGroups, function(allButtonGroup, allIdx){\n\t return allButtonGroup.name === buttonGroup.name;\n\t });\n\t\n\t // if it matches add the addional buttons to that group, if not just add it to the all buttons group\n\t if(matchingGroups.length > 0) {\n\t matchingGroups[0].data = matchingGroups[0].data.concat(buttonGroup.data);\n\t } else { \n\t allBtnGroups.push(options.additionalButtons[0][idx]);\n\t }\n\t\n\t });\n\t } \n\t\n\t // Reduce and/or reorder the button groups\n\t if (options.reorderButtonGroups.length > 0) {\n\t allBtnGroups = allBtnGroups\n\t .filter(function(btnGroup) {\n\t return options.reorderButtonGroups.indexOf(btnGroup.name) > -1;\n\t })\n\t .sort(function(a, b) {\n\t if (options.reorderButtonGroups.indexOf(a.name) < options.reorderButtonGroups.indexOf(b.name)) return -1;\n\t if (options.reorderButtonGroups.indexOf(a.name) > options.reorderButtonGroups.indexOf(b.name)) return 1;\n\t return 0;\n\t });\n\t }\n\t\n\t // Build the buttons\n\t if (allBtnGroups.length > 0) {\n\t editorHeader = this.__buildButtons([allBtnGroups], editorHeader);\n\t }\n\t\n\t if (options.fullscreen.enable) {\n\t editorHeader.append('<div class=\"md-controls\"><a class=\"md-control md-control-fullscreen\" href=\"#\"><span class=\"'+this.__getIcon(options.fullscreen.icons.fullscreenOn)+'\"></span></a></div>').on('click', '.md-control-fullscreen', function(e) {\n\t e.preventDefault();\n\t instance.setFullscreen(true);\n\t });\n\t }\n\t\n\t editor.append(editorHeader);\n\t\n\t // Wrap the textarea\n\t if (container.is('textarea')) {\n\t container.before(editor);\n\t textarea = container;\n\t textarea.addClass('md-input');\n\t editor.append(textarea);\n\t } else {\n\t var rawContent = (typeof toMarkdown == 'function') ? toMarkdown(container.html()) : container.html(),\n\t currentContent = $.trim(rawContent);\n\t\n\t // This is some arbitrary content that could be edited\n\t textarea = $('<textarea/>', {\n\t 'class': 'md-input',\n\t 'val' : currentContent\n\t });\n\t\n\t editor.append(textarea);\n\t\n\t // Save the editable\n\t editable.el = container;\n\t editable.type = container.prop('tagName').toLowerCase();\n\t editable.content = container.html();\n\t\n\t $(container[0].attributes).each(function(){\n\t editable.attrKeys.push(this.nodeName);\n\t editable.attrValues.push(this.nodeValue);\n\t });\n\t\n\t // Set editor to blocked the original container\n\t container.replaceWith(editor);\n\t }\n\t\n\t var editorFooter = $('<div/>', {\n\t 'class': 'md-footer'\n\t }),\n\t createFooter = false,\n\t footer = '';\n\t // Create the footer if savable\n\t if (options.savable) {\n\t createFooter = true;\n\t var saveHandler = 'cmdSave';\n\t\n\t // Register handler and callback\n\t handler.push(saveHandler);\n\t callback.push(options.onSave);\n\t\n\t editorFooter.append('<button class=\"btn btn-success\" data-provider=\"'\n\t + ns\n\t + '\" data-handler=\"'\n\t + saveHandler\n\t + '\"><i class=\"icon icon-white icon-ok\"></i> '\n\t + this.__localize('Save')\n\t + '</button>');\n\t\n\t\n\t }\n\t\n\t footer = typeof options.footer === 'function' ? options.footer(this) : options.footer;\n\t\n\t if ($.trim(footer) !== '') {\n\t createFooter = true;\n\t editorFooter.append(footer);\n\t }\n\t\n\t if (createFooter) editor.append(editorFooter);\n\t\n\t // Set width\n\t if (options.width && options.width !== 'inherit') {\n\t if (jQuery.isNumeric(options.width)) {\n\t editor.css('display', 'table');\n\t textarea.css('width', options.width + 'px');\n\t } else {\n\t editor.addClass(options.width);\n\t }\n\t }\n\t\n\t // Set height\n\t if (options.height && options.height !== 'inherit') {\n\t if (jQuery.isNumeric(options.height)) {\n\t var height = options.height;\n\t if (editorHeader) height = Math.max(0, height - editorHeader.outerHeight());\n\t if (editorFooter) height = Math.max(0, height - editorFooter.outerHeight());\n\t textarea.css('height', height + 'px');\n\t } else {\n\t editor.addClass(options.height);\n\t }\n\t }\n\t\n\t // Reference\n\t this.$editor = editor;\n\t this.$textarea = textarea;\n\t this.$editable = editable;\n\t this.$oldContent = this.getContent();\n\t\n\t this.__setListener();\n\t\n\t // Set editor attributes, data short-hand API and listener\n\t this.$editor.attr('id',(new Date()).getTime());\n\t this.$editor.on('click', '[data-provider=\"bootstrap-markdown\"]', $.proxy(this.__handle, this));\n\t\n\t if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n\t this.$editor.addClass('md-editor-disabled');\n\t this.disableButtons('all');\n\t }\n\t\n\t if (this.eventSupported('keydown') && typeof jQuery.hotkeys === 'object') {\n\t editorHeader.find('[data-provider=\"bootstrap-markdown\"]').each(function() {\n\t var $button = $(this),\n\t hotkey = $button.attr('data-hotkey');\n\t if (hotkey.toLowerCase() !== '') {\n\t textarea.bind('keydown', hotkey, function() {\n\t $button.trigger('click');\n\t return false;\n\t });\n\t }\n\t });\n\t }\n\t\n\t if (options.initialstate === 'preview') {\n\t this.showPreview();\n\t } else if (options.initialstate === 'fullscreen' && options.fullscreen.enable) {\n\t this.setFullscreen(true);\n\t }\n\t\n\t } else {\n\t this.$editor.show();\n\t }\n\t\n\t if (options.autofocus) {\n\t this.$textarea.focus();\n\t this.$editor.addClass('active');\n\t }\n\t\n\t if (options.fullscreen.enable && options.fullscreen !== false) {\n\t this.$editor.append('<div class=\"md-fullscreen-controls\">'\n\t + '<a href=\"#\" class=\"exit-fullscreen\" title=\"Exit fullscreen\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOff) + '\">'\n\t + '</span></a>'\n\t + '</div>');\n\t this.$editor.on('click', '.exit-fullscreen', function(e) {\n\t e.preventDefault();\n\t instance.setFullscreen(false);\n\t });\n\t }\n\t\n\t // hide hidden buttons from options\n\t this.hideButtons(options.hiddenButtons);\n\t\n\t // disable disabled buttons from options\n\t this.disableButtons(options.disabledButtons);\n\t\n\t // Trigger the onShow hook\n\t options.onShow(this);\n\t\n\t return this;\n\t }\n\t\n\t , parseContent: function(val) {\n\t var content;\n\t\n\t // parse with supported markdown parser\n\t var val = val || this.$textarea.val();\n\t\n\t if (this.$options.parser) {\n\t content = this.$options.parser(val);\n\t } else if (typeof markdown == 'object') {\n\t content = markdown.toHTML(val);\n\t } else if (typeof marked == 'function') {\n\t content = marked(val);\n\t } else {\n\t content = val;\n\t }\n\t\n\t return content;\n\t }\n\t\n\t , showPreview: function() {\n\t var options = this.$options,\n\t container = this.$textarea,\n\t afterContainer = container.next(),\n\t replacementContainer = $('<div/>',{'class':'md-preview','data-provider':'markdown-preview'}),\n\t content,\n\t callbackContent;\n\t\n\t if (this.$isPreview == true) {\n\t // Avoid sequenced element creation on missused scenario\n\t // @see https://github.com/toopay/bootstrap-markdown/issues/170\n\t return this;\n\t }\n\t \n\t // Give flag that tell the editor enter preview mode\n\t this.$isPreview = true;\n\t // Disable all buttons\n\t this.disableButtons('all').enableButtons('cmdPreview');\n\t\n\t // Try to get the content from callback\n\t callbackContent = options.onPreview(this);\n\t // Set the content based from the callback content if string otherwise parse value from textarea\n\t content = typeof callbackContent == 'string' ? callbackContent : this.parseContent();\n\t\n\t // Build preview element\n\t replacementContainer.html(content);\n\t\n\t if (afterContainer && afterContainer.attr('class') == 'md-footer') {\n\t // If there is footer element, insert the preview container before it\n\t replacementContainer.insertBefore(afterContainer);\n\t } else {\n\t // Otherwise, just append it after textarea\n\t container.parent().append(replacementContainer);\n\t }\n\t\n\t // Set the preview element dimensions\n\t replacementContainer.css({\n\t width: container.outerWidth() + 'px',\n\t height: container.outerHeight() + 'px'\n\t });\n\t\n\t if (this.$options.resize) {\n\t replacementContainer.css('resize',this.$options.resize);\n\t }\n\t\n\t // Hide the last-active textarea\n\t container.hide();\n\t\n\t // Attach the editor instances\n\t replacementContainer.data('markdown',this);\n\t\n\t if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n\t this.$editor.addClass('md-editor-disabled');\n\t this.disableButtons('all');\n\t }\n\t\n\t return this;\n\t }\n\t\n\t , hidePreview: function() {\n\t // Give flag that tell the editor quit preview mode\n\t this.$isPreview = false;\n\t\n\t // Obtain the preview container\n\t var container = this.$editor.find('div[data-provider=\"markdown-preview\"]');\n\t\n\t // Remove the preview container\n\t container.remove();\n\t\n\t // Enable all buttons\n\t this.enableButtons('all');\n\t // Disable configured disabled buttons\n\t this.disableButtons(this.$options.disabledButtons);\n\t\n\t // Back to the editor\n\t this.$textarea.show();\n\t this.__setListener();\n\t\n\t return this;\n\t }\n\t\n\t , isDirty: function() {\n\t return this.$oldContent != this.getContent();\n\t }\n\t\n\t , getContent: function() {\n\t return this.$textarea.val();\n\t }\n\t\n\t , setContent: function(content) {\n\t this.$textarea.val(content);\n\t\n\t return this;\n\t }\n\t\n\t , findSelection: function(chunk) {\n\t var content = this.getContent(), startChunkPosition;\n\t\n\t if (startChunkPosition = content.indexOf(chunk), startChunkPosition >= 0 && chunk.length > 0) {\n\t var oldSelection = this.getSelection(), selection;\n\t\n\t this.setSelection(startChunkPosition,startChunkPosition+chunk.length);\n\t selection = this.getSelection();\n\t\n\t this.setSelection(oldSelection.start,oldSelection.end);\n\t\n\t return selection;\n\t } else {\n\t return null;\n\t }\n\t }\n\t\n\t , getSelection: function() {\n\t\n\t var e = this.$textarea[0];\n\t\n\t return (\n\t\n\t ('selectionStart' in e && function() {\n\t var l = e.selectionEnd - e.selectionStart;\n\t return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) };\n\t }) ||\n\t\n\t /* browser not supported */\n\t function() {\n\t return null;\n\t }\n\t\n\t )();\n\t\n\t }\n\t\n\t , setSelection: function(start,end) {\n\t\n\t var e = this.$textarea[0];\n\t\n\t return (\n\t\n\t ('selectionStart' in e && function() {\n\t e.selectionStart = start;\n\t e.selectionEnd = end;\n\t return;\n\t }) ||\n\t\n\t /* browser not supported */\n\t function() {\n\t return null;\n\t }\n\t\n\t )();\n\t\n\t }\n\t\n\t , replaceSelection: function(text) {\n\t\n\t var e = this.$textarea[0];\n\t\n\t return (\n\t\n\t ('selectionStart' in e && function() {\n\t e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length);\n\t // Set cursor to the last replacement end\n\t e.selectionStart = e.value.length;\n\t return this;\n\t }) ||\n\t\n\t /* browser not supported */\n\t function() {\n\t e.value += text;\n\t return jQuery(e);\n\t }\n\t\n\t )();\n\t }\n\t\n\t , getNextTab: function() {\n\t // Shift the nextTab\n\t if (this.$nextTab.length === 0) {\n\t return null;\n\t } else {\n\t var nextTab, tab = this.$nextTab.shift();\n\t\n\t if (typeof tab == 'function') {\n\t nextTab = tab();\n\t } else if (typeof tab == 'object' && tab.length > 0) {\n\t nextTab = tab;\n\t }\n\t\n\t return nextTab;\n\t }\n\t }\n\t\n\t , setNextTab: function(start,end) {\n\t // Push new selection into nextTab collections\n\t if (typeof start == 'string') {\n\t var that = this;\n\t this.$nextTab.push(function(){\n\t return that.findSelection(start);\n\t });\n\t } else if (typeof start == 'number' && typeof end == 'number') {\n\t var oldSelection = this.getSelection();\n\t\n\t this.setSelection(start,end);\n\t this.$nextTab.push(this.getSelection());\n\t\n\t this.setSelection(oldSelection.start,oldSelection.end);\n\t }\n\t\n\t return;\n\t }\n\t\n\t , __parseButtonNameParam: function (names) {\n\t return typeof names == 'string' ?\n\t names.split(' ') :\n\t names;\n\t\n\t }\n\t\n\t , enableButtons: function(name) {\n\t var buttons = this.__parseButtonNameParam(name),\n\t that = this;\n\t\n\t $.each(buttons, function(i, v) {\n\t that.__alterButtons(buttons[i], function (el) {\n\t el.removeAttr('disabled');\n\t });\n\t });\n\t\n\t return this;\n\t }\n\t\n\t , disableButtons: function(name) {\n\t var buttons = this.__parseButtonNameParam(name),\n\t that = this;\n\t\n\t $.each(buttons, function(i, v) {\n\t that.__alterButtons(buttons[i], function (el) {\n\t el.attr('disabled','disabled');\n\t });\n\t });\n\t\n\t return this;\n\t }\n\t\n\t , hideButtons: function(name) {\n\t var buttons = this.__parseButtonNameParam(name),\n\t that = this;\n\t\n\t $.each(buttons, function(i, v) {\n\t that.__alterButtons(buttons[i], function (el) {\n\t el.addClass('hidden');\n\t });\n\t });\n\t\n\t return this;\n\t }\n\t\n\t , showButtons: function(name) {\n\t var buttons = this.__parseButtonNameParam(name),\n\t that = this;\n\t\n\t $.each(buttons, function(i, v) {\n\t that.__alterButtons(buttons[i], function (el) {\n\t el.removeClass('hidden');\n\t });\n\t });\n\t\n\t return this;\n\t }\n\t\n\t , eventSupported: function(eventName) {\n\t var isSupported = eventName in this.$element;\n\t if (!isSupported) {\n\t this.$element.setAttribute(eventName, 'return;');\n\t isSupported = typeof this.$element[eventName] === 'function';\n\t }\n\t return isSupported;\n\t }\n\t\n\t , keyup: function (e) {\n\t var blocked = false;\n\t switch(e.keyCode) {\n\t case 40: // down arrow\n\t case 38: // up arrow\n\t case 16: // shift\n\t case 17: // ctrl\n\t case 18: // alt\n\t break;\n\t\n\t case 9: // tab\n\t var nextTab;\n\t if (nextTab = this.getNextTab(),nextTab !== null) {\n\t // Get the nextTab if exists\n\t var that = this;\n\t setTimeout(function(){\n\t that.setSelection(nextTab.start,nextTab.end);\n\t },500);\n\t\n\t blocked = true;\n\t } else {\n\t // The next tab memory contains nothing...\n\t // check the cursor position to determine tab action\n\t var cursor = this.getSelection();\n\t\n\t if (cursor.start == cursor.end && cursor.end == this.getContent().length) {\n\t // The cursor already reach the end of the content\n\t blocked = false;\n\t } else {\n\t // Put the cursor to the end\n\t this.setSelection(this.getContent().length,this.getContent().length);\n\t\n\t blocked = true;\n\t }\n\t }\n\t\n\t break;\n\t\n\t case 13: // enter\n\t blocked = false;\n\t break;\n\t case 27: // escape\n\t if (this.$isFullscreen) this.setFullscreen(false);\n\t blocked = false;\n\t break;\n\t\n\t default:\n\t blocked = false;\n\t }\n\t\n\t if (blocked) {\n\t e.stopPropagation();\n\t e.preventDefault();\n\t }\n\t\n\t this.$options.onChange(this);\n\t }\n\t\n\t , change: function(e) {\n\t this.$options.onChange(this);\n\t return this;\n\t }\n\t , select: function (e) {\n\t this.$options.onSelect(this);\n\t return this;\n\t }\n\t , focus: function (e) {\n\t var options = this.$options,\n\t isHideable = options.hideable,\n\t editor = this.$editor;\n\t\n\t editor.addClass('active');\n\t\n\t // Blur other markdown(s)\n\t $(document).find('.md-editor').each(function(){\n\t if ($(this).attr('id') !== editor.attr('id')) {\n\t var attachedMarkdown;\n\t\n\t if (attachedMarkdown = $(this).find('textarea').data('markdown'),\n\t attachedMarkdown === null) {\n\t attachedMarkdown = $(this).find('div[data-provider=\"markdown-preview\"]').data('markdown');\n\t }\n\t\n\t if (attachedMarkdown) {\n\t attachedMarkdown.blur();\n\t }\n\t }\n\t });\n\t\n\t // Trigger the onFocus hook\n\t options.onFocus(this);\n\t\n\t return this;\n\t }\n\t\n\t , blur: function (e) {\n\t var options = this.$options,\n\t isHideable = options.hideable,\n\t editor = this.$editor,\n\t editable = this.$editable;\n\t\n\t if (editor.hasClass('active') || this.$element.parent().length === 0) {\n\t editor.removeClass('active');\n\t\n\t if (isHideable) {\n\t // Check for editable elements\n\t if (editable.el !== null) {\n\t // Build the original element\n\t var oldElement = $('<'+editable.type+'/>'),\n\t content = this.getContent(),\n\t currentContent = this.parseContent(content);\n\t\n\t $(editable.attrKeys).each(function(k,v) {\n\t oldElement.attr(editable.attrKeys[k],editable.attrValues[k]);\n\t });\n\t\n\t // Get the editor content\n\t oldElement.html(currentContent);\n\t\n\t editor.replaceWith(oldElement);\n\t } else {\n\t editor.hide();\n\t }\n\t }\n\t\n\t // Trigger the onBlur hook\n\t options.onBlur(this);\n\t }\n\t\n\t return this;\n\t }\n\t\n\t };\n\t\n\t /* MARKDOWN PLUGIN DEFINITION\n\t * ========================== */\n\t\n\t var old = $.fn.markdown;\n\t\n\t $.fn.markdown = function (option) {\n\t return this.each(function () {\n\t var $this = $(this)\n\t , data = $this.data('markdown')\n\t , options = typeof option == 'object' && option;\n\t if (!data) $this.data('markdown', (data = new Markdown(this, options)))\n\t })\n\t };\n\t\n\t $.fn.markdown.messages = {};\n\t\n\t $.fn.markdown.defaults = {\n\t /* Editor Properties */\n\t autofocus: false,\n\t hideable: false,\n\t savable: false,\n\t width: 'inherit',\n\t height: 'inherit',\n\t resize: 'none',\n\t iconlibrary: 'glyph',\n\t language: 'en',\n\t initialstate: 'editor',\n\t parser: null,\n\t\n\t /* Buttons Properties */\n\t buttons: [\n\t [{\n\t name: 'groupFont',\n\t data: [{\n\t name: 'cmdBold',\n\t hotkey: 'Ctrl+B',\n\t title: 'Bold',\n\t icon: { glyph: 'glyphicon glyphicon-bold', fa: 'fa fa-bold', 'fa-3': 'icon-bold' },\n\t callback: function(e){\n\t // Give/remove ** surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('strong text');\n\t } else {\n\t chunk = selected.text;\n\t }\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (content.substr(selected.start-2,2) === '**'\n\t && content.substr(selected.end,2) === '**' ) {\n\t e.setSelection(selected.start-2,selected.end+2);\n\t e.replaceSelection(chunk);\n\t cursor = selected.start-2;\n\t } else {\n\t e.replaceSelection('**'+chunk+'**');\n\t cursor = selected.start+2;\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t },{\n\t name: 'cmdItalic',\n\t title: 'Italic',\n\t hotkey: 'Ctrl+I',\n\t icon: { glyph: 'glyphicon glyphicon-italic', fa: 'fa fa-italic', 'fa-3': 'icon-italic' },\n\t callback: function(e){\n\t // Give/remove * surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('emphasized text');\n\t } else {\n\t chunk = selected.text;\n\t }\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (content.substr(selected.start-1,1) === '_'\n\t && content.substr(selected.end,1) === '_' ) {\n\t e.setSelection(selected.start-1,selected.end+1);\n\t e.replaceSelection(chunk);\n\t cursor = selected.start-1;\n\t } else {\n\t e.replaceSelection('_'+chunk+'_');\n\t cursor = selected.start+1;\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t },{\n\t name: 'cmdHeading',\n\t title: 'Heading',\n\t hotkey: 'Ctrl+H',\n\t icon: { glyph: 'glyphicon glyphicon-header', fa: 'fa fa-header', 'fa-3': 'icon-font' },\n\t callback: function(e){\n\t // Append/remove ### surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent(), pointer, prevChar;\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('heading text');\n\t } else {\n\t chunk = selected.text + '\\n';\n\t }\n\t\n\t // transform selection and set the cursor into chunked text\n\t if ((pointer = 4, content.substr(selected.start-pointer,pointer) === '### ')\n\t || (pointer = 3, content.substr(selected.start-pointer,pointer) === '###')) {\n\t e.setSelection(selected.start-pointer,selected.end);\n\t e.replaceSelection(chunk);\n\t cursor = selected.start-pointer;\n\t } else if (selected.start > 0 && (prevChar = content.substr(selected.start-1,1), !!prevChar && prevChar != '\\n')) {\n\t e.replaceSelection('\\n\\n### '+chunk);\n\t cursor = selected.start+6;\n\t } else {\n\t // Empty string before element\n\t e.replaceSelection('### '+chunk);\n\t cursor = selected.start+4;\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t }]\n\t },{\n\t name: 'groupLink',\n\t data: [{\n\t name: 'cmdUrl',\n\t title: 'URL/Link',\n\t hotkey: 'Ctrl+L',\n\t icon: { glyph: 'glyphicon glyphicon-link', fa: 'fa fa-link', 'fa-3': 'icon-link' },\n\t callback: function(e){\n\t // Give [] surround the selection and prepend the link\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent(), link;\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('enter link description here');\n\t } else {\n\t chunk = selected.text;\n\t }\n\t\n\t link = prompt(e.__localize('Insert Hyperlink'),'http://');\n\t\n\t var urlRegex = new RegExp('^((http|https)://|(mailto:)|(//))[a-z0-9]', 'i');\n\t if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n\t var sanitizedLink = $('<div>'+link+'</div>').text();\n\t\n\t // transform selection and set the cursor into chunked text\n\t e.replaceSelection('['+chunk+']('+sanitizedLink+')');\n\t cursor = selected.start+1;\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t }\n\t },{\n\t name: 'cmdImage',\n\t title: 'Image',\n\t hotkey: 'Ctrl+G',\n\t icon: { glyph: 'glyphicon glyphicon-picture', fa: 'fa fa-picture-o', 'fa-3': 'icon-picture' },\n\t callback: function(e){\n\t // Give ![] surround the selection and prepend the image link\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent(), link;\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('enter image description here');\n\t } else {\n\t chunk = selected.text;\n\t }\n\t\n\t link = prompt(e.__localize('Insert Image Hyperlink'),'http://');\n\t\n\t var urlRegex = new RegExp('^((http|https)://|(//))[a-z0-9]', 'i');\n\t if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n\t var sanitizedLink = $('<div>'+link+'</div>').text();\n\t\n\t // transform selection and set the cursor into chunked text\n\t e.replaceSelection('+'\")');\n\t cursor = selected.start+2;\n\t\n\t // Set the next tab\n\t e.setNextTab(e.__localize('enter image title here'));\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t }\n\t }]\n\t },{\n\t name: 'groupMisc',\n\t data: [{\n\t name: 'cmdList',\n\t hotkey: 'Ctrl+U',\n\t title: 'Unordered List',\n\t icon: { glyph: 'glyphicon glyphicon-list', fa: 'fa fa-list', 'fa-3': 'icon-list-ul' },\n\t callback: function(e){\n\t // Prepend/Give - surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('list text here');\n\t\n\t e.replaceSelection('- '+chunk);\n\t // Set the cursor\n\t cursor = selected.start+2;\n\t } else {\n\t if (selected.text.indexOf('\\n') < 0) {\n\t chunk = selected.text;\n\t\n\t e.replaceSelection('- '+chunk);\n\t\n\t // Set the cursor\n\t cursor = selected.start+2;\n\t } else {\n\t var list = [];\n\t\n\t list = selected.text.split('\\n');\n\t chunk = list[0];\n\t\n\t $.each(list,function(k,v) {\n\t list[k] = '- '+v;\n\t });\n\t\n\t e.replaceSelection('\\n\\n'+list.join('\\n'));\n\t\n\t // Set the cursor\n\t cursor = selected.start+4;\n\t }\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t },\n\t {\n\t name: 'cmdListO',\n\t hotkey: 'Ctrl+O',\n\t title: 'Ordered List',\n\t icon: { glyph: 'glyphicon glyphicon-th-list', fa: 'fa fa-list-ol', 'fa-3': 'icon-list-ol' },\n\t callback: function(e) {\n\t\n\t // Prepend/Give - surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('list text here');\n\t e.replaceSelection('1. '+chunk);\n\t // Set the cursor\n\t cursor = selected.start+3;\n\t } else {\n\t if (selected.text.indexOf('\\n') < 0) {\n\t chunk = selected.text;\n\t\n\t e.replaceSelection('1. '+chunk);\n\t\n\t // Set the cursor\n\t cursor = selected.start+3;\n\t } else {\n\t var list = [];\n\t\n\t list = selected.text.split('\\n');\n\t chunk = list[0];\n\t\n\t $.each(list,function(k,v) {\n\t list[k] = '1. '+v;\n\t });\n\t\n\t e.replaceSelection('\\n\\n'+list.join('\\n'));\n\t\n\t // Set the cursor\n\t cursor = selected.start+5;\n\t }\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t },\n\t {\n\t name: 'cmdCode',\n\t hotkey: 'Ctrl+K',\n\t title: 'Code',\n\t icon: { glyph: 'glyphicon glyphicon-asterisk', fa: 'fa fa-code', 'fa-3': 'icon-code' },\n\t callback: function(e) {\n\t // Give/remove ** surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('code text here');\n\t } else {\n\t chunk = selected.text;\n\t }\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (content.substr(selected.start-4,4) === '```\\n'\n\t && content.substr(selected.end,4) === '\\n```') {\n\t e.setSelection(selected.start-4, selected.end+4);\n\t e.replaceSelection(chunk);\n\t cursor = selected.start-4;\n\t } else if (content.substr(selected.start-1,1) === '`'\n\t && content.substr(selected.end,1) === '`') {\n\t e.setSelection(selected.start-1,selected.end+1);\n\t e.replaceSelection(chunk);\n\t cursor = selected.start-1;\n\t } else if (content.indexOf('\\n') > -1) {\n\t e.replaceSelection('```\\n'+chunk+'\\n```');\n\t cursor = selected.start+4;\n\t } else {\n\t e.replaceSelection('`'+chunk+'`');\n\t cursor = selected.start+1;\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t },\n\t {\n\t name: 'cmdQuote',\n\t hotkey: 'Ctrl+Q',\n\t title: 'Quote',\n\t icon: { glyph: 'glyphicon glyphicon-comment', fa: 'fa fa-quote-left', 'fa-3': 'icon-quote-left' },\n\t callback: function(e) {\n\t // Prepend/Give - surround the selection\n\t var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\t\n\t // transform selection and set the cursor into chunked text\n\t if (selected.length === 0) {\n\t // Give extra word\n\t chunk = e.__localize('quote here');\n\t\n\t e.replaceSelection('> '+chunk);\n\t\n\t // Set the cursor\n\t cursor = selected.start+2;\n\t } else {\n\t if (selected.text.indexOf('\\n') < 0) {\n\t chunk = selected.text;\n\t\n\t e.replaceSelection('> '+chunk);\n\t\n\t // Set the cursor\n\t cursor = selected.start+2;\n\t } else {\n\t var list = [];\n\t\n\t list = selected.text.split('\\n');\n\t chunk = list[0];\n\t\n\t $.each(list,function(k,v) {\n\t list[k] = '> '+v;\n\t });\n\t\n\t e.replaceSelection('\\n\\n'+list.join('\\n'));\n\t\n\t // Set the cursor\n\t cursor = selected.start+4;\n\t }\n\t }\n\t\n\t // Set the cursor\n\t e.setSelection(cursor,cursor+chunk.length);\n\t }\n\t }]\n\t },{\n\t name: 'groupUtil',\n\t data: [{\n\t name: 'cmdPreview',\n\t toggle: true,\n\t hotkey: 'Ctrl+P',\n\t title: 'Preview',\n\t btnText: 'Preview',\n\t btnClass: 'btn btn-primary btn-sm',\n\t icon: { glyph: 'glyphicon glyphicon-search', fa: 'fa fa-search', 'fa-3': 'icon-search' },\n\t callback: function(e){\n\t // Check the preview mode and toggle based on this flag\n\t var isPreview = e.$isPreview,content;\n\t\n\t if (isPreview === false) {\n\t // Give flag that tell the editor enter preview mode\n\t e.showPreview();\n\t } else {\n\t e.hidePreview();\n\t }\n\t }\n\t }]\n\t }]\n\t ],\n\t additionalButtons:[], // Place to hook more buttons by code\n\t reorderButtonGroups:[],\n\t hiddenButtons:[], // Default hidden buttons\n\t disabledButtons:[], // Default disabled buttons\n\t footer: '',\n\t fullscreen: {\n\t enable: true,\n\t icons: {\n\t fullscreenOn: {\n\t fa: 'fa fa-expand',\n\t glyph: 'glyphicon glyphicon-fullscreen',\n\t 'fa-3': 'icon-resize-full'\n\t },\n\t fullscreenOff: {\n\t fa: 'fa fa-compress',\n\t glyph: 'glyphicon glyphicon-fullscreen',\n\t 'fa-3': 'icon-resize-small'\n\t }\n\t }\n\t },\n\t\n\t /* Events hook */\n\t onShow: function (e) {},\n\t onPreview: function (e) {},\n\t onSave: function (e) {},\n\t onBlur: function (e) {},\n\t onFocus: function (e) {},\n\t onChange: function(e) {},\n\t onFullscreen: function(e) {},\n\t onSelect: function (e) {}\n\t };\n\t\n\t $.fn.markdown.Constructor = Markdown;\n\t\n\t\n\t /* MARKDOWN NO CONFLICT\n\t * ==================== */\n\t\n\t $.fn.markdown.noConflict = function () {\n\t $.fn.markdown = old;\n\t return this;\n\t };\n\t\n\t /* MARKDOWN GLOBAL FUNCTION & DATA-API\n\t * ==================================== */\n\t var initMarkdown = function(el) {\n\t var $this = el;\n\t\n\t if ($this.data('markdown')) {\n\t $this.data('markdown').showEditor();\n\t return;\n\t }\n\t\n\t $this.markdown()\n\t };\n\t\n\t var blurNonFocused = function(e) {\n\t var $activeElement = $(document.activeElement);\n\t\n\t // Blur event\n\t $(document).find('.md-editor').each(function(){\n\t var $this = $(this),\n\t focused = $activeElement.closest('.md-editor')[0] === this,\n\t attachedMarkdown = $this.find('textarea').data('markdown') ||\n\t $this.find('div[data-provider=\"markdown-preview\"]').data('markdown');\n\t\n\t if (attachedMarkdown && !focused) {\n\t attachedMarkdown.blur();\n\t }\n\t })\n\t };\n\t\n\t $(document)\n\t .on('click.markdown.data-api', '[data-provide=\"markdown-editable\"]', function (e) {\n\t initMarkdown($(this));\n\t e.preventDefault();\n\t })\n\t .on('click focusin', function (e) {\n\t blurNonFocused(e);\n\t })\n\t .ready(function(){\n\t $('textarea[data-provide=\"markdown\"]').each(function(){\n\t initMarkdown($(this));\n\t })\n\t });\n\t\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(12)))\n\n/***/ },\n\n/***/ 1059:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".calendar{color:#000;min-width:210px;border-radius:4px}.calendar>*{display:block}.calendar .fa-remove{color:red}.calendar nav{font-weight:700;display:flex}.calendar nav .switch{flex:2 0 50%}.calendar nav .next,.calendar nav .prev{flex:1}.calendar main{display:flex;flex-wrap:wrap}.calendar main header{font-weight:700}.calendar main header span{height:30px;padding-top:10px;line-height:20px}.calendar main.days>*{display:flex;flex:1 0 100%}.calendar main.days button,.calendar main.days span{flex:1 0 30px;text-align:center}.calendar main.months,.calendar main.years{flex-wrap:wrap}.calendar main.months button,.calendar main.years button{flex:1 0 25%;text-align:center;height:54px;line-height:54px}.calendar footer{font-weight:700;display:flex}.calendar button{height:30px;width:100%;background:none;border:none;border-radius:4px}.calendar button:hover{background:#eee}.calendar button.new,.calendar button.old{color:#777}.calendar button.day:hover,.calendar button:focus{background:#eee;cursor:pointer}.calendar button:disabled,.calendar button:disabled:hover{background:none;color:#777;cursor:not-allowed}.calendar button.today{color:#000;background-color:#ffdb99;border-color:#ffb733;position:relative}.calendar button.today.focus,.calendar button.today:focus{color:#000;background-color:#ffc966;border-color:#b37400}.calendar button.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.calendar button.today.active,.calendar button.today:active,.open>.dropdown-toggle.calendar button.today{color:#000;background-color:#ffc966;background-image:none;border-color:#f59e00}.calendar button.today.active.focus,.calendar button.today.active:focus,.calendar button.today.active:hover,.calendar button.today:active.focus,.calendar button.today:active:focus,.calendar button.today:active:hover,.open>.dropdown-toggle.calendar button.today.focus,.open>.dropdown-toggle.calendar button.today:focus,.open>.dropdown-toggle.calendar button.today:hover{color:#000;background-color:#ffbc42;border-color:#b37400}.calendar button.today.disabled.focus,.calendar button.today.disabled:focus,.calendar button.today.disabled:hover,.calendar button.today[disabled].focus,.calendar button.today[disabled]:focus,.calendar button.today[disabled]:hover,fieldset[disabled] .calendar button.today.focus,fieldset[disabled] .calendar button.today:focus,fieldset[disabled] .calendar button.today:hover{background-color:#ffdb99;border-color:#ffb733}.calendar button.today .badge{color:#ffdb99;background-color:#000}.calendar button.today:focus{background:#ffc966}.calendar button.today:disabled,.calendar button.today:disabled:active{background:#ffdb99;color:#777}.calendar button.today:before{content:\\\"\\\";display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#000;border-top-color:#ffdb99;position:absolute;bottom:4px;right:4px}.calendar button.active{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.calendar button.active.focus,.calendar button.active:focus{color:#fff;background-color:#286090;border-color:#122b40}.calendar button.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.calendar button.active.active,.calendar button.active:active,.open>.dropdown-toggle.calendar button.active{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.calendar button.active.active.focus,.calendar button.active.active:focus,.calendar button.active.active:hover,.calendar button.active:active.focus,.calendar button.active:active:focus,.calendar button.active:active:hover,.open>.dropdown-toggle.calendar button.active.focus,.open>.dropdown-toggle.calendar button.active:focus,.open>.dropdown-toggle.calendar button.active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.calendar button.active.disabled.focus,.calendar button.active.disabled:focus,.calendar button.active.disabled:hover,.calendar button.active[disabled].focus,.calendar button.active[disabled]:focus,.calendar button.active[disabled]:hover,fieldset[disabled] .calendar button.active.focus,fieldset[disabled] .calendar button.active:focus,fieldset[disabled] .calendar button.active:hover{background-color:#337ab7;border-color:#2e6da4}.calendar button.active .badge{color:#337ab7;background-color:#fff}.calendar button.active.today:before{border-bottom-color:#fff}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/calendar.vue\"],\"names\":[],\"mappings\":\"AAAA,UAAU,WAAY,gBAAgB,iBAAiB,CAAC,YAAY,aAAa,CAAC,qBAAqB,SAAS,CAAC,cAAc,gBAAiB,YAAY,CAAC,sBAAsB,YAAY,CAAC,wCAAwC,MAAM,CAAC,eAAe,aAAa,cAAc,CAAC,sBAAsB,eAAgB,CAAC,2BAA2B,YAAY,iBAAiB,gBAAgB,CAAC,sBAAsB,aAAa,aAAa,CAAC,oDAAoD,cAAc,iBAAiB,CAAC,2CAA2C,cAAc,CAAC,yDAAyD,aAAa,kBAAkB,YAAY,gBAAgB,CAAC,iBAAiB,gBAAiB,YAAY,CAAC,iBAAiB,YAAY,WAAW,gBAAgB,YAAY,iBAAiB,CAAC,uBAAuB,eAAe,CAAC,0CAA0C,UAAU,CAAC,kDAAkD,gBAAgB,cAAc,CAAC,0DAA0D,gBAAgB,WAAW,kBAAkB,CAAC,uBAAuB,WAAW,yBAAyB,qBAAqB,iBAAiB,CAAC,0DAA0D,WAAW,yBAAyB,oBAAoB,CAAC,6BAA6B,WAAW,yBAAyB,oBAAoB,CAAC,yGAAyG,WAAW,yBAAyB,sBAAsB,oBAAoB,CAAC,iXAAiX,WAAW,yBAAyB,oBAAoB,CAAC,uXAAuX,yBAAyB,oBAAoB,CAAC,8BAA8B,cAAc,qBAAqB,CAAC,6BAA6B,kBAAkB,CAAC,uEAAuE,mBAAmB,UAAU,CAAC,8BAA8B,WAAW,qBAAqB,yBAAyB,yBAAyB,yBAAyB,yBAAyB,kBAAkB,WAAW,SAAS,CAAC,wBAAwB,WAAW,yBAAyB,qBAAqB,oCAAqC,CAAC,4DAA4D,WAAW,yBAAyB,oBAAoB,CAAC,8BAA8B,WAAW,yBAAyB,oBAAoB,CAAC,4GAA4G,WAAW,yBAAyB,sBAAsB,oBAAoB,CAAC,0XAA0X,WAAW,yBAAyB,oBAAoB,CAAC,gYAAgY,yBAAyB,oBAAoB,CAAC,+BAA+B,cAAc,qBAAqB,CAAC,qCAAqC,wBAAwB,CAAC\",\"file\":\"calendar.vue\",\"sourcesContent\":[\".calendar{color:black;min-width:210px;border-radius:4px}.calendar>*{display:block}.calendar .fa-remove{color:red}.calendar nav{font-weight:bold;display:flex}.calendar nav .switch{flex:2 0 50%}.calendar nav .prev,.calendar nav .next{flex:1}.calendar main{display:flex;flex-wrap:wrap}.calendar main header{font-weight:bold}.calendar main header span{height:30px;padding-top:10px;line-height:20px}.calendar main.days>*{display:flex;flex:1 0 100%}.calendar main.days span,.calendar main.days button{flex:1 0 30px;text-align:center}.calendar main.months,.calendar main.years{flex-wrap:wrap}.calendar main.months button,.calendar main.years button{flex:1 0 25%;text-align:center;height:54px;line-height:54px}.calendar footer{font-weight:bold;display:flex}.calendar button{height:30px;width:100%;background:none;border:none;border-radius:4px}.calendar button:hover{background:#eee}.calendar button.old,.calendar button.new{color:#777}.calendar button.day:hover,.calendar button:focus{background:#eee;cursor:pointer}.calendar button:disabled,.calendar button:disabled:hover{background:none;color:#777;cursor:not-allowed}.calendar button.today{color:#000;background-color:#ffdb99;border-color:#ffb733;position:relative}.calendar button.today:focus,.calendar button.today.focus{color:#000;background-color:#ffc966;border-color:#b37400}.calendar button.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.calendar button.today:active,.calendar button.today.active,.open>.dropdown-toggle.calendar button.today{color:#000;background-color:#ffc966;background-image:none;border-color:#f59e00}.calendar button.today:active:hover,.calendar button.today.active:hover,.open>.dropdown-toggle.calendar button.today:hover,.calendar button.today:active:focus,.calendar button.today.active:focus,.open>.dropdown-toggle.calendar button.today:focus,.calendar button.today:active.focus,.calendar button.today.active.focus,.open>.dropdown-toggle.calendar button.today.focus{color:#000;background-color:#ffbc42;border-color:#b37400}.calendar button.today.disabled:hover,.calendar button.today[disabled]:hover,fieldset[disabled] .calendar button.today:hover,.calendar button.today.disabled:focus,.calendar button.today[disabled]:focus,fieldset[disabled] .calendar button.today:focus,.calendar button.today.disabled.focus,.calendar button.today[disabled].focus,fieldset[disabled] .calendar button.today.focus{background-color:#ffdb99;border-color:#ffb733}.calendar button.today .badge{color:#ffdb99;background-color:#000}.calendar button.today:focus{background:#ffc966}.calendar button.today:disabled,.calendar button.today:disabled:active{background:#ffdb99;color:#777}.calendar button.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#000;border-top-color:#ffdb99;position:absolute;bottom:4px;right:4px}.calendar button.active{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.calendar button.active:focus,.calendar button.active.focus{color:#fff;background-color:#286090;border-color:#122b40}.calendar button.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.calendar button.active:active,.calendar button.active.active,.open>.dropdown-toggle.calendar button.active{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.calendar button.active:active:hover,.calendar button.active.active:hover,.open>.dropdown-toggle.calendar button.active:hover,.calendar button.active:active:focus,.calendar button.active.active:focus,.open>.dropdown-toggle.calendar button.active:focus,.calendar button.active:active.focus,.calendar button.active.active.focus,.open>.dropdown-toggle.calendar button.active.focus{color:#fff;background-color:#204d74;border-color:#122b40}.calendar button.active.disabled:hover,.calendar button.active[disabled]:hover,fieldset[disabled] .calendar button.active:hover,.calendar button.active.disabled:focus,.calendar button.active[disabled]:focus,fieldset[disabled] .calendar button.active:focus,.calendar button.active.disabled.focus,.calendar button.active[disabled].focus,fieldset[disabled] .calendar button.active.focus{background-color:#337ab7;border-color:#2e6da4}.calendar button.active .badge{color:#337ab7;background-color:#fff}.calendar button.active.today:before{border-bottom-color:#fff}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1060:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".checkbox-form-field label{font-weight:700}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/checkbox.vue\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B,eAAgB,CAAC\",\"file\":\"checkbox.vue\",\"sourcesContent\":[\".checkbox-form-field label{font-weight:bold}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1061:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".date-picker .dropdown-menu{min-width:100%;width:auto}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/date-picker.vue\"],\"names\":[],\"mappings\":\"AAAA,4BAA4B,eAAe,UAAU,CAAC\",\"file\":\"date-picker.vue\",\"sourcesContent\":[\".date-picker .dropdown-menu{min-width:100%;width:auto}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1062:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \"table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777}caption,th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.markdown img{max-width:100%;margin:auto;display:block}.markdown img+em{display:block;text-align:center;margin:.3em .1em}.markdown table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.markdown table>tbody>tr>td,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>td,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.markdown table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.markdown table>caption+thead>tr:first-child>td,.markdown table>caption+thead>tr:first-child>th,.markdown table>colgroup+thead>tr:first-child>td,.markdown table>colgroup+thead>tr:first-child>th,.markdown table>thead:first-child>tr:first-child>td,.markdown table>thead:first-child>tr:first-child>th{border-top:0}.markdown table>tbody+tbody{border-top:2px solid #ddd}.markdown table .table{background-color:#fff}.markdown table>tbody>tr>td,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>td,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>thead>tr>th{border:1px solid #ddd}.markdown table>thead>tr>td,.markdown table>thead>tr>th{border-bottom-width:2px}.markdown table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.markdown table>tbody>tr:hover{background-color:#f5f5f5}.md-editor>textarea{background:#fff;padding:6px 12px;border-bottom:none}.md-editor.active{border-color:#3c8dbc;box-shadow:none}.form-group.has-error .md-editor{border-color:#dd4b39}.form-group.has-success .md-editor{border-color:#00a65a}.md-editor .btn{border-radius:0}.md-editor .btn.btn-default{background-color:#fff}.md-editor .md-preview{color:#000;padding:6px 12px;max-width:100%}.md-editor .md-preview img{max-width:100%;margin:auto;display:block}.md-editor .md-preview img+em{display:block;text-align:center;margin:.3em .1em}.md-editor .md-preview table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>td,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.md-editor .md-preview table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.md-editor .md-preview table>caption+thead>tr:first-child>td,.md-editor .md-preview table>caption+thead>tr:first-child>th,.md-editor .md-preview table>colgroup+thead>tr:first-child>td,.md-editor .md-preview table>colgroup+thead>tr:first-child>th,.md-editor .md-preview table>thead:first-child>tr:first-child>td,.md-editor .md-preview table>thead:first-child>tr:first-child>th{border-top:0}.md-editor .md-preview table>tbody+tbody{border-top:2px solid #ddd}.md-editor .md-preview table .table{background-color:#fff}.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>td,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{border:1px solid #ddd}.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{border-bottom-width:2px}.md-editor .md-preview table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.md-editor .md-preview table>tbody>tr:hover{background-color:#f5f5f5}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/markdown-editor.vue\"],\"names\":[],\"mappings\":\"AAAA,MAAM,4BAA4B,CAAC,uBAAyB,gBAAgB,qBAAqB,UAAU,CAAC,4CAAgD,gBAAgB,mBAAmB,UAAU,CAAC,QAAQ,gBAAgB,mBAAmB,UAAW,CAAgB,WAAhB,eAAe,CAAoB,OAAO,WAAW,eAAe,kBAAkB,CAAC,kHAAkH,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,mBAAmB,sBAAsB,4BAA4B,CAAC,oPAAoP,YAAY,CAAC,mBAAmB,yBAAyB,CAAC,cAAc,qBAAqB,CAAC,8KAA8K,WAAW,CAAC,AAAsC,wLAAwK,qBAAqB,CAAC,wDAAwD,uBAAuB,CAAC,yCAAyC,wBAAwB,CAAC,AAAqD,oVAAwT,wBAAwB,CAAC,4LAA4L,wBAAwB,CAAC,oUAAoU,wBAAwB,CAAC,iMAAiM,wBAAwB,CAAC,gSAAgS,wBAAwB,CAAC,kLAAkL,wBAAwB,CAAC,oUAAoU,wBAAwB,CAAC,iMAAiM,wBAAwB,CAAC,wTAAwT,wBAAwB,CAAC,4LAA4L,wBAAwB,CAAC,kBAAkB,gBAAgB,eAAe,CAAC,oCAAoC,kBAAkB,WAAW,mBAAmB,kBAAkB,4CAA4C,qBAAqB,CAAC,yBAAyB,eAAe,CAAC,8NAA8N,kBAAkB,CAAC,kCAAkC,QAAQ,CAAC,4VAA4V,aAAa,CAAC,sVAAsV,cAAc,CAAC,oOAAoO,eAAe,CAAC,CAAC,cAAc,eAAe,YAAY,aAAa,CAAC,iBAAiB,cAAc,kBAAkB,gBAAgB,CAAC,gBAAgB,WAAW,eAAe,mBAAmB,qBAAqB,CAAC,wKAAwK,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,4BAA4B,sBAAsB,4BAA4B,CAAC,0SAA0S,YAAY,CAAC,4BAA4B,yBAAyB,CAAC,uBAAuB,qBAAqB,CAAC,wKAAwK,qBAAqB,CAAC,wDAAwD,uBAAuB,CAAC,0CAA0C,wBAAwB,CAAC,+BAA+B,wBAAwB,CAAC,oBAAoB,gBAAiB,iBAAiB,kBAAkB,CAAC,kBAAkB,qBAAqB,eAAe,CAAC,iCAAiC,oBAAoB,CAAC,mCAAmC,oBAAoB,CAAC,gBAAgB,eAAe,CAAC,4BAA4B,qBAAsB,CAAC,uBAAuB,WAAY,iBAAiB,cAAc,CAAC,2BAA2B,eAAe,YAAY,aAAa,CAAC,8BAA8B,cAAc,kBAAkB,gBAAgB,CAAC,6BAA6B,WAAW,eAAe,mBAAmB,qBAAqB,CAAC,sPAAsP,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,yCAAyC,sBAAsB,4BAA4B,CAAC,wXAAwX,YAAY,CAAC,yCAAyC,yBAAyB,CAAC,oCAAoC,qBAAqB,CAAC,sPAAsP,qBAAqB,CAAC,kFAAkF,uBAAuB,CAAC,uDAAuD,wBAAwB,CAAC,4CAA4C,wBAAwB,CAAC\",\"file\":\"markdown-editor.vue\",\"sourcesContent\":[\"table{background-color:transparent}table col[class*=\\\"col-\\\"]{position:static;display:table-column;float:none}table td[class*=\\\"col-\\\"],table th[class*=\\\"col-\\\"]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.markdown img{max-width:100%;margin:auto;display:block}.markdown img+em{display:block;text-align:center;margin:.3em .1em}.markdown table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.markdown table>thead>tr>th,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>tbody>tr>td,.markdown table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.markdown table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.markdown table>caption+thead>tr:first-child>th,.markdown table>colgroup+thead>tr:first-child>th,.markdown table>thead:first-child>tr:first-child>th,.markdown table>caption+thead>tr:first-child>td,.markdown table>colgroup+thead>tr:first-child>td,.markdown table>thead:first-child>tr:first-child>td{border-top:0}.markdown table>tbody+tbody{border-top:2px solid #ddd}.markdown table .table{background-color:#fff}.markdown table>thead>tr>th,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>tbody>tr>td,.markdown table>tfoot>tr>td{border:1px solid #ddd}.markdown table>thead>tr>th,.markdown table>thead>tr>td{border-bottom-width:2px}.markdown table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.markdown table>tbody>tr:hover{background-color:#f5f5f5}.md-editor>textarea{background:white;padding:6px 12px;border-bottom:none}.md-editor.active{border-color:#3c8dbc;box-shadow:none}.form-group.has-error .md-editor{border-color:#dd4b39}.form-group.has-success .md-editor{border-color:#00a65a}.md-editor .btn{border-radius:0}.md-editor .btn.btn-default{background-color:white}.md-editor .md-preview{color:black;padding:6px 12px;max-width:100%}.md-editor .md-preview img{max-width:100%;margin:auto;display:block}.md-editor .md-preview img+em{display:block;text-align:center;margin:.3em .1em}.md-editor .md-preview table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.md-editor .md-preview table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.md-editor .md-preview table>caption+thead>tr:first-child>th,.md-editor .md-preview table>colgroup+thead>tr:first-child>th,.md-editor .md-preview table>thead:first-child>tr:first-child>th,.md-editor .md-preview table>caption+thead>tr:first-child>td,.md-editor .md-preview table>colgroup+thead>tr:first-child>td,.md-editor .md-preview table>thead:first-child>tr:first-child>td{border-top:0}.md-editor .md-preview table>tbody+tbody{border-top:2px solid #ddd}.md-editor .md-preview table .table{background-color:#fff}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tfoot>tr>td{border:1px solid #ddd}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>thead>tr>td{border-bottom-width:2px}.md-editor .md-preview table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.md-editor .md-preview table>tbody>tr:hover{background-color:#f5f5f5}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1063:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div class=calendar :class=\\\"[ 'view' ]\\\"> <div class=calendar-{{view}}> <nav> <button class=prev @click.prevent=previous :disabled=previousDisabled> <span class=\\\"fa fa-chevron-left\\\"></span> </button> <button class=switch @click.prevent=zoomOut>{{ rangeDisplay }}</button> <button class=next @click.prevent=next :disabled=nextDisabled> <span class=\\\"fa fa-chevron-right\\\"></span> </button> </nav> <main v-if=\\\"view == 'days'\\\" class=days> <header> <span class=dow v-for=\\\"day in days\\\">{{ day }}</span> </header> <div v-for=\\\"week in monthDays(current)\\\"> <button v-for=\\\"day in week\\\" class=day :class=dayClasses(day) @click.prevent=pickDay(day) :disabled=isDisabled(day)> {{ day.date() }} </button> </div> </main> <main v-if=\\\"view == 'months'\\\" class=months> <button v-for=\\\"(idx, month) in months\\\" class=month @click.prevent=pickMonth(idx) :disabled=isMonthDisabled(idx)> {{ month }} </button> </main> <main v-if=\\\"view == 'years'\\\" class=years> <button v-for=\\\"year in yearsRange\\\" class=year @click.prevent=pickYear(year) :disabled=isYearDisabled(year)> {{ year }} </button> </main> <footer> <button @click.prevent=pickDay(today)>{{ _('Today') }}</button> <button @click.prevent=clear> <span class=\\\"fa fa-remove\\\"></span> {{ _('Clear') }} </button> </footer> </div> </div> \";\n\n/***/ },\n\n/***/ 1064:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div class=\\\"checkbox checkbox-form-field\\\"> <label :for=field.id :class=\\\"{ 'required': required }\\\"> <input type=checkbox :id=field.id :name=field.id :checked=value @input=onChange> {{ field.label }} </label> </div> \";\n\n/***/ },\n\n/***/ 1065:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div class=\\\"input-group dropdown date-picker\\\" :class=\\\"{ 'open': picking }\\\" v-outside=onOutside> <span class=input-group-addon><span class=\\\"fa fa-calendar\\\"></span></span> <input type=text class=form-control v-el:input @focus=onFocus @input=\\\"onChange | debounce 500\\\" :placeholder=placeholder :required=required :value=\\\"value|dt dateFormat ''\\\" :readonly=readonly> <div class=\\\"dropdown-menu dropdown-menu-right\\\"> <calendar v-ref:calendar :selected=value></calendar> </div> <input v-if=serializable v-el:hidden type=hidden :name=field.id :value=\\\"value|dt ISO_FORMAT ''\\\"> </div> \";\n\n/***/ },\n\n/***/ 1066:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <input type=hidden :id=field.id :name=field.id :value=value :required=required> \";\n\n/***/ },\n\n/***/ 1067:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <textarea class=form-control :rows=\\\"field.rows || rows || 6\\\" :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly @input=onChange>{{value || ''}}</textarea> \";\n\n/***/ },\n\n/***/ 1068:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <input type=number class=form-control :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly :value=value @input=onChange> \";\n\n/***/ },\n\n/***/ 1069:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <select class=form-control v-model=value :multiple=field.multiple :id=field.id :name=field.id :placeholder=placeholder :required=required :disabled=readonly @change=onChange> <optgroup v-for=\\\"(group, ids) in field.groups\\\" :label=group> <option v-for=\\\"option in options | extract group\\\" :value=option.value :selected=\\\"option.value == value\\\"> {{option.text || option.value}} </option> </optgroup> </select> \";\n\n/***/ },\n\n/***/ 1070:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <select class=form-control v-model=value :multiple=field.multiple :id=field.id :name=field.id :placeholder=placeholder :required=required :disabled=readonly @change=onChange> <option v-for=\\\"option in options | extract\\\" :value=option.value> {{option.text || option.value}} </option> </select> \";\n\n/***/ },\n\n/***/ 1071:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <input type=text class=form-control :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly :value=value @input=onChange> \";\n\n/***/ },\n\n/***/ 1072:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1059);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../node_modules/css-loader/index.js?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../node_modules/css-loader/index.js?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1073:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1060);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1074:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1061);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1075:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1062);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1076:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray2 = __webpack_require__(135);\n\t\n\tvar _slicedToArray3 = _interopRequireDefault(_slicedToArray2);\n\t\n\tvar _entries = __webpack_require__(201);\n\t\n\tvar _entries2 = _interopRequireDefault(_entries);\n\t\n\tvar _toConsumableArray2 = __webpack_require__(1034);\n\t\n\tvar _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);\n\t\n\tvar _getIterator2 = __webpack_require__(200);\n\t\n\tvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\t\n\tvar _api = __webpack_require__(99);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tvar _i18n = __webpack_require__(133);\n\t\n\tvar _utils = __webpack_require__(314);\n\t\n\tvar _logger = __webpack_require__(19);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tvar _moment = __webpack_require__(15);\n\t\n\tvar _moment2 = _interopRequireDefault(_moment);\n\t\n\tvar _jqueryValidation = __webpack_require__(1077);\n\t\n\tvar _jqueryValidation2 = _interopRequireDefault(_jqueryValidation);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar interpolation = { defaultVariables: { 'O': '{O}', '1': '{1}', 'ISO': '{ISO}' } };\n\t\n\t_jqueryValidation2.default.extend(_jqueryValidation2.default.validator.messages, {\n\t required: (0, _i18n._)('valid-required'),\n\t remote: (0, _i18n._)('valid-remote'),\n\t email: (0, _i18n._)('valid-email'),\n\t url: (0, _i18n._)('valid-url'),\n\t date: (0, _i18n._)('valid-date'),\n\t dateISO: (0, _i18n._)('valid-date-iso', { interpolation: interpolation }),\n\t number: (0, _i18n._)('valid-number'),\n\t digits: (0, _i18n._)('valid-digits'),\n\t creditcard: (0, _i18n._)('valid-creditcard'),\n\t equalTo: (0, _i18n._)('valid-equal-to'),\n\t maxlength: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-maxlength', { interpolation: interpolation })),\n\t minlength: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-minlength', { interpolation: interpolation })),\n\t rangelength: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-range-length', { interpolation: interpolation })),\n\t range: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-range', { interpolation: interpolation })),\n\t max: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-max', { interpolation: interpolation })),\n\t min: _jqueryValidation2.default.validator.format((0, _i18n._)('valid-min', { interpolation: interpolation }))\n\t});\n\t\n\t_jqueryValidation2.default.validator.addMethod('dateGreaterThan', function (value, element, param) {\n\t var start = (0, _moment2.default)(document.getElementById(param).value);\n\t return this.optional(element) || (0, _moment2.default)(value).isAfter(start);\n\t}, _jqueryValidation2.default.validator.format((0, _i18n._)('Date should be after start date')));\n\t\n\tfunction empty_schema() {\n\t return { properties: {}, required: [] };\n\t}\n\t\n\tvar TEXT_INPUTS = ['color', 'date', 'datetime', 'datetime-local', 'email', 'hidden', 'month', 'number', 'range', 'search', 'tel', 'text', 'time', 'url', 'week'];\n\t\n\tvar TEXT_TAGS = ['select', 'textarea'];\n\t\n\texports.default = {\n\t name: 'base-form',\n\t props: {\n\t fields: Array,\n\t model: Object,\n\t defs: Object,\n\t readonly: {\n\t type: Boolean,\n\t default: false\n\t },\n\t fill: Boolean\n\t },\n\t events: {\n\t 'field:change': function fieldChange(field, value) {\n\t this.$dispatch('form:change', this, field, value);\n\t return true;\n\t }\n\t },\n\t computed: {\n\t schema: function schema() {\n\t if (!this.fields || !(this.model || this.defs)) {\n\t return empty_schema();\n\t }\n\t var s = empty_schema();\n\t var schema = this.defs || this.model && this.model.__schema__ || empty_schema();\n\t\n\t this.fields.forEach(function (field) {\n\t if (schema.hasOwnProperty('properties') && schema.properties.hasOwnProperty(field.id)) {\n\t s.properties[field.id] = schema.properties[field.id];\n\t if (schema.required && schema.required.indexOf(field.id) >= 0) {\n\t s.required.push(field.id);\n\t }\n\t return;\n\t }\n\t\n\t var properties = field.id.split('.');\n\t var currentSchema = schema;\n\t var required = true;\n\t var path = '';\n\t var prop = void 0;\n\t\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = (0, _getIterator3.default)(properties), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t prop = _step.value;\n\t\n\t path += path === '' ? prop : '.' + prop;\n\t\n\t if (currentSchema.hasOwnProperty('$ref')) {\n\t currentSchema = _api2.default.resolve(currentSchema.$ref);\n\t }\n\t\n\t if (!currentSchema.properties || !currentSchema.properties.hasOwnProperty(prop)) {\n\t _logger2.default.warn('Property \"' + prop + '\" not found in schema');\n\t return;\n\t }\n\t\n\t required = required && currentSchema.hasOwnProperty('required') && currentSchema.required.indexOf(prop) >= 0;\n\t\n\t if (required && s.required.indexOf(path) < 0) {\n\t s.required.push(path);\n\t }\n\t\n\t if (currentSchema.properties[prop].hasOwnProperty('$ref')) {\n\t currentSchema = _api2.default.resolve(currentSchema.properties[prop].$ref);\n\t }\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t\n\t s.properties[field.id] = currentSchema.properties[prop];\n\t if (required && !field.id in s.required) {\n\t s.required.push(field.id);\n\t }\n\t });\n\t\n\t return s;\n\t },\n\t $form: function $form() {\n\t if (!this) return;\n\t return this.$refs.form || this.$els.form || this.$el;\n\t }\n\t },\n\t attached: function attached() {\n\t (0, _jqueryValidation2.default)(this.$form).validate({\n\t ignore: '',\n\t errorClass: 'help-block',\n\t highlight: this.highlight,\n\t unhighlight: this.unhighlight,\n\t success: this.success,\n\t showErrors: this.showErrors,\n\t errorPlacement: function errorPlacement() {}\n\t });\n\t this.$broadcast('form:ready');\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this.$form) {\n\t this.$broadcast('form:beforeDestroy');\n\t (0, _jqueryValidation2.default)(this.$form).data('validator', null);\n\t this.$broadcast('form:destroy');\n\t }\n\t },\n\t\n\t methods: {\n\t validate: function validate() {\n\t return (0, _jqueryValidation2.default)(this.$form).valid();\n\t },\n\t serialize: function serialize() {\n\t if (!this.$form) return;\n\t var elements = this.$form.querySelectorAll('input,textarea,select');\n\t var out = {};\n\t\n\t Array.prototype.map.call(elements, function (el) {\n\t var value = void 0;\n\t if (el.tagName.toLowerCase() === 'select' && el.multiple) {\n\t value = [].concat((0, _toConsumableArray3.default)(el.options));\n\t value = value.filter(function (option) {\n\t return option.selected;\n\t });\n\t value = value.map(function (option) {\n\t return option.value;\n\t });\n\t } else if (TEXT_TAGS.includes(el.tagName.toLowerCase()) || TEXT_INPUTS.includes(el.type.toLowerCase())) {\n\t value = el.value || null;\n\t } else if (el.type === 'checkbox') {\n\t value = el.checked;\n\t } else {\n\t value = el.value;\n\t }\n\t return { name: el.name, value: value };\n\t }).forEach(function (item) {\n\t (0, _utils.setattr)(out, item.name, item.value);\n\t });\n\t\n\t for (var prop in out) {\n\t if ((0, _utils.isObject)(out[prop]) && this.schema.required.indexOf(prop) < 0) {\n\t var falsy = true;\n\t for (var attr in out[prop]) {\n\t if (out[prop].hasOwnProperty(attr)) {\n\t falsy &= !out[prop][attr];\n\t }\n\t }\n\t if (falsy) {\n\t delete out[prop];\n\t }\n\t }\n\t }\n\t\n\t return out;\n\t },\n\t on_error: function on_error(response) {\n\t var messages = [];\n\t\n\t if ((0, _utils.isString)(response)) {\n\t _logger2.default.error(response);\n\t return;\n\t }\n\t\n\t if (response.headers && 'X-Sentry-ID' in response.headers) {\n\t messages.push(this._('The error identifier is {id}', { id: response.headers['X-Sentry-ID'] }));\n\t }\n\t\n\t if ('data' in response) {\n\t var data = {};\n\t try {\n\t data = JSON.parse(response.data);\n\t } catch (e) {\n\t _logger2.default.warn('Parsing error:', e);\n\t }\n\t\n\t if ('errors' in data) {\n\t this.fill_errors(data.errors);\n\t return;\n\t } else if ('message' in data) {\n\t messages.push(data.message);\n\t }\n\t }\n\t\n\t if (!messages.length) {\n\t messages.push(this._('An unkown error occured'));\n\t }\n\t\n\t this.$dispatch('notify', {\n\t type: 'error',\n\t icon: 'exclamation-triangle',\n\t title: this._('An error occured'),\n\t details: messages.join('\\n')\n\t });\n\t },\n\t fill_errors: function fill_errors(errors) {\n\t var _this = this;\n\t\n\t (0, _entries2.default)((0, _utils.flattenObject)(errors)).forEach(function (_ref) {\n\t var _ref2 = (0, _slicedToArray3.default)(_ref, 2),\n\t field = _ref2[0],\n\t errs = _ref2[1];\n\t\n\t var el = _this.$form.querySelector('[name=\"' + field + '\"]');\n\t var $field = _this.findField(el);\n\t $field.errors = errs;\n\t $field.success = false;\n\t });\n\t },\n\t highlight: function highlight(element) {\n\t this.findField(element).success = false;\n\t },\n\t unhighlight: function unhighlight(element) {\n\t this.findField(element).errors = [];\n\t },\n\t showErrors: function showErrors(errorMap, errorList) {\n\t var _this2 = this;\n\t\n\t errorList.forEach(function (error) {\n\t _this2.findField(error.element).errors = [error.message];\n\t });\n\t (0, _jqueryValidation2.default)(this.$form).data('validator').defaultShowErrors();\n\t },\n\t success: function success(label, el) {\n\t this.findField(el).success = true;\n\t },\n\t findField: function findField(el) {\n\t var $component = (0, _utils.findComponent)(this, el);\n\t while (!$component.isField) {\n\t $component = $component.$parent;\n\t }\n\t return $component;\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1077:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t * jQuery Validation Plugin v1.20.0\n\t *\n\t * https://jqueryvalidation.org/\n\t *\n\t * Copyright (c) 2023 Jörn Zaefferer\n\t * Released under the MIT license\n\t */\n\t(function( factory ) {\n\t\tif ( true ) {\n\t\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(12)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\t} else if (typeof module === \"object\" && module.exports) {\n\t\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t\t} else {\n\t\t\tfactory( jQuery );\n\t\t}\n\t}(function( $ ) {\n\t\n\t$.extend( $.fn, {\n\t\n\t\t// https://jqueryvalidation.org/validate/\n\t\tvalidate: function( options ) {\n\t\n\t\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\t\tif ( !this.length ) {\n\t\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Check if a validator for this form was already created\n\t\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\t\tif ( validator ) {\n\t\t\t\treturn validator;\n\t\t\t}\n\t\n\t\t\t// Add novalidate tag if HTML5.\n\t\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\t\n\t\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t\t$.data( this[ 0 ], \"validator\", validator );\n\t\n\t\t\tif ( validator.settings.onsubmit ) {\n\t\n\t\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\t\n\t\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t\t// submits later.\n\t\t\t\t\tvalidator.submitButton = event.currentTarget;\n\t\n\t\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\n\t\t\t\t// Validate the form on submit\n\t\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\t\tif ( validator.settings.debug ) {\n\t\n\t\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tfunction handle() {\n\t\t\t\t\t\tvar hidden, result;\n\t\n\t\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t\t// - A user defined a `submitHandler`\n\t\t\t\t\t\t// - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t\t// was called to submit the form in case it's valid\n\t\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\t\tif ( hidden ) {\n\t\n\t\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\t\treturn handle();\n\t\t\t\t\t}\n\t\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn handle();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\n\t\t\treturn validator;\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/valid/\n\t\tvalid: function() {\n\t\t\tvar valid, validator, errorList;\n\t\n\t\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\t\tvalid = this.validate().form();\n\t\t\t} else {\n\t\t\t\terrorList = [];\n\t\t\t\tvalid = true;\n\t\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\t\tif ( !valid ) {\n\t\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tvalidator.errorList = errorList;\n\t\t\t}\n\t\t\treturn valid;\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/rules/\n\t\trules: function( command, argument ) {\n\t\t\tvar element = this[ 0 ],\n\t\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\t\n\t\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\t\tif ( element == null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ( !element.form && isContentEditable ) {\n\t\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\t\telement.name = this.attr( \"name\" );\n\t\t\t}\n\t\n\t\t\tif ( element.form == null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ( command ) {\n\t\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\t\tstaticRules = settings.rules;\n\t\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\t\tswitch ( command ) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\t\n\t\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\t\tdelete existingRules.messages;\n\t\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"remove\":\n\t\t\t\t\tif ( !argument ) {\n\t\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\t\treturn existingRules;\n\t\t\t\t\t}\n\t\t\t\t\tfiltered = {};\n\t\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t\t} );\n\t\t\t\t\treturn filtered;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tdata = $.validator.normalizeRules(\n\t\t\t$.extend(\n\t\t\t\t{},\n\t\t\t\t$.validator.classRules( element ),\n\t\t\t\t$.validator.attributeRules( element ),\n\t\t\t\t$.validator.dataRules( element ),\n\t\t\t\t$.validator.staticRules( element )\n\t\t\t), element );\n\t\n\t\t\t// Make sure required is at front\n\t\t\tif ( data.required ) {\n\t\t\t\tparam = data.required;\n\t\t\t\tdelete data.required;\n\t\t\t\tdata = $.extend( { required: param }, data );\n\t\t\t}\n\t\n\t\t\t// Make sure remote is at back\n\t\t\tif ( data.remote ) {\n\t\t\t\tparam = data.remote;\n\t\t\t\tdelete data.remote;\n\t\t\t\tdata = $.extend( data, { remote: param } );\n\t\t\t}\n\t\n\t\t\treturn data;\n\t\t}\n\t} );\n\t\n\t// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\n\tvar trim = function( str ) {\n\t\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\t\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n\t};\n\t\n\t// Custom selectors\n\t$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\t\n\t\t// https://jqueryvalidation.org/blank-selector/\n\t\tblank: function( a ) {\n\t\t\treturn !trim( \"\" + $( a ).val() );\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/filled-selector/\n\t\tfilled: function( a ) {\n\t\t\tvar val = $( a ).val();\n\t\t\treturn val !== null && !!trim( \"\" + val );\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/unchecked-selector/\n\t\tunchecked: function( a ) {\n\t\t\treturn !$( a ).prop( \"checked\" );\n\t\t}\n\t} );\n\t\n\t// Constructor for validator\n\t$.validator = function( options, form ) {\n\t\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\t\tthis.currentForm = form;\n\t\tthis.init();\n\t};\n\t\n\t// https://jqueryvalidation.org/jQuery.validator.format/\n\t$.validator.format = function( source, params ) {\n\t\tif ( arguments.length === 1 ) {\n\t\t\treturn function() {\n\t\t\t\tvar args = $.makeArray( arguments );\n\t\t\t\targs.unshift( source );\n\t\t\t\treturn $.validator.format.apply( this, args );\n\t\t\t};\n\t\t}\n\t\tif ( params === undefined ) {\n\t\t\treturn source;\n\t\t}\n\t\tif ( arguments.length > 2 && params.constructor !== Array ) {\n\t\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t\t}\n\t\tif ( params.constructor !== Array ) {\n\t\t\tparams = [ params ];\n\t\t}\n\t\t$.each( params, function( i, n ) {\n\t\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\t\treturn n;\n\t\t\t} );\n\t\t} );\n\t\treturn source;\n\t};\n\t\n\t$.extend( $.validator, {\n\t\n\t\tdefaults: {\n\t\t\tmessages: {},\n\t\t\tgroups: {},\n\t\t\trules: {},\n\t\t\terrorClass: \"error\",\n\t\t\tpendingClass: \"pending\",\n\t\t\tvalidClass: \"valid\",\n\t\t\terrorElement: \"label\",\n\t\t\tfocusCleanup: false,\n\t\t\tfocusInvalid: true,\n\t\t\terrorContainer: $( [] ),\n\t\t\terrorLabelContainer: $( [] ),\n\t\t\tonsubmit: true,\n\t\t\tignore: \":hidden\",\n\t\t\tignoreTitle: false,\n\t\t\tonfocusin: function( element ) {\n\t\t\t\tthis.lastActive = element;\n\t\n\t\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t\t}\n\t\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t\t}\n\t\t\t},\n\t\t\tonfocusout: function( element ) {\n\t\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\t\tthis.element( element );\n\t\t\t\t}\n\t\t\t},\n\t\t\tonkeyup: function( element, event ) {\n\t\n\t\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t\t// Shift => 16\n\t\t\t\t// Ctrl => 17\n\t\t\t\t// Alt => 18\n\t\t\t\t// Caps lock => 20\n\t\t\t\t// End => 35\n\t\t\t\t// Home => 36\n\t\t\t\t// Left arrow => 37\n\t\t\t\t// Up arrow => 38\n\t\t\t\t// Right arrow => 39\n\t\t\t\t// Down arrow => 40\n\t\t\t\t// Insert => 45\n\t\t\t\t// Num lock => 144\n\t\t\t\t// AltGr key => 225\n\t\t\t\tvar excludedKeys = [\n\t\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t\t];\n\t\n\t\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\t\treturn;\n\t\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\t\tthis.element( element );\n\t\t\t\t}\n\t\t\t},\n\t\t\tonclick: function( element ) {\n\t\n\t\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\t\tthis.element( element );\n\t\n\t\t\t\t// Or option elements, check parent select in that case\n\t\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\t\tthis.element( element.parentNode );\n\t\t\t\t}\n\t\t\t},\n\t\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t\t} else {\n\t\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t\t}\n\t\t\t},\n\t\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t\t} else {\n\t\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\t\tsetDefaults: function( settings ) {\n\t\t\t$.extend( $.validator.defaults, settings );\n\t\t},\n\t\n\t\tmessages: {\n\t\t\trequired: \"This field is required.\",\n\t\t\tremote: \"Please fix this field.\",\n\t\t\temail: \"Please enter a valid email address.\",\n\t\t\turl: \"Please enter a valid URL.\",\n\t\t\tdate: \"Please enter a valid date.\",\n\t\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\t\tnumber: \"Please enter a valid number.\",\n\t\t\tdigits: \"Please enter only digits.\",\n\t\t\tequalTo: \"Please enter the same value again.\",\n\t\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t\t},\n\t\n\t\tautoCreateRanges: false,\n\t\n\t\tprototype: {\n\t\n\t\t\tinit: function() {\n\t\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\t\tthis.submitted = {};\n\t\t\t\tthis.valueCache = {};\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\tthis.pending = {};\n\t\t\t\tthis.invalid = {};\n\t\t\t\tthis.reset();\n\t\n\t\t\t\tvar currentForm = this.currentForm,\n\t\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\t\trules;\n\t\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t\t}\n\t\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t\trules = this.settings.rules;\n\t\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t\t} );\n\t\n\t\t\t\tfunction delegate( event ) {\n\t\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\t\n\t\t\t\t\t// Set form expando on contenteditable\n\t\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\t\tsettings = validator.settings;\n\t\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t$( this.currentForm )\n\t\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\t\n\t\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\t\n\t\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/Validator.form/\n\t\t\tform: function() {\n\t\t\t\tthis.checkForm();\n\t\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\t\tif ( !this.valid() ) {\n\t\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\t\t\t\treturn this.valid();\n\t\t\t},\n\t\n\t\t\tcheckForm: function() {\n\t\t\t\tthis.prepareForm();\n\t\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.check( elements[ i ] );\n\t\t\t\t}\n\t\t\t\treturn this.valid();\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/Validator.element/\n\t\t\telement: function( element ) {\n\t\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\t\tv = this,\n\t\t\t\t\tresult = true,\n\t\t\t\t\trs, group;\n\t\n\t\t\t\tif ( checkElement === undefined ) {\n\t\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t\t} else {\n\t\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\t\tthis.currentElements = $( checkElement );\n\t\n\t\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t\t// containing a value\n\t\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\n\t\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\t\tresult = result && rs;\n\t\t\t\t\tif ( rs ) {\n\t\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( !this.numberOfInvalids() ) {\n\t\n\t\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t\t}\n\t\t\t\t\tthis.showErrors();\n\t\n\t\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t\t}\n\t\n\t\t\t\treturn result;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\t\tshowErrors: function( errors ) {\n\t\t\t\tif ( errors ) {\n\t\t\t\t\tvar validator = this;\n\t\n\t\t\t\t\t// Add items to error list and map\n\t\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\n\t\t\t\t\t// Remove items from success list\n\t\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t\t} else {\n\t\t\t\t\tthis.defaultShowErrors();\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\t\tresetForm: function() {\n\t\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t\t}\n\t\t\t\tthis.invalid = {};\n\t\t\t\tthis.submitted = {};\n\t\t\t\tthis.prepareForm();\n\t\t\t\tthis.hideErrors();\n\t\t\t\tvar elements = this.elements()\n\t\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t\t.removeAttr( \"aria-invalid\" );\n\t\n\t\t\t\tthis.resetElements( elements );\n\t\t\t},\n\t\n\t\t\tresetElements: function( elements ) {\n\t\t\t\tvar i;\n\t\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\telements\n\t\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tnumberOfInvalids: function() {\n\t\t\t\treturn this.objectLength( this.invalid );\n\t\t\t},\n\t\n\t\t\tobjectLength: function( obj ) {\n\t\t\t\t/* jshint unused: false */\n\t\t\t\tvar count = 0,\n\t\t\t\t\ti;\n\t\t\t\tfor ( i in obj ) {\n\t\n\t\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t\t// message as invalid elements\n\t\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn count;\n\t\t\t},\n\t\n\t\t\thideErrors: function() {\n\t\t\t\tthis.hideThese( this.toHide );\n\t\t\t},\n\t\n\t\t\thideThese: function( errors ) {\n\t\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\t\tthis.addWrapper( errors ).hide();\n\t\t\t},\n\t\n\t\t\tvalid: function() {\n\t\t\t\treturn this.size() === 0;\n\t\t\t},\n\t\n\t\t\tsize: function() {\n\t\t\t\treturn this.errorList.length;\n\t\t\t},\n\t\n\t\t\tfocusInvalid: function() {\n\t\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t\t.trigger( \"focus\" )\n\t\n\t\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t\t} catch ( e ) {\n\t\n\t\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tfindLastActive: function() {\n\t\t\t\tvar lastActive = this.lastActive;\n\t\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t\t} ).length === 1 && lastActive;\n\t\t\t},\n\t\n\t\t\telements: function() {\n\t\t\t\tvar validator = this,\n\t\t\t\t\trulesCache = {};\n\t\n\t\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\t\treturn $( this.currentForm )\n\t\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t\t.not( this.settings.ignore )\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\t\n\t\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Set form expando on contenteditable\n\t\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\t\tthis.name = name;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\n\t\t\t\t\trulesCache[ name ] = true;\n\t\t\t\t\treturn true;\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\tclean: function( selector ) {\n\t\t\t\treturn $( selector )[ 0 ];\n\t\t\t},\n\t\n\t\t\terrors: function() {\n\t\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t\t},\n\t\n\t\t\tresetInternals: function() {\n\t\t\t\tthis.successList = [];\n\t\t\t\tthis.errorList = [];\n\t\t\t\tthis.errorMap = {};\n\t\t\t\tthis.toShow = $( [] );\n\t\t\t\tthis.toHide = $( [] );\n\t\t\t},\n\t\n\t\t\treset: function() {\n\t\t\t\tthis.resetInternals();\n\t\t\t\tthis.currentElements = $( [] );\n\t\t\t},\n\t\n\t\t\tprepareForm: function() {\n\t\t\t\tthis.reset();\n\t\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t\t},\n\t\n\t\t\tprepareElement: function( element ) {\n\t\t\t\tthis.reset();\n\t\t\t\tthis.toHide = this.errorsFor( element );\n\t\t\t},\n\t\n\t\t\telementValue: function( element ) {\n\t\t\t\tvar $element = $( element ),\n\t\t\t\t\ttype = element.type,\n\t\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\t\tval, idx;\n\t\n\t\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t\t}\n\t\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tval = $element.text();\n\t\t\t\t} else {\n\t\t\t\t\tval = $element.val();\n\t\t\t\t}\n\t\n\t\t\t\tif ( type === \"file\" ) {\n\t\n\t\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Legacy browsers\n\t\t\t\t\t// Unix-based path\n\t\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Windows-based path\n\t\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Just the file name\n\t\t\t\t\treturn val;\n\t\t\t\t}\n\t\n\t\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t\t}\n\t\t\t\treturn val;\n\t\t\t},\n\t\n\t\t\tcheck: function( element ) {\n\t\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\t\n\t\t\t\tvar rules = $( element ).rules(),\n\t\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t} ).length,\n\t\t\t\t\tdependencyMismatch = false,\n\t\t\t\t\tval = this.elementValue( element ),\n\t\t\t\t\tresult, method, rule, normalizer;\n\t\n\t\t\t\t// Abort any pending Ajax request from a previous call to this method.\n\t\t\t\tthis.abortRequest( element );\n\t\n\t\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t\t}\n\t\n\t\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t\t// of using the real one.\n\t\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\t\tif ( normalizer ) {\n\t\t\t\t\tval = normalizer.call( element, val );\n\t\n\t\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\t\tdelete rules.normalizer;\n\t\t\t\t}\n\t\n\t\t\t\tfor ( method in rules ) {\n\t\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\t\n\t\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdependencyMismatch = false;\n\t\n\t\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\t\te.message += \". Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( dependencyMismatch ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\t\tthis.successList.push( element );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\n\t\t\t// Return the custom message for the given element and validation method\n\t\t\t// specified in the element's HTML5 data attribute\n\t\t\t// return the generic message if present and no method specific message is present\n\t\t\tcustomDataMessage: function( element, method ) {\n\t\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t\t},\n\t\n\t\t\t// Return the custom message for the given element name and validation method\n\t\t\tcustomMessage: function( name, method ) {\n\t\t\t\tvar m = this.settings.messages[ name ];\n\t\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t\t},\n\t\n\t\t\t// Return the first defined argument, allowing empty strings\n\t\t\tfindDefined: function() {\n\t\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\n\t\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t\t// of the following form:\n\t\t\t// rule = {\n\t\t\t// method: \"method name\",\n\t\t\t// parameters: \"the given method parameters\"\n\t\t\t// }\n\t\t\t//\n\t\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t\t// old code, and will be removed in the next major release.\n\t\t\tdefaultMessage: function( element, rule ) {\n\t\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\t\trule = { method: rule };\n\t\t\t\t}\n\t\n\t\t\t\tvar message = this.findDefined(\n\t\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\t\n\t\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t\t),\n\t\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t\t}\n\t\n\t\t\t\treturn message;\n\t\t\t},\n\t\n\t\t\tformatAndAdd: function( element, rule ) {\n\t\t\t\tvar message = this.defaultMessage( element, rule );\n\t\n\t\t\t\tthis.errorList.push( {\n\t\t\t\t\tmessage: message,\n\t\t\t\t\telement: element,\n\t\t\t\t\tmethod: rule.method\n\t\t\t\t} );\n\t\n\t\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\t\tthis.submitted[ element.name ] = message;\n\t\t\t},\n\t\n\t\t\taddWrapper: function( toToggle ) {\n\t\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t\t}\n\t\t\t\treturn toToggle;\n\t\t\t},\n\t\n\t\t\tdefaultShowErrors: function() {\n\t\t\t\tvar i, elements, error;\n\t\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\t\terror = this.errorList[ i ];\n\t\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t\t}\n\t\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t\t}\n\t\t\t\tif ( this.errorList.length ) {\n\t\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t\t}\n\t\t\t\tif ( this.settings.success ) {\n\t\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\t\tthis.hideErrors();\n\t\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t\t},\n\t\n\t\t\tvalidElements: function() {\n\t\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t\t},\n\t\n\t\t\tinvalidElements: function() {\n\t\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\t\treturn this.element;\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\tshowLabel: function( element, message ) {\n\t\t\t\tvar place, group, errorID, v,\n\t\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\t\n\t\t\t\tif ( error.length ) {\n\t\n\t\t\t\t\t// Refresh error/success class\n\t\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\t\n\t\t\t\t\t// Replace message on existing label\n\t\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// Create error element\n\t\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t\t.addClass( this.settings.errorClass );\n\t\n\t\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\t\tplace = error;\n\t\t\t\t\tif ( this.settings.wrapper ) {\n\t\n\t\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Link error back to the element\n\t\t\t\t\tif ( error.is( \"label\" ) ) {\n\t\n\t\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\t\terror.attr( \"for\", elementID );\n\t\n\t\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\t\terrorID = error.attr( \"id\" );\n\t\n\t\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\t\n\t\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\t\n\t\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\t\terror.text( \"\" );\n\t\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.toShow = this.toShow.add( error );\n\t\t\t},\n\t\n\t\t\terrorsFor: function( element ) {\n\t\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\t\n\t\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\t\tif ( describer ) {\n\t\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t\t}\n\t\n\t\t\t\treturn this\n\t\t\t\t\t.errors()\n\t\t\t\t\t.filter( selector );\n\t\t\t},\n\t\n\t\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t\t// as a literal part of a name/id or any selector.\n\t\t\tescapeCssMeta: function( string ) {\n\t\t\t\tif ( string === undefined ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\n\t\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t\t},\n\t\n\t\t\tidOrName: function( element ) {\n\t\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t\t},\n\t\n\t\t\tvalidationTargetFor: function( element ) {\n\t\n\t\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\telement = this.findByName( element.name );\n\t\t\t\t}\n\t\n\t\t\t\t// Always apply ignore filter\n\t\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t\t},\n\t\n\t\t\tcheckable: function( element ) {\n\t\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t\t},\n\t\n\t\t\tfindByName: function( name ) {\n\t\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t\t},\n\t\n\t\t\tgetLength: function( value, element ) {\n\t\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\t\tcase \"select\":\n\t\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\t\tcase \"input\":\n\t\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn value.length;\n\t\t\t},\n\t\n\t\t\tdepend: function( param, element ) {\n\t\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t\t},\n\t\n\t\t\tdependTypes: {\n\t\t\t\t\"boolean\": function( param ) {\n\t\t\t\t\treturn param;\n\t\t\t\t},\n\t\t\t\t\"string\": function( param, element ) {\n\t\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t\t},\n\t\t\t\t\"function\": function( param, element ) {\n\t\t\t\t\treturn param( element );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\toptional: function( element ) {\n\t\t\t\tvar val = this.elementValue( element );\n\t\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t\t},\n\t\n\t\t\telementAjaxPort: function( element ) {\n\t\t\t\treturn \"validate\" + element.name;\n\t\t\t},\n\t\n\t\t\tstartRequest: function( element ) {\n\t\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\t\tthis.pendingRequest++;\n\t\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tstopRequest: function( element, valid ) {\n\t\t\t\tthis.pendingRequest--;\n\t\n\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t}\n\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {\n\t\t\t\t\t$( this.currentForm ).trigger( \"submit\" );\n\t\n\t\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tthis.formSubmitted = false;\n\t\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\t\tthis.formSubmitted = false;\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tabortRequest: function( element ) {\n\t\t\t\tvar port;\n\t\n\t\t\t\tif ( this.pending[ element.name ] ) {\n\t\t\t\t\tport = this.elementAjaxPort( element );\n\t\t\t\t\t$.ajaxAbort( port );\n\t\n\t\t\t\t\tthis.pendingRequest--;\n\t\n\t\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t\t}\n\t\n\t\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tpreviousValue: function( element, method ) {\n\t\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\t\n\t\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\t\told: null,\n\t\t\t\t\tvalid: true,\n\t\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t\t} );\n\t\t\t},\n\t\n\t\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\t\tdestroy: function() {\n\t\t\t\tthis.resetForm();\n\t\n\t\t\t\t$( this.currentForm )\n\t\t\t\t\t.off( \".validate\" )\n\t\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tclassRuleSettings: {\n\t\t\trequired: { required: true },\n\t\t\temail: { email: true },\n\t\t\turl: { url: true },\n\t\t\tdate: { date: true },\n\t\t\tdateISO: { dateISO: true },\n\t\t\tnumber: { number: true },\n\t\t\tdigits: { digits: true },\n\t\t\tcreditcard: { creditcard: true }\n\t\t},\n\t\n\t\taddClassRules: function( className, rules ) {\n\t\t\tif ( className.constructor === String ) {\n\t\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t\t} else {\n\t\t\t\t$.extend( this.classRuleSettings, className );\n\t\t\t}\n\t\t},\n\t\n\t\tclassRules: function( element ) {\n\t\t\tvar rules = {},\n\t\t\t\tclasses = $( element ).attr( \"class\" );\n\t\n\t\t\tif ( classes ) {\n\t\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn rules;\n\t\t},\n\t\n\t\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\t\n\t\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t\t// allows type=\"date\" and others to be compared as strings\n\t\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\t\tvalue = Number( value );\n\t\n\t\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\t\tif ( isNaN( value ) ) {\n\t\t\t\t\tvalue = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tif ( value || value === 0 ) {\n\t\t\t\trules[ method ] = value;\n\t\t\t} else if ( type === method && type !== \"range\" ) {\n\t\n\t\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t\t// does not test for the html5 'range' type\n\t\t\t\trules[ type === \"date\" ? \"dateISO\" : method ] = true;\n\t\t\t}\n\t\t},\n\t\n\t\tattributeRules: function( element ) {\n\t\t\tvar rules = {},\n\t\t\t\t$element = $( element ),\n\t\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\t\tmethod, value;\n\t\n\t\t\tfor ( method in $.validator.methods ) {\n\t\n\t\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\t\tif ( method === \"required\" ) {\n\t\t\t\t\tvalue = element.getAttribute( method );\n\t\n\t\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\t\tvalue = true;\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\t\tvalue = !!value;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = $element.attr( method );\n\t\t\t\t}\n\t\n\t\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t\t}\n\t\n\t\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\n\t\t\treturn rules;\n\t\t},\n\t\n\t\tdataRules: function( element ) {\n\t\t\tvar rules = {},\n\t\t\t\t$element = $( element ),\n\t\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\t\tmethod, value;\n\t\n\t\t\tfor ( method in $.validator.methods ) {\n\t\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\n\t\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\t\n\t\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t\t}\n\t\t\treturn rules;\n\t\t},\n\t\n\t\tstaticRules: function( element ) {\n\t\t\tvar rules = {},\n\t\t\t\tvalidator = $.data( element.form, \"validator\" );\n\t\n\t\t\tif ( validator.settings.rules ) {\n\t\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t\t}\n\t\t\treturn rules;\n\t\t},\n\t\n\t\tnormalizeRules: function( rules, element ) {\n\t\n\t\t\t// Handle dependency check\n\t\t\t$.each( rules, function( prop, val ) {\n\t\n\t\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\t\tif ( val === false ) {\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( val.param || val.depends ) {\n\t\t\t\t\tvar keepRule = true;\n\t\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif ( keepRule ) {\n\t\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\t// Evaluate parameters\n\t\t\t$.each( rules, function( rule, parameter ) {\n\t\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t\t} );\n\t\n\t\t\t// Clean number parameters\n\t\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\t\tif ( rules[ this ] ) {\n\t\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\t\tvar parts;\n\t\t\t\tif ( rules[ this ] ) {\n\t\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\tif ( $.validator.autoCreateRanges ) {\n\t\n\t\t\t\t// Auto-create ranges\n\t\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\t\tdelete rules.min;\n\t\t\t\t\tdelete rules.max;\n\t\t\t\t}\n\t\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\t\tdelete rules.minlength;\n\t\t\t\t\tdelete rules.maxlength;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn rules;\n\t\t},\n\t\n\t\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\t\tnormalizeRule: function( data ) {\n\t\t\tif ( typeof data === \"string\" ) {\n\t\t\t\tvar transformed = {};\n\t\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\t\ttransformed[ this ] = true;\n\t\t\t\t} );\n\t\t\t\tdata = transformed;\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\t\taddMethod: function( name, method, message ) {\n\t\t\t$.validator.methods[ name ] = method;\n\t\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\t\tif ( method.length < 3 ) {\n\t\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t\t}\n\t\t},\n\t\n\t\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\t\tmethods: {\n\t\n\t\t\t// https://jqueryvalidation.org/required-method/\n\t\t\trequired: function( value, element, param ) {\n\t\n\t\t\t\t// Check if dependency is met\n\t\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t\t}\n\t\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\t\n\t\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\t\tvar val = $( element ).val();\n\t\t\t\t\treturn val && val.length > 0;\n\t\t\t\t}\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t\t}\n\t\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/email-method/\n\t\t\temail: function( value, element ) {\n\t\n\t\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t\t// Retrieved 2014-01-14\n\t\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t\t// Or use custom methods to implement your own email validation\n\t\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/url-method/\n\t\t\turl: function( value, element ) {\n\t\n\t\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t\t// modified to allow protocol-relative URLs\n\t\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/date-method/\n\t\t\tdate: ( function() {\n\t\t\t\tvar called = false;\n\t\n\t\t\t\treturn function( value, element ) {\n\t\t\t\t\tif ( !called ) {\n\t\t\t\t\t\tcalled = true;\n\t\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t\t};\n\t\t\t}() ),\n\t\n\t\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\t\tdateISO: function( value, element ) {\n\t\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/number-method/\n\t\t\tnumber: function( value, element ) {\n\t\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/digits-method/\n\t\t\tdigits: function( value, element ) {\n\t\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/minlength-method/\n\t\t\tminlength: function( value, element, param ) {\n\t\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\t\treturn this.optional( element ) || length >= param;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\t\tmaxlength: function( value, element, param ) {\n\t\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\t\treturn this.optional( element ) || length <= param;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\t\trangelength: function( value, element, param ) {\n\t\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/min-method/\n\t\t\tmin: function( value, element, param ) {\n\t\t\t\treturn this.optional( element ) || value >= param;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/max-method/\n\t\t\tmax: function( value, element, param ) {\n\t\t\t\treturn this.optional( element ) || value <= param;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/range-method/\n\t\t\trange: function( value, element, param ) {\n\t\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/step-method/\n\t\t\tstep: function( value, element, param ) {\n\t\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t\t},\n\t\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t\t},\n\t\t\t\t\tvalid = true,\n\t\t\t\t\tdecimals;\n\t\n\t\t\t\t// Works only for text, number and range input types\n\t\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\t\tif ( notSupported ) {\n\t\t\t\t\tthrow new Error( errorMessage );\n\t\t\t\t}\n\t\n\t\t\t\tdecimals = decimalPlaces( param );\n\t\n\t\t\t\t// Value can't have too many decimals\n\t\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\t\tvalid = false;\n\t\t\t\t}\n\t\n\t\t\t\treturn this.optional( element ) || valid;\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\t\tequalTo: function( value, element, param ) {\n\t\n\t\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\t\tvar target = $( param );\n\t\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t\t$( element ).valid();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\treturn value === target.val();\n\t\t\t},\n\t\n\t\t\t// https://jqueryvalidation.org/remote-method/\n\t\t\tremote: function( value, element, param, method ) {\n\t\t\t\tif ( this.optional( element ) ) {\n\t\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t\t}\n\t\n\t\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\t\n\t\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\t\tvalidator, data, optionDataString;\n\t\n\t\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t\t}\n\t\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\t\n\t\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\t\treturn previous.valid;\n\t\t\t\t}\n\t\n\t\t\t\tprevious.old = optionDataString;\n\t\t\t\tvalidator = this;\n\t\t\t\tthis.startRequest( element );\n\t\t\t\tdata = {};\n\t\t\t\tdata[ element.name ] = value;\n\t\t\t\t$.ajax( $.extend( true, {\n\t\t\t\t\tmode: \"abort\",\n\t\t\t\t\tport: this.elementAjaxPort( element ),\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tdata: data,\n\t\t\t\t\tcontext: validator.currentForm,\n\t\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\t\terrors, message, submitted;\n\t\n\t\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t\t}\n\t\t\t\t}, param ) );\n\t\t\t\treturn \"pending\";\n\t\t\t}\n\t\t}\n\t\n\t} );\n\t\n\t// Ajax mode: abort\n\t// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n\t// $.ajaxAbort( port );\n\t// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\t\n\tvar pendingRequests = {},\n\t\tajax;\n\t\n\t// Use a prefilter if available (1.5+)\n\tif ( $.ajaxPrefilter ) {\n\t\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\t\tvar port = settings.port;\n\t\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t\t$.ajaxAbort( port );\n\t\t\t\tpendingRequests[ port ] = xhr;\n\t\t\t}\n\t\t} );\n\t} else {\n\t\n\t\t// Proxy ajax\n\t\tajax = $.ajax;\n\t\t$.ajax = function( settings ) {\n\t\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\t\tif ( mode === \"abort\" ) {\n\t\t\t\t$.ajaxAbort( port );\n\t\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\t\treturn pendingRequests[ port ];\n\t\t\t}\n\t\t\treturn ajax.apply( this, arguments );\n\t\t};\n\t}\n\t\n\t// Abort the previous request without sending a new one\n\t$.ajaxAbort = function( port ) {\n\t\tif ( pendingRequests[ port ] ) {\n\t\t\tpendingRequests[ port ].abort();\n\t\t\tdelete pendingRequests[ port ];\n\t\t}\n\t};\n\treturn $;\n\t}));\n\n/***/ },\n\n/***/ 1083:\n60,\n\n/***/ 1084:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar hide = __webpack_require__(76);\n\tmodule.exports = function (target, src, safe) {\n\t for (var key in src) {\n\t if (safe && target[key]) target[key] = src[key];\n\t else hide(target, key, src[key]);\n\t } return target;\n\t};\n\n\n/***/ },\n\n/***/ 1085:\n[976, 74],\n\n/***/ 1097:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _set = __webpack_require__(1119);\n\t\n\tvar _set2 = _interopRequireDefault(_set);\n\t\n\tvar _config = __webpack_require__(22);\n\t\n\tvar _config2 = _interopRequireDefault(_config);\n\t\n\tvar _i18n = __webpack_require__(133);\n\t\n\tvar _i18n2 = _interopRequireDefault(_i18n);\n\t\n\tvar _logger = __webpack_require__(19);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tvar _fineUploader = __webpack_require__(1142);\n\t\n\tvar _fineUploader2 = _interopRequireDefault(_fineUploader);\n\t\n\tvar _allowedExtensions = __webpack_require__(1100);\n\t\n\tvar _allowedExtensions2 = _interopRequireDefault(_allowedExtensions);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar HAS_FILE_API = window.File && window.FileReader && window.FileList && window.Blob;\n\tvar _1GO = Math.pow(1024, 3);\n\tvar _1MO = Math.pow(1024, 2);\n\tvar _1KO = 1024;\n\t\n\tvar interpolation = { defaultVariables: {\n\t file: '{file}',\n\t minSizeLimit: '{minSizeLimit}',\n\t sizeLimit: '{sizeLimit}',\n\t netItems: '{netItems}',\n\t itemLimit: '{itemLimit}',\n\t extensions: '{extensions}'\n\t } };\n\t\n\tvar messages = {\n\t emptyError: _i18n2.default._('{file} is empty, please select files again without it.', { interpolation: interpolation }),\n\t maxHeightImageError: _i18n2.default._('Image is too tall.'),\n\t maxWidthImageError: _i18n2.default._('Image is too wide.'),\n\t minHeightImageError: _i18n2.default._('Image is not tall enough.'),\n\t minWidthImageError: _i18n2.default._('Image is not wide enough.'),\n\t minSizeError: _i18n2.default._('{file} is too small, minimum file size is {minSizeLimit}.', { interpolation: interpolation }),\n\t noFilesError: _i18n2.default._('No files to upload.'),\n\t onLeave: _i18n2.default._('The files are being uploaded, if you leave now the upload will be canceled.'),\n\t retryFailTooManyItemsError: _i18n2.default._('Retry failed - you have reached your file limit.'),\n\t sizeError: _i18n2.default._('{file} is too large, maximum file size is {sizeLimit}.', { interpolation: interpolation }),\n\t tooManyItemsError: _i18n2.default._('Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.', { interpolation: interpolation }),\n\t typeError: _i18n2.default._('{file} has an invalid extension. Valid extension(s): {extensions}.', { interpolation: interpolation }),\n\t unsupportedBrowserIos8Safari: _i18n2.default._('Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues.')\n\t};\n\t\n\texports.default = {\n\t autoUpload: true,\n\t\n\t uploadMultiple: true,\n\t\n\t dropActive: 'drop-active',\n\t\n\t chunk: true,\n\t\n\t data: function data() {\n\t return {\n\t files: [],\n\t errors: new _set2.default(),\n\t dropping: false,\n\t upload_endpoint: null,\n\t HAS_FILE_API: HAS_FILE_API\n\t };\n\t },\n\t\n\t computed: {\n\t canDrop: function canDrop() {\n\t return true;\n\t }\n\t },\n\t ready: function ready() {\n\t this.$dnd = new _fineUploader2.default.DragAndDrop({\n\t dropZoneElements: this.canDrop ? [this.$el] : [],\n\t classes: {\n\t dropActive: this.$options.dropActive || 'drop-active'\n\t },\n\t callbacks: {\n\t processingDroppedFilesComplete: this.on_dropped_files_complete\n\t }\n\t });\n\t this._build_uploader();\n\t },\n\t\n\t\n\t watch: {\n\t canDrop: function canDrop(_canDrop) {\n\t if (_canDrop) {\n\t this.$dnd.setupExtraDropzone(this.$el);\n\t } else {\n\t this.$dnd.dispose();\n\t }\n\t },\n\t upload_endpoint: function upload_endpoint() {\n\t this._build_uploader();\n\t }\n\t },\n\t filters: {\n\t fileext: function fileext(filename) {\n\t return filename.split('.').pop();\n\t },\n\t filesize: function filesize(size) {\n\t if (!size || size <= 0) {\n\t return '-';\n\t }\n\t if (size > _1GO) {\n\t return Math.round(size * 100 / _1GO) / 100 + ' Go';\n\t } else if (size > _1MO) {\n\t return Math.round(size * 10 / _1MO) / 10 + ' Mo';\n\t } else if (size > _1KO) {\n\t return Math.round(size * 10 / _1KO) / 10 + ' Ko';\n\t } else {\n\t return size + ' o';\n\t }\n\t }\n\t },\n\t\n\t methods: {\n\t _build_uploader: function _build_uploader() {\n\t if (!this.upload_endpoint) return;\n\t this.$uploader = new _fineUploader2.default.FineUploaderBasic({\n\t debug: (false),\n\t multiple: this.$options.uploadMultiple,\n\t uploaderType: 'basic',\n\t autoUpload: this.$options.autoUpload,\n\t button: this.$els.uploadBtn,\n\t request: {\n\t endpoint: this.upload_endpoint,\n\t inputName: 'file',\n\t uuidName: 'uuid',\n\t totalFileSizeName: 'size',\n\t filenameParam: 'filename'\n\t },\n\t chunking: {\n\t enabled: this.$options.chunk,\n\t concurrent: {\n\t enabled: this.$options.chunk\n\t },\n\t paramNames: {\n\t chunkSize: 'chunksize',\n\t partByteOffset: 'partbyteoffset',\n\t partIndex: 'partindex',\n\t totalParts: 'totalparts'\n\t },\n\t success: {\n\t endpoint: this.upload_endpoint\n\t }\n\t },\n\t retry: {\n\t enableAuto: true\n\t },\n\t callbacks: {\n\t onUpload: this.on_upload,\n\t onSubmitted: this.on_submit,\n\t onProgress: this.on_progress,\n\t onComplete: this.on_complete,\n\t onError: this.on_upload_error\n\t },\n\t validation: { allowedExtensions: this.$options.allowedExtensions || _allowedExtensions2.default.items },\n\t messages: messages\n\t });\n\t },\n\t upload: function upload(params) {\n\t if (params) {\n\t this.$uploader.setParams(params);\n\t }\n\t this.$uploader.uploadStoredFiles();\n\t },\n\t on_submit: function on_submit(id) {\n\t if (HAS_FILE_API) {\n\t var file = this.$uploader.getFile(id);\n\t file.id = id;\n\t file.progress = 0;\n\t this.files.push(file);\n\t this.$emit('uploader:file-submit', id, file);\n\t }\n\t },\n\t on_upload: function on_upload(id) {\n\t this.$emit('uploader:upload', id);\n\t },\n\t on_progress: function on_progress(id, name, uploaded, total) {\n\t var file = this.$uploader.getFile(id);\n\t file.progress = Math.round(uploaded * 100 / total);\n\t this.$emit('uploader:progress', id, uploaded, total);\n\t },\n\t on_complete: function on_complete(id, name, response) {\n\t if (!response.success) return;\n\t var file = this.$uploader.getFile(id);\n\t this.files.$remove(file);\n\t this.$emit('uploader:complete', id, response, file);\n\t },\n\t on_dropped_files_complete: function on_dropped_files_complete(files) {\n\t if (this.canDrop) {\n\t this.$uploader.addFiles(files);\n\t }\n\t },\n\t on_upload_error: function on_upload_error(id, name, reason, xhr) {\n\t if (this.errors.has(id)) return;\n\t if (xhr) {\n\t try {\n\t var data = JSON.parse(xhr.responseText);\n\t reason = data.error || data.message || reason;\n\t } catch (e) {\n\t _logger2.default.error('Unable to parse error', xhr.responseText);\n\t }\n\t }\n\t if (reason === 'XHR returned response code 0') {\n\t reason = this._('Unknown error while communicating with the server');\n\t }\n\t if (xhr && _config2.default.sentry.dsn) {\n\t var sentryId = xhr.getResponseHeader('X-Sentry-ID');\n\t if (sentryId) {\n\t reason = [reason, this._('The error identifier is {id}', { id: sentryId })].join('\\n');\n\t }\n\t }\n\t this.$dispatch('notify', {\n\t type: 'error',\n\t icon: 'exclamation-triangle',\n\t title: this._('Upload error on {name}', { name: name }),\n\t details: reason\n\t });\n\t this.$emit('uploader:error', id, name, reason);\n\t this.errors.add(id);\n\t },\n\t clear: function clear() {\n\t this.$uploader.clearStoredFiles();\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1100:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.AllowedExtensions = undefined;\n\t\n\tvar _getPrototypeOf = __webpack_require__(21);\n\t\n\tvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\t\n\tvar _classCallCheck2 = __webpack_require__(20);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _possibleConstructorReturn2 = __webpack_require__(27);\n\t\n\tvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\t\n\tvar _inherits2 = __webpack_require__(26);\n\t\n\tvar _inherits3 = _interopRequireDefault(_inherits2);\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar AllowedExtensions = exports.AllowedExtensions = function (_List) {\n\t (0, _inherits3.default)(AllowedExtensions, _List);\n\t\n\t function AllowedExtensions(options) {\n\t (0, _classCallCheck3.default)(this, AllowedExtensions);\n\t\n\t var _this = (0, _possibleConstructorReturn3.default)(this, (AllowedExtensions.__proto__ || (0, _getPrototypeOf2.default)(AllowedExtensions)).call(this, options));\n\t\n\t _this.$options.ns = 'datasets';\n\t _this.$options.fetch = 'allowed_extensions';\n\t return _this;\n\t }\n\t\n\t return AllowedExtensions;\n\t}(_base.List);\n\t\n\texports.default = new AllowedExtensions().fetch();\n\n/***/ },\n\n/***/ 1119:\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(1120), __esModule: true };\n\n/***/ },\n\n/***/ 1120:\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(329);\n\t__webpack_require__(134);\n\t__webpack_require__(139);\n\t__webpack_require__(1131);\n\t__webpack_require__(1134);\n\t__webpack_require__(1133);\n\t__webpack_require__(1132);\n\tmodule.exports = __webpack_require__(13).Set;\n\n\n/***/ },\n\n/***/ 1121:\n[962, 989],\n\n/***/ 1122:\n[963, 199, 203, 87, 315, 1124],\n\n/***/ 1123:\n[964, 74, 327, 44],\n\n/***/ 1124:\n[965, 1123],\n\n/***/ 1125:\n[967, 58, 137, 1084, 199, 1083, 989, 204, 328, 1130, 45, 320, 1085],\n\n/***/ 1126:\n[968, 202, 1121],\n\n/***/ 1127:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar global = __webpack_require__(52);\n\tvar $export = __webpack_require__(51);\n\tvar meta = __webpack_require__(320);\n\tvar fails = __webpack_require__(77);\n\tvar hide = __webpack_require__(76);\n\tvar redefineAll = __webpack_require__(1084);\n\tvar forOf = __webpack_require__(989);\n\tvar anInstance = __webpack_require__(1083);\n\tvar isObject = __webpack_require__(74);\n\tvar setToStringTag = __webpack_require__(138);\n\tvar dP = __webpack_require__(58).f;\n\tvar each = __webpack_require__(1122)(0);\n\tvar DESCRIPTORS = __webpack_require__(45);\n\t\n\tmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n\t var Base = global[NAME];\n\t var C = Base;\n\t var ADDER = IS_MAP ? 'set' : 'add';\n\t var proto = C && C.prototype;\n\t var O = {};\n\t if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n\t new C().entries().next();\n\t }))) {\n\t // create collection constructor\n\t C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n\t redefineAll(C.prototype, methods);\n\t meta.NEED = true;\n\t } else {\n\t C = wrapper(function (target, iterable) {\n\t anInstance(target, C, NAME, '_c');\n\t target._c = new Base();\n\t if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);\n\t });\n\t each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {\n\t var IS_ADDER = KEY == 'add' || KEY == 'set';\n\t if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {\n\t anInstance(this, C, KEY);\n\t if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;\n\t var result = this._c[KEY](a === 0 ? 0 : a, b);\n\t return IS_ADDER ? this : result;\n\t });\n\t });\n\t IS_WEAK || dP(C.prototype, 'size', {\n\t get: function () {\n\t return this._c.size;\n\t }\n\t });\n\t }\n\t\n\t setToStringTag(C, NAME);\n\t\n\t O[NAME] = C;\n\t $export($export.G + $export.W + $export.F, O);\n\t\n\t if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\t\n\t return C;\n\t};\n\n\n/***/ },\n\n/***/ 1128:\n[974, 51, 317, 199, 989],\n\n/***/ 1129:\n[975, 51],\n\n/***/ 1130:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar global = __webpack_require__(52);\n\tvar core = __webpack_require__(13);\n\tvar dP = __webpack_require__(58);\n\tvar DESCRIPTORS = __webpack_require__(45);\n\tvar SPECIES = __webpack_require__(44)('species');\n\t\n\tmodule.exports = function (KEY) {\n\t var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n\t if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n\t configurable: true,\n\t get: function () { return this; }\n\t });\n\t};\n\n\n/***/ },\n\n/***/ 1131:\n[979, 1125, 1085, 1127],\n\n/***/ 1132:\n[980, 1128],\n\n/***/ 1133:\n[981, 1129],\n\n/***/ 1134:\n[982, 51, 1126],\n\n/***/ 1141:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;// Fine Uploader 5.16.2 - MIT licensed. http://fineuploader.com\n\t(function(global) {\n\t var qq = function(element) {\n\t \"use strict\";\n\t return {\n\t hide: function() {\n\t element.style.display = \"none\";\n\t return this;\n\t },\n\t attach: function(type, fn) {\n\t if (element.addEventListener) {\n\t element.addEventListener(type, fn, false);\n\t } else if (element.attachEvent) {\n\t element.attachEvent(\"on\" + type, fn);\n\t }\n\t return function() {\n\t qq(element).detach(type, fn);\n\t };\n\t },\n\t detach: function(type, fn) {\n\t if (element.removeEventListener) {\n\t element.removeEventListener(type, fn, false);\n\t } else if (element.attachEvent) {\n\t element.detachEvent(\"on\" + type, fn);\n\t }\n\t return this;\n\t },\n\t contains: function(descendant) {\n\t if (!descendant) {\n\t return false;\n\t }\n\t if (element === descendant) {\n\t return true;\n\t }\n\t if (element.contains) {\n\t return element.contains(descendant);\n\t } else {\n\t return !!(descendant.compareDocumentPosition(element) & 8);\n\t }\n\t },\n\t insertBefore: function(elementB) {\n\t elementB.parentNode.insertBefore(element, elementB);\n\t return this;\n\t },\n\t remove: function() {\n\t element.parentNode.removeChild(element);\n\t return this;\n\t },\n\t css: function(styles) {\n\t if (element.style == null) {\n\t throw new qq.Error(\"Can't apply style to node as it is not on the HTMLElement prototype chain!\");\n\t }\n\t if (styles.opacity != null) {\n\t if (typeof element.style.opacity !== \"string\" && typeof element.filters !== \"undefined\") {\n\t styles.filter = \"alpha(opacity=\" + Math.round(100 * styles.opacity) + \")\";\n\t }\n\t }\n\t qq.extend(element.style, styles);\n\t return this;\n\t },\n\t hasClass: function(name, considerParent) {\n\t var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n\t return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className));\n\t },\n\t addClass: function(name) {\n\t if (!qq(element).hasClass(name)) {\n\t element.className += \" \" + name;\n\t }\n\t return this;\n\t },\n\t removeClass: function(name) {\n\t var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n\t element.className = element.className.replace(re, \" \").replace(/^\\s+|\\s+$/g, \"\");\n\t return this;\n\t },\n\t getByClass: function(className, first) {\n\t var candidates, result = [];\n\t if (first && element.querySelector) {\n\t return element.querySelector(\".\" + className);\n\t } else if (element.querySelectorAll) {\n\t return element.querySelectorAll(\".\" + className);\n\t }\n\t candidates = element.getElementsByTagName(\"*\");\n\t qq.each(candidates, function(idx, val) {\n\t if (qq(val).hasClass(className)) {\n\t result.push(val);\n\t }\n\t });\n\t return first ? result[0] : result;\n\t },\n\t getFirstByClass: function(className) {\n\t return qq(element).getByClass(className, true);\n\t },\n\t children: function() {\n\t var children = [], child = element.firstChild;\n\t while (child) {\n\t if (child.nodeType === 1) {\n\t children.push(child);\n\t }\n\t child = child.nextSibling;\n\t }\n\t return children;\n\t },\n\t setText: function(text) {\n\t element.innerText = text;\n\t element.textContent = text;\n\t return this;\n\t },\n\t clearText: function() {\n\t return qq(element).setText(\"\");\n\t },\n\t hasAttribute: function(attrName) {\n\t var attrVal;\n\t if (element.hasAttribute) {\n\t if (!element.hasAttribute(attrName)) {\n\t return false;\n\t }\n\t return /^false$/i.exec(element.getAttribute(attrName)) == null;\n\t } else {\n\t attrVal = element[attrName];\n\t if (attrVal === undefined) {\n\t return false;\n\t }\n\t return /^false$/i.exec(attrVal) == null;\n\t }\n\t }\n\t };\n\t };\n\t (function() {\n\t \"use strict\";\n\t qq.canvasToBlob = function(canvas, mime, quality) {\n\t return qq.dataUriToBlob(canvas.toDataURL(mime, quality));\n\t };\n\t qq.dataUriToBlob = function(dataUri) {\n\t var arrayBuffer, byteString, createBlob = function(data, mime) {\n\t var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder();\n\t if (blobBuilder) {\n\t blobBuilder.append(data);\n\t return blobBuilder.getBlob(mime);\n\t } else {\n\t return new Blob([ data ], {\n\t type: mime\n\t });\n\t }\n\t }, intArray, mimeString;\n\t if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n\t byteString = atob(dataUri.split(\",\")[1]);\n\t } else {\n\t byteString = decodeURI(dataUri.split(\",\")[1]);\n\t }\n\t mimeString = dataUri.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n\t arrayBuffer = new ArrayBuffer(byteString.length);\n\t intArray = new Uint8Array(arrayBuffer);\n\t qq.each(byteString, function(idx, character) {\n\t intArray[idx] = character.charCodeAt(0);\n\t });\n\t return createBlob(arrayBuffer, mimeString);\n\t };\n\t qq.log = function(message, level) {\n\t if (window.console) {\n\t if (!level || level === \"info\") {\n\t window.console.log(message);\n\t } else {\n\t if (window.console[level]) {\n\t window.console[level](message);\n\t } else {\n\t window.console.log(\"<\" + level + \"> \" + message);\n\t }\n\t }\n\t }\n\t };\n\t qq.isObject = function(variable) {\n\t return variable && !variable.nodeType && Object.prototype.toString.call(variable) === \"[object Object]\";\n\t };\n\t qq.isFunction = function(variable) {\n\t return typeof variable === \"function\";\n\t };\n\t qq.isArray = function(value) {\n\t return Object.prototype.toString.call(value) === \"[object Array]\" || value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer;\n\t };\n\t qq.isItemList = function(maybeItemList) {\n\t return Object.prototype.toString.call(maybeItemList) === \"[object DataTransferItemList]\";\n\t };\n\t qq.isNodeList = function(maybeNodeList) {\n\t return Object.prototype.toString.call(maybeNodeList) === \"[object NodeList]\" || maybeNodeList.item && maybeNodeList.namedItem;\n\t };\n\t qq.isString = function(maybeString) {\n\t return Object.prototype.toString.call(maybeString) === \"[object String]\";\n\t };\n\t qq.trimStr = function(string) {\n\t if (String.prototype.trim) {\n\t return string.trim();\n\t }\n\t return string.replace(/^\\s+|\\s+$/g, \"\");\n\t };\n\t qq.format = function(str) {\n\t var args = Array.prototype.slice.call(arguments, 1), newStr = str, nextIdxToReplace = newStr.indexOf(\"{}\");\n\t qq.each(args, function(idx, val) {\n\t var strBefore = newStr.substring(0, nextIdxToReplace), strAfter = newStr.substring(nextIdxToReplace + 2);\n\t newStr = strBefore + val + strAfter;\n\t nextIdxToReplace = newStr.indexOf(\"{}\", nextIdxToReplace + val.length);\n\t if (nextIdxToReplace < 0) {\n\t return false;\n\t }\n\t });\n\t return newStr;\n\t };\n\t qq.isFile = function(maybeFile) {\n\t return window.File && Object.prototype.toString.call(maybeFile) === \"[object File]\";\n\t };\n\t qq.isFileList = function(maybeFileList) {\n\t return window.FileList && Object.prototype.toString.call(maybeFileList) === \"[object FileList]\";\n\t };\n\t qq.isFileOrInput = function(maybeFileOrInput) {\n\t return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput);\n\t };\n\t qq.isInput = function(maybeInput, notFile) {\n\t var evaluateType = function(type) {\n\t var normalizedType = type.toLowerCase();\n\t if (notFile) {\n\t return normalizedType !== \"file\";\n\t }\n\t return normalizedType === \"file\";\n\t };\n\t if (window.HTMLInputElement) {\n\t if (Object.prototype.toString.call(maybeInput) === \"[object HTMLInputElement]\") {\n\t if (maybeInput.type && evaluateType(maybeInput.type)) {\n\t return true;\n\t }\n\t }\n\t }\n\t if (maybeInput.tagName) {\n\t if (maybeInput.tagName.toLowerCase() === \"input\") {\n\t if (maybeInput.type && evaluateType(maybeInput.type)) {\n\t return true;\n\t }\n\t }\n\t }\n\t return false;\n\t };\n\t qq.isBlob = function(maybeBlob) {\n\t if (window.Blob && Object.prototype.toString.call(maybeBlob) === \"[object Blob]\") {\n\t return true;\n\t }\n\t };\n\t qq.isXhrUploadSupported = function() {\n\t var input = document.createElement(\"input\");\n\t input.type = \"file\";\n\t return input.multiple !== undefined && typeof File !== \"undefined\" && typeof FormData !== \"undefined\" && typeof qq.createXhrInstance().upload !== \"undefined\";\n\t };\n\t qq.createXhrInstance = function() {\n\t if (window.XMLHttpRequest) {\n\t return new XMLHttpRequest();\n\t }\n\t try {\n\t return new ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n\t } catch (error) {\n\t qq.log(\"Neither XHR or ActiveX are supported!\", \"error\");\n\t return null;\n\t }\n\t };\n\t qq.isFolderDropSupported = function(dataTransfer) {\n\t return dataTransfer.items && dataTransfer.items.length > 0 && dataTransfer.items[0].webkitGetAsEntry;\n\t };\n\t qq.isFileChunkingSupported = function() {\n\t return !qq.androidStock() && qq.isXhrUploadSupported() && (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined);\n\t };\n\t qq.sliceBlob = function(fileOrBlob, start, end) {\n\t var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice;\n\t return slicer.call(fileOrBlob, start, end);\n\t };\n\t qq.arrayBufferToHex = function(buffer) {\n\t var bytesAsHex = \"\", bytes = new Uint8Array(buffer);\n\t qq.each(bytes, function(idx, byt) {\n\t var byteAsHexStr = byt.toString(16);\n\t if (byteAsHexStr.length < 2) {\n\t byteAsHexStr = \"0\" + byteAsHexStr;\n\t }\n\t bytesAsHex += byteAsHexStr;\n\t });\n\t return bytesAsHex;\n\t };\n\t qq.readBlobToHex = function(blob, startOffset, length) {\n\t var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length), fileReader = new FileReader(), promise = new qq.Promise();\n\t fileReader.onload = function() {\n\t promise.success(qq.arrayBufferToHex(fileReader.result));\n\t };\n\t fileReader.onerror = promise.failure;\n\t fileReader.readAsArrayBuffer(initialBlob);\n\t return promise;\n\t };\n\t qq.extend = function(first, second, extendNested) {\n\t qq.each(second, function(prop, val) {\n\t if (extendNested && qq.isObject(val)) {\n\t if (first[prop] === undefined) {\n\t first[prop] = {};\n\t }\n\t qq.extend(first[prop], val, true);\n\t } else {\n\t first[prop] = val;\n\t }\n\t });\n\t return first;\n\t };\n\t qq.override = function(target, sourceFn) {\n\t var super_ = {}, source = sourceFn(super_);\n\t qq.each(source, function(srcPropName, srcPropVal) {\n\t if (target[srcPropName] !== undefined) {\n\t super_[srcPropName] = target[srcPropName];\n\t }\n\t target[srcPropName] = srcPropVal;\n\t });\n\t return target;\n\t };\n\t qq.indexOf = function(arr, elt, from) {\n\t if (arr.indexOf) {\n\t return arr.indexOf(elt, from);\n\t }\n\t from = from || 0;\n\t var len = arr.length;\n\t if (from < 0) {\n\t from += len;\n\t }\n\t for (;from < len; from += 1) {\n\t if (arr.hasOwnProperty(from) && arr[from] === elt) {\n\t return from;\n\t }\n\t }\n\t return -1;\n\t };\n\t qq.getUniqueId = function() {\n\t return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n\t var r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n\t return v.toString(16);\n\t });\n\t };\n\t qq.ie = function() {\n\t return navigator.userAgent.indexOf(\"MSIE\") !== -1 || navigator.userAgent.indexOf(\"Trident\") !== -1;\n\t };\n\t qq.ie7 = function() {\n\t return navigator.userAgent.indexOf(\"MSIE 7\") !== -1;\n\t };\n\t qq.ie8 = function() {\n\t return navigator.userAgent.indexOf(\"MSIE 8\") !== -1;\n\t };\n\t qq.ie10 = function() {\n\t return navigator.userAgent.indexOf(\"MSIE 10\") !== -1;\n\t };\n\t qq.ie11 = function() {\n\t return qq.ie() && navigator.userAgent.indexOf(\"rv:11\") !== -1;\n\t };\n\t qq.edge = function() {\n\t return navigator.userAgent.indexOf(\"Edge\") >= 0;\n\t };\n\t qq.safari = function() {\n\t return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Apple\") !== -1;\n\t };\n\t qq.chrome = function() {\n\t return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Google\") !== -1;\n\t };\n\t qq.opera = function() {\n\t return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Opera\") !== -1;\n\t };\n\t qq.firefox = function() {\n\t return !qq.edge() && !qq.ie11() && navigator.userAgent.indexOf(\"Mozilla\") !== -1 && navigator.vendor !== undefined && navigator.vendor === \"\";\n\t };\n\t qq.windows = function() {\n\t return navigator.platform === \"Win32\";\n\t };\n\t qq.android = function() {\n\t return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n\t };\n\t qq.androidStock = function() {\n\t return qq.android() && navigator.userAgent.toLowerCase().indexOf(\"chrome\") < 0;\n\t };\n\t qq.ios6 = function() {\n\t return qq.ios() && navigator.userAgent.indexOf(\" OS 6_\") !== -1;\n\t };\n\t qq.ios7 = function() {\n\t return qq.ios() && navigator.userAgent.indexOf(\" OS 7_\") !== -1;\n\t };\n\t qq.ios8 = function() {\n\t return qq.ios() && navigator.userAgent.indexOf(\" OS 8_\") !== -1;\n\t };\n\t qq.ios800 = function() {\n\t return qq.ios() && navigator.userAgent.indexOf(\" OS 8_0 \") !== -1;\n\t };\n\t qq.ios = function() {\n\t return navigator.userAgent.indexOf(\"iPad\") !== -1 || navigator.userAgent.indexOf(\"iPod\") !== -1 || navigator.userAgent.indexOf(\"iPhone\") !== -1;\n\t };\n\t qq.iosChrome = function() {\n\t return qq.ios() && navigator.userAgent.indexOf(\"CriOS\") !== -1;\n\t };\n\t qq.iosSafari = function() {\n\t return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf(\"Safari\") !== -1;\n\t };\n\t qq.iosSafariWebView = function() {\n\t return qq.ios() && !qq.iosChrome() && !qq.iosSafari();\n\t };\n\t qq.preventDefault = function(e) {\n\t if (e.preventDefault) {\n\t e.preventDefault();\n\t } else {\n\t e.returnValue = false;\n\t }\n\t };\n\t qq.toElement = function() {\n\t var div = document.createElement(\"div\");\n\t return function(html) {\n\t div.innerHTML = html;\n\t var element = div.firstChild;\n\t div.removeChild(element);\n\t return element;\n\t };\n\t }();\n\t qq.each = function(iterableItem, callback) {\n\t var keyOrIndex, retVal;\n\t if (iterableItem) {\n\t if (window.Storage && iterableItem.constructor === window.Storage) {\n\t for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n\t retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex)));\n\t if (retVal === false) {\n\t break;\n\t }\n\t }\n\t } else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) {\n\t for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n\t retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n\t if (retVal === false) {\n\t break;\n\t }\n\t }\n\t } else if (qq.isString(iterableItem)) {\n\t for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n\t retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex));\n\t if (retVal === false) {\n\t break;\n\t }\n\t }\n\t } else {\n\t for (keyOrIndex in iterableItem) {\n\t if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) {\n\t retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n\t if (retVal === false) {\n\t break;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t };\n\t qq.bind = function(oldFunc, context) {\n\t if (qq.isFunction(oldFunc)) {\n\t var args = Array.prototype.slice.call(arguments, 2);\n\t return function() {\n\t var newArgs = qq.extend([], args);\n\t if (arguments.length) {\n\t newArgs = newArgs.concat(Array.prototype.slice.call(arguments));\n\t }\n\t return oldFunc.apply(context, newArgs);\n\t };\n\t }\n\t throw new Error(\"first parameter must be a function!\");\n\t };\n\t qq.obj2url = function(obj, temp, prefixDone) {\n\t var uristrings = [], prefix = \"&\", add = function(nextObj, i) {\n\t var nextTemp = temp ? /\\[\\]$/.test(temp) ? temp : temp + \"[\" + i + \"]\" : i;\n\t if (nextTemp !== \"undefined\" && i !== \"undefined\") {\n\t uristrings.push(typeof nextObj === \"object\" ? qq.obj2url(nextObj, nextTemp, true) : Object.prototype.toString.call(nextObj) === \"[object Function]\" ? encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj()) : encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj));\n\t }\n\t };\n\t if (!prefixDone && temp) {\n\t prefix = /\\?/.test(temp) ? /\\?$/.test(temp) ? \"\" : \"&\" : \"?\";\n\t uristrings.push(temp);\n\t uristrings.push(qq.obj2url(obj));\n\t } else if (Object.prototype.toString.call(obj) === \"[object Array]\" && typeof obj !== \"undefined\") {\n\t qq.each(obj, function(idx, val) {\n\t add(val, idx);\n\t });\n\t } else if (typeof obj !== \"undefined\" && obj !== null && typeof obj === \"object\") {\n\t qq.each(obj, function(prop, val) {\n\t add(val, prop);\n\t });\n\t } else {\n\t uristrings.push(encodeURIComponent(temp) + \"=\" + encodeURIComponent(obj));\n\t }\n\t if (temp) {\n\t return uristrings.join(prefix);\n\t } else {\n\t return uristrings.join(prefix).replace(/^&/, \"\").replace(/%20/g, \"+\");\n\t }\n\t };\n\t qq.obj2FormData = function(obj, formData, arrayKeyName) {\n\t if (!formData) {\n\t formData = new FormData();\n\t }\n\t qq.each(obj, function(key, val) {\n\t key = arrayKeyName ? arrayKeyName + \"[\" + key + \"]\" : key;\n\t if (qq.isObject(val)) {\n\t qq.obj2FormData(val, formData, key);\n\t } else if (qq.isFunction(val)) {\n\t formData.append(key, val());\n\t } else {\n\t formData.append(key, val);\n\t }\n\t });\n\t return formData;\n\t };\n\t qq.obj2Inputs = function(obj, form) {\n\t var input;\n\t if (!form) {\n\t form = document.createElement(\"form\");\n\t }\n\t qq.obj2FormData(obj, {\n\t append: function(key, val) {\n\t input = document.createElement(\"input\");\n\t input.setAttribute(\"name\", key);\n\t input.setAttribute(\"value\", val);\n\t form.appendChild(input);\n\t }\n\t });\n\t return form;\n\t };\n\t qq.parseJson = function(json) {\n\t if (window.JSON && qq.isFunction(JSON.parse)) {\n\t return JSON.parse(json);\n\t } else {\n\t return eval(\"(\" + json + \")\");\n\t }\n\t };\n\t qq.getExtension = function(filename) {\n\t var extIdx = filename.lastIndexOf(\".\") + 1;\n\t if (extIdx > 0) {\n\t return filename.substr(extIdx, filename.length - extIdx);\n\t }\n\t };\n\t qq.getFilename = function(blobOrFileInput) {\n\t if (qq.isInput(blobOrFileInput)) {\n\t return blobOrFileInput.value.replace(/.*(\\/|\\\\)/, \"\");\n\t } else if (qq.isFile(blobOrFileInput)) {\n\t if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) {\n\t return blobOrFileInput.fileName;\n\t }\n\t }\n\t return blobOrFileInput.name;\n\t };\n\t qq.DisposeSupport = function() {\n\t var disposers = [];\n\t return {\n\t dispose: function() {\n\t var disposer;\n\t do {\n\t disposer = disposers.shift();\n\t if (disposer) {\n\t disposer();\n\t }\n\t } while (disposer);\n\t },\n\t attach: function() {\n\t var args = arguments;\n\t this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1)));\n\t },\n\t addDisposer: function(disposeFunction) {\n\t disposers.push(disposeFunction);\n\t }\n\t };\n\t };\n\t })();\n\t (function() {\n\t \"use strict\";\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t return qq;\n\t }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else if (typeof module !== \"undefined\" && module.exports) {\n\t module.exports = qq;\n\t } else {\n\t global.qq = qq;\n\t }\n\t })();\n\t (function() {\n\t \"use strict\";\n\t qq.Error = function(message) {\n\t this.message = \"[Fine Uploader \" + qq.version + \"] \" + message;\n\t };\n\t qq.Error.prototype = new Error();\n\t })();\n\t qq.version = \"5.16.2\";\n\t qq.supportedFeatures = function() {\n\t \"use strict\";\n\t var supportsUploading, supportsUploadingBlobs, supportsFileDrop, supportsAjaxFileUploading, supportsFolderDrop, supportsChunking, supportsResume, supportsUploadViaPaste, supportsUploadCors, supportsDeleteFileXdr, supportsDeleteFileCorsXhr, supportsDeleteFileCors, supportsFolderSelection, supportsImagePreviews, supportsUploadProgress;\n\t function testSupportsFileInputElement() {\n\t var supported = true, tempInput;\n\t try {\n\t tempInput = document.createElement(\"input\");\n\t tempInput.type = \"file\";\n\t qq(tempInput).hide();\n\t if (tempInput.disabled) {\n\t supported = false;\n\t }\n\t } catch (ex) {\n\t supported = false;\n\t }\n\t return supported;\n\t }\n\t function isChrome14OrHigher() {\n\t return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\\/[1][4-9]|Chrome\\/[2-9][0-9]/) !== undefined;\n\t }\n\t function isCrossOriginXhrSupported() {\n\t if (window.XMLHttpRequest) {\n\t var xhr = qq.createXhrInstance();\n\t return xhr.withCredentials !== undefined;\n\t }\n\t return false;\n\t }\n\t function isXdrSupported() {\n\t return window.XDomainRequest !== undefined;\n\t }\n\t function isCrossOriginAjaxSupported() {\n\t if (isCrossOriginXhrSupported()) {\n\t return true;\n\t }\n\t return isXdrSupported();\n\t }\n\t function isFolderSelectionSupported() {\n\t return document.createElement(\"input\").webkitdirectory !== undefined;\n\t }\n\t function isLocalStorageSupported() {\n\t try {\n\t return !!window.localStorage && qq.isFunction(window.localStorage.setItem);\n\t } catch (error) {\n\t return false;\n\t }\n\t }\n\t function isDragAndDropSupported() {\n\t var span = document.createElement(\"span\");\n\t return (\"draggable\" in span || \"ondragstart\" in span && \"ondrop\" in span) && !qq.android() && !qq.ios();\n\t }\n\t supportsUploading = testSupportsFileInputElement();\n\t supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported();\n\t supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock();\n\t supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported();\n\t supportsFolderDrop = supportsFileDrop && function() {\n\t var input = document.createElement(\"input\");\n\t input.type = \"file\";\n\t return !!(\"webkitdirectory\" in (input || document.querySelectorAll(\"input[type=file]\")[0]));\n\t }();\n\t supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported();\n\t supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported();\n\t supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher();\n\t supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading);\n\t supportsDeleteFileCorsXhr = isCrossOriginXhrSupported();\n\t supportsDeleteFileXdr = isXdrSupported();\n\t supportsDeleteFileCors = isCrossOriginAjaxSupported();\n\t supportsFolderSelection = isFolderSelectionSupported();\n\t supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined;\n\t supportsUploadProgress = function() {\n\t if (supportsAjaxFileUploading) {\n\t return !qq.androidStock() && !qq.iosChrome();\n\t }\n\t return false;\n\t }();\n\t return {\n\t ajaxUploading: supportsAjaxFileUploading,\n\t blobUploading: supportsUploadingBlobs,\n\t canDetermineSize: supportsAjaxFileUploading,\n\t chunking: supportsChunking,\n\t deleteFileCors: supportsDeleteFileCors,\n\t deleteFileCorsXdr: supportsDeleteFileXdr,\n\t deleteFileCorsXhr: supportsDeleteFileCorsXhr,\n\t dialogElement: !!window.HTMLDialogElement,\n\t fileDrop: supportsFileDrop,\n\t folderDrop: supportsFolderDrop,\n\t folderSelection: supportsFolderSelection,\n\t imagePreviews: supportsImagePreviews,\n\t imageValidation: supportsImagePreviews,\n\t itemSizeValidation: supportsAjaxFileUploading,\n\t pause: supportsChunking,\n\t progressBar: supportsUploadProgress,\n\t resume: supportsResume,\n\t scaling: supportsImagePreviews && supportsUploadingBlobs,\n\t tiffPreviews: qq.safari(),\n\t unlimitedScaledImageSize: !qq.ios(),\n\t uploading: supportsUploading,\n\t uploadCors: supportsUploadCors,\n\t uploadCustomHeaders: supportsAjaxFileUploading,\n\t uploadNonMultipart: supportsAjaxFileUploading,\n\t uploadViaPaste: supportsUploadViaPaste\n\t };\n\t }();\n\t qq.isGenericPromise = function(maybePromise) {\n\t \"use strict\";\n\t return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then));\n\t };\n\t qq.Promise = function() {\n\t \"use strict\";\n\t var successArgs, failureArgs, successCallbacks = [], failureCallbacks = [], doneCallbacks = [], state = 0;\n\t qq.extend(this, {\n\t then: function(onSuccess, onFailure) {\n\t if (state === 0) {\n\t if (onSuccess) {\n\t successCallbacks.push(onSuccess);\n\t }\n\t if (onFailure) {\n\t failureCallbacks.push(onFailure);\n\t }\n\t } else if (state === -1) {\n\t onFailure && onFailure.apply(null, failureArgs);\n\t } else if (onSuccess) {\n\t onSuccess.apply(null, successArgs);\n\t }\n\t return this;\n\t },\n\t done: function(callback) {\n\t if (state === 0) {\n\t doneCallbacks.push(callback);\n\t } else {\n\t callback.apply(null, failureArgs === undefined ? successArgs : failureArgs);\n\t }\n\t return this;\n\t },\n\t success: function() {\n\t state = 1;\n\t successArgs = arguments;\n\t if (successCallbacks.length) {\n\t qq.each(successCallbacks, function(idx, callback) {\n\t callback.apply(null, successArgs);\n\t });\n\t }\n\t if (doneCallbacks.length) {\n\t qq.each(doneCallbacks, function(idx, callback) {\n\t callback.apply(null, successArgs);\n\t });\n\t }\n\t return this;\n\t },\n\t failure: function() {\n\t state = -1;\n\t failureArgs = arguments;\n\t if (failureCallbacks.length) {\n\t qq.each(failureCallbacks, function(idx, callback) {\n\t callback.apply(null, failureArgs);\n\t });\n\t }\n\t if (doneCallbacks.length) {\n\t qq.each(doneCallbacks, function(idx, callback) {\n\t callback.apply(null, failureArgs);\n\t });\n\t }\n\t return this;\n\t }\n\t });\n\t };\n\t qq.BlobProxy = function(referenceBlob, onCreate) {\n\t \"use strict\";\n\t qq.extend(this, {\n\t referenceBlob: referenceBlob,\n\t create: function() {\n\t return onCreate(referenceBlob);\n\t }\n\t });\n\t };\n\t qq.UploadButton = function(o) {\n\t \"use strict\";\n\t var self = this, disposeSupport = new qq.DisposeSupport(), options = {\n\t acceptFiles: null,\n\t element: null,\n\t focusClass: \"qq-upload-button-focus\",\n\t folders: false,\n\t hoverClass: \"qq-upload-button-hover\",\n\t ios8BrowserCrashWorkaround: false,\n\t multiple: false,\n\t name: \"qqfile\",\n\t onChange: function(input) {},\n\t title: null\n\t }, input, buttonId;\n\t qq.extend(options, o);\n\t buttonId = qq.getUniqueId();\n\t function createInput() {\n\t var input = document.createElement(\"input\");\n\t input.setAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME, buttonId);\n\t input.setAttribute(\"title\", options.title);\n\t self.setMultiple(options.multiple, input);\n\t if (options.folders && qq.supportedFeatures.folderSelection) {\n\t input.setAttribute(\"webkitdirectory\", \"\");\n\t }\n\t if (options.acceptFiles) {\n\t input.setAttribute(\"accept\", options.acceptFiles);\n\t }\n\t input.setAttribute(\"type\", \"file\");\n\t input.setAttribute(\"name\", options.name);\n\t qq(input).css({\n\t position: \"absolute\",\n\t right: 0,\n\t top: 0,\n\t fontFamily: \"Arial\",\n\t fontSize: qq.ie() && !qq.ie8() ? \"3500px\" : \"118px\",\n\t margin: 0,\n\t padding: 0,\n\t cursor: \"pointer\",\n\t opacity: 0\n\t });\n\t !qq.ie7() && qq(input).css({\n\t height: \"100%\"\n\t });\n\t options.element.appendChild(input);\n\t disposeSupport.attach(input, \"change\", function() {\n\t options.onChange(input);\n\t });\n\t disposeSupport.attach(input, \"mouseover\", function() {\n\t qq(options.element).addClass(options.hoverClass);\n\t });\n\t disposeSupport.attach(input, \"mouseout\", function() {\n\t qq(options.element).removeClass(options.hoverClass);\n\t });\n\t disposeSupport.attach(input, \"focus\", function() {\n\t qq(options.element).addClass(options.focusClass);\n\t });\n\t disposeSupport.attach(input, \"blur\", function() {\n\t qq(options.element).removeClass(options.focusClass);\n\t });\n\t return input;\n\t }\n\t qq(options.element).css({\n\t position: \"relative\",\n\t overflow: \"hidden\",\n\t direction: \"ltr\"\n\t });\n\t qq.extend(this, {\n\t getInput: function() {\n\t return input;\n\t },\n\t getButtonId: function() {\n\t return buttonId;\n\t },\n\t setMultiple: function(isMultiple, optInput) {\n\t var input = optInput || this.getInput();\n\t if (options.ios8BrowserCrashWorkaround && qq.ios8() && (qq.iosChrome() || qq.iosSafariWebView())) {\n\t input.setAttribute(\"multiple\", \"\");\n\t } else {\n\t if (isMultiple) {\n\t input.setAttribute(\"multiple\", \"\");\n\t } else {\n\t input.removeAttribute(\"multiple\");\n\t }\n\t }\n\t },\n\t setAcceptFiles: function(acceptFiles) {\n\t if (acceptFiles !== options.acceptFiles) {\n\t input.setAttribute(\"accept\", acceptFiles);\n\t }\n\t },\n\t reset: function() {\n\t if (input.parentNode) {\n\t qq(input).remove();\n\t }\n\t qq(options.element).removeClass(options.focusClass);\n\t input = null;\n\t input = createInput();\n\t }\n\t });\n\t input = createInput();\n\t };\n\t qq.UploadButton.BUTTON_ID_ATTR_NAME = \"qq-button-id\";\n\t qq.UploadData = function(uploaderProxy) {\n\t \"use strict\";\n\t var data = [], byUuid = {}, byStatus = {}, byProxyGroupId = {}, byBatchId = {};\n\t function getDataByIds(idOrIds) {\n\t if (qq.isArray(idOrIds)) {\n\t var entries = [];\n\t qq.each(idOrIds, function(idx, id) {\n\t entries.push(data[id]);\n\t });\n\t return entries;\n\t }\n\t return data[idOrIds];\n\t }\n\t function getDataByUuids(uuids) {\n\t if (qq.isArray(uuids)) {\n\t var entries = [];\n\t qq.each(uuids, function(idx, uuid) {\n\t entries.push(data[byUuid[uuid]]);\n\t });\n\t return entries;\n\t }\n\t return data[byUuid[uuids]];\n\t }\n\t function getDataByStatus(status) {\n\t var statusResults = [], statuses = [].concat(status);\n\t qq.each(statuses, function(index, statusEnum) {\n\t var statusResultIndexes = byStatus[statusEnum];\n\t if (statusResultIndexes !== undefined) {\n\t qq.each(statusResultIndexes, function(i, dataIndex) {\n\t statusResults.push(data[dataIndex]);\n\t });\n\t }\n\t });\n\t return statusResults;\n\t }\n\t qq.extend(this, {\n\t addFile: function(spec) {\n\t var status = spec.status || qq.status.SUBMITTING, id = data.push({\n\t name: spec.name,\n\t originalName: spec.name,\n\t uuid: spec.uuid,\n\t size: spec.size == null ? -1 : spec.size,\n\t status: status,\n\t file: spec.file\n\t }) - 1;\n\t if (spec.batchId) {\n\t data[id].batchId = spec.batchId;\n\t if (byBatchId[spec.batchId] === undefined) {\n\t byBatchId[spec.batchId] = [];\n\t }\n\t byBatchId[spec.batchId].push(id);\n\t }\n\t if (spec.proxyGroupId) {\n\t data[id].proxyGroupId = spec.proxyGroupId;\n\t if (byProxyGroupId[spec.proxyGroupId] === undefined) {\n\t byProxyGroupId[spec.proxyGroupId] = [];\n\t }\n\t byProxyGroupId[spec.proxyGroupId].push(id);\n\t }\n\t data[id].id = id;\n\t byUuid[spec.uuid] = id;\n\t if (byStatus[status] === undefined) {\n\t byStatus[status] = [];\n\t }\n\t byStatus[status].push(id);\n\t spec.onBeforeStatusChange && spec.onBeforeStatusChange(id);\n\t uploaderProxy.onStatusChange(id, null, status);\n\t return id;\n\t },\n\t retrieve: function(optionalFilter) {\n\t if (qq.isObject(optionalFilter) && data.length) {\n\t if (optionalFilter.id !== undefined) {\n\t return getDataByIds(optionalFilter.id);\n\t } else if (optionalFilter.uuid !== undefined) {\n\t return getDataByUuids(optionalFilter.uuid);\n\t } else if (optionalFilter.status) {\n\t return getDataByStatus(optionalFilter.status);\n\t }\n\t } else {\n\t return qq.extend([], data, true);\n\t }\n\t },\n\t removeFileRef: function(id) {\n\t var record = getDataByIds(id);\n\t if (record) {\n\t delete record.file;\n\t }\n\t },\n\t reset: function() {\n\t data = [];\n\t byUuid = {};\n\t byStatus = {};\n\t byBatchId = {};\n\t },\n\t setStatus: function(id, newStatus) {\n\t var oldStatus = data[id].status, byStatusOldStatusIndex = qq.indexOf(byStatus[oldStatus], id);\n\t byStatus[oldStatus].splice(byStatusOldStatusIndex, 1);\n\t data[id].status = newStatus;\n\t if (byStatus[newStatus] === undefined) {\n\t byStatus[newStatus] = [];\n\t }\n\t byStatus[newStatus].push(id);\n\t uploaderProxy.onStatusChange(id, oldStatus, newStatus);\n\t },\n\t uuidChanged: function(id, newUuid) {\n\t var oldUuid = data[id].uuid;\n\t data[id].uuid = newUuid;\n\t byUuid[newUuid] = id;\n\t delete byUuid[oldUuid];\n\t },\n\t updateName: function(id, newName) {\n\t data[id].name = newName;\n\t },\n\t updateSize: function(id, newSize) {\n\t data[id].size = newSize;\n\t },\n\t setParentId: function(targetId, parentId) {\n\t data[targetId].parentId = parentId;\n\t },\n\t getIdsInProxyGroup: function(id) {\n\t var proxyGroupId = data[id].proxyGroupId;\n\t if (proxyGroupId) {\n\t return byProxyGroupId[proxyGroupId];\n\t }\n\t return [];\n\t },\n\t getIdsInBatch: function(id) {\n\t var batchId = data[id].batchId;\n\t return byBatchId[batchId];\n\t }\n\t });\n\t };\n\t qq.status = {\n\t SUBMITTING: \"submitting\",\n\t SUBMITTED: \"submitted\",\n\t REJECTED: \"rejected\",\n\t QUEUED: \"queued\",\n\t CANCELED: \"canceled\",\n\t PAUSED: \"paused\",\n\t UPLOADING: \"uploading\",\n\t UPLOAD_FINALIZING: \"upload finalizing\",\n\t UPLOAD_RETRYING: \"retrying upload\",\n\t UPLOAD_SUCCESSFUL: \"upload successful\",\n\t UPLOAD_FAILED: \"upload failed\",\n\t DELETE_FAILED: \"delete failed\",\n\t DELETING: \"deleting\",\n\t DELETED: \"deleted\"\n\t };\n\t (function() {\n\t \"use strict\";\n\t qq.basePublicApi = {\n\t addBlobs: function(blobDataOrArray, params, endpoint) {\n\t this.addFiles(blobDataOrArray, params, endpoint);\n\t },\n\t addInitialFiles: function(cannedFileList) {\n\t var self = this;\n\t qq.each(cannedFileList, function(index, cannedFile) {\n\t self._addCannedFile(cannedFile);\n\t });\n\t },\n\t addFiles: function(data, params, endpoint) {\n\t this._maybeHandleIos8SafariWorkaround();\n\t var batchId = this._storedIds.length === 0 ? qq.getUniqueId() : this._currentBatchId, processBlob = qq.bind(function(blob) {\n\t this._handleNewFile({\n\t blob: blob,\n\t name: this._options.blobs.defaultName\n\t }, batchId, verifiedFiles);\n\t }, this), processBlobData = qq.bind(function(blobData) {\n\t this._handleNewFile(blobData, batchId, verifiedFiles);\n\t }, this), processCanvas = qq.bind(function(canvas) {\n\t var blob = qq.canvasToBlob(canvas);\n\t this._handleNewFile({\n\t blob: blob,\n\t name: this._options.blobs.defaultName + \".png\"\n\t }, batchId, verifiedFiles);\n\t }, this), processCanvasData = qq.bind(function(canvasData) {\n\t var normalizedQuality = canvasData.quality && canvasData.quality / 100, blob = qq.canvasToBlob(canvasData.canvas, canvasData.type, normalizedQuality);\n\t this._handleNewFile({\n\t blob: blob,\n\t name: canvasData.name\n\t }, batchId, verifiedFiles);\n\t }, this), processFileOrInput = qq.bind(function(fileOrInput) {\n\t if (qq.isInput(fileOrInput) && qq.supportedFeatures.ajaxUploading) {\n\t var files = Array.prototype.slice.call(fileOrInput.files), self = this;\n\t qq.each(files, function(idx, file) {\n\t self._handleNewFile(file, batchId, verifiedFiles);\n\t });\n\t } else {\n\t this._handleNewFile(fileOrInput, batchId, verifiedFiles);\n\t }\n\t }, this), normalizeData = function() {\n\t if (qq.isFileList(data)) {\n\t data = Array.prototype.slice.call(data);\n\t }\n\t data = [].concat(data);\n\t }, self = this, verifiedFiles = [];\n\t this._currentBatchId = batchId;\n\t if (data) {\n\t normalizeData();\n\t qq.each(data, function(idx, fileContainer) {\n\t if (qq.isFileOrInput(fileContainer)) {\n\t processFileOrInput(fileContainer);\n\t } else if (qq.isBlob(fileContainer)) {\n\t processBlob(fileContainer);\n\t } else if (qq.isObject(fileContainer)) {\n\t if (fileContainer.blob && fileContainer.name) {\n\t processBlobData(fileContainer);\n\t } else if (fileContainer.canvas && fileContainer.name) {\n\t processCanvasData(fileContainer);\n\t }\n\t } else if (fileContainer.tagName && fileContainer.tagName.toLowerCase() === \"canvas\") {\n\t processCanvas(fileContainer);\n\t } else {\n\t self.log(fileContainer + \" is not a valid file container! Ignoring!\", \"warn\");\n\t }\n\t });\n\t this.log(\"Received \" + verifiedFiles.length + \" files.\");\n\t this._prepareItemsForUpload(verifiedFiles, params, endpoint);\n\t }\n\t },\n\t cancel: function(id) {\n\t var uploadData = this._uploadData.retrieve({\n\t id: id\n\t });\n\t if (uploadData && uploadData.status === qq.status.UPLOAD_FINALIZING) {\n\t this.log(qq.format(\"Ignoring cancel for file ID {} ({}). Finalizing upload.\", id, this.getName(id)), \"error\");\n\t } else {\n\t this._handler.cancel(id);\n\t }\n\t },\n\t cancelAll: function() {\n\t var storedIdsCopy = [], self = this;\n\t qq.extend(storedIdsCopy, this._storedIds);\n\t qq.each(storedIdsCopy, function(idx, storedFileId) {\n\t self.cancel(storedFileId);\n\t });\n\t this._handler.cancelAll();\n\t },\n\t clearStoredFiles: function() {\n\t this._storedIds = [];\n\t },\n\t continueUpload: function(id) {\n\t var uploadData = this._uploadData.retrieve({\n\t id: id\n\t });\n\t if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {\n\t return false;\n\t }\n\t if (uploadData.status === qq.status.PAUSED) {\n\t this.log(qq.format(\"Paused file ID {} ({}) will be continued. Not paused.\", id, this.getName(id)));\n\t this._uploadFile(id);\n\t return true;\n\t } else {\n\t this.log(qq.format(\"Ignoring continue for file ID {} ({}). Not paused.\", id, this.getName(id)), \"error\");\n\t }\n\t return false;\n\t },\n\t deleteFile: function(id) {\n\t return this._onSubmitDelete(id);\n\t },\n\t doesExist: function(fileOrBlobId) {\n\t return this._handler.isValid(fileOrBlobId);\n\t },\n\t drawThumbnail: function(fileId, imgOrCanvas, maxSize, fromServer, customResizeFunction) {\n\t var promiseToReturn = new qq.Promise(), fileOrUrl, options;\n\t if (this._imageGenerator) {\n\t fileOrUrl = this._thumbnailUrls[fileId];\n\t options = {\n\t customResizeFunction: customResizeFunction,\n\t maxSize: maxSize > 0 ? maxSize : null,\n\t scale: maxSize > 0\n\t };\n\t if (!fromServer && qq.supportedFeatures.imagePreviews) {\n\t fileOrUrl = this.getFile(fileId);\n\t }\n\t if (fileOrUrl == null) {\n\t promiseToReturn.failure({\n\t container: imgOrCanvas,\n\t error: \"File or URL not found.\"\n\t });\n\t } else {\n\t this._imageGenerator.generate(fileOrUrl, imgOrCanvas, options).then(function success(modifiedContainer) {\n\t promiseToReturn.success(modifiedContainer);\n\t }, function failure(container, reason) {\n\t promiseToReturn.failure({\n\t container: container,\n\t error: reason || \"Problem generating thumbnail\"\n\t });\n\t });\n\t }\n\t } else {\n\t promiseToReturn.failure({\n\t container: imgOrCanvas,\n\t error: \"Missing image generator module\"\n\t });\n\t }\n\t return promiseToReturn;\n\t },\n\t getButton: function(fileId) {\n\t return this._getButton(this._buttonIdsForFileIds[fileId]);\n\t },\n\t getEndpoint: function(fileId) {\n\t return this._endpointStore.get(fileId);\n\t },\n\t getFile: function(fileOrBlobId) {\n\t var file = this._handler.getFile(fileOrBlobId);\n\t var uploadDataRecord;\n\t if (!file) {\n\t uploadDataRecord = this._uploadData.retrieve({\n\t id: fileOrBlobId\n\t });\n\t if (uploadDataRecord) {\n\t file = uploadDataRecord.file;\n\t }\n\t }\n\t return file || null;\n\t },\n\t getInProgress: function() {\n\t return this._uploadData.retrieve({\n\t status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED ]\n\t }).length;\n\t },\n\t getName: function(id) {\n\t return this._uploadData.retrieve({\n\t id: id\n\t }).name;\n\t },\n\t getParentId: function(id) {\n\t var uploadDataEntry = this.getUploads({\n\t id: id\n\t }), parentId = null;\n\t if (uploadDataEntry) {\n\t if (uploadDataEntry.parentId !== undefined) {\n\t parentId = uploadDataEntry.parentId;\n\t }\n\t }\n\t return parentId;\n\t },\n\t getResumableFilesData: function() {\n\t return this._handler.getResumableFilesData();\n\t },\n\t getSize: function(id) {\n\t return this._uploadData.retrieve({\n\t id: id\n\t }).size;\n\t },\n\t getNetUploads: function() {\n\t return this._netUploaded;\n\t },\n\t getRemainingAllowedItems: function() {\n\t var allowedItems = this._currentItemLimit;\n\t if (allowedItems > 0) {\n\t return allowedItems - this._netUploadedOrQueued;\n\t }\n\t return null;\n\t },\n\t getUploads: function(optionalFilter) {\n\t return this._uploadData.retrieve(optionalFilter);\n\t },\n\t getUuid: function(id) {\n\t return this._uploadData.retrieve({\n\t id: id\n\t }).uuid;\n\t },\n\t isResumable: function(id) {\n\t return this._handler.hasResumeRecord(id);\n\t },\n\t log: function(str, level) {\n\t if (this._options.debug && (!level || level === \"info\")) {\n\t qq.log(\"[Fine Uploader \" + qq.version + \"] \" + str);\n\t } else if (level && level !== \"info\") {\n\t qq.log(\"[Fine Uploader \" + qq.version + \"] \" + str, level);\n\t }\n\t },\n\t pauseUpload: function(id) {\n\t var uploadData = this._uploadData.retrieve({\n\t id: id\n\t });\n\t if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {\n\t return false;\n\t }\n\t if (qq.indexOf([ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING ], uploadData.status) >= 0) {\n\t if (this._handler.pause(id)) {\n\t this._uploadData.setStatus(id, qq.status.PAUSED);\n\t return true;\n\t } else {\n\t this.log(qq.format(\"Unable to pause file ID {} ({}).\", id, this.getName(id)), \"error\");\n\t }\n\t } else {\n\t this.log(qq.format(\"Ignoring pause for file ID {} ({}). Not in progress.\", id, this.getName(id)), \"error\");\n\t }\n\t return false;\n\t },\n\t removeFileRef: function(id) {\n\t this._handler.expunge(id);\n\t this._uploadData.removeFileRef(id);\n\t },\n\t reset: function() {\n\t this.log(\"Resetting uploader...\");\n\t this._handler.reset();\n\t this._storedIds = [];\n\t this._autoRetries = [];\n\t this._retryTimeouts = [];\n\t this._preventRetries = [];\n\t this._thumbnailUrls = [];\n\t qq.each(this._buttons, function(idx, button) {\n\t button.reset();\n\t });\n\t this._paramsStore.reset();\n\t this._endpointStore.reset();\n\t this._netUploadedOrQueued = 0;\n\t this._netUploaded = 0;\n\t this._uploadData.reset();\n\t this._buttonIdsForFileIds = [];\n\t this._pasteHandler && this._pasteHandler.reset();\n\t this._options.session.refreshOnReset && this._refreshSessionData();\n\t this._succeededSinceLastAllComplete = [];\n\t this._failedSinceLastAllComplete = [];\n\t this._totalProgress && this._totalProgress.reset();\n\t this._customResumeDataStore.reset();\n\t },\n\t retry: function(id) {\n\t return this._manualRetry(id);\n\t },\n\t scaleImage: function(id, specs) {\n\t var self = this;\n\t return qq.Scaler.prototype.scaleImage(id, specs, {\n\t log: qq.bind(self.log, self),\n\t getFile: qq.bind(self.getFile, self),\n\t uploadData: self._uploadData\n\t });\n\t },\n\t setCustomHeaders: function(headers, id) {\n\t this._customHeadersStore.set(headers, id);\n\t },\n\t setCustomResumeData: function(id, data) {\n\t this._customResumeDataStore.set(data, id);\n\t },\n\t setDeleteFileCustomHeaders: function(headers, id) {\n\t this._deleteFileCustomHeadersStore.set(headers, id);\n\t },\n\t setDeleteFileEndpoint: function(endpoint, id) {\n\t this._deleteFileEndpointStore.set(endpoint, id);\n\t },\n\t setDeleteFileParams: function(params, id) {\n\t this._deleteFileParamsStore.set(params, id);\n\t },\n\t setEndpoint: function(endpoint, id) {\n\t this._endpointStore.set(endpoint, id);\n\t },\n\t setForm: function(elementOrId) {\n\t this._updateFormSupportAndParams(elementOrId);\n\t },\n\t setItemLimit: function(newItemLimit) {\n\t this._currentItemLimit = newItemLimit;\n\t },\n\t setName: function(id, newName) {\n\t this._uploadData.updateName(id, newName);\n\t },\n\t setParams: function(params, id) {\n\t this._paramsStore.set(params, id);\n\t },\n\t setUuid: function(id, newUuid) {\n\t return this._uploadData.uuidChanged(id, newUuid);\n\t },\n\t setStatus: function(id, newStatus) {\n\t var fileRecord = this.getUploads({\n\t id: id\n\t });\n\t if (!fileRecord) {\n\t throw new qq.Error(id + \" is not a valid file ID.\");\n\t }\n\t switch (newStatus) {\n\t case qq.status.DELETED:\n\t this._onDeleteComplete(id, null, false);\n\t break;\n\t\n\t case qq.status.DELETE_FAILED:\n\t this._onDeleteComplete(id, null, true);\n\t break;\n\t\n\t default:\n\t var errorMessage = \"Method setStatus called on '\" + name + \"' not implemented yet for \" + newStatus;\n\t this.log(errorMessage);\n\t throw new qq.Error(errorMessage);\n\t }\n\t },\n\t uploadStoredFiles: function() {\n\t if (this._storedIds.length === 0) {\n\t this._itemError(\"noFilesError\");\n\t } else {\n\t this._uploadStoredFiles();\n\t }\n\t }\n\t };\n\t qq.basePrivateApi = {\n\t _addCannedFile: function(sessionData) {\n\t var self = this;\n\t return this._uploadData.addFile({\n\t uuid: sessionData.uuid,\n\t name: sessionData.name,\n\t size: sessionData.size,\n\t status: qq.status.UPLOAD_SUCCESSFUL,\n\t onBeforeStatusChange: function(id) {\n\t sessionData.deleteFileEndpoint && self.setDeleteFileEndpoint(sessionData.deleteFileEndpoint, id);\n\t sessionData.deleteFileParams && self.setDeleteFileParams(sessionData.deleteFileParams, id);\n\t if (sessionData.thumbnailUrl) {\n\t self._thumbnailUrls[id] = sessionData.thumbnailUrl;\n\t }\n\t self._netUploaded++;\n\t self._netUploadedOrQueued++;\n\t }\n\t });\n\t },\n\t _annotateWithButtonId: function(file, associatedInput) {\n\t if (qq.isFile(file)) {\n\t file.qqButtonId = this._getButtonId(associatedInput);\n\t }\n\t },\n\t _batchError: function(message) {\n\t this._options.callbacks.onError(null, null, message, undefined);\n\t },\n\t _createDeleteHandler: function() {\n\t var self = this;\n\t return new qq.DeleteFileAjaxRequester({\n\t method: this._options.deleteFile.method.toUpperCase(),\n\t maxConnections: this._options.maxConnections,\n\t uuidParamName: this._options.request.uuidName,\n\t customHeaders: this._deleteFileCustomHeadersStore,\n\t paramsStore: this._deleteFileParamsStore,\n\t endpointStore: this._deleteFileEndpointStore,\n\t cors: this._options.cors,\n\t log: qq.bind(self.log, self),\n\t onDelete: function(id) {\n\t self._onDelete(id);\n\t self._options.callbacks.onDelete(id);\n\t },\n\t onDeleteComplete: function(id, xhrOrXdr, isError) {\n\t self._onDeleteComplete(id, xhrOrXdr, isError);\n\t self._options.callbacks.onDeleteComplete(id, xhrOrXdr, isError);\n\t }\n\t });\n\t },\n\t _createPasteHandler: function() {\n\t var self = this;\n\t return new qq.PasteSupport({\n\t targetElement: this._options.paste.targetElement,\n\t callbacks: {\n\t log: qq.bind(self.log, self),\n\t pasteReceived: function(blob) {\n\t self._handleCheckedCallback({\n\t name: \"onPasteReceived\",\n\t callback: qq.bind(self._options.callbacks.onPasteReceived, self, blob),\n\t onSuccess: qq.bind(self._handlePasteSuccess, self, blob),\n\t identifier: \"pasted image\"\n\t });\n\t }\n\t }\n\t });\n\t },\n\t _createStore: function(initialValue, _readOnlyValues_) {\n\t var store = {}, catchall = initialValue, perIdReadOnlyValues = {}, readOnlyValues = _readOnlyValues_, copy = function(orig) {\n\t if (qq.isObject(orig)) {\n\t return qq.extend({}, orig);\n\t }\n\t return orig;\n\t }, getReadOnlyValues = function() {\n\t if (qq.isFunction(readOnlyValues)) {\n\t return readOnlyValues();\n\t }\n\t return readOnlyValues;\n\t }, includeReadOnlyValues = function(id, existing) {\n\t if (readOnlyValues && qq.isObject(existing)) {\n\t qq.extend(existing, getReadOnlyValues());\n\t }\n\t if (perIdReadOnlyValues[id]) {\n\t qq.extend(existing, perIdReadOnlyValues[id]);\n\t }\n\t };\n\t return {\n\t set: function(val, id) {\n\t if (id == null) {\n\t store = {};\n\t catchall = copy(val);\n\t } else {\n\t store[id] = copy(val);\n\t }\n\t },\n\t get: function(id) {\n\t var values;\n\t if (id != null && store[id]) {\n\t values = store[id];\n\t } else {\n\t values = copy(catchall);\n\t }\n\t includeReadOnlyValues(id, values);\n\t return copy(values);\n\t },\n\t addReadOnly: function(id, values) {\n\t if (qq.isObject(store)) {\n\t if (id === null) {\n\t if (qq.isFunction(values)) {\n\t readOnlyValues = values;\n\t } else {\n\t readOnlyValues = readOnlyValues || {};\n\t qq.extend(readOnlyValues, values);\n\t }\n\t } else {\n\t perIdReadOnlyValues[id] = perIdReadOnlyValues[id] || {};\n\t qq.extend(perIdReadOnlyValues[id], values);\n\t }\n\t }\n\t },\n\t remove: function(fileId) {\n\t return delete store[fileId];\n\t },\n\t reset: function() {\n\t store = {};\n\t perIdReadOnlyValues = {};\n\t catchall = initialValue;\n\t }\n\t };\n\t },\n\t _createUploadDataTracker: function() {\n\t var self = this;\n\t return new qq.UploadData({\n\t getName: function(id) {\n\t return self.getName(id);\n\t },\n\t getUuid: function(id) {\n\t return self.getUuid(id);\n\t },\n\t getSize: function(id) {\n\t return self.getSize(id);\n\t },\n\t onStatusChange: function(id, oldStatus, newStatus) {\n\t self._onUploadStatusChange(id, oldStatus, newStatus);\n\t self._options.callbacks.onStatusChange(id, oldStatus, newStatus);\n\t self._maybeAllComplete(id, newStatus);\n\t if (self._totalProgress) {\n\t setTimeout(function() {\n\t self._totalProgress.onStatusChange(id, oldStatus, newStatus);\n\t }, 0);\n\t }\n\t }\n\t });\n\t },\n\t _createUploadButton: function(spec) {\n\t var self = this, acceptFiles = spec.accept || this._options.validation.acceptFiles, allowedExtensions = spec.allowedExtensions || this._options.validation.allowedExtensions, button;\n\t function allowMultiple() {\n\t if (qq.supportedFeatures.ajaxUploading) {\n\t if (self._options.workarounds.iosEmptyVideos && qq.ios() && !qq.ios6() && self._isAllowedExtension(allowedExtensions, \".mov\")) {\n\t return false;\n\t }\n\t if (spec.multiple === undefined) {\n\t return self._options.multiple;\n\t }\n\t return spec.multiple;\n\t }\n\t return false;\n\t }\n\t button = new qq.UploadButton({\n\t acceptFiles: acceptFiles,\n\t element: spec.element,\n\t focusClass: this._options.classes.buttonFocus,\n\t folders: spec.folders,\n\t hoverClass: this._options.classes.buttonHover,\n\t ios8BrowserCrashWorkaround: this._options.workarounds.ios8BrowserCrash,\n\t multiple: allowMultiple(),\n\t name: this._options.request.inputName,\n\t onChange: function(input) {\n\t self._onInputChange(input);\n\t },\n\t title: spec.title == null ? this._options.text.fileInputTitle : spec.title\n\t });\n\t this._disposeSupport.addDisposer(function() {\n\t button.dispose();\n\t });\n\t self._buttons.push(button);\n\t return button;\n\t },\n\t _createUploadHandler: function(additionalOptions, namespace) {\n\t var self = this, lastOnProgress = {}, options = {\n\t debug: this._options.debug,\n\t maxConnections: this._options.maxConnections,\n\t cors: this._options.cors,\n\t paramsStore: this._paramsStore,\n\t endpointStore: this._endpointStore,\n\t chunking: this._options.chunking,\n\t resume: this._options.resume,\n\t blobs: this._options.blobs,\n\t log: qq.bind(self.log, self),\n\t preventRetryParam: this._options.retry.preventRetryResponseProperty,\n\t onProgress: function(id, name, loaded, total) {\n\t if (loaded < 0 || total < 0) {\n\t return;\n\t }\n\t if (lastOnProgress[id]) {\n\t if (lastOnProgress[id].loaded !== loaded || lastOnProgress[id].total !== total) {\n\t self._onProgress(id, name, loaded, total);\n\t self._options.callbacks.onProgress(id, name, loaded, total);\n\t }\n\t } else {\n\t self._onProgress(id, name, loaded, total);\n\t self._options.callbacks.onProgress(id, name, loaded, total);\n\t }\n\t lastOnProgress[id] = {\n\t loaded: loaded,\n\t total: total\n\t };\n\t },\n\t onComplete: function(id, name, result, xhr) {\n\t delete lastOnProgress[id];\n\t var status = self.getUploads({\n\t id: id\n\t }).status, retVal;\n\t if (status === qq.status.UPLOAD_SUCCESSFUL || status === qq.status.UPLOAD_FAILED) {\n\t return;\n\t }\n\t retVal = self._onComplete(id, name, result, xhr);\n\t if (retVal instanceof qq.Promise) {\n\t retVal.done(function() {\n\t self._options.callbacks.onComplete(id, name, result, xhr);\n\t });\n\t } else {\n\t self._options.callbacks.onComplete(id, name, result, xhr);\n\t }\n\t },\n\t onCancel: function(id, name, cancelFinalizationEffort) {\n\t var promise = new qq.Promise();\n\t self._handleCheckedCallback({\n\t name: \"onCancel\",\n\t callback: qq.bind(self._options.callbacks.onCancel, self, id, name),\n\t onFailure: promise.failure,\n\t onSuccess: function() {\n\t cancelFinalizationEffort.then(function() {\n\t self._onCancel(id, name);\n\t });\n\t promise.success();\n\t },\n\t identifier: id\n\t });\n\t return promise;\n\t },\n\t onUploadPrep: qq.bind(this._onUploadPrep, this),\n\t onUpload: function(id, name) {\n\t self._onUpload(id, name);\n\t var onUploadResult = self._options.callbacks.onUpload(id, name);\n\t if (qq.isGenericPromise(onUploadResult)) {\n\t self.log(qq.format(\"onUpload for {} returned a Promise - waiting for resolution.\", id));\n\t return onUploadResult;\n\t }\n\t return new qq.Promise().success();\n\t },\n\t onUploadChunk: function(id, name, chunkData) {\n\t self._onUploadChunk(id, chunkData);\n\t var onUploadChunkResult = self._options.callbacks.onUploadChunk(id, name, chunkData);\n\t if (qq.isGenericPromise(onUploadChunkResult)) {\n\t self.log(qq.format(\"onUploadChunk for {}.{} returned a Promise - waiting for resolution.\", id, chunkData.partIndex));\n\t return onUploadChunkResult;\n\t }\n\t return new qq.Promise().success();\n\t },\n\t onUploadChunkSuccess: function(id, chunkData, result, xhr) {\n\t self._onUploadChunkSuccess(id, chunkData);\n\t self._options.callbacks.onUploadChunkSuccess.apply(self, arguments);\n\t },\n\t onResume: function(id, name, chunkData, customResumeData) {\n\t return self._options.callbacks.onResume(id, name, chunkData, customResumeData);\n\t },\n\t onAutoRetry: function(id, name, responseJSON, xhr) {\n\t return self._onAutoRetry.apply(self, arguments);\n\t },\n\t onUuidChanged: function(id, newUuid) {\n\t self.log(\"Server requested UUID change from '\" + self.getUuid(id) + \"' to '\" + newUuid + \"'\");\n\t self.setUuid(id, newUuid);\n\t },\n\t getName: qq.bind(self.getName, self),\n\t getUuid: qq.bind(self.getUuid, self),\n\t getSize: qq.bind(self.getSize, self),\n\t setSize: qq.bind(self._setSize, self),\n\t getDataByUuid: function(uuid) {\n\t return self.getUploads({\n\t uuid: uuid\n\t });\n\t },\n\t isQueued: function(id) {\n\t var status = self.getUploads({\n\t id: id\n\t }).status;\n\t return status === qq.status.QUEUED || status === qq.status.SUBMITTED || status === qq.status.UPLOAD_RETRYING || status === qq.status.PAUSED;\n\t },\n\t getIdsInProxyGroup: self._uploadData.getIdsInProxyGroup,\n\t getIdsInBatch: self._uploadData.getIdsInBatch,\n\t isInProgress: function(id) {\n\t return self.getUploads({\n\t id: id\n\t }).status === qq.status.UPLOADING;\n\t },\n\t getCustomResumeData: qq.bind(self._getCustomResumeData, self),\n\t setStatus: function(id, status) {\n\t self._uploadData.setStatus(id, status);\n\t }\n\t };\n\t qq.each(this._options.request, function(prop, val) {\n\t options[prop] = val;\n\t });\n\t options.customHeaders = this._customHeadersStore;\n\t if (additionalOptions) {\n\t qq.each(additionalOptions, function(key, val) {\n\t options[key] = val;\n\t });\n\t }\n\t return new qq.UploadHandlerController(options, namespace);\n\t },\n\t _fileOrBlobRejected: function(id) {\n\t this._netUploadedOrQueued--;\n\t this._uploadData.setStatus(id, qq.status.REJECTED);\n\t },\n\t _formatSize: function(bytes) {\n\t if (bytes === 0) {\n\t return bytes + this._options.text.sizeSymbols[0];\n\t }\n\t var i = -1;\n\t do {\n\t bytes = bytes / 1e3;\n\t i++;\n\t } while (bytes > 999);\n\t return Math.max(bytes, .1).toFixed(1) + this._options.text.sizeSymbols[i];\n\t },\n\t _generateExtraButtonSpecs: function() {\n\t var self = this;\n\t this._extraButtonSpecs = {};\n\t qq.each(this._options.extraButtons, function(idx, extraButtonOptionEntry) {\n\t var multiple = extraButtonOptionEntry.multiple, validation = qq.extend({}, self._options.validation, true), extraButtonSpec = qq.extend({}, extraButtonOptionEntry);\n\t if (multiple === undefined) {\n\t multiple = self._options.multiple;\n\t }\n\t if (extraButtonSpec.validation) {\n\t qq.extend(validation, extraButtonOptionEntry.validation, true);\n\t }\n\t qq.extend(extraButtonSpec, {\n\t multiple: multiple,\n\t validation: validation\n\t }, true);\n\t self._initExtraButton(extraButtonSpec);\n\t });\n\t },\n\t _getButton: function(buttonId) {\n\t var extraButtonsSpec = this._extraButtonSpecs[buttonId];\n\t if (extraButtonsSpec) {\n\t return extraButtonsSpec.element;\n\t } else if (buttonId === this._defaultButtonId) {\n\t return this._options.button;\n\t }\n\t },\n\t _getButtonId: function(buttonOrFileInputOrFile) {\n\t var inputs, fileInput, fileBlobOrInput = buttonOrFileInputOrFile;\n\t if (fileBlobOrInput instanceof qq.BlobProxy) {\n\t fileBlobOrInput = fileBlobOrInput.referenceBlob;\n\t }\n\t if (fileBlobOrInput && !qq.isBlob(fileBlobOrInput)) {\n\t if (qq.isFile(fileBlobOrInput)) {\n\t return fileBlobOrInput.qqButtonId;\n\t } else if (fileBlobOrInput.tagName.toLowerCase() === \"input\" && fileBlobOrInput.type.toLowerCase() === \"file\") {\n\t return fileBlobOrInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);\n\t }\n\t inputs = fileBlobOrInput.getElementsByTagName(\"input\");\n\t qq.each(inputs, function(idx, input) {\n\t if (input.getAttribute(\"type\") === \"file\") {\n\t fileInput = input;\n\t return false;\n\t }\n\t });\n\t if (fileInput) {\n\t return fileInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);\n\t }\n\t }\n\t },\n\t _getCustomResumeData: function(fileId) {\n\t return this._customResumeDataStore.get(fileId);\n\t },\n\t _getNotFinished: function() {\n\t return this._uploadData.retrieve({\n\t status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED, qq.status.SUBMITTING, qq.status.SUBMITTED, qq.status.PAUSED ]\n\t }).length;\n\t },\n\t _getValidationBase: function(buttonId) {\n\t var extraButtonSpec = this._extraButtonSpecs[buttonId];\n\t return extraButtonSpec ? extraButtonSpec.validation : this._options.validation;\n\t },\n\t _getValidationDescriptor: function(fileWrapper) {\n\t if (fileWrapper.file instanceof qq.BlobProxy) {\n\t return {\n\t name: qq.getFilename(fileWrapper.file.referenceBlob),\n\t size: fileWrapper.file.referenceBlob.size\n\t };\n\t }\n\t return {\n\t name: this.getUploads({\n\t id: fileWrapper.id\n\t }).name,\n\t size: this.getUploads({\n\t id: fileWrapper.id\n\t }).size\n\t };\n\t },\n\t _getValidationDescriptors: function(fileWrappers) {\n\t var self = this, fileDescriptors = [];\n\t qq.each(fileWrappers, function(idx, fileWrapper) {\n\t fileDescriptors.push(self._getValidationDescriptor(fileWrapper));\n\t });\n\t return fileDescriptors;\n\t },\n\t _handleCameraAccess: function() {\n\t if (this._options.camera.ios && qq.ios()) {\n\t var acceptIosCamera = \"image/*;capture=camera\", button = this._options.camera.button, buttonId = button ? this._getButtonId(button) : this._defaultButtonId, optionRoot = this._options;\n\t if (buttonId && buttonId !== this._defaultButtonId) {\n\t optionRoot = this._extraButtonSpecs[buttonId];\n\t }\n\t optionRoot.multiple = false;\n\t if (optionRoot.validation.acceptFiles === null) {\n\t optionRoot.validation.acceptFiles = acceptIosCamera;\n\t } else {\n\t optionRoot.validation.acceptFiles += \",\" + acceptIosCamera;\n\t }\n\t qq.each(this._buttons, function(idx, button) {\n\t if (button.getButtonId() === buttonId) {\n\t button.setMultiple(optionRoot.multiple);\n\t button.setAcceptFiles(optionRoot.acceptFiles);\n\t return false;\n\t }\n\t });\n\t }\n\t },\n\t _handleCheckedCallback: function(details) {\n\t var self = this, callbackRetVal = details.callback();\n\t if (qq.isGenericPromise(callbackRetVal)) {\n\t this.log(details.name + \" - waiting for \" + details.name + \" promise to be fulfilled for \" + details.identifier);\n\t return callbackRetVal.then(function(successParam) {\n\t self.log(details.name + \" promise success for \" + details.identifier);\n\t details.onSuccess(successParam);\n\t }, function() {\n\t if (details.onFailure) {\n\t self.log(details.name + \" promise failure for \" + details.identifier);\n\t details.onFailure();\n\t } else {\n\t self.log(details.name + \" promise failure for \" + details.identifier);\n\t }\n\t });\n\t }\n\t if (callbackRetVal !== false) {\n\t details.onSuccess(callbackRetVal);\n\t } else {\n\t if (details.onFailure) {\n\t this.log(details.name + \" - return value was 'false' for \" + details.identifier + \". Invoking failure callback.\");\n\t details.onFailure();\n\t } else {\n\t this.log(details.name + \" - return value was 'false' for \" + details.identifier + \". Will not proceed.\");\n\t }\n\t }\n\t return callbackRetVal;\n\t },\n\t _handleNewFile: function(file, batchId, newFileWrapperList) {\n\t var self = this, uuid = qq.getUniqueId(), size = -1, name = qq.getFilename(file), actualFile = file.blob || file, handler = this._customNewFileHandler ? this._customNewFileHandler : qq.bind(self._handleNewFileGeneric, self);\n\t if (!qq.isInput(actualFile) && actualFile.size >= 0) {\n\t size = actualFile.size;\n\t }\n\t handler(actualFile, name, uuid, size, newFileWrapperList, batchId, this._options.request.uuidName, {\n\t uploadData: self._uploadData,\n\t paramsStore: self._paramsStore,\n\t addFileToHandler: function(id, file) {\n\t self._handler.add(id, file);\n\t self._netUploadedOrQueued++;\n\t self._trackButton(id);\n\t }\n\t });\n\t },\n\t _handleNewFileGeneric: function(file, name, uuid, size, fileList, batchId) {\n\t var id = this._uploadData.addFile({\n\t uuid: uuid,\n\t name: name,\n\t size: size,\n\t batchId: batchId,\n\t file: file\n\t });\n\t this._handler.add(id, file);\n\t this._trackButton(id);\n\t this._netUploadedOrQueued++;\n\t fileList.push({\n\t id: id,\n\t file: file\n\t });\n\t },\n\t _handlePasteSuccess: function(blob, extSuppliedName) {\n\t var extension = blob.type.split(\"/\")[1], name = extSuppliedName;\n\t if (name == null) {\n\t name = this._options.paste.defaultName;\n\t }\n\t name += \".\" + extension;\n\t this.addFiles({\n\t name: name,\n\t blob: blob\n\t });\n\t },\n\t _handleDeleteSuccess: function(id) {\n\t if (this.getUploads({\n\t id: id\n\t }).status !== qq.status.DELETED) {\n\t var name = this.getName(id);\n\t this._netUploadedOrQueued--;\n\t this._netUploaded--;\n\t this._handler.expunge(id);\n\t this._uploadData.setStatus(id, qq.status.DELETED);\n\t this.log(\"Delete request for '\" + name + \"' has succeeded.\");\n\t }\n\t },\n\t _handleDeleteFailed: function(id, xhrOrXdr) {\n\t var name = this.getName(id);\n\t this._uploadData.setStatus(id, qq.status.DELETE_FAILED);\n\t this.log(\"Delete request for '\" + name + \"' has failed.\", \"error\");\n\t if (!xhrOrXdr || xhrOrXdr.withCredentials === undefined) {\n\t this._options.callbacks.onError(id, name, \"Delete request failed\", xhrOrXdr);\n\t } else {\n\t this._options.callbacks.onError(id, name, \"Delete request failed with response code \" + xhrOrXdr.status, xhrOrXdr);\n\t }\n\t },\n\t _initExtraButton: function(spec) {\n\t var button = this._createUploadButton({\n\t accept: spec.validation.acceptFiles,\n\t allowedExtensions: spec.validation.allowedExtensions,\n\t element: spec.element,\n\t folders: spec.folders,\n\t multiple: spec.multiple,\n\t title: spec.fileInputTitle\n\t });\n\t this._extraButtonSpecs[button.getButtonId()] = spec;\n\t },\n\t _initFormSupportAndParams: function() {\n\t this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this));\n\t if (this._formSupport && this._formSupport.attachedToForm) {\n\t this._paramsStore = this._createStore(this._options.request.params, this._formSupport.getFormInputsAsObject);\n\t this._options.autoUpload = this._formSupport.newAutoUpload;\n\t if (this._formSupport.newEndpoint) {\n\t this._options.request.endpoint = this._formSupport.newEndpoint;\n\t }\n\t } else {\n\t this._paramsStore = this._createStore(this._options.request.params);\n\t }\n\t },\n\t _isDeletePossible: function() {\n\t if (!qq.DeleteFileAjaxRequester || !this._options.deleteFile.enabled) {\n\t return false;\n\t }\n\t if (this._options.cors.expected) {\n\t if (qq.supportedFeatures.deleteFileCorsXhr) {\n\t return true;\n\t }\n\t if (qq.supportedFeatures.deleteFileCorsXdr && this._options.cors.allowXdr) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t return true;\n\t },\n\t _isAllowedExtension: function(allowed, fileName) {\n\t var valid = false;\n\t if (!allowed.length) {\n\t return true;\n\t }\n\t qq.each(allowed, function(idx, allowedExt) {\n\t if (qq.isString(allowedExt)) {\n\t var extRegex = new RegExp(\"\\\\.\" + allowedExt + \"$\", \"i\");\n\t if (fileName.match(extRegex) != null) {\n\t valid = true;\n\t return false;\n\t }\n\t }\n\t });\n\t return valid;\n\t },\n\t _itemError: function(code, maybeNameOrNames, item) {\n\t var message = this._options.messages[code], allowedExtensions = [], names = [].concat(maybeNameOrNames), name = names[0], buttonId = this._getButtonId(item), validationBase = this._getValidationBase(buttonId), extensionsForMessage, placeholderMatch;\n\t function r(name, replacement) {\n\t message = message.replace(name, replacement);\n\t }\n\t qq.each(validationBase.allowedExtensions, function(idx, allowedExtension) {\n\t if (qq.isString(allowedExtension)) {\n\t allowedExtensions.push(allowedExtension);\n\t }\n\t });\n\t extensionsForMessage = allowedExtensions.join(\", \").toLowerCase();\n\t r(\"{file}\", this._options.formatFileName(name));\n\t r(\"{extensions}\", extensionsForMessage);\n\t r(\"{sizeLimit}\", this._formatSize(validationBase.sizeLimit));\n\t r(\"{minSizeLimit}\", this._formatSize(validationBase.minSizeLimit));\n\t placeholderMatch = message.match(/(\\{\\w+\\})/g);\n\t if (placeholderMatch !== null) {\n\t qq.each(placeholderMatch, function(idx, placeholder) {\n\t r(placeholder, names[idx]);\n\t });\n\t }\n\t this._options.callbacks.onError(null, name, message, undefined);\n\t return message;\n\t },\n\t _manualRetry: function(id, callback) {\n\t if (this._onBeforeManualRetry(id)) {\n\t this._netUploadedOrQueued++;\n\t this._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);\n\t if (callback) {\n\t callback(id);\n\t } else {\n\t this._handler.retry(id);\n\t }\n\t return true;\n\t }\n\t },\n\t _maybeAllComplete: function(id, status) {\n\t var self = this, notFinished = this._getNotFinished();\n\t if (status === qq.status.UPLOAD_SUCCESSFUL) {\n\t this._succeededSinceLastAllComplete.push(id);\n\t } else if (status === qq.status.UPLOAD_FAILED) {\n\t this._failedSinceLastAllComplete.push(id);\n\t }\n\t if (notFinished === 0 && (this._succeededSinceLastAllComplete.length || this._failedSinceLastAllComplete.length)) {\n\t setTimeout(function() {\n\t self._onAllComplete(self._succeededSinceLastAllComplete, self._failedSinceLastAllComplete);\n\t }, 0);\n\t }\n\t },\n\t _maybeHandleIos8SafariWorkaround: function() {\n\t var self = this;\n\t if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) {\n\t setTimeout(function() {\n\t window.alert(self._options.messages.unsupportedBrowserIos8Safari);\n\t }, 0);\n\t throw new qq.Error(this._options.messages.unsupportedBrowserIos8Safari);\n\t }\n\t },\n\t _maybeParseAndSendUploadError: function(id, name, response, xhr) {\n\t if (!response.success) {\n\t if (xhr && xhr.status !== 200 && !response.error) {\n\t this._options.callbacks.onError(id, name, \"XHR returned response code \" + xhr.status, xhr);\n\t } else {\n\t var errorReason = response.error ? response.error : this._options.text.defaultResponseError;\n\t this._options.callbacks.onError(id, name, errorReason, xhr);\n\t }\n\t }\n\t },\n\t _maybeProcessNextItemAfterOnValidateCallback: function(validItem, items, index, params, endpoint) {\n\t var self = this;\n\t if (items.length > index) {\n\t if (validItem || !this._options.validation.stopOnFirstInvalidFile) {\n\t setTimeout(function() {\n\t var validationDescriptor = self._getValidationDescriptor(items[index]), buttonId = self._getButtonId(items[index].file), button = self._getButton(buttonId);\n\t self._handleCheckedCallback({\n\t name: \"onValidate\",\n\t callback: qq.bind(self._options.callbacks.onValidate, self, validationDescriptor, button),\n\t onSuccess: qq.bind(self._onValidateCallbackSuccess, self, items, index, params, endpoint),\n\t onFailure: qq.bind(self._onValidateCallbackFailure, self, items, index, params, endpoint),\n\t identifier: \"Item '\" + validationDescriptor.name + \"', size: \" + validationDescriptor.size\n\t });\n\t }, 0);\n\t } else if (!validItem) {\n\t for (;index < items.length; index++) {\n\t self._fileOrBlobRejected(items[index].id);\n\t }\n\t }\n\t }\n\t },\n\t _onAllComplete: function(successful, failed) {\n\t this._totalProgress && this._totalProgress.onAllComplete(successful, failed, this._preventRetries);\n\t this._options.callbacks.onAllComplete(qq.extend([], successful), qq.extend([], failed));\n\t this._succeededSinceLastAllComplete = [];\n\t this._failedSinceLastAllComplete = [];\n\t },\n\t _onAutoRetry: function(id, name, responseJSON, xhr, callback) {\n\t var self = this;\n\t self._preventRetries[id] = responseJSON[self._options.retry.preventRetryResponseProperty];\n\t if (self._shouldAutoRetry(id)) {\n\t var retryWaitPeriod = self._options.retry.autoAttemptDelay * 1e3;\n\t self._maybeParseAndSendUploadError.apply(self, arguments);\n\t self._options.callbacks.onAutoRetry(id, name, self._autoRetries[id]);\n\t self._onBeforeAutoRetry(id, name);\n\t self._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);\n\t self._retryTimeouts[id] = setTimeout(function() {\n\t self.log(\"Starting retry for \" + name + \"...\");\n\t if (callback) {\n\t callback(id);\n\t } else {\n\t self._handler.retry(id);\n\t }\n\t }, retryWaitPeriod);\n\t return true;\n\t }\n\t },\n\t _onBeforeAutoRetry: function(id, name) {\n\t this.log(\"Waiting \" + this._options.retry.autoAttemptDelay + \" seconds before retrying \" + name + \"...\");\n\t },\n\t _onBeforeManualRetry: function(id) {\n\t var itemLimit = this._currentItemLimit, fileName;\n\t if (this._preventRetries[id]) {\n\t this.log(\"Retries are forbidden for id \" + id, \"warn\");\n\t return false;\n\t } else if (this._handler.isValid(id)) {\n\t fileName = this.getName(id);\n\t if (this._options.callbacks.onManualRetry(id, fileName) === false) {\n\t return false;\n\t }\n\t if (itemLimit > 0 && this._netUploadedOrQueued + 1 > itemLimit) {\n\t this._itemError(\"retryFailTooManyItems\");\n\t return false;\n\t }\n\t this.log(\"Retrying upload for '\" + fileName + \"' (id: \" + id + \")...\");\n\t return true;\n\t } else {\n\t this.log(\"'\" + id + \"' is not a valid file ID\", \"error\");\n\t return false;\n\t }\n\t },\n\t _onCancel: function(id, name) {\n\t this._netUploadedOrQueued--;\n\t clearTimeout(this._retryTimeouts[id]);\n\t var storedItemIndex = qq.indexOf(this._storedIds, id);\n\t if (!this._options.autoUpload && storedItemIndex >= 0) {\n\t this._storedIds.splice(storedItemIndex, 1);\n\t }\n\t this._uploadData.setStatus(id, qq.status.CANCELED);\n\t },\n\t _onComplete: function(id, name, result, xhr) {\n\t if (!result.success) {\n\t this._netUploadedOrQueued--;\n\t this._uploadData.setStatus(id, qq.status.UPLOAD_FAILED);\n\t if (result[this._options.retry.preventRetryResponseProperty] === true) {\n\t this._preventRetries[id] = true;\n\t }\n\t } else {\n\t if (result.thumbnailUrl) {\n\t this._thumbnailUrls[id] = result.thumbnailUrl;\n\t }\n\t this._netUploaded++;\n\t this._uploadData.setStatus(id, qq.status.UPLOAD_SUCCESSFUL);\n\t }\n\t this._maybeParseAndSendUploadError(id, name, result, xhr);\n\t return result.success ? true : false;\n\t },\n\t _onDelete: function(id) {\n\t this._uploadData.setStatus(id, qq.status.DELETING);\n\t },\n\t _onDeleteComplete: function(id, xhrOrXdr, isError) {\n\t var name = this.getName(id);\n\t if (isError) {\n\t this._handleDeleteFailed(id, xhrOrXdr);\n\t } else {\n\t this._handleDeleteSuccess(id);\n\t }\n\t },\n\t _onInputChange: function(input) {\n\t var fileIndex;\n\t if (qq.supportedFeatures.ajaxUploading) {\n\t for (fileIndex = 0; fileIndex < input.files.length; fileIndex++) {\n\t this._annotateWithButtonId(input.files[fileIndex], input);\n\t }\n\t this.addFiles(input.files);\n\t } else if (input.value.length > 0) {\n\t this.addFiles(input);\n\t }\n\t qq.each(this._buttons, function(idx, button) {\n\t button.reset();\n\t });\n\t },\n\t _onProgress: function(id, name, loaded, total) {\n\t this._totalProgress && this._totalProgress.onIndividualProgress(id, loaded, total);\n\t },\n\t _onSubmit: function(id, name) {},\n\t _onSubmitCallbackSuccess: function(id, name) {\n\t this._onSubmit.apply(this, arguments);\n\t this._uploadData.setStatus(id, qq.status.SUBMITTED);\n\t this._onSubmitted.apply(this, arguments);\n\t if (this._options.autoUpload) {\n\t this._options.callbacks.onSubmitted.apply(this, arguments);\n\t this._uploadFile(id);\n\t } else {\n\t this._storeForLater(id);\n\t this._options.callbacks.onSubmitted.apply(this, arguments);\n\t }\n\t },\n\t _onSubmitDelete: function(id, onSuccessCallback, additionalMandatedParams) {\n\t var uuid = this.getUuid(id), adjustedOnSuccessCallback;\n\t if (onSuccessCallback) {\n\t adjustedOnSuccessCallback = qq.bind(onSuccessCallback, this, id, uuid, additionalMandatedParams);\n\t }\n\t if (this._isDeletePossible()) {\n\t this._handleCheckedCallback({\n\t name: \"onSubmitDelete\",\n\t callback: qq.bind(this._options.callbacks.onSubmitDelete, this, id),\n\t onSuccess: adjustedOnSuccessCallback || qq.bind(this._deleteHandler.sendDelete, this, id, uuid, additionalMandatedParams),\n\t identifier: id\n\t });\n\t return true;\n\t } else {\n\t this.log(\"Delete request ignored for ID \" + id + \", delete feature is disabled or request not possible \" + \"due to CORS on a user agent that does not support pre-flighting.\", \"warn\");\n\t return false;\n\t }\n\t },\n\t _onSubmitted: function(id) {},\n\t _onTotalProgress: function(loaded, total) {\n\t this._options.callbacks.onTotalProgress(loaded, total);\n\t },\n\t _onUploadPrep: function(id) {},\n\t _onUpload: function(id, name) {\n\t this._uploadData.setStatus(id, qq.status.UPLOADING);\n\t },\n\t _onUploadChunk: function(id, chunkData) {},\n\t _onUploadChunkSuccess: function(id, chunkData) {\n\t if (!this._preventRetries[id] && this._options.retry.enableAuto) {\n\t this._autoRetries[id] = 0;\n\t }\n\t },\n\t _onUploadStatusChange: function(id, oldStatus, newStatus) {\n\t if (newStatus === qq.status.PAUSED) {\n\t clearTimeout(this._retryTimeouts[id]);\n\t }\n\t },\n\t _onValidateBatchCallbackFailure: function(fileWrappers) {\n\t var self = this;\n\t qq.each(fileWrappers, function(idx, fileWrapper) {\n\t self._fileOrBlobRejected(fileWrapper.id);\n\t });\n\t },\n\t _onValidateBatchCallbackSuccess: function(validationDescriptors, items, params, endpoint, button) {\n\t var errorMessage, itemLimit = this._currentItemLimit, proposedNetFilesUploadedOrQueued = this._netUploadedOrQueued;\n\t if (itemLimit === 0 || proposedNetFilesUploadedOrQueued <= itemLimit) {\n\t if (items.length > 0) {\n\t this._handleCheckedCallback({\n\t name: \"onValidate\",\n\t callback: qq.bind(this._options.callbacks.onValidate, this, validationDescriptors[0], button),\n\t onSuccess: qq.bind(this._onValidateCallbackSuccess, this, items, 0, params, endpoint),\n\t onFailure: qq.bind(this._onValidateCallbackFailure, this, items, 0, params, endpoint),\n\t identifier: \"Item '\" + items[0].file.name + \"', size: \" + items[0].file.size\n\t });\n\t } else {\n\t this._itemError(\"noFilesError\");\n\t }\n\t } else {\n\t this._onValidateBatchCallbackFailure(items);\n\t errorMessage = this._options.messages.tooManyItemsError.replace(/\\{netItems\\}/g, proposedNetFilesUploadedOrQueued).replace(/\\{itemLimit\\}/g, itemLimit);\n\t this._batchError(errorMessage);\n\t }\n\t },\n\t _onValidateCallbackFailure: function(items, index, params, endpoint) {\n\t var nextIndex = index + 1;\n\t this._fileOrBlobRejected(items[index].id, items[index].file.name);\n\t this._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);\n\t },\n\t _onValidateCallbackSuccess: function(items, index, params, endpoint) {\n\t var self = this, nextIndex = index + 1, validationDescriptor = this._getValidationDescriptor(items[index]);\n\t this._validateFileOrBlobData(items[index], validationDescriptor).then(function() {\n\t self._upload(items[index].id, params, endpoint);\n\t self._maybeProcessNextItemAfterOnValidateCallback(true, items, nextIndex, params, endpoint);\n\t }, function() {\n\t self._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);\n\t });\n\t },\n\t _prepareItemsForUpload: function(items, params, endpoint) {\n\t if (items.length === 0) {\n\t this._itemError(\"noFilesError\");\n\t return;\n\t }\n\t var validationDescriptors = this._getValidationDescriptors(items), buttonId = this._getButtonId(items[0].file), button = this._getButton(buttonId);\n\t this._handleCheckedCallback({\n\t name: \"onValidateBatch\",\n\t callback: qq.bind(this._options.callbacks.onValidateBatch, this, validationDescriptors, button),\n\t onSuccess: qq.bind(this._onValidateBatchCallbackSuccess, this, validationDescriptors, items, params, endpoint, button),\n\t onFailure: qq.bind(this._onValidateBatchCallbackFailure, this, items),\n\t identifier: \"batch validation\"\n\t });\n\t },\n\t _preventLeaveInProgress: function() {\n\t var self = this;\n\t this._disposeSupport.attach(window, \"beforeunload\", function(e) {\n\t if (self.getInProgress()) {\n\t e = e || window.event;\n\t e.returnValue = self._options.messages.onLeave;\n\t return self._options.messages.onLeave;\n\t }\n\t });\n\t },\n\t _refreshSessionData: function() {\n\t var self = this, options = this._options.session;\n\t if (qq.Session && this._options.session.endpoint != null) {\n\t if (!this._session) {\n\t qq.extend(options, {\n\t cors: this._options.cors\n\t });\n\t options.log = qq.bind(this.log, this);\n\t options.addFileRecord = qq.bind(this._addCannedFile, this);\n\t this._session = new qq.Session(options);\n\t }\n\t setTimeout(function() {\n\t self._session.refresh().then(function(response, xhrOrXdr) {\n\t self._sessionRequestComplete();\n\t self._options.callbacks.onSessionRequestComplete(response, true, xhrOrXdr);\n\t }, function(response, xhrOrXdr) {\n\t self._options.callbacks.onSessionRequestComplete(response, false, xhrOrXdr);\n\t });\n\t }, 0);\n\t }\n\t },\n\t _sessionRequestComplete: function() {},\n\t _setSize: function(id, newSize) {\n\t this._uploadData.updateSize(id, newSize);\n\t this._totalProgress && this._totalProgress.onNewSize(id);\n\t },\n\t _shouldAutoRetry: function(id) {\n\t var uploadData = this._uploadData.retrieve({\n\t id: id\n\t });\n\t if (!this._preventRetries[id] && this._options.retry.enableAuto && uploadData.status !== qq.status.PAUSED) {\n\t if (this._autoRetries[id] === undefined) {\n\t this._autoRetries[id] = 0;\n\t }\n\t if (this._autoRetries[id] < this._options.retry.maxAutoAttempts) {\n\t this._autoRetries[id] += 1;\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\t _storeForLater: function(id) {\n\t this._storedIds.push(id);\n\t },\n\t _trackButton: function(id) {\n\t var buttonId;\n\t if (qq.supportedFeatures.ajaxUploading) {\n\t buttonId = this._handler.getFile(id).qqButtonId;\n\t } else {\n\t buttonId = this._getButtonId(this._handler.getInput(id));\n\t }\n\t if (buttonId) {\n\t this._buttonIdsForFileIds[id] = buttonId;\n\t }\n\t },\n\t _updateFormSupportAndParams: function(formElementOrId) {\n\t this._options.form.element = formElementOrId;\n\t this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this));\n\t if (this._formSupport && this._formSupport.attachedToForm) {\n\t this._paramsStore.addReadOnly(null, this._formSupport.getFormInputsAsObject);\n\t this._options.autoUpload = this._formSupport.newAutoUpload;\n\t if (this._formSupport.newEndpoint) {\n\t this.setEndpoint(this._formSupport.newEndpoint);\n\t }\n\t }\n\t },\n\t _upload: function(id, params, endpoint) {\n\t var name = this.getName(id);\n\t if (params) {\n\t this.setParams(params, id);\n\t }\n\t if (endpoint) {\n\t this.setEndpoint(endpoint, id);\n\t }\n\t this._handleCheckedCallback({\n\t name: \"onSubmit\",\n\t callback: qq.bind(this._options.callbacks.onSubmit, this, id, name),\n\t onSuccess: qq.bind(this._onSubmitCallbackSuccess, this, id, name),\n\t onFailure: qq.bind(this._fileOrBlobRejected, this, id, name),\n\t identifier: id\n\t });\n\t },\n\t _uploadFile: function(id) {\n\t if (!this._handler.upload(id)) {\n\t this._uploadData.setStatus(id, qq.status.QUEUED);\n\t }\n\t },\n\t _uploadStoredFiles: function() {\n\t var idToUpload, stillSubmitting, self = this;\n\t while (this._storedIds.length) {\n\t idToUpload = this._storedIds.shift();\n\t this._uploadFile(idToUpload);\n\t }\n\t stillSubmitting = this.getUploads({\n\t status: qq.status.SUBMITTING\n\t }).length;\n\t if (stillSubmitting) {\n\t qq.log(\"Still waiting for \" + stillSubmitting + \" files to clear submit queue. Will re-parse stored IDs array shortly.\");\n\t setTimeout(function() {\n\t self._uploadStoredFiles();\n\t }, 1e3);\n\t }\n\t },\n\t _validateFileOrBlobData: function(fileWrapper, validationDescriptor) {\n\t var self = this, file = function() {\n\t if (fileWrapper.file instanceof qq.BlobProxy) {\n\t return fileWrapper.file.referenceBlob;\n\t }\n\t return fileWrapper.file;\n\t }(), name = validationDescriptor.name, size = validationDescriptor.size, buttonId = this._getButtonId(fileWrapper.file), validationBase = this._getValidationBase(buttonId), validityChecker = new qq.Promise();\n\t validityChecker.then(function() {}, function() {\n\t self._fileOrBlobRejected(fileWrapper.id, name);\n\t });\n\t if (qq.isFileOrInput(file) && !this._isAllowedExtension(validationBase.allowedExtensions, name)) {\n\t this._itemError(\"typeError\", name, file);\n\t return validityChecker.failure();\n\t }\n\t if (!this._options.validation.allowEmpty && size === 0) {\n\t this._itemError(\"emptyError\", name, file);\n\t return validityChecker.failure();\n\t }\n\t if (size > 0 && validationBase.sizeLimit && size > validationBase.sizeLimit) {\n\t this._itemError(\"sizeError\", name, file);\n\t return validityChecker.failure();\n\t }\n\t if (size > 0 && size < validationBase.minSizeLimit) {\n\t this._itemError(\"minSizeError\", name, file);\n\t return validityChecker.failure();\n\t }\n\t if (qq.ImageValidation && qq.supportedFeatures.imagePreviews && qq.isFile(file)) {\n\t new qq.ImageValidation(file, qq.bind(self.log, self)).validate(validationBase.image).then(validityChecker.success, function(errorCode) {\n\t self._itemError(errorCode + \"ImageError\", name, file);\n\t validityChecker.failure();\n\t });\n\t } else {\n\t validityChecker.success();\n\t }\n\t return validityChecker;\n\t },\n\t _wrapCallbacks: function() {\n\t var self, safeCallback, prop;\n\t self = this;\n\t safeCallback = function(name, callback, args) {\n\t var errorMsg;\n\t try {\n\t return callback.apply(self, args);\n\t } catch (exception) {\n\t errorMsg = exception.message || exception.toString();\n\t self.log(\"Caught exception in '\" + name + \"' callback - \" + errorMsg, \"error\");\n\t }\n\t };\n\t for (prop in this._options.callbacks) {\n\t (function() {\n\t var callbackName, callbackFunc;\n\t callbackName = prop;\n\t callbackFunc = self._options.callbacks[callbackName];\n\t self._options.callbacks[callbackName] = function() {\n\t return safeCallback(callbackName, callbackFunc, arguments);\n\t };\n\t })();\n\t }\n\t }\n\t };\n\t })();\n\t (function() {\n\t \"use strict\";\n\t qq.FineUploaderBasic = function(o) {\n\t var self = this;\n\t this._options = {\n\t debug: false,\n\t button: null,\n\t multiple: true,\n\t maxConnections: 3,\n\t disableCancelForFormUploads: false,\n\t autoUpload: true,\n\t warnBeforeUnload: true,\n\t request: {\n\t customHeaders: {},\n\t endpoint: \"/server/upload\",\n\t filenameParam: \"qqfilename\",\n\t forceMultipart: true,\n\t inputName: \"qqfile\",\n\t method: \"POST\",\n\t omitDefaultParams: false,\n\t params: {},\n\t paramsInBody: true,\n\t requireSuccessJson: true,\n\t totalFileSizeName: \"qqtotalfilesize\",\n\t uuidName: \"qquuid\"\n\t },\n\t validation: {\n\t allowedExtensions: [],\n\t sizeLimit: 0,\n\t minSizeLimit: 0,\n\t itemLimit: 0,\n\t stopOnFirstInvalidFile: true,\n\t acceptFiles: null,\n\t image: {\n\t maxHeight: 0,\n\t maxWidth: 0,\n\t minHeight: 0,\n\t minWidth: 0\n\t },\n\t allowEmpty: false\n\t },\n\t callbacks: {\n\t onSubmit: function(id, name) {},\n\t onSubmitted: function(id, name) {},\n\t onComplete: function(id, name, responseJSON, maybeXhr) {},\n\t onAllComplete: function(successful, failed) {},\n\t onCancel: function(id, name) {},\n\t onUpload: function(id, name) {},\n\t onUploadChunk: function(id, name, chunkData) {},\n\t onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr) {},\n\t onResume: function(id, fileName, chunkData, customResumeData) {},\n\t onProgress: function(id, name, loaded, total) {},\n\t onTotalProgress: function(loaded, total) {},\n\t onError: function(id, name, reason, maybeXhrOrXdr) {},\n\t onAutoRetry: function(id, name, attemptNumber) {},\n\t onManualRetry: function(id, name) {},\n\t onValidateBatch: function(fileOrBlobData) {},\n\t onValidate: function(fileOrBlobData) {},\n\t onSubmitDelete: function(id) {},\n\t onDelete: function(id) {},\n\t onDeleteComplete: function(id, xhrOrXdr, isError) {},\n\t onPasteReceived: function(blob) {},\n\t onStatusChange: function(id, oldStatus, newStatus) {},\n\t onSessionRequestComplete: function(response, success, xhrOrXdr) {}\n\t },\n\t messages: {\n\t typeError: \"{file} has an invalid extension. Valid extension(s): {extensions}.\",\n\t sizeError: \"{file} is too large, maximum file size is {sizeLimit}.\",\n\t minSizeError: \"{file} is too small, minimum file size is {minSizeLimit}.\",\n\t emptyError: \"{file} is empty, please select files again without it.\",\n\t noFilesError: \"No files to upload.\",\n\t tooManyItemsError: \"Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.\",\n\t maxHeightImageError: \"Image is too tall.\",\n\t maxWidthImageError: \"Image is too wide.\",\n\t minHeightImageError: \"Image is not tall enough.\",\n\t minWidthImageError: \"Image is not wide enough.\",\n\t retryFailTooManyItems: \"Retry failed - you have reached your file limit.\",\n\t onLeave: \"The files are being uploaded, if you leave now the upload will be canceled.\",\n\t unsupportedBrowserIos8Safari: \"Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues.\"\n\t },\n\t retry: {\n\t enableAuto: false,\n\t maxAutoAttempts: 3,\n\t autoAttemptDelay: 5,\n\t preventRetryResponseProperty: \"preventRetry\"\n\t },\n\t classes: {\n\t buttonHover: \"qq-upload-button-hover\",\n\t buttonFocus: \"qq-upload-button-focus\"\n\t },\n\t chunking: {\n\t enabled: false,\n\t concurrent: {\n\t enabled: false\n\t },\n\t mandatory: false,\n\t paramNames: {\n\t partIndex: \"qqpartindex\",\n\t partByteOffset: \"qqpartbyteoffset\",\n\t chunkSize: \"qqchunksize\",\n\t totalFileSize: \"qqtotalfilesize\",\n\t totalParts: \"qqtotalparts\"\n\t },\n\t partSize: function(id) {\n\t return 2e6;\n\t },\n\t success: {\n\t endpoint: null,\n\t headers: function(id) {\n\t return null;\n\t },\n\t jsonPayload: false,\n\t method: \"POST\",\n\t params: function(id) {\n\t return null;\n\t },\n\t resetOnStatus: []\n\t }\n\t },\n\t resume: {\n\t enabled: false,\n\t recordsExpireIn: 7,\n\t paramNames: {\n\t resuming: \"qqresume\"\n\t },\n\t customKeys: function(fileId) {\n\t return [];\n\t }\n\t },\n\t formatFileName: function(fileOrBlobName) {\n\t return fileOrBlobName;\n\t },\n\t text: {\n\t defaultResponseError: \"Upload failure reason unknown\",\n\t fileInputTitle: \"file input\",\n\t sizeSymbols: [ \"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\" ]\n\t },\n\t deleteFile: {\n\t enabled: false,\n\t method: \"DELETE\",\n\t endpoint: \"/server/upload\",\n\t customHeaders: {},\n\t params: {}\n\t },\n\t cors: {\n\t expected: false,\n\t sendCredentials: false,\n\t allowXdr: false\n\t },\n\t blobs: {\n\t defaultName: \"misc_data\"\n\t },\n\t paste: {\n\t targetElement: null,\n\t defaultName: \"pasted_image\"\n\t },\n\t camera: {\n\t ios: false,\n\t button: null\n\t },\n\t extraButtons: [],\n\t session: {\n\t endpoint: null,\n\t params: {},\n\t customHeaders: {},\n\t refreshOnReset: true\n\t },\n\t form: {\n\t element: \"qq-form\",\n\t autoUpload: false,\n\t interceptSubmit: true\n\t },\n\t scaling: {\n\t customResizer: null,\n\t sendOriginal: true,\n\t orient: true,\n\t defaultType: null,\n\t defaultQuality: 80,\n\t failureText: \"Failed to scale\",\n\t includeExif: false,\n\t sizes: []\n\t },\n\t workarounds: {\n\t iosEmptyVideos: true,\n\t ios8SafariUploads: true,\n\t ios8BrowserCrash: false\n\t }\n\t };\n\t qq.extend(this._options, o, true);\n\t this._buttons = [];\n\t this._extraButtonSpecs = {};\n\t this._buttonIdsForFileIds = [];\n\t this._wrapCallbacks();\n\t this._disposeSupport = new qq.DisposeSupport();\n\t this._storedIds = [];\n\t this._autoRetries = [];\n\t this._retryTimeouts = [];\n\t this._preventRetries = [];\n\t this._thumbnailUrls = [];\n\t this._netUploadedOrQueued = 0;\n\t this._netUploaded = 0;\n\t this._uploadData = this._createUploadDataTracker();\n\t this._initFormSupportAndParams();\n\t this._customHeadersStore = this._createStore(this._options.request.customHeaders);\n\t this._deleteFileCustomHeadersStore = this._createStore(this._options.deleteFile.customHeaders);\n\t this._deleteFileParamsStore = this._createStore(this._options.deleteFile.params);\n\t this._endpointStore = this._createStore(this._options.request.endpoint);\n\t this._deleteFileEndpointStore = this._createStore(this._options.deleteFile.endpoint);\n\t this._handler = this._createUploadHandler();\n\t this._deleteHandler = qq.DeleteFileAjaxRequester && this._createDeleteHandler();\n\t if (this._options.button) {\n\t this._defaultButtonId = this._createUploadButton({\n\t element: this._options.button,\n\t title: this._options.text.fileInputTitle\n\t }).getButtonId();\n\t }\n\t this._generateExtraButtonSpecs();\n\t this._handleCameraAccess();\n\t if (this._options.paste.targetElement) {\n\t if (qq.PasteSupport) {\n\t this._pasteHandler = this._createPasteHandler();\n\t } else {\n\t this.log(\"Paste support module not found\", \"error\");\n\t }\n\t }\n\t this._options.warnBeforeUnload && this._preventLeaveInProgress();\n\t this._imageGenerator = qq.ImageGenerator && new qq.ImageGenerator(qq.bind(this.log, this));\n\t this._refreshSessionData();\n\t this._succeededSinceLastAllComplete = [];\n\t this._failedSinceLastAllComplete = [];\n\t this._scaler = qq.Scaler && new qq.Scaler(this._options.scaling, qq.bind(this.log, this)) || {};\n\t if (this._scaler.enabled) {\n\t this._customNewFileHandler = qq.bind(this._scaler.handleNewFile, this._scaler);\n\t }\n\t if (qq.TotalProgress && qq.supportedFeatures.progressBar) {\n\t this._totalProgress = new qq.TotalProgress(qq.bind(this._onTotalProgress, this), function(id) {\n\t var entry = self._uploadData.retrieve({\n\t id: id\n\t });\n\t return entry && entry.size || 0;\n\t });\n\t }\n\t this._currentItemLimit = this._options.validation.itemLimit;\n\t this._customResumeDataStore = this._createStore();\n\t };\n\t qq.FineUploaderBasic.prototype = qq.basePublicApi;\n\t qq.extend(qq.FineUploaderBasic.prototype, qq.basePrivateApi);\n\t })();\n\t qq.AjaxRequester = function(o) {\n\t \"use strict\";\n\t var log, shouldParamsBeInQueryString, queue = [], requestData = {}, options = {\n\t acceptHeader: null,\n\t validMethods: [ \"PATCH\", \"POST\", \"PUT\" ],\n\t method: \"POST\",\n\t contentType: \"application/x-www-form-urlencoded\",\n\t maxConnections: 3,\n\t customHeaders: {},\n\t endpointStore: {},\n\t paramsStore: {},\n\t mandatedParams: {},\n\t allowXRequestedWithAndCacheControl: true,\n\t successfulResponseCodes: {\n\t DELETE: [ 200, 202, 204 ],\n\t PATCH: [ 200, 201, 202, 203, 204 ],\n\t POST: [ 200, 201, 202, 203, 204 ],\n\t PUT: [ 200, 201, 202, 203, 204 ],\n\t GET: [ 200 ]\n\t },\n\t cors: {\n\t expected: false,\n\t sendCredentials: false\n\t },\n\t log: function(str, level) {},\n\t onSend: function(id) {},\n\t onComplete: function(id, xhrOrXdr, isError) {},\n\t onProgress: null\n\t };\n\t qq.extend(options, o);\n\t log = options.log;\n\t if (qq.indexOf(options.validMethods, options.method) < 0) {\n\t throw new Error(\"'\" + options.method + \"' is not a supported method for this type of request!\");\n\t }\n\t function isSimpleMethod() {\n\t return qq.indexOf([ \"GET\", \"POST\", \"HEAD\" ], options.method) >= 0;\n\t }\n\t function containsNonSimpleHeaders(headers) {\n\t var containsNonSimple = false;\n\t qq.each(containsNonSimple, function(idx, header) {\n\t if (qq.indexOf([ \"Accept\", \"Accept-Language\", \"Content-Language\", \"Content-Type\" ], header) < 0) {\n\t containsNonSimple = true;\n\t return false;\n\t }\n\t });\n\t return containsNonSimple;\n\t }\n\t function isXdr(xhr) {\n\t return options.cors.expected && xhr.withCredentials === undefined;\n\t }\n\t function getCorsAjaxTransport() {\n\t var xhrOrXdr;\n\t if (window.XMLHttpRequest || window.ActiveXObject) {\n\t xhrOrXdr = qq.createXhrInstance();\n\t if (xhrOrXdr.withCredentials === undefined) {\n\t xhrOrXdr = new XDomainRequest();\n\t xhrOrXdr.onload = function() {};\n\t xhrOrXdr.onerror = function() {};\n\t xhrOrXdr.ontimeout = function() {};\n\t xhrOrXdr.onprogress = function() {};\n\t }\n\t }\n\t return xhrOrXdr;\n\t }\n\t function getXhrOrXdr(id, suppliedXhr) {\n\t var xhrOrXdr = requestData[id] && requestData[id].xhr;\n\t if (!xhrOrXdr) {\n\t if (suppliedXhr) {\n\t xhrOrXdr = suppliedXhr;\n\t } else {\n\t if (options.cors.expected) {\n\t xhrOrXdr = getCorsAjaxTransport();\n\t } else {\n\t xhrOrXdr = qq.createXhrInstance();\n\t }\n\t }\n\t requestData[id].xhr = xhrOrXdr;\n\t }\n\t return xhrOrXdr;\n\t }\n\t function dequeue(id) {\n\t var i = qq.indexOf(queue, id), max = options.maxConnections, nextId;\n\t delete requestData[id];\n\t queue.splice(i, 1);\n\t if (queue.length >= max && i < max) {\n\t nextId = queue[max - 1];\n\t sendRequest(nextId);\n\t }\n\t }\n\t function onComplete(id, xdrError) {\n\t var xhr = getXhrOrXdr(id), method = options.method, isError = xdrError === true;\n\t dequeue(id);\n\t if (isError) {\n\t log(method + \" request for \" + id + \" has failed\", \"error\");\n\t } else if (!isXdr(xhr) && !isResponseSuccessful(xhr.status)) {\n\t isError = true;\n\t log(method + \" request for \" + id + \" has failed - response code \" + xhr.status, \"error\");\n\t }\n\t options.onComplete(id, xhr, isError);\n\t }\n\t function getParams(id) {\n\t var onDemandParams = requestData[id].additionalParams, mandatedParams = options.mandatedParams, params;\n\t if (options.paramsStore.get) {\n\t params = options.paramsStore.get(id);\n\t }\n\t if (onDemandParams) {\n\t qq.each(onDemandParams, function(name, val) {\n\t params = params || {};\n\t params[name] = val;\n\t });\n\t }\n\t if (mandatedParams) {\n\t qq.each(mandatedParams, function(name, val) {\n\t params = params || {};\n\t params[name] = val;\n\t });\n\t }\n\t return params;\n\t }\n\t function sendRequest(id, optXhr) {\n\t var xhr = getXhrOrXdr(id, optXhr), method = options.method, params = getParams(id), payload = requestData[id].payload, url;\n\t options.onSend(id);\n\t url = createUrl(id, params, requestData[id].additionalQueryParams);\n\t if (isXdr(xhr)) {\n\t xhr.onload = getXdrLoadHandler(id);\n\t xhr.onerror = getXdrErrorHandler(id);\n\t } else {\n\t xhr.onreadystatechange = getXhrReadyStateChangeHandler(id);\n\t }\n\t registerForUploadProgress(id);\n\t xhr.open(method, url, true);\n\t if (options.cors.expected && options.cors.sendCredentials && !isXdr(xhr)) {\n\t xhr.withCredentials = true;\n\t }\n\t setHeaders(id);\n\t log(\"Sending \" + method + \" request for \" + id);\n\t if (payload) {\n\t xhr.send(payload);\n\t } else if (shouldParamsBeInQueryString || !params) {\n\t xhr.send();\n\t } else if (params && options.contentType && options.contentType.toLowerCase().indexOf(\"application/x-www-form-urlencoded\") >= 0) {\n\t xhr.send(qq.obj2url(params, \"\"));\n\t } else if (params && options.contentType && options.contentType.toLowerCase().indexOf(\"application/json\") >= 0) {\n\t xhr.send(JSON.stringify(params));\n\t } else {\n\t xhr.send(params);\n\t }\n\t return xhr;\n\t }\n\t function createUrl(id, params, additionalQueryParams) {\n\t var endpoint = options.endpointStore.get(id), addToPath = requestData[id].addToPath;\n\t if (addToPath != undefined) {\n\t endpoint += \"/\" + addToPath;\n\t }\n\t if (shouldParamsBeInQueryString && params) {\n\t endpoint = qq.obj2url(params, endpoint);\n\t }\n\t if (additionalQueryParams) {\n\t endpoint = qq.obj2url(additionalQueryParams, endpoint);\n\t }\n\t return endpoint;\n\t }\n\t function getXhrReadyStateChangeHandler(id) {\n\t return function() {\n\t if (getXhrOrXdr(id).readyState === 4) {\n\t onComplete(id);\n\t }\n\t };\n\t }\n\t function registerForUploadProgress(id) {\n\t var onProgress = options.onProgress;\n\t if (onProgress) {\n\t getXhrOrXdr(id).upload.onprogress = function(e) {\n\t if (e.lengthComputable) {\n\t onProgress(id, e.loaded, e.total);\n\t }\n\t };\n\t }\n\t }\n\t function getXdrLoadHandler(id) {\n\t return function() {\n\t onComplete(id);\n\t };\n\t }\n\t function getXdrErrorHandler(id) {\n\t return function() {\n\t onComplete(id, true);\n\t };\n\t }\n\t function setHeaders(id) {\n\t var xhr = getXhrOrXdr(id), customHeaders = options.customHeaders, onDemandHeaders = requestData[id].additionalHeaders || {}, method = options.method, allHeaders = {};\n\t if (!isXdr(xhr)) {\n\t options.acceptHeader && xhr.setRequestHeader(\"Accept\", options.acceptHeader);\n\t if (options.allowXRequestedWithAndCacheControl) {\n\t if (!options.cors.expected || (!isSimpleMethod() || containsNonSimpleHeaders(customHeaders))) {\n\t xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\t xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n\t }\n\t }\n\t if (options.contentType && (method === \"POST\" || method === \"PUT\")) {\n\t xhr.setRequestHeader(\"Content-Type\", options.contentType);\n\t }\n\t qq.extend(allHeaders, qq.isFunction(customHeaders) ? customHeaders(id) : customHeaders);\n\t qq.extend(allHeaders, onDemandHeaders);\n\t qq.each(allHeaders, function(name, val) {\n\t xhr.setRequestHeader(name, val);\n\t });\n\t }\n\t }\n\t function isResponseSuccessful(responseCode) {\n\t return qq.indexOf(options.successfulResponseCodes[options.method], responseCode) >= 0;\n\t }\n\t function prepareToSend(id, optXhr, addToPath, additionalParams, additionalQueryParams, additionalHeaders, payload) {\n\t requestData[id] = {\n\t addToPath: addToPath,\n\t additionalParams: additionalParams,\n\t additionalQueryParams: additionalQueryParams,\n\t additionalHeaders: additionalHeaders,\n\t payload: payload\n\t };\n\t var len = queue.push(id);\n\t if (len <= options.maxConnections) {\n\t return sendRequest(id, optXhr);\n\t }\n\t }\n\t shouldParamsBeInQueryString = options.method === \"GET\" || options.method === \"DELETE\";\n\t qq.extend(this, {\n\t initTransport: function(id) {\n\t var path, params, headers, payload, cacheBuster, additionalQueryParams;\n\t return {\n\t withPath: function(appendToPath) {\n\t path = appendToPath;\n\t return this;\n\t },\n\t withParams: function(additionalParams) {\n\t params = additionalParams;\n\t return this;\n\t },\n\t withQueryParams: function(_additionalQueryParams_) {\n\t additionalQueryParams = _additionalQueryParams_;\n\t return this;\n\t },\n\t withHeaders: function(additionalHeaders) {\n\t headers = additionalHeaders;\n\t return this;\n\t },\n\t withPayload: function(thePayload) {\n\t payload = thePayload;\n\t return this;\n\t },\n\t withCacheBuster: function() {\n\t cacheBuster = true;\n\t return this;\n\t },\n\t send: function(optXhr) {\n\t if (cacheBuster && qq.indexOf([ \"GET\", \"DELETE\" ], options.method) >= 0) {\n\t params.qqtimestamp = new Date().getTime();\n\t }\n\t return prepareToSend(id, optXhr, path, params, additionalQueryParams, headers, payload);\n\t }\n\t };\n\t },\n\t canceled: function(id) {\n\t dequeue(id);\n\t }\n\t });\n\t };\n\t qq.UploadHandler = function(spec) {\n\t \"use strict\";\n\t var proxy = spec.proxy, fileState = {}, onCancel = proxy.onCancel, getName = proxy.getName;\n\t qq.extend(this, {\n\t add: function(id, fileItem) {\n\t fileState[id] = fileItem;\n\t fileState[id].temp = {};\n\t },\n\t cancel: function(id) {\n\t var self = this, cancelFinalizationEffort = new qq.Promise(), onCancelRetVal = onCancel(id, getName(id), cancelFinalizationEffort);\n\t onCancelRetVal.then(function() {\n\t if (self.isValid(id)) {\n\t fileState[id].canceled = true;\n\t self.expunge(id);\n\t }\n\t cancelFinalizationEffort.success();\n\t });\n\t },\n\t expunge: function(id) {\n\t delete fileState[id];\n\t },\n\t getThirdPartyFileId: function(id) {\n\t return fileState[id].key;\n\t },\n\t isValid: function(id) {\n\t return fileState[id] !== undefined;\n\t },\n\t reset: function() {\n\t fileState = {};\n\t },\n\t _getFileState: function(id) {\n\t return fileState[id];\n\t },\n\t _setThirdPartyFileId: function(id, thirdPartyFileId) {\n\t fileState[id].key = thirdPartyFileId;\n\t },\n\t _wasCanceled: function(id) {\n\t return !!fileState[id].canceled;\n\t }\n\t });\n\t };\n\t qq.UploadHandlerController = function(o, namespace) {\n\t \"use strict\";\n\t var controller = this, chunkingPossible = false, concurrentChunkingPossible = false, chunking, preventRetryResponse, log, handler, options = {\n\t paramsStore: {},\n\t maxConnections: 3,\n\t chunking: {\n\t enabled: false,\n\t multiple: {\n\t enabled: false\n\t }\n\t },\n\t log: function(str, level) {},\n\t onProgress: function(id, fileName, loaded, total) {},\n\t onComplete: function(id, fileName, response, xhr) {},\n\t onCancel: function(id, fileName) {},\n\t onUploadPrep: function(id) {},\n\t onUpload: function(id, fileName) {},\n\t onUploadChunk: function(id, fileName, chunkData) {},\n\t onUploadChunkSuccess: function(id, chunkData, response, xhr) {},\n\t onAutoRetry: function(id, fileName, response, xhr) {},\n\t onResume: function(id, fileName, chunkData, customResumeData) {},\n\t onUuidChanged: function(id, newUuid) {},\n\t getName: function(id) {},\n\t setSize: function(id, newSize) {},\n\t isQueued: function(id) {},\n\t getIdsInProxyGroup: function(id) {},\n\t getIdsInBatch: function(id) {},\n\t isInProgress: function(id) {}\n\t }, chunked = {\n\t done: function(id, chunkIdx, response, xhr) {\n\t var chunkData = handler._getChunkData(id, chunkIdx);\n\t handler._getFileState(id).attemptingResume = false;\n\t delete handler._getFileState(id).temp.chunkProgress[chunkIdx];\n\t handler._getFileState(id).loaded += chunkData.size;\n\t options.onUploadChunkSuccess(id, handler._getChunkDataForCallback(chunkData), response, xhr);\n\t },\n\t finalize: function(id) {\n\t var size = options.getSize(id), name = options.getName(id);\n\t log(\"All chunks have been uploaded for \" + id + \" - finalizing....\");\n\t handler.finalizeChunks(id).then(function(response, xhr) {\n\t log(\"Finalize successful for \" + id);\n\t var normaizedResponse = upload.normalizeResponse(response, true);\n\t options.onProgress(id, name, size, size);\n\t handler._maybeDeletePersistedChunkData(id);\n\t upload.cleanup(id, normaizedResponse, xhr);\n\t }, function(response, xhr) {\n\t var normalizedResponse = upload.normalizeResponse(response, false);\n\t log(\"Problem finalizing chunks for file ID \" + id + \" - \" + normalizedResponse.error, \"error\");\n\t if (normalizedResponse.reset || xhr && options.chunking.success.resetOnStatus.indexOf(xhr.status) >= 0) {\n\t chunked.reset(id);\n\t }\n\t if (!options.onAutoRetry(id, name, normalizedResponse, xhr)) {\n\t upload.cleanup(id, normalizedResponse, xhr);\n\t }\n\t });\n\t },\n\t handleFailure: function(chunkIdx, id, response, xhr) {\n\t var name = options.getName(id);\n\t log(\"Chunked upload request failed for \" + id + \", chunk \" + chunkIdx);\n\t handler.clearCachedChunk(id, chunkIdx);\n\t var responseToReport = upload.normalizeResponse(response, false), inProgressIdx;\n\t if (responseToReport.reset) {\n\t chunked.reset(id);\n\t } else {\n\t var inProgressChunksArray = handler._getFileState(id).chunking.inProgress;\n\t inProgressIdx = inProgressChunksArray ? qq.indexOf(inProgressChunksArray, chunkIdx) : -1;\n\t if (inProgressIdx >= 0) {\n\t handler._getFileState(id).chunking.inProgress.splice(inProgressIdx, 1);\n\t handler._getFileState(id).chunking.remaining.unshift(chunkIdx);\n\t }\n\t }\n\t if (!handler._getFileState(id).temp.ignoreFailure) {\n\t if (concurrentChunkingPossible) {\n\t handler._getFileState(id).temp.ignoreFailure = true;\n\t log(qq.format(\"Going to attempt to abort these chunks: {}. These are currently in-progress: {}.\", JSON.stringify(Object.keys(handler._getXhrs(id))), JSON.stringify(handler._getFileState(id).chunking.inProgress)));\n\t qq.each(handler._getXhrs(id), function(ckid, ckXhr) {\n\t log(qq.format(\"Attempting to abort file {}.{}. XHR readyState {}. \", id, ckid, ckXhr.readyState));\n\t ckXhr.abort();\n\t ckXhr._cancelled = true;\n\t });\n\t handler.moveInProgressToRemaining(id);\n\t connectionManager.free(id, true);\n\t }\n\t if (!options.onAutoRetry(id, name, responseToReport, xhr)) {\n\t upload.cleanup(id, responseToReport, xhr);\n\t }\n\t }\n\t },\n\t hasMoreParts: function(id) {\n\t return !!handler._getFileState(id).chunking.remaining.length;\n\t },\n\t nextPart: function(id) {\n\t var nextIdx = handler._getFileState(id).chunking.remaining.shift();\n\t if (nextIdx >= handler._getTotalChunks(id)) {\n\t nextIdx = null;\n\t }\n\t return nextIdx;\n\t },\n\t reset: function(id) {\n\t log(\"Server or callback has ordered chunking effort to be restarted on next attempt for item ID \" + id, \"error\");\n\t handler._maybeDeletePersistedChunkData(id);\n\t handler.reevaluateChunking(id);\n\t handler._getFileState(id).loaded = 0;\n\t handler._getFileState(id).attemptingResume = false;\n\t },\n\t sendNext: function(id) {\n\t var size = options.getSize(id), name = options.getName(id), chunkIdx = chunked.nextPart(id), chunkData = handler._getChunkData(id, chunkIdx), fileState = handler._getFileState(id), resuming = fileState.attemptingResume, inProgressChunks = fileState.chunking.inProgress || [];\n\t if (fileState.loaded == null) {\n\t fileState.loaded = 0;\n\t }\n\t if (resuming && options.onResume(id, name, chunkData, fileState.customResumeData) === false) {\n\t chunked.reset(id);\n\t chunkIdx = chunked.nextPart(id);\n\t chunkData = handler._getChunkData(id, chunkIdx);\n\t resuming = false;\n\t }\n\t if (chunkIdx == null && inProgressChunks.length === 0) {\n\t chunked.finalize(id);\n\t } else {\n\t inProgressChunks.push(chunkIdx);\n\t handler._getFileState(id).chunking.inProgress = inProgressChunks;\n\t if (concurrentChunkingPossible) {\n\t connectionManager.open(id, chunkIdx);\n\t }\n\t if (concurrentChunkingPossible && connectionManager.available() && handler._getFileState(id).chunking.remaining.length) {\n\t chunked.sendNext(id);\n\t }\n\t if (chunkData.blob.size === 0) {\n\t log(qq.format(\"Chunk {} for file {} will not be uploaded, zero sized chunk.\", chunkIdx, id), \"error\");\n\t chunked.handleFailure(chunkIdx, id, \"File is no longer available\", null);\n\t }\n\t var onUploadChunkPromise = options.onUploadChunk(id, name, handler._getChunkDataForCallback(chunkData));\n\t onUploadChunkPromise.then(function(requestOverrides) {\n\t if (!options.isInProgress(id)) {\n\t log(qq.format(\"Not sending chunked upload request for item {}.{} - no longer in progress.\", id, chunkIdx));\n\t } else {\n\t log(qq.format(\"Sending chunked upload request for item {}.{}, bytes {}-{} of {}.\", id, chunkIdx, chunkData.start + 1, chunkData.end, size));\n\t var uploadChunkData = {\n\t chunkIdx: chunkIdx,\n\t id: id,\n\t overrides: requestOverrides,\n\t resuming: resuming\n\t };\n\t handler.uploadChunk(uploadChunkData).then(function success(response, xhr) {\n\t log(\"Chunked upload request succeeded for \" + id + \", chunk \" + chunkIdx);\n\t handler.clearCachedChunk(id, chunkIdx);\n\t var inProgressChunks = handler._getFileState(id).chunking.inProgress || [], responseToReport = upload.normalizeResponse(response, true), inProgressChunkIdx = qq.indexOf(inProgressChunks, chunkIdx);\n\t log(qq.format(\"Chunk {} for file {} uploaded successfully.\", chunkIdx, id));\n\t chunked.done(id, chunkIdx, responseToReport, xhr);\n\t if (inProgressChunkIdx >= 0) {\n\t inProgressChunks.splice(inProgressChunkIdx, 1);\n\t }\n\t handler._maybePersistChunkedState(id);\n\t if (!chunked.hasMoreParts(id) && inProgressChunks.length === 0) {\n\t chunked.finalize(id);\n\t } else if (chunked.hasMoreParts(id)) {\n\t chunked.sendNext(id);\n\t } else {\n\t log(qq.format(\"File ID {} has no more chunks to send and these chunk indexes are still marked as in-progress: {}\", id, JSON.stringify(inProgressChunks)));\n\t }\n\t }, function failure(response, xhr) {\n\t chunked.handleFailure(chunkIdx, id, response, xhr);\n\t }).done(function() {\n\t handler.clearXhr(id, chunkIdx);\n\t });\n\t }\n\t }, function(error) {\n\t chunked.handleFailure(chunkIdx, id, error, null);\n\t });\n\t }\n\t }\n\t }, connectionManager = {\n\t _open: [],\n\t _openChunks: {},\n\t _waiting: [],\n\t available: function() {\n\t var max = options.maxConnections, openChunkEntriesCount = 0, openChunksCount = 0;\n\t qq.each(connectionManager._openChunks, function(fileId, openChunkIndexes) {\n\t openChunkEntriesCount++;\n\t openChunksCount += openChunkIndexes.length;\n\t });\n\t return max - (connectionManager._open.length - openChunkEntriesCount + openChunksCount);\n\t },\n\t free: function(id, dontAllowNext) {\n\t var allowNext = !dontAllowNext, waitingIndex = qq.indexOf(connectionManager._waiting, id), connectionsIndex = qq.indexOf(connectionManager._open, id), nextId;\n\t delete connectionManager._openChunks[id];\n\t if (upload.getProxyOrBlob(id) instanceof qq.BlobProxy) {\n\t log(\"Generated blob upload has ended for \" + id + \", disposing generated blob.\");\n\t delete handler._getFileState(id).file;\n\t }\n\t if (waitingIndex >= 0) {\n\t connectionManager._waiting.splice(waitingIndex, 1);\n\t } else if (allowNext && connectionsIndex >= 0) {\n\t connectionManager._open.splice(connectionsIndex, 1);\n\t nextId = connectionManager._waiting.shift();\n\t if (nextId >= 0) {\n\t connectionManager._open.push(nextId);\n\t upload.start(nextId);\n\t }\n\t }\n\t },\n\t getWaitingOrConnected: function() {\n\t var waitingOrConnected = [];\n\t qq.each(connectionManager._openChunks, function(fileId, chunks) {\n\t if (chunks && chunks.length) {\n\t waitingOrConnected.push(parseInt(fileId));\n\t }\n\t });\n\t qq.each(connectionManager._open, function(idx, fileId) {\n\t if (!connectionManager._openChunks[fileId]) {\n\t waitingOrConnected.push(parseInt(fileId));\n\t }\n\t });\n\t waitingOrConnected = waitingOrConnected.concat(connectionManager._waiting);\n\t return waitingOrConnected;\n\t },\n\t isUsingConnection: function(id) {\n\t return qq.indexOf(connectionManager._open, id) >= 0;\n\t },\n\t open: function(id, chunkIdx) {\n\t if (chunkIdx == null) {\n\t connectionManager._waiting.push(id);\n\t }\n\t if (connectionManager.available()) {\n\t if (chunkIdx == null) {\n\t connectionManager._waiting.pop();\n\t connectionManager._open.push(id);\n\t } else {\n\t (function() {\n\t var openChunksEntry = connectionManager._openChunks[id] || [];\n\t openChunksEntry.push(chunkIdx);\n\t connectionManager._openChunks[id] = openChunksEntry;\n\t })();\n\t }\n\t return true;\n\t }\n\t return false;\n\t },\n\t reset: function() {\n\t connectionManager._waiting = [];\n\t connectionManager._open = [];\n\t }\n\t }, simple = {\n\t send: function(id, name) {\n\t var fileState = handler._getFileState(id);\n\t if (!fileState) {\n\t log(\"Ignoring send request as this upload may have been cancelled, File ID \" + id, \"warn\");\n\t return;\n\t }\n\t fileState.loaded = 0;\n\t log(\"Sending simple upload request for \" + id);\n\t handler.uploadFile(id).then(function(response, optXhr) {\n\t log(\"Simple upload request succeeded for \" + id);\n\t var responseToReport = upload.normalizeResponse(response, true), size = options.getSize(id);\n\t options.onProgress(id, name, size, size);\n\t upload.maybeNewUuid(id, responseToReport);\n\t upload.cleanup(id, responseToReport, optXhr);\n\t }, function(response, optXhr) {\n\t log(\"Simple upload request failed for \" + id);\n\t var responseToReport = upload.normalizeResponse(response, false);\n\t if (!options.onAutoRetry(id, name, responseToReport, optXhr)) {\n\t upload.cleanup(id, responseToReport, optXhr);\n\t }\n\t });\n\t }\n\t }, upload = {\n\t cancel: function(id) {\n\t log(\"Cancelling \" + id);\n\t options.paramsStore.remove(id);\n\t connectionManager.free(id);\n\t },\n\t cleanup: function(id, response, optXhr) {\n\t var name = options.getName(id);\n\t options.onComplete(id, name, response, optXhr);\n\t if (handler._getFileState(id)) {\n\t handler._clearXhrs && handler._clearXhrs(id);\n\t }\n\t connectionManager.free(id);\n\t },\n\t getProxyOrBlob: function(id) {\n\t return handler.getProxy && handler.getProxy(id) || handler.getFile && handler.getFile(id);\n\t },\n\t initHandler: function() {\n\t var handlerType = namespace ? qq[namespace] : qq.traditional, handlerModuleSubtype = qq.supportedFeatures.ajaxUploading ? \"Xhr\" : \"Form\";\n\t handler = new handlerType[handlerModuleSubtype + \"UploadHandler\"](options, {\n\t getCustomResumeData: options.getCustomResumeData,\n\t getDataByUuid: options.getDataByUuid,\n\t getName: options.getName,\n\t getSize: options.getSize,\n\t getUuid: options.getUuid,\n\t log: log,\n\t onCancel: options.onCancel,\n\t onProgress: options.onProgress,\n\t onUuidChanged: options.onUuidChanged,\n\t onFinalizing: function(id) {\n\t options.setStatus(id, qq.status.UPLOAD_FINALIZING);\n\t }\n\t });\n\t if (handler._removeExpiredChunkingRecords) {\n\t handler._removeExpiredChunkingRecords();\n\t }\n\t },\n\t isDeferredEligibleForUpload: function(id) {\n\t return options.isQueued(id);\n\t },\n\t maybeDefer: function(id, blob) {\n\t if (blob && !handler.getFile(id) && blob instanceof qq.BlobProxy) {\n\t options.onUploadPrep(id);\n\t log(\"Attempting to generate a blob on-demand for \" + id);\n\t blob.create().then(function(generatedBlob) {\n\t log(\"Generated an on-demand blob for \" + id);\n\t handler.updateBlob(id, generatedBlob);\n\t options.setSize(id, generatedBlob.size);\n\t handler.reevaluateChunking(id);\n\t upload.maybeSendDeferredFiles(id);\n\t }, function(errorMessage) {\n\t var errorResponse = {};\n\t if (errorMessage) {\n\t errorResponse.error = errorMessage;\n\t }\n\t log(qq.format(\"Failed to generate blob for ID {}. Error message: {}.\", id, errorMessage), \"error\");\n\t options.onComplete(id, options.getName(id), qq.extend(errorResponse, preventRetryResponse), null);\n\t upload.maybeSendDeferredFiles(id);\n\t connectionManager.free(id);\n\t });\n\t } else {\n\t return upload.maybeSendDeferredFiles(id);\n\t }\n\t return false;\n\t },\n\t maybeSendDeferredFiles: function(id) {\n\t var idsInGroup = options.getIdsInProxyGroup(id), uploadedThisId = false;\n\t if (idsInGroup && idsInGroup.length) {\n\t log(\"Maybe ready to upload proxy group file \" + id);\n\t qq.each(idsInGroup, function(idx, idInGroup) {\n\t if (upload.isDeferredEligibleForUpload(idInGroup) && !!handler.getFile(idInGroup)) {\n\t uploadedThisId = idInGroup === id;\n\t upload.now(idInGroup);\n\t } else if (upload.isDeferredEligibleForUpload(idInGroup)) {\n\t return false;\n\t }\n\t });\n\t } else {\n\t uploadedThisId = true;\n\t upload.now(id);\n\t }\n\t return uploadedThisId;\n\t },\n\t maybeNewUuid: function(id, response) {\n\t if (response.newUuid !== undefined) {\n\t options.onUuidChanged(id, response.newUuid);\n\t }\n\t },\n\t normalizeResponse: function(originalResponse, successful) {\n\t var response = originalResponse;\n\t if (!qq.isObject(originalResponse)) {\n\t response = {};\n\t if (qq.isString(originalResponse) && !successful) {\n\t response.error = originalResponse;\n\t }\n\t }\n\t response.success = successful;\n\t return response;\n\t },\n\t now: function(id) {\n\t var name = options.getName(id);\n\t if (!controller.isValid(id)) {\n\t throw new qq.Error(id + \" is not a valid file ID to upload!\");\n\t }\n\t options.onUpload(id, name).then(function(response) {\n\t if (response && response.pause) {\n\t options.setStatus(id, qq.status.PAUSED);\n\t handler.pause(id);\n\t connectionManager.free(id);\n\t } else {\n\t if (chunkingPossible && handler._shouldChunkThisFile(id)) {\n\t chunked.sendNext(id);\n\t } else {\n\t simple.send(id, name);\n\t }\n\t }\n\t }, function(error) {\n\t error = error || {};\n\t log(id + \" upload start aborted due to rejected onUpload Promise - details: \" + error, \"error\");\n\t if (!options.onAutoRetry(id, name, error.responseJSON || {})) {\n\t var response = upload.normalizeResponse(error.responseJSON, false);\n\t upload.cleanup(id, response);\n\t }\n\t });\n\t },\n\t start: function(id) {\n\t var blobToUpload = upload.getProxyOrBlob(id);\n\t if (blobToUpload) {\n\t return upload.maybeDefer(id, blobToUpload);\n\t } else {\n\t upload.now(id);\n\t return true;\n\t }\n\t }\n\t };\n\t qq.extend(this, {\n\t add: function(id, file) {\n\t handler.add.apply(this, arguments);\n\t },\n\t upload: function(id) {\n\t if (connectionManager.open(id)) {\n\t return upload.start(id);\n\t }\n\t return false;\n\t },\n\t retry: function(id) {\n\t if (concurrentChunkingPossible) {\n\t handler._getFileState(id).temp.ignoreFailure = false;\n\t }\n\t if (connectionManager.isUsingConnection(id)) {\n\t return upload.start(id);\n\t } else {\n\t return controller.upload(id);\n\t }\n\t },\n\t cancel: function(id) {\n\t var cancelRetVal = handler.cancel(id);\n\t if (qq.isGenericPromise(cancelRetVal)) {\n\t cancelRetVal.then(function() {\n\t upload.cancel(id);\n\t });\n\t } else if (cancelRetVal !== false) {\n\t upload.cancel(id);\n\t }\n\t },\n\t cancelAll: function() {\n\t var waitingOrConnected = connectionManager.getWaitingOrConnected(), i;\n\t if (waitingOrConnected.length) {\n\t for (i = waitingOrConnected.length - 1; i >= 0; i--) {\n\t controller.cancel(waitingOrConnected[i]);\n\t }\n\t }\n\t connectionManager.reset();\n\t },\n\t getFile: function(id) {\n\t if (handler.getProxy && handler.getProxy(id)) {\n\t return handler.getProxy(id).referenceBlob;\n\t }\n\t return handler.getFile && handler.getFile(id);\n\t },\n\t isProxied: function(id) {\n\t return !!(handler.getProxy && handler.getProxy(id));\n\t },\n\t getInput: function(id) {\n\t if (handler.getInput) {\n\t return handler.getInput(id);\n\t }\n\t },\n\t reset: function() {\n\t log(\"Resetting upload handler\");\n\t controller.cancelAll();\n\t connectionManager.reset();\n\t handler.reset();\n\t },\n\t expunge: function(id) {\n\t if (controller.isValid(id)) {\n\t return handler.expunge(id);\n\t }\n\t },\n\t isValid: function(id) {\n\t return handler.isValid(id);\n\t },\n\t hasResumeRecord: function(id) {\n\t var key = handler.isValid(id) && handler._getLocalStorageId && handler._getLocalStorageId(id);\n\t if (key) {\n\t return !!localStorage.getItem(key);\n\t }\n\t return false;\n\t },\n\t getResumableFilesData: function() {\n\t if (handler.getResumableFilesData) {\n\t return handler.getResumableFilesData();\n\t }\n\t return [];\n\t },\n\t getThirdPartyFileId: function(id) {\n\t if (controller.isValid(id)) {\n\t return handler.getThirdPartyFileId(id);\n\t }\n\t },\n\t pause: function(id) {\n\t if (controller.isResumable(id) && handler.pause && controller.isValid(id) && handler.pause(id)) {\n\t connectionManager.free(id);\n\t handler.moveInProgressToRemaining(id);\n\t return true;\n\t }\n\t return false;\n\t },\n\t isAttemptingResume: function(id) {\n\t return !!handler.isAttemptingResume && handler.isAttemptingResume(id);\n\t },\n\t isResumable: function(id) {\n\t return !!handler.isResumable && handler.isResumable(id);\n\t }\n\t });\n\t qq.extend(options, o);\n\t log = options.log;\n\t chunkingPossible = options.chunking.enabled && qq.supportedFeatures.chunking;\n\t concurrentChunkingPossible = chunkingPossible && options.chunking.concurrent.enabled;\n\t preventRetryResponse = function() {\n\t var response = {};\n\t response[options.preventRetryParam] = true;\n\t return response;\n\t }();\n\t upload.initHandler();\n\t };\n\t qq.WindowReceiveMessage = function(o) {\n\t \"use strict\";\n\t var options = {\n\t log: function(message, level) {}\n\t }, callbackWrapperDetachers = {};\n\t qq.extend(options, o);\n\t qq.extend(this, {\n\t receiveMessage: function(id, callback) {\n\t var onMessageCallbackWrapper = function(event) {\n\t callback(event.data);\n\t };\n\t if (window.postMessage) {\n\t callbackWrapperDetachers[id] = qq(window).attach(\"message\", onMessageCallbackWrapper);\n\t } else {\n\t log(\"iframe message passing not supported in this browser!\", \"error\");\n\t }\n\t },\n\t stopReceivingMessages: function(id) {\n\t if (window.postMessage) {\n\t var detacher = callbackWrapperDetachers[id];\n\t if (detacher) {\n\t detacher();\n\t }\n\t }\n\t }\n\t });\n\t };\n\t qq.FormUploadHandler = function(spec) {\n\t \"use strict\";\n\t var options = spec.options, handler = this, proxy = spec.proxy, formHandlerInstanceId = qq.getUniqueId(), onloadCallbacks = {}, detachLoadEvents = {}, postMessageCallbackTimers = {}, isCors = options.isCors, inputName = options.inputName, getUuid = proxy.getUuid, log = proxy.log, corsMessageReceiver = new qq.WindowReceiveMessage({\n\t log: log\n\t });\n\t function expungeFile(id) {\n\t delete detachLoadEvents[id];\n\t if (isCors) {\n\t clearTimeout(postMessageCallbackTimers[id]);\n\t delete postMessageCallbackTimers[id];\n\t corsMessageReceiver.stopReceivingMessages(id);\n\t }\n\t var iframe = document.getElementById(handler._getIframeName(id));\n\t if (iframe) {\n\t iframe.setAttribute(\"src\", \"javascript:false;\");\n\t qq(iframe).remove();\n\t }\n\t }\n\t function getFileIdForIframeName(iframeName) {\n\t return iframeName.split(\"_\")[0];\n\t }\n\t function initIframeForUpload(name) {\n\t var iframe = qq.toElement(\"<iframe src='javascript:false;' name='\" + name + \"' />\");\n\t iframe.setAttribute(\"id\", name);\n\t iframe.style.display = \"none\";\n\t document.body.appendChild(iframe);\n\t return iframe;\n\t }\n\t function registerPostMessageCallback(iframe, callback) {\n\t var iframeName = iframe.id, fileId = getFileIdForIframeName(iframeName), uuid = getUuid(fileId);\n\t onloadCallbacks[uuid] = callback;\n\t detachLoadEvents[fileId] = qq(iframe).attach(\"load\", function() {\n\t if (handler.getInput(fileId)) {\n\t log(\"Received iframe load event for CORS upload request (iframe name \" + iframeName + \")\");\n\t postMessageCallbackTimers[iframeName] = setTimeout(function() {\n\t var errorMessage = \"No valid message received from loaded iframe for iframe name \" + iframeName;\n\t log(errorMessage, \"error\");\n\t callback({\n\t error: errorMessage\n\t });\n\t }, 1e3);\n\t }\n\t });\n\t corsMessageReceiver.receiveMessage(iframeName, function(message) {\n\t log(\"Received the following window message: '\" + message + \"'\");\n\t var fileId = getFileIdForIframeName(iframeName), response = handler._parseJsonResponse(message), uuid = response.uuid, onloadCallback;\n\t if (uuid && onloadCallbacks[uuid]) {\n\t log(\"Handling response for iframe name \" + iframeName);\n\t clearTimeout(postMessageCallbackTimers[iframeName]);\n\t delete postMessageCallbackTimers[iframeName];\n\t handler._detachLoadEvent(iframeName);\n\t onloadCallback = onloadCallbacks[uuid];\n\t delete onloadCallbacks[uuid];\n\t corsMessageReceiver.stopReceivingMessages(iframeName);\n\t onloadCallback(response);\n\t } else if (!uuid) {\n\t log(\"'\" + message + \"' does not contain a UUID - ignoring.\");\n\t }\n\t });\n\t }\n\t qq.extend(this, new qq.UploadHandler(spec));\n\t qq.override(this, function(super_) {\n\t return {\n\t add: function(id, fileInput) {\n\t super_.add(id, {\n\t input: fileInput\n\t });\n\t fileInput.setAttribute(\"name\", inputName);\n\t if (fileInput.parentNode) {\n\t qq(fileInput).remove();\n\t }\n\t },\n\t expunge: function(id) {\n\t expungeFile(id);\n\t super_.expunge(id);\n\t },\n\t isValid: function(id) {\n\t return super_.isValid(id) && handler._getFileState(id).input !== undefined;\n\t }\n\t };\n\t });\n\t qq.extend(this, {\n\t getInput: function(id) {\n\t return handler._getFileState(id).input;\n\t },\n\t _attachLoadEvent: function(iframe, callback) {\n\t var responseDescriptor;\n\t if (isCors) {\n\t registerPostMessageCallback(iframe, callback);\n\t } else {\n\t detachLoadEvents[iframe.id] = qq(iframe).attach(\"load\", function() {\n\t log(\"Received response for \" + iframe.id);\n\t if (!iframe.parentNode) {\n\t return;\n\t }\n\t try {\n\t if (iframe.contentDocument && iframe.contentDocument.body && iframe.contentDocument.body.innerHTML == \"false\") {\n\t return;\n\t }\n\t } catch (error) {\n\t log(\"Error when attempting to access iframe during handling of upload response (\" + error.message + \")\", \"error\");\n\t responseDescriptor = {\n\t success: false\n\t };\n\t }\n\t callback(responseDescriptor);\n\t });\n\t }\n\t },\n\t _createIframe: function(id) {\n\t var iframeName = handler._getIframeName(id);\n\t return initIframeForUpload(iframeName);\n\t },\n\t _detachLoadEvent: function(id) {\n\t if (detachLoadEvents[id] !== undefined) {\n\t detachLoadEvents[id]();\n\t delete detachLoadEvents[id];\n\t }\n\t },\n\t _getIframeName: function(fileId) {\n\t return fileId + \"_\" + formHandlerInstanceId;\n\t },\n\t _initFormForUpload: function(spec) {\n\t var method = spec.method, endpoint = spec.endpoint, params = spec.params, paramsInBody = spec.paramsInBody, targetName = spec.targetName, form = qq.toElement(\"<form method='\" + method + \"' enctype='multipart/form-data'></form>\"), url = endpoint;\n\t if (paramsInBody) {\n\t qq.obj2Inputs(params, form);\n\t } else {\n\t url = qq.obj2url(params, endpoint);\n\t }\n\t form.setAttribute(\"action\", url);\n\t form.setAttribute(\"target\", targetName);\n\t form.style.display = \"none\";\n\t document.body.appendChild(form);\n\t return form;\n\t },\n\t _parseJsonResponse: function(innerHtmlOrMessage) {\n\t var response = {};\n\t try {\n\t response = qq.parseJson(innerHtmlOrMessage);\n\t } catch (error) {\n\t log(\"Error when attempting to parse iframe upload response (\" + error.message + \")\", \"error\");\n\t }\n\t return response;\n\t }\n\t });\n\t };\n\t qq.XhrUploadHandler = function(spec) {\n\t \"use strict\";\n\t var handler = this, namespace = spec.options.namespace, proxy = spec.proxy, chunking = spec.options.chunking, getChunkSize = function(id) {\n\t var fileState = handler._getFileState(id);\n\t if (fileState.chunkSize) {\n\t return fileState.chunkSize;\n\t } else {\n\t var chunkSize = chunking.partSize;\n\t if (qq.isFunction(chunkSize)) {\n\t chunkSize = chunkSize(id, getSize(id));\n\t }\n\t fileState.chunkSize = chunkSize;\n\t return chunkSize;\n\t }\n\t }, resume = spec.options.resume, chunkFiles = chunking && spec.options.chunking.enabled && qq.supportedFeatures.chunking, resumeEnabled = resume && spec.options.resume.enabled && chunkFiles && qq.supportedFeatures.resume, getName = proxy.getName, getSize = proxy.getSize, getUuid = proxy.getUuid, getEndpoint = proxy.getEndpoint, getDataByUuid = proxy.getDataByUuid, onUuidChanged = proxy.onUuidChanged, onProgress = proxy.onProgress, log = proxy.log, getCustomResumeData = proxy.getCustomResumeData;\n\t function abort(id) {\n\t qq.each(handler._getXhrs(id), function(xhrId, xhr) {\n\t var ajaxRequester = handler._getAjaxRequester(id, xhrId);\n\t xhr.onreadystatechange = null;\n\t xhr.upload.onprogress = null;\n\t xhr.abort();\n\t ajaxRequester && ajaxRequester.canceled && ajaxRequester.canceled(id);\n\t });\n\t }\n\t qq.extend(this, new qq.UploadHandler(spec));\n\t qq.override(this, function(super_) {\n\t return {\n\t add: function(id, blobOrProxy) {\n\t if (qq.isFile(blobOrProxy) || qq.isBlob(blobOrProxy)) {\n\t super_.add(id, {\n\t file: blobOrProxy\n\t });\n\t } else if (blobOrProxy instanceof qq.BlobProxy) {\n\t super_.add(id, {\n\t proxy: blobOrProxy\n\t });\n\t } else {\n\t throw new Error(\"Passed obj is not a File, Blob, or proxy\");\n\t }\n\t handler._initTempState(id);\n\t resumeEnabled && handler._maybePrepareForResume(id);\n\t },\n\t expunge: function(id) {\n\t abort(id);\n\t handler._maybeDeletePersistedChunkData(id);\n\t handler._clearXhrs(id);\n\t super_.expunge(id);\n\t }\n\t };\n\t });\n\t qq.extend(this, {\n\t clearCachedChunk: function(id, chunkIdx) {\n\t var fileState = handler._getFileState(id);\n\t if (fileState) {\n\t delete fileState.temp.cachedChunks[chunkIdx];\n\t }\n\t },\n\t clearXhr: function(id, chunkIdx) {\n\t var tempState = handler._getFileState(id).temp;\n\t if (tempState.xhrs) {\n\t delete tempState.xhrs[chunkIdx];\n\t }\n\t if (tempState.ajaxRequesters) {\n\t delete tempState.ajaxRequesters[chunkIdx];\n\t }\n\t },\n\t finalizeChunks: function(id, responseParser) {\n\t var lastChunkIdx = handler._getTotalChunks(id) - 1, xhr = handler._getXhr(id, lastChunkIdx);\n\t if (responseParser) {\n\t return new qq.Promise().success(responseParser(xhr), xhr);\n\t }\n\t return new qq.Promise().success({}, xhr);\n\t },\n\t getFile: function(id) {\n\t return handler.isValid(id) && handler._getFileState(id).file;\n\t },\n\t getProxy: function(id) {\n\t return handler.isValid(id) && handler._getFileState(id).proxy;\n\t },\n\t getResumableFilesData: function() {\n\t var resumableFilesData = [];\n\t handler._iterateResumeRecords(function(key, uploadData) {\n\t handler.moveInProgressToRemaining(null, uploadData.chunking.inProgress, uploadData.chunking.remaining);\n\t var data = {\n\t name: uploadData.name,\n\t remaining: uploadData.chunking.remaining,\n\t size: uploadData.size,\n\t uuid: uploadData.uuid\n\t };\n\t if (uploadData.key) {\n\t data.key = uploadData.key;\n\t }\n\t if (uploadData.customResumeData) {\n\t data.customResumeData = uploadData.customResumeData;\n\t }\n\t resumableFilesData.push(data);\n\t });\n\t return resumableFilesData;\n\t },\n\t isAttemptingResume: function(id) {\n\t return handler._getFileState(id).attemptingResume;\n\t },\n\t isResumable: function(id) {\n\t return !!chunking && handler.isValid(id) && !handler._getFileState(id).notResumable;\n\t },\n\t moveInProgressToRemaining: function(id, optInProgress, optRemaining) {\n\t var fileState = handler._getFileState(id) || {}, chunkingState = fileState.chunking || {}, inProgress = optInProgress || chunkingState.inProgress, remaining = optRemaining || chunkingState.remaining;\n\t if (inProgress) {\n\t log(qq.format(\"Moving these chunks from in-progress {}, to remaining.\", JSON.stringify(inProgress)));\n\t inProgress.reverse();\n\t qq.each(inProgress, function(idx, chunkIdx) {\n\t remaining.unshift(chunkIdx);\n\t });\n\t inProgress.length = 0;\n\t }\n\t },\n\t pause: function(id) {\n\t if (handler.isValid(id)) {\n\t log(qq.format(\"Aborting XHR upload for {} '{}' due to pause instruction.\", id, getName(id)));\n\t handler._getFileState(id).paused = true;\n\t abort(id);\n\t return true;\n\t }\n\t },\n\t reevaluateChunking: function(id) {\n\t if (chunking && handler.isValid(id)) {\n\t var state = handler._getFileState(id), totalChunks, i;\n\t delete state.chunking;\n\t state.chunking = {};\n\t totalChunks = handler._getTotalChunks(id);\n\t if (totalChunks > 1 || chunking.mandatory) {\n\t state.chunking.enabled = true;\n\t state.chunking.parts = totalChunks;\n\t state.chunking.remaining = [];\n\t for (i = 0; i < totalChunks; i++) {\n\t state.chunking.remaining.push(i);\n\t }\n\t handler._initTempState(id);\n\t } else {\n\t state.chunking.enabled = false;\n\t }\n\t }\n\t },\n\t updateBlob: function(id, newBlob) {\n\t if (handler.isValid(id)) {\n\t handler._getFileState(id).file = newBlob;\n\t }\n\t },\n\t _clearXhrs: function(id) {\n\t var tempState = handler._getFileState(id).temp;\n\t qq.each(tempState.ajaxRequesters, function(chunkId) {\n\t delete tempState.ajaxRequesters[chunkId];\n\t });\n\t qq.each(tempState.xhrs, function(chunkId) {\n\t delete tempState.xhrs[chunkId];\n\t });\n\t },\n\t _createXhr: function(id, optChunkIdx) {\n\t return handler._registerXhr(id, optChunkIdx, qq.createXhrInstance());\n\t },\n\t _getAjaxRequester: function(id, optChunkIdx) {\n\t var chunkIdx = optChunkIdx == null ? -1 : optChunkIdx;\n\t return handler._getFileState(id).temp.ajaxRequesters[chunkIdx];\n\t },\n\t _getChunkData: function(id, chunkIndex) {\n\t var chunkSize = getChunkSize(id), fileSize = getSize(id), fileOrBlob = handler.getFile(id), startBytes = chunkSize * chunkIndex, endBytes = startBytes + chunkSize >= fileSize ? fileSize : startBytes + chunkSize, totalChunks = handler._getTotalChunks(id), cachedChunks = this._getFileState(id).temp.cachedChunks, blob = cachedChunks[chunkIndex] || qq.sliceBlob(fileOrBlob, startBytes, endBytes);\n\t cachedChunks[chunkIndex] = blob;\n\t return {\n\t part: chunkIndex,\n\t start: startBytes,\n\t end: endBytes,\n\t count: totalChunks,\n\t blob: blob,\n\t size: endBytes - startBytes\n\t };\n\t },\n\t _getChunkDataForCallback: function(chunkData) {\n\t return {\n\t partIndex: chunkData.part,\n\t startByte: chunkData.start + 1,\n\t endByte: chunkData.end,\n\t totalParts: chunkData.count\n\t };\n\t },\n\t _getLocalStorageId: function(id) {\n\t var formatVersion = \"5.0\", name = getName(id), size = getSize(id), chunkSize = getChunkSize(id), endpoint = getEndpoint(id), customKeys = resume.customKeys(id), localStorageId = qq.format(\"qq{}resume{}-{}-{}-{}-{}\", namespace, formatVersion, name, size, chunkSize, endpoint);\n\t customKeys.forEach(function(key) {\n\t localStorageId += \"-\" + key;\n\t });\n\t return localStorageId;\n\t },\n\t _getMimeType: function(id) {\n\t return handler.getFile(id).type;\n\t },\n\t _getPersistableData: function(id) {\n\t return handler._getFileState(id).chunking;\n\t },\n\t _getTotalChunks: function(id) {\n\t if (chunking) {\n\t var fileSize = getSize(id), chunkSize = getChunkSize(id);\n\t return Math.ceil(fileSize / chunkSize);\n\t }\n\t },\n\t _getXhr: function(id, optChunkIdx) {\n\t var chunkIdx = optChunkIdx == null ? -1 : optChunkIdx;\n\t return handler._getFileState(id).temp.xhrs[chunkIdx];\n\t },\n\t _getXhrs: function(id) {\n\t return handler._getFileState(id).temp.xhrs;\n\t },\n\t _iterateResumeRecords: function(callback) {\n\t if (resumeEnabled) {\n\t qq.each(localStorage, function(key, item) {\n\t if (key.indexOf(qq.format(\"qq{}resume\", namespace)) === 0) {\n\t var uploadData = JSON.parse(item);\n\t callback(key, uploadData);\n\t }\n\t });\n\t }\n\t },\n\t _initTempState: function(id) {\n\t handler._getFileState(id).temp = {\n\t ajaxRequesters: {},\n\t chunkProgress: {},\n\t xhrs: {},\n\t cachedChunks: {}\n\t };\n\t },\n\t _markNotResumable: function(id) {\n\t handler._getFileState(id).notResumable = true;\n\t },\n\t _maybeDeletePersistedChunkData: function(id) {\n\t var localStorageId;\n\t if (resumeEnabled && handler.isResumable(id)) {\n\t localStorageId = handler._getLocalStorageId(id);\n\t if (localStorageId && localStorage.getItem(localStorageId)) {\n\t localStorage.removeItem(localStorageId);\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\t _maybePrepareForResume: function(id) {\n\t var state = handler._getFileState(id), localStorageId, persistedData;\n\t if (resumeEnabled && state.key === undefined) {\n\t localStorageId = handler._getLocalStorageId(id);\n\t persistedData = localStorage.getItem(localStorageId);\n\t if (persistedData) {\n\t persistedData = JSON.parse(persistedData);\n\t if (getDataByUuid(persistedData.uuid)) {\n\t handler._markNotResumable(id);\n\t } else {\n\t log(qq.format(\"Identified file with ID {} and name of {} as resumable.\", id, getName(id)));\n\t onUuidChanged(id, persistedData.uuid);\n\t state.key = persistedData.key;\n\t state.chunking = persistedData.chunking;\n\t state.loaded = persistedData.loaded;\n\t state.customResumeData = persistedData.customResumeData;\n\t state.attemptingResume = true;\n\t handler.moveInProgressToRemaining(id);\n\t }\n\t }\n\t }\n\t },\n\t _maybePersistChunkedState: function(id) {\n\t var state = handler._getFileState(id), localStorageId, persistedData;\n\t if (resumeEnabled && handler.isResumable(id)) {\n\t var customResumeData = getCustomResumeData(id);\n\t localStorageId = handler._getLocalStorageId(id);\n\t persistedData = {\n\t name: getName(id),\n\t size: getSize(id),\n\t uuid: getUuid(id),\n\t key: state.key,\n\t chunking: state.chunking,\n\t loaded: state.loaded,\n\t lastUpdated: Date.now()\n\t };\n\t if (customResumeData) {\n\t persistedData.customResumeData = customResumeData;\n\t }\n\t try {\n\t localStorage.setItem(localStorageId, JSON.stringify(persistedData));\n\t } catch (error) {\n\t log(qq.format(\"Unable to save resume data for '{}' due to error: '{}'.\", id, error.toString()), \"warn\");\n\t }\n\t }\n\t },\n\t _registerProgressHandler: function(id, chunkIdx, chunkSize) {\n\t var xhr = handler._getXhr(id, chunkIdx), name = getName(id), progressCalculator = {\n\t simple: function(loaded, total) {\n\t var fileSize = getSize(id);\n\t if (loaded === total) {\n\t onProgress(id, name, fileSize, fileSize);\n\t } else {\n\t onProgress(id, name, loaded >= fileSize ? fileSize - 1 : loaded, fileSize);\n\t }\n\t },\n\t chunked: function(loaded, total) {\n\t var chunkProgress = handler._getFileState(id).temp.chunkProgress, totalSuccessfullyLoadedForFile = handler._getFileState(id).loaded, loadedForRequest = loaded, totalForRequest = total, totalFileSize = getSize(id), estActualChunkLoaded = loadedForRequest - (totalForRequest - chunkSize), totalLoadedForFile = totalSuccessfullyLoadedForFile;\n\t chunkProgress[chunkIdx] = estActualChunkLoaded;\n\t qq.each(chunkProgress, function(chunkIdx, chunkLoaded) {\n\t totalLoadedForFile += chunkLoaded;\n\t });\n\t onProgress(id, name, totalLoadedForFile, totalFileSize);\n\t }\n\t };\n\t xhr.upload.onprogress = function(e) {\n\t if (e.lengthComputable) {\n\t var type = chunkSize == null ? \"simple\" : \"chunked\";\n\t progressCalculator[type](e.loaded, e.total);\n\t }\n\t };\n\t },\n\t _registerXhr: function(id, optChunkIdx, xhr, optAjaxRequester) {\n\t var xhrsId = optChunkIdx == null ? -1 : optChunkIdx, tempState = handler._getFileState(id).temp;\n\t tempState.xhrs = tempState.xhrs || {};\n\t tempState.ajaxRequesters = tempState.ajaxRequesters || {};\n\t tempState.xhrs[xhrsId] = xhr;\n\t if (optAjaxRequester) {\n\t tempState.ajaxRequesters[xhrsId] = optAjaxRequester;\n\t }\n\t return xhr;\n\t },\n\t _removeExpiredChunkingRecords: function() {\n\t var expirationDays = resume.recordsExpireIn;\n\t handler._iterateResumeRecords(function(key, uploadData) {\n\t var expirationDate = new Date(uploadData.lastUpdated);\n\t expirationDate.setDate(expirationDate.getDate() + expirationDays);\n\t if (expirationDate.getTime() <= Date.now()) {\n\t log(\"Removing expired resume record with key \" + key);\n\t localStorage.removeItem(key);\n\t }\n\t });\n\t },\n\t _shouldChunkThisFile: function(id) {\n\t var state = handler._getFileState(id);\n\t if (state) {\n\t if (!state.chunking) {\n\t handler.reevaluateChunking(id);\n\t }\n\t return state.chunking.enabled;\n\t }\n\t }\n\t });\n\t };\n\t qq.DeleteFileAjaxRequester = function(o) {\n\t \"use strict\";\n\t var requester, options = {\n\t method: \"DELETE\",\n\t uuidParamName: \"qquuid\",\n\t endpointStore: {},\n\t maxConnections: 3,\n\t customHeaders: function(id) {\n\t return {};\n\t },\n\t paramsStore: {},\n\t cors: {\n\t expected: false,\n\t sendCredentials: false\n\t },\n\t log: function(str, level) {},\n\t onDelete: function(id) {},\n\t onDeleteComplete: function(id, xhrOrXdr, isError) {}\n\t };\n\t qq.extend(options, o);\n\t function getMandatedParams() {\n\t if (options.method.toUpperCase() === \"POST\") {\n\t return {\n\t _method: \"DELETE\"\n\t };\n\t }\n\t return {};\n\t }\n\t requester = qq.extend(this, new qq.AjaxRequester({\n\t acceptHeader: \"application/json\",\n\t validMethods: [ \"POST\", \"DELETE\" ],\n\t method: options.method,\n\t endpointStore: options.endpointStore,\n\t paramsStore: options.paramsStore,\n\t mandatedParams: getMandatedParams(),\n\t maxConnections: options.maxConnections,\n\t customHeaders: function(id) {\n\t return options.customHeaders.get(id);\n\t },\n\t log: options.log,\n\t onSend: options.onDelete,\n\t onComplete: options.onDeleteComplete,\n\t cors: options.cors\n\t }));\n\t qq.extend(this, {\n\t sendDelete: function(id, uuid, additionalMandatedParams) {\n\t var additionalOptions = additionalMandatedParams || {};\n\t options.log(\"Submitting delete file request for \" + id);\n\t if (options.method === \"DELETE\") {\n\t requester.initTransport(id).withPath(uuid).withParams(additionalOptions).send();\n\t } else {\n\t additionalOptions[options.uuidParamName] = uuid;\n\t requester.initTransport(id).withParams(additionalOptions).send();\n\t }\n\t }\n\t });\n\t };\n\t (function() {\n\t function detectSubsampling(img) {\n\t var iw = img.naturalWidth, ih = img.naturalHeight, canvas = document.createElement(\"canvas\"), ctx;\n\t if (iw * ih > 1024 * 1024) {\n\t canvas.width = canvas.height = 1;\n\t ctx = canvas.getContext(\"2d\");\n\t ctx.drawImage(img, -iw + 1, 0);\n\t return ctx.getImageData(0, 0, 1, 1).data[3] === 0;\n\t } else {\n\t return false;\n\t }\n\t }\n\t function detectVerticalSquash(img, iw, ih) {\n\t var canvas = document.createElement(\"canvas\"), sy = 0, ey = ih, py = ih, ctx, data, alpha, ratio;\n\t canvas.width = 1;\n\t canvas.height = ih;\n\t ctx = canvas.getContext(\"2d\");\n\t ctx.drawImage(img, 0, 0);\n\t data = ctx.getImageData(0, 0, 1, ih).data;\n\t while (py > sy) {\n\t alpha = data[(py - 1) * 4 + 3];\n\t if (alpha === 0) {\n\t ey = py;\n\t } else {\n\t sy = py;\n\t }\n\t py = ey + sy >> 1;\n\t }\n\t ratio = py / ih;\n\t return ratio === 0 ? 1 : ratio;\n\t }\n\t function renderImageToDataURL(img, blob, options, doSquash) {\n\t var canvas = document.createElement(\"canvas\"), mime = options.mime || \"image/jpeg\", promise = new qq.Promise();\n\t renderImageToCanvas(img, blob, canvas, options, doSquash).then(function() {\n\t promise.success(canvas.toDataURL(mime, options.quality || .8));\n\t });\n\t return promise;\n\t }\n\t function maybeCalculateDownsampledDimensions(spec) {\n\t var maxPixels = 5241e3;\n\t if (!qq.ios()) {\n\t throw new qq.Error(\"Downsampled dimensions can only be reliably calculated for iOS!\");\n\t }\n\t if (spec.origHeight * spec.origWidth > maxPixels) {\n\t return {\n\t newHeight: Math.round(Math.sqrt(maxPixels * (spec.origHeight / spec.origWidth))),\n\t newWidth: Math.round(Math.sqrt(maxPixels * (spec.origWidth / spec.origHeight)))\n\t };\n\t }\n\t }\n\t function renderImageToCanvas(img, blob, canvas, options, doSquash) {\n\t var iw = img.naturalWidth, ih = img.naturalHeight, width = options.width, height = options.height, ctx = canvas.getContext(\"2d\"), promise = new qq.Promise(), modifiedDimensions;\n\t ctx.save();\n\t if (options.resize) {\n\t return renderImageToCanvasWithCustomResizer({\n\t blob: blob,\n\t canvas: canvas,\n\t image: img,\n\t imageHeight: ih,\n\t imageWidth: iw,\n\t orientation: options.orientation,\n\t resize: options.resize,\n\t targetHeight: height,\n\t targetWidth: width\n\t });\n\t }\n\t if (!qq.supportedFeatures.unlimitedScaledImageSize) {\n\t modifiedDimensions = maybeCalculateDownsampledDimensions({\n\t origWidth: width,\n\t origHeight: height\n\t });\n\t if (modifiedDimensions) {\n\t qq.log(qq.format(\"Had to reduce dimensions due to device limitations from {}w / {}h to {}w / {}h\", width, height, modifiedDimensions.newWidth, modifiedDimensions.newHeight), \"warn\");\n\t width = modifiedDimensions.newWidth;\n\t height = modifiedDimensions.newHeight;\n\t }\n\t }\n\t transformCoordinate(canvas, width, height, options.orientation);\n\t if (qq.ios()) {\n\t (function() {\n\t if (detectSubsampling(img)) {\n\t iw /= 2;\n\t ih /= 2;\n\t }\n\t var d = 1024, tmpCanvas = document.createElement(\"canvas\"), vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1, dw = Math.ceil(d * width / iw), dh = Math.ceil(d * height / ih / vertSquashRatio), sy = 0, dy = 0, tmpCtx, sx, dx;\n\t tmpCanvas.width = tmpCanvas.height = d;\n\t tmpCtx = tmpCanvas.getContext(\"2d\");\n\t while (sy < ih) {\n\t sx = 0;\n\t dx = 0;\n\t while (sx < iw) {\n\t tmpCtx.clearRect(0, 0, d, d);\n\t tmpCtx.drawImage(img, -sx, -sy);\n\t ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh);\n\t sx += d;\n\t dx += dw;\n\t }\n\t sy += d;\n\t dy += dh;\n\t }\n\t ctx.restore();\n\t tmpCanvas = tmpCtx = null;\n\t })();\n\t } else {\n\t ctx.drawImage(img, 0, 0, width, height);\n\t }\n\t canvas.qqImageRendered && canvas.qqImageRendered();\n\t promise.success();\n\t return promise;\n\t }\n\t function renderImageToCanvasWithCustomResizer(resizeInfo) {\n\t var blob = resizeInfo.blob, image = resizeInfo.image, imageHeight = resizeInfo.imageHeight, imageWidth = resizeInfo.imageWidth, orientation = resizeInfo.orientation, promise = new qq.Promise(), resize = resizeInfo.resize, sourceCanvas = document.createElement(\"canvas\"), sourceCanvasContext = sourceCanvas.getContext(\"2d\"), targetCanvas = resizeInfo.canvas, targetHeight = resizeInfo.targetHeight, targetWidth = resizeInfo.targetWidth;\n\t transformCoordinate(sourceCanvas, imageWidth, imageHeight, orientation);\n\t targetCanvas.height = targetHeight;\n\t targetCanvas.width = targetWidth;\n\t sourceCanvasContext.drawImage(image, 0, 0);\n\t resize({\n\t blob: blob,\n\t height: targetHeight,\n\t image: image,\n\t sourceCanvas: sourceCanvas,\n\t targetCanvas: targetCanvas,\n\t width: targetWidth\n\t }).then(function success() {\n\t targetCanvas.qqImageRendered && targetCanvas.qqImageRendered();\n\t promise.success();\n\t }, promise.failure);\n\t return promise;\n\t }\n\t function transformCoordinate(canvas, width, height, orientation) {\n\t switch (orientation) {\n\t case 5:\n\t case 6:\n\t case 7:\n\t case 8:\n\t canvas.width = height;\n\t canvas.height = width;\n\t break;\n\t\n\t default:\n\t canvas.width = width;\n\t canvas.height = height;\n\t }\n\t var ctx = canvas.getContext(\"2d\");\n\t switch (orientation) {\n\t case 2:\n\t ctx.translate(width, 0);\n\t ctx.scale(-1, 1);\n\t break;\n\t\n\t case 3:\n\t ctx.translate(width, height);\n\t ctx.rotate(Math.PI);\n\t break;\n\t\n\t case 4:\n\t ctx.translate(0, height);\n\t ctx.scale(1, -1);\n\t break;\n\t\n\t case 5:\n\t ctx.rotate(.5 * Math.PI);\n\t ctx.scale(1, -1);\n\t break;\n\t\n\t case 6:\n\t ctx.rotate(.5 * Math.PI);\n\t ctx.translate(0, -height);\n\t break;\n\t\n\t case 7:\n\t ctx.rotate(.5 * Math.PI);\n\t ctx.translate(width, -height);\n\t ctx.scale(-1, 1);\n\t break;\n\t\n\t case 8:\n\t ctx.rotate(-.5 * Math.PI);\n\t ctx.translate(-width, 0);\n\t break;\n\t\n\t default:\n\t break;\n\t }\n\t }\n\t function MegaPixImage(srcImage, errorCallback) {\n\t var self = this;\n\t if (window.Blob && srcImage instanceof Blob) {\n\t (function() {\n\t var img = new Image(), URL = window.URL && window.URL.createObjectURL ? window.URL : window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : null;\n\t if (!URL) {\n\t throw Error(\"No createObjectURL function found to create blob url\");\n\t }\n\t img.src = URL.createObjectURL(srcImage);\n\t self.blob = srcImage;\n\t srcImage = img;\n\t })();\n\t }\n\t if (!srcImage.naturalWidth && !srcImage.naturalHeight) {\n\t srcImage.onload = function() {\n\t var listeners = self.imageLoadListeners;\n\t if (listeners) {\n\t self.imageLoadListeners = null;\n\t setTimeout(function() {\n\t for (var i = 0, len = listeners.length; i < len; i++) {\n\t listeners[i]();\n\t }\n\t }, 0);\n\t }\n\t };\n\t srcImage.onerror = errorCallback;\n\t this.imageLoadListeners = [];\n\t }\n\t this.srcImage = srcImage;\n\t }\n\t MegaPixImage.prototype.render = function(target, options) {\n\t options = options || {};\n\t var self = this, imgWidth = this.srcImage.naturalWidth, imgHeight = this.srcImage.naturalHeight, width = options.width, height = options.height, maxWidth = options.maxWidth, maxHeight = options.maxHeight, doSquash = !this.blob || this.blob.type === \"image/jpeg\", tagName = target.tagName.toLowerCase(), opt;\n\t if (this.imageLoadListeners) {\n\t this.imageLoadListeners.push(function() {\n\t self.render(target, options);\n\t });\n\t return;\n\t }\n\t if (width && !height) {\n\t height = imgHeight * width / imgWidth << 0;\n\t } else if (height && !width) {\n\t width = imgWidth * height / imgHeight << 0;\n\t } else {\n\t width = imgWidth;\n\t height = imgHeight;\n\t }\n\t if (maxWidth && width > maxWidth) {\n\t width = maxWidth;\n\t height = imgHeight * width / imgWidth << 0;\n\t }\n\t if (maxHeight && height > maxHeight) {\n\t height = maxHeight;\n\t width = imgWidth * height / imgHeight << 0;\n\t }\n\t opt = {\n\t width: width,\n\t height: height\n\t }, qq.each(options, function(optionsKey, optionsValue) {\n\t opt[optionsKey] = optionsValue;\n\t });\n\t if (tagName === \"img\") {\n\t (function() {\n\t var oldTargetSrc = target.src;\n\t renderImageToDataURL(self.srcImage, self.blob, opt, doSquash).then(function(dataUri) {\n\t target.src = dataUri;\n\t oldTargetSrc === target.src && target.onload();\n\t });\n\t })();\n\t } else if (tagName === \"canvas\") {\n\t renderImageToCanvas(this.srcImage, this.blob, target, opt, doSquash);\n\t }\n\t if (typeof this.onrender === \"function\") {\n\t this.onrender(target);\n\t }\n\t };\n\t qq.MegaPixImage = MegaPixImage;\n\t })();\n\t qq.ImageGenerator = function(log) {\n\t \"use strict\";\n\t function isImg(el) {\n\t return el.tagName.toLowerCase() === \"img\";\n\t }\n\t function isCanvas(el) {\n\t return el.tagName.toLowerCase() === \"canvas\";\n\t }\n\t function isImgCorsSupported() {\n\t return new Image().crossOrigin !== undefined;\n\t }\n\t function isCanvasSupported() {\n\t var canvas = document.createElement(\"canvas\");\n\t return canvas.getContext && canvas.getContext(\"2d\");\n\t }\n\t function determineMimeOfFileName(nameWithPath) {\n\t var pathSegments = nameWithPath.split(\"/\"), name = pathSegments[pathSegments.length - 1].split(\"?\")[0], extension = qq.getExtension(name);\n\t extension = extension && extension.toLowerCase();\n\t switch (extension) {\n\t case \"jpeg\":\n\t case \"jpg\":\n\t return \"image/jpeg\";\n\t\n\t case \"png\":\n\t return \"image/png\";\n\t\n\t case \"bmp\":\n\t return \"image/bmp\";\n\t\n\t case \"gif\":\n\t return \"image/gif\";\n\t\n\t case \"tiff\":\n\t case \"tif\":\n\t return \"image/tiff\";\n\t }\n\t }\n\t function isCrossOrigin(url) {\n\t var targetAnchor = document.createElement(\"a\"), targetProtocol, targetHostname, targetPort;\n\t targetAnchor.href = url;\n\t targetProtocol = targetAnchor.protocol;\n\t targetPort = targetAnchor.port;\n\t targetHostname = targetAnchor.hostname;\n\t if (targetProtocol.toLowerCase() !== window.location.protocol.toLowerCase()) {\n\t return true;\n\t }\n\t if (targetHostname.toLowerCase() !== window.location.hostname.toLowerCase()) {\n\t return true;\n\t }\n\t if (targetPort !== window.location.port && !qq.ie()) {\n\t return true;\n\t }\n\t return false;\n\t }\n\t function registerImgLoadListeners(img, promise) {\n\t img.onload = function() {\n\t img.onload = null;\n\t img.onerror = null;\n\t promise.success(img);\n\t };\n\t img.onerror = function() {\n\t img.onload = null;\n\t img.onerror = null;\n\t log(\"Problem drawing thumbnail!\", \"error\");\n\t promise.failure(img, \"Problem drawing thumbnail!\");\n\t };\n\t }\n\t function registerCanvasDrawImageListener(canvas, promise) {\n\t canvas.qqImageRendered = function() {\n\t promise.success(canvas);\n\t };\n\t }\n\t function registerThumbnailRenderedListener(imgOrCanvas, promise) {\n\t var registered = isImg(imgOrCanvas) || isCanvas(imgOrCanvas);\n\t if (isImg(imgOrCanvas)) {\n\t registerImgLoadListeners(imgOrCanvas, promise);\n\t } else if (isCanvas(imgOrCanvas)) {\n\t registerCanvasDrawImageListener(imgOrCanvas, promise);\n\t } else {\n\t promise.failure(imgOrCanvas);\n\t log(qq.format(\"Element container of type {} is not supported!\", imgOrCanvas.tagName), \"error\");\n\t }\n\t return registered;\n\t }\n\t function draw(fileOrBlob, container, options) {\n\t var drawPreview = new qq.Promise(), identifier = new qq.Identify(fileOrBlob, log), maxSize = options.maxSize, orient = options.orient == null ? true : options.orient, megapixErrorHandler = function() {\n\t container.onerror = null;\n\t container.onload = null;\n\t log(\"Could not render preview, file may be too large!\", \"error\");\n\t drawPreview.failure(container, \"Browser cannot render image!\");\n\t };\n\t identifier.isPreviewable().then(function(mime) {\n\t var dummyExif = {\n\t parse: function() {\n\t return new qq.Promise().success();\n\t }\n\t }, exif = orient ? new qq.Exif(fileOrBlob, log) : dummyExif, mpImg = new qq.MegaPixImage(fileOrBlob, megapixErrorHandler);\n\t if (registerThumbnailRenderedListener(container, drawPreview)) {\n\t exif.parse().then(function(exif) {\n\t var orientation = exif && exif.Orientation;\n\t mpImg.render(container, {\n\t maxWidth: maxSize,\n\t maxHeight: maxSize,\n\t orientation: orientation,\n\t mime: mime,\n\t resize: options.customResizeFunction\n\t });\n\t }, function(failureMsg) {\n\t log(qq.format(\"EXIF data could not be parsed ({}). Assuming orientation = 1.\", failureMsg));\n\t mpImg.render(container, {\n\t maxWidth: maxSize,\n\t maxHeight: maxSize,\n\t mime: mime,\n\t resize: options.customResizeFunction\n\t });\n\t });\n\t }\n\t }, function() {\n\t log(\"Not previewable\");\n\t drawPreview.failure(container, \"Not previewable\");\n\t });\n\t return drawPreview;\n\t }\n\t function drawOnCanvasOrImgFromUrl(url, canvasOrImg, draw, maxSize, customResizeFunction) {\n\t var tempImg = new Image(), tempImgRender = new qq.Promise();\n\t registerThumbnailRenderedListener(tempImg, tempImgRender);\n\t if (isCrossOrigin(url)) {\n\t tempImg.crossOrigin = \"anonymous\";\n\t }\n\t tempImg.src = url;\n\t tempImgRender.then(function rendered() {\n\t registerThumbnailRenderedListener(canvasOrImg, draw);\n\t var mpImg = new qq.MegaPixImage(tempImg);\n\t mpImg.render(canvasOrImg, {\n\t maxWidth: maxSize,\n\t maxHeight: maxSize,\n\t mime: determineMimeOfFileName(url),\n\t resize: customResizeFunction\n\t });\n\t }, draw.failure);\n\t }\n\t function drawOnImgFromUrlWithCssScaling(url, img, draw, maxSize) {\n\t registerThumbnailRenderedListener(img, draw);\n\t qq(img).css({\n\t maxWidth: maxSize + \"px\",\n\t maxHeight: maxSize + \"px\"\n\t });\n\t img.src = url;\n\t }\n\t function drawFromUrl(url, container, options) {\n\t var draw = new qq.Promise(), scale = options.scale, maxSize = scale ? options.maxSize : null;\n\t if (scale && isImg(container)) {\n\t if (isCanvasSupported()) {\n\t if (isCrossOrigin(url) && !isImgCorsSupported()) {\n\t drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);\n\t } else {\n\t drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);\n\t }\n\t } else {\n\t drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);\n\t }\n\t } else if (isCanvas(container)) {\n\t drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);\n\t } else if (registerThumbnailRenderedListener(container, draw)) {\n\t container.src = url;\n\t }\n\t return draw;\n\t }\n\t qq.extend(this, {\n\t generate: function(fileBlobOrUrl, container, options) {\n\t if (qq.isString(fileBlobOrUrl)) {\n\t log(\"Attempting to update thumbnail based on server response.\");\n\t return drawFromUrl(fileBlobOrUrl, container, options || {});\n\t } else {\n\t log(\"Attempting to draw client-side image preview.\");\n\t return draw(fileBlobOrUrl, container, options || {});\n\t }\n\t }\n\t });\n\t this._testing = {};\n\t this._testing.isImg = isImg;\n\t this._testing.isCanvas = isCanvas;\n\t this._testing.isCrossOrigin = isCrossOrigin;\n\t this._testing.determineMimeOfFileName = determineMimeOfFileName;\n\t };\n\t qq.Exif = function(fileOrBlob, log) {\n\t \"use strict\";\n\t var TAG_IDS = [ 274 ], TAG_INFO = {\n\t 274: {\n\t name: \"Orientation\",\n\t bytes: 2\n\t }\n\t };\n\t function parseLittleEndian(hex) {\n\t var result = 0, pow = 0;\n\t while (hex.length > 0) {\n\t result += parseInt(hex.substring(0, 2), 16) * Math.pow(2, pow);\n\t hex = hex.substring(2, hex.length);\n\t pow += 8;\n\t }\n\t return result;\n\t }\n\t function seekToApp1(offset, promise) {\n\t var theOffset = offset, thePromise = promise;\n\t if (theOffset === undefined) {\n\t theOffset = 2;\n\t thePromise = new qq.Promise();\n\t }\n\t qq.readBlobToHex(fileOrBlob, theOffset, 4).then(function(hex) {\n\t var match = /^ffe([0-9])/.exec(hex), segmentLength;\n\t if (match) {\n\t if (match[1] !== \"1\") {\n\t segmentLength = parseInt(hex.slice(4, 8), 16);\n\t seekToApp1(theOffset + segmentLength + 2, thePromise);\n\t } else {\n\t thePromise.success(theOffset);\n\t }\n\t } else {\n\t thePromise.failure(\"No EXIF header to be found!\");\n\t }\n\t });\n\t return thePromise;\n\t }\n\t function getApp1Offset() {\n\t var promise = new qq.Promise();\n\t qq.readBlobToHex(fileOrBlob, 0, 6).then(function(hex) {\n\t if (hex.indexOf(\"ffd8\") !== 0) {\n\t promise.failure(\"Not a valid JPEG!\");\n\t } else {\n\t seekToApp1().then(function(offset) {\n\t promise.success(offset);\n\t }, function(error) {\n\t promise.failure(error);\n\t });\n\t }\n\t });\n\t return promise;\n\t }\n\t function isLittleEndian(app1Start) {\n\t var promise = new qq.Promise();\n\t qq.readBlobToHex(fileOrBlob, app1Start + 10, 2).then(function(hex) {\n\t promise.success(hex === \"4949\");\n\t });\n\t return promise;\n\t }\n\t function getDirEntryCount(app1Start, littleEndian) {\n\t var promise = new qq.Promise();\n\t qq.readBlobToHex(fileOrBlob, app1Start + 18, 2).then(function(hex) {\n\t if (littleEndian) {\n\t return promise.success(parseLittleEndian(hex));\n\t } else {\n\t promise.success(parseInt(hex, 16));\n\t }\n\t });\n\t return promise;\n\t }\n\t function getIfd(app1Start, dirEntries) {\n\t var offset = app1Start + 20, bytes = dirEntries * 12;\n\t return qq.readBlobToHex(fileOrBlob, offset, bytes);\n\t }\n\t function getDirEntries(ifdHex) {\n\t var entries = [], offset = 0;\n\t while (offset + 24 <= ifdHex.length) {\n\t entries.push(ifdHex.slice(offset, offset + 24));\n\t offset += 24;\n\t }\n\t return entries;\n\t }\n\t function getTagValues(littleEndian, dirEntries) {\n\t var TAG_VAL_OFFSET = 16, tagsToFind = qq.extend([], TAG_IDS), vals = {};\n\t qq.each(dirEntries, function(idx, entry) {\n\t var idHex = entry.slice(0, 4), id = littleEndian ? parseLittleEndian(idHex) : parseInt(idHex, 16), tagsToFindIdx = tagsToFind.indexOf(id), tagValHex, tagName, tagValLength;\n\t if (tagsToFindIdx >= 0) {\n\t tagName = TAG_INFO[id].name;\n\t tagValLength = TAG_INFO[id].bytes;\n\t tagValHex = entry.slice(TAG_VAL_OFFSET, TAG_VAL_OFFSET + tagValLength * 2);\n\t vals[tagName] = littleEndian ? parseLittleEndian(tagValHex) : parseInt(tagValHex, 16);\n\t tagsToFind.splice(tagsToFindIdx, 1);\n\t }\n\t if (tagsToFind.length === 0) {\n\t return false;\n\t }\n\t });\n\t return vals;\n\t }\n\t qq.extend(this, {\n\t parse: function() {\n\t var parser = new qq.Promise(), onParseFailure = function(message) {\n\t log(qq.format(\"EXIF header parse failed: '{}' \", message));\n\t parser.failure(message);\n\t };\n\t getApp1Offset().then(function(app1Offset) {\n\t log(qq.format(\"Moving forward with EXIF header parsing for '{}'\", fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name));\n\t isLittleEndian(app1Offset).then(function(littleEndian) {\n\t log(qq.format(\"EXIF Byte order is {} endian\", littleEndian ? \"little\" : \"big\"));\n\t getDirEntryCount(app1Offset, littleEndian).then(function(dirEntryCount) {\n\t log(qq.format(\"Found {} APP1 directory entries\", dirEntryCount));\n\t getIfd(app1Offset, dirEntryCount).then(function(ifdHex) {\n\t var dirEntries = getDirEntries(ifdHex), tagValues = getTagValues(littleEndian, dirEntries);\n\t log(\"Successfully parsed some EXIF tags\");\n\t parser.success(tagValues);\n\t }, onParseFailure);\n\t }, onParseFailure);\n\t }, onParseFailure);\n\t }, onParseFailure);\n\t return parser;\n\t }\n\t });\n\t this._testing = {};\n\t this._testing.parseLittleEndian = parseLittleEndian;\n\t };\n\t qq.Identify = function(fileOrBlob, log) {\n\t \"use strict\";\n\t function isIdentifiable(magicBytes, questionableBytes) {\n\t var identifiable = false, magicBytesEntries = [].concat(magicBytes);\n\t qq.each(magicBytesEntries, function(idx, magicBytesArrayEntry) {\n\t if (questionableBytes.indexOf(magicBytesArrayEntry) === 0) {\n\t identifiable = true;\n\t return false;\n\t }\n\t });\n\t return identifiable;\n\t }\n\t qq.extend(this, {\n\t isPreviewable: function() {\n\t var self = this, identifier = new qq.Promise(), previewable = false, name = fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name;\n\t log(qq.format(\"Attempting to determine if {} can be rendered in this browser\", name));\n\t log(\"First pass: check type attribute of blob object.\");\n\t if (this.isPreviewableSync()) {\n\t log(\"Second pass: check for magic bytes in file header.\");\n\t qq.readBlobToHex(fileOrBlob, 0, 4).then(function(hex) {\n\t qq.each(self.PREVIEWABLE_MIME_TYPES, function(mime, bytes) {\n\t if (isIdentifiable(bytes, hex)) {\n\t if (mime !== \"image/tiff\" || qq.supportedFeatures.tiffPreviews) {\n\t previewable = true;\n\t identifier.success(mime);\n\t }\n\t return false;\n\t }\n\t });\n\t log(qq.format(\"'{}' is {} able to be rendered in this browser\", name, previewable ? \"\" : \"NOT\"));\n\t if (!previewable) {\n\t identifier.failure();\n\t }\n\t }, function() {\n\t log(\"Error reading file w/ name '\" + name + \"'. Not able to be rendered in this browser.\");\n\t identifier.failure();\n\t });\n\t } else {\n\t identifier.failure();\n\t }\n\t return identifier;\n\t },\n\t isPreviewableSync: function() {\n\t var fileMime = fileOrBlob.type, isRecognizedImage = qq.indexOf(Object.keys(this.PREVIEWABLE_MIME_TYPES), fileMime) >= 0, previewable = false, name = fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name;\n\t if (isRecognizedImage) {\n\t if (fileMime === \"image/tiff\") {\n\t previewable = qq.supportedFeatures.tiffPreviews;\n\t } else {\n\t previewable = true;\n\t }\n\t }\n\t !previewable && log(name + \" is not previewable in this browser per the blob's type attr\");\n\t return previewable;\n\t }\n\t });\n\t };\n\t qq.Identify.prototype.PREVIEWABLE_MIME_TYPES = {\n\t \"image/jpeg\": \"ffd8ff\",\n\t \"image/gif\": \"474946\",\n\t \"image/png\": \"89504e\",\n\t \"image/bmp\": \"424d\",\n\t \"image/tiff\": [ \"49492a00\", \"4d4d002a\" ]\n\t };\n\t qq.ImageValidation = function(blob, log) {\n\t \"use strict\";\n\t function hasNonZeroLimits(limits) {\n\t var atLeastOne = false;\n\t qq.each(limits, function(limit, value) {\n\t if (value > 0) {\n\t atLeastOne = true;\n\t return false;\n\t }\n\t });\n\t return atLeastOne;\n\t }\n\t function getWidthHeight() {\n\t var sizeDetermination = new qq.Promise();\n\t new qq.Identify(blob, log).isPreviewable().then(function() {\n\t var image = new Image(), url = window.URL && window.URL.createObjectURL ? window.URL : window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : null;\n\t if (url) {\n\t image.onerror = function() {\n\t log(\"Cannot determine dimensions for image. May be too large.\", \"error\");\n\t sizeDetermination.failure();\n\t };\n\t image.onload = function() {\n\t sizeDetermination.success({\n\t width: this.width,\n\t height: this.height\n\t });\n\t };\n\t image.src = url.createObjectURL(blob);\n\t } else {\n\t log(\"No createObjectURL function available to generate image URL!\", \"error\");\n\t sizeDetermination.failure();\n\t }\n\t }, sizeDetermination.failure);\n\t return sizeDetermination;\n\t }\n\t function getFailingLimit(limits, dimensions) {\n\t var failingLimit;\n\t qq.each(limits, function(limitName, limitValue) {\n\t if (limitValue > 0) {\n\t var limitMatcher = /(max|min)(Width|Height)/.exec(limitName), dimensionPropName = limitMatcher[2].charAt(0).toLowerCase() + limitMatcher[2].slice(1), actualValue = dimensions[dimensionPropName];\n\t switch (limitMatcher[1]) {\n\t case \"min\":\n\t if (actualValue < limitValue) {\n\t failingLimit = limitName;\n\t return false;\n\t }\n\t break;\n\t\n\t case \"max\":\n\t if (actualValue > limitValue) {\n\t failingLimit = limitName;\n\t return false;\n\t }\n\t break;\n\t }\n\t }\n\t });\n\t return failingLimit;\n\t }\n\t this.validate = function(limits) {\n\t var validationEffort = new qq.Promise();\n\t log(\"Attempting to validate image.\");\n\t if (hasNonZeroLimits(limits)) {\n\t getWidthHeight().then(function(dimensions) {\n\t var failingLimit = getFailingLimit(limits, dimensions);\n\t if (failingLimit) {\n\t validationEffort.failure(failingLimit);\n\t } else {\n\t validationEffort.success();\n\t }\n\t }, validationEffort.success);\n\t } else {\n\t validationEffort.success();\n\t }\n\t return validationEffort;\n\t };\n\t };\n\t qq.Session = function(spec) {\n\t \"use strict\";\n\t var options = {\n\t endpoint: null,\n\t params: {},\n\t customHeaders: {},\n\t cors: {},\n\t addFileRecord: function(sessionData) {},\n\t log: function(message, level) {}\n\t };\n\t qq.extend(options, spec, true);\n\t function isJsonResponseValid(response) {\n\t if (qq.isArray(response)) {\n\t return true;\n\t }\n\t options.log(\"Session response is not an array.\", \"error\");\n\t }\n\t function handleFileItems(fileItems, success, xhrOrXdr, promise) {\n\t var someItemsIgnored = false;\n\t success = success && isJsonResponseValid(fileItems);\n\t if (success) {\n\t qq.each(fileItems, function(idx, fileItem) {\n\t if (fileItem.uuid == null) {\n\t someItemsIgnored = true;\n\t options.log(qq.format(\"Session response item {} did not include a valid UUID - ignoring.\", idx), \"error\");\n\t } else if (fileItem.name == null) {\n\t someItemsIgnored = true;\n\t options.log(qq.format(\"Session response item {} did not include a valid name - ignoring.\", idx), \"error\");\n\t } else {\n\t try {\n\t options.addFileRecord(fileItem);\n\t return true;\n\t } catch (err) {\n\t someItemsIgnored = true;\n\t options.log(err.message, \"error\");\n\t }\n\t }\n\t return false;\n\t });\n\t }\n\t promise[success && !someItemsIgnored ? \"success\" : \"failure\"](fileItems, xhrOrXdr);\n\t }\n\t this.refresh = function() {\n\t var refreshEffort = new qq.Promise(), refreshCompleteCallback = function(response, success, xhrOrXdr) {\n\t handleFileItems(response, success, xhrOrXdr, refreshEffort);\n\t }, requesterOptions = qq.extend({}, options), requester = new qq.SessionAjaxRequester(qq.extend(requesterOptions, {\n\t onComplete: refreshCompleteCallback\n\t }));\n\t requester.queryServer();\n\t return refreshEffort;\n\t };\n\t };\n\t qq.SessionAjaxRequester = function(spec) {\n\t \"use strict\";\n\t var requester, options = {\n\t endpoint: null,\n\t customHeaders: {},\n\t params: {},\n\t cors: {\n\t expected: false,\n\t sendCredentials: false\n\t },\n\t onComplete: function(response, success, xhrOrXdr) {},\n\t log: function(str, level) {}\n\t };\n\t qq.extend(options, spec);\n\t function onComplete(id, xhrOrXdr, isError) {\n\t var response = null;\n\t if (xhrOrXdr.responseText != null) {\n\t try {\n\t response = qq.parseJson(xhrOrXdr.responseText);\n\t } catch (err) {\n\t options.log(\"Problem parsing session response: \" + err.message, \"error\");\n\t isError = true;\n\t }\n\t }\n\t options.onComplete(response, !isError, xhrOrXdr);\n\t }\n\t requester = qq.extend(this, new qq.AjaxRequester({\n\t acceptHeader: \"application/json\",\n\t validMethods: [ \"GET\" ],\n\t method: \"GET\",\n\t endpointStore: {\n\t get: function() {\n\t return options.endpoint;\n\t }\n\t },\n\t customHeaders: options.customHeaders,\n\t log: options.log,\n\t onComplete: onComplete,\n\t cors: options.cors\n\t }));\n\t qq.extend(this, {\n\t queryServer: function() {\n\t var params = qq.extend({}, options.params);\n\t options.log(\"Session query request.\");\n\t requester.initTransport(\"sessionRefresh\").withParams(params).withCacheBuster().send();\n\t }\n\t });\n\t };\n\t qq.Scaler = function(spec, log) {\n\t \"use strict\";\n\t var self = this, customResizeFunction = spec.customResizer, includeOriginal = spec.sendOriginal, orient = spec.orient, defaultType = spec.defaultType, defaultQuality = spec.defaultQuality / 100, failedToScaleText = spec.failureText, includeExif = spec.includeExif, sizes = this._getSortedSizes(spec.sizes);\n\t qq.extend(this, {\n\t enabled: qq.supportedFeatures.scaling && sizes.length > 0,\n\t getFileRecords: function(originalFileUuid, originalFileName, originalBlobOrBlobData) {\n\t var self = this, records = [], originalBlob = originalBlobOrBlobData.blob ? originalBlobOrBlobData.blob : originalBlobOrBlobData, identifier = new qq.Identify(originalBlob, log);\n\t if (identifier.isPreviewableSync()) {\n\t qq.each(sizes, function(idx, sizeRecord) {\n\t var outputType = self._determineOutputType({\n\t defaultType: defaultType,\n\t requestedType: sizeRecord.type,\n\t refType: originalBlob.type\n\t });\n\t records.push({\n\t uuid: qq.getUniqueId(),\n\t name: self._getName(originalFileName, {\n\t name: sizeRecord.name,\n\t type: outputType,\n\t refType: originalBlob.type\n\t }),\n\t blob: new qq.BlobProxy(originalBlob, qq.bind(self._generateScaledImage, self, {\n\t customResizeFunction: customResizeFunction,\n\t maxSize: sizeRecord.maxSize,\n\t orient: orient,\n\t type: outputType,\n\t quality: defaultQuality,\n\t failedText: failedToScaleText,\n\t includeExif: includeExif,\n\t log: log\n\t }))\n\t });\n\t });\n\t records.push({\n\t uuid: originalFileUuid,\n\t name: originalFileName,\n\t size: originalBlob.size,\n\t blob: includeOriginal ? originalBlob : null\n\t });\n\t } else {\n\t records.push({\n\t uuid: originalFileUuid,\n\t name: originalFileName,\n\t size: originalBlob.size,\n\t blob: originalBlob\n\t });\n\t }\n\t return records;\n\t },\n\t handleNewFile: function(file, name, uuid, size, fileList, batchId, uuidParamName, api) {\n\t var self = this, buttonId = file.qqButtonId || file.blob && file.blob.qqButtonId, scaledIds = [], originalId = null, addFileToHandler = api.addFileToHandler, uploadData = api.uploadData, paramsStore = api.paramsStore, proxyGroupId = qq.getUniqueId();\n\t qq.each(self.getFileRecords(uuid, name, file), function(idx, record) {\n\t var blobSize = record.size, id;\n\t if (record.blob instanceof qq.BlobProxy) {\n\t blobSize = -1;\n\t }\n\t id = uploadData.addFile({\n\t uuid: record.uuid,\n\t name: record.name,\n\t size: blobSize,\n\t batchId: batchId,\n\t proxyGroupId: proxyGroupId\n\t });\n\t if (record.blob instanceof qq.BlobProxy) {\n\t scaledIds.push(id);\n\t } else {\n\t originalId = id;\n\t }\n\t if (record.blob) {\n\t addFileToHandler(id, record.blob);\n\t fileList.push({\n\t id: id,\n\t file: record.blob\n\t });\n\t } else {\n\t uploadData.setStatus(id, qq.status.REJECTED);\n\t }\n\t });\n\t if (originalId !== null) {\n\t qq.each(scaledIds, function(idx, scaledId) {\n\t var params = {\n\t qqparentuuid: uploadData.retrieve({\n\t id: originalId\n\t }).uuid,\n\t qqparentsize: uploadData.retrieve({\n\t id: originalId\n\t }).size\n\t };\n\t params[uuidParamName] = uploadData.retrieve({\n\t id: scaledId\n\t }).uuid;\n\t uploadData.setParentId(scaledId, originalId);\n\t paramsStore.addReadOnly(scaledId, params);\n\t });\n\t if (scaledIds.length) {\n\t (function() {\n\t var param = {};\n\t param[uuidParamName] = uploadData.retrieve({\n\t id: originalId\n\t }).uuid;\n\t paramsStore.addReadOnly(originalId, param);\n\t })();\n\t }\n\t }\n\t }\n\t });\n\t };\n\t qq.extend(qq.Scaler.prototype, {\n\t scaleImage: function(id, specs, api) {\n\t \"use strict\";\n\t if (!qq.supportedFeatures.scaling) {\n\t throw new qq.Error(\"Scaling is not supported in this browser!\");\n\t }\n\t var scalingEffort = new qq.Promise(), log = api.log, file = api.getFile(id), uploadData = api.uploadData.retrieve({\n\t id: id\n\t }), name = uploadData && uploadData.name, uuid = uploadData && uploadData.uuid, scalingOptions = {\n\t customResizer: specs.customResizer,\n\t sendOriginal: false,\n\t orient: specs.orient,\n\t defaultType: specs.type || null,\n\t defaultQuality: specs.quality,\n\t failedToScaleText: \"Unable to scale\",\n\t sizes: [ {\n\t name: \"\",\n\t maxSize: specs.maxSize\n\t } ]\n\t }, scaler = new qq.Scaler(scalingOptions, log);\n\t if (!qq.Scaler || !qq.supportedFeatures.imagePreviews || !file) {\n\t scalingEffort.failure();\n\t log(\"Could not generate requested scaled image for \" + id + \". \" + \"Scaling is either not possible in this browser, or the file could not be located.\", \"error\");\n\t } else {\n\t qq.bind(function() {\n\t var record = scaler.getFileRecords(uuid, name, file)[0];\n\t if (record && record.blob instanceof qq.BlobProxy) {\n\t record.blob.create().then(scalingEffort.success, scalingEffort.failure);\n\t } else {\n\t log(id + \" is not a scalable image!\", \"error\");\n\t scalingEffort.failure();\n\t }\n\t }, this)();\n\t }\n\t return scalingEffort;\n\t },\n\t _determineOutputType: function(spec) {\n\t \"use strict\";\n\t var requestedType = spec.requestedType, defaultType = spec.defaultType, referenceType = spec.refType;\n\t if (!defaultType && !requestedType) {\n\t if (referenceType !== \"image/jpeg\") {\n\t return \"image/png\";\n\t }\n\t return referenceType;\n\t }\n\t if (!requestedType) {\n\t return defaultType;\n\t }\n\t if (qq.indexOf(Object.keys(qq.Identify.prototype.PREVIEWABLE_MIME_TYPES), requestedType) >= 0) {\n\t if (requestedType === \"image/tiff\") {\n\t return qq.supportedFeatures.tiffPreviews ? requestedType : defaultType;\n\t }\n\t return requestedType;\n\t }\n\t return defaultType;\n\t },\n\t _getName: function(originalName, scaledVersionProperties) {\n\t \"use strict\";\n\t var startOfExt = originalName.lastIndexOf(\".\"), versionType = scaledVersionProperties.type || \"image/png\", referenceType = scaledVersionProperties.refType, scaledName = \"\", scaledExt = qq.getExtension(originalName), nameAppendage = \"\";\n\t if (scaledVersionProperties.name && scaledVersionProperties.name.trim().length) {\n\t nameAppendage = \" (\" + scaledVersionProperties.name + \")\";\n\t }\n\t if (startOfExt >= 0) {\n\t scaledName = originalName.substr(0, startOfExt);\n\t if (referenceType !== versionType) {\n\t scaledExt = versionType.split(\"/\")[1];\n\t }\n\t scaledName += nameAppendage + \".\" + scaledExt;\n\t } else {\n\t scaledName = originalName + nameAppendage;\n\t }\n\t return scaledName;\n\t },\n\t _getSortedSizes: function(sizes) {\n\t \"use strict\";\n\t sizes = qq.extend([], sizes);\n\t return sizes.sort(function(a, b) {\n\t if (a.maxSize > b.maxSize) {\n\t return 1;\n\t }\n\t if (a.maxSize < b.maxSize) {\n\t return -1;\n\t }\n\t return 0;\n\t });\n\t },\n\t _generateScaledImage: function(spec, sourceFile) {\n\t \"use strict\";\n\t var self = this, customResizeFunction = spec.customResizeFunction, log = spec.log, maxSize = spec.maxSize, orient = spec.orient, type = spec.type, quality = spec.quality, failedText = spec.failedText, includeExif = spec.includeExif && sourceFile.type === \"image/jpeg\" && type === \"image/jpeg\", scalingEffort = new qq.Promise(), imageGenerator = new qq.ImageGenerator(log), canvas = document.createElement(\"canvas\");\n\t log(\"Attempting to generate scaled version for \" + sourceFile.name);\n\t imageGenerator.generate(sourceFile, canvas, {\n\t maxSize: maxSize,\n\t orient: orient,\n\t customResizeFunction: customResizeFunction\n\t }).then(function() {\n\t var scaledImageDataUri = canvas.toDataURL(type, quality), signalSuccess = function() {\n\t log(\"Success generating scaled version for \" + sourceFile.name);\n\t var blob = qq.dataUriToBlob(scaledImageDataUri);\n\t scalingEffort.success(blob);\n\t };\n\t if (includeExif) {\n\t self._insertExifHeader(sourceFile, scaledImageDataUri, log).then(function(scaledImageDataUriWithExif) {\n\t scaledImageDataUri = scaledImageDataUriWithExif;\n\t signalSuccess();\n\t }, function() {\n\t log(\"Problem inserting EXIF header into scaled image. Using scaled image w/out EXIF data.\", \"error\");\n\t signalSuccess();\n\t });\n\t } else {\n\t signalSuccess();\n\t }\n\t }, function() {\n\t log(\"Failed attempt to generate scaled version for \" + sourceFile.name, \"error\");\n\t scalingEffort.failure(failedText);\n\t });\n\t return scalingEffort;\n\t },\n\t _insertExifHeader: function(originalImage, scaledImageDataUri, log) {\n\t \"use strict\";\n\t var reader = new FileReader(), insertionEffort = new qq.Promise(), originalImageDataUri = \"\";\n\t reader.onload = function() {\n\t originalImageDataUri = reader.result;\n\t insertionEffort.success(qq.ExifRestorer.restore(originalImageDataUri, scaledImageDataUri));\n\t };\n\t reader.onerror = function() {\n\t log(\"Problem reading \" + originalImage.name + \" during attempt to transfer EXIF data to scaled version.\", \"error\");\n\t insertionEffort.failure();\n\t };\n\t reader.readAsDataURL(originalImage);\n\t return insertionEffort;\n\t },\n\t _dataUriToBlob: function(dataUri) {\n\t \"use strict\";\n\t var byteString, mimeString, arrayBuffer, intArray;\n\t if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n\t byteString = atob(dataUri.split(\",\")[1]);\n\t } else {\n\t byteString = decodeURI(dataUri.split(\",\")[1]);\n\t }\n\t mimeString = dataUri.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n\t arrayBuffer = new ArrayBuffer(byteString.length);\n\t intArray = new Uint8Array(arrayBuffer);\n\t qq.each(byteString, function(idx, character) {\n\t intArray[idx] = character.charCodeAt(0);\n\t });\n\t return this._createBlob(arrayBuffer, mimeString);\n\t },\n\t _createBlob: function(data, mime) {\n\t \"use strict\";\n\t var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder();\n\t if (blobBuilder) {\n\t blobBuilder.append(data);\n\t return blobBuilder.getBlob(mime);\n\t } else {\n\t return new Blob([ data ], {\n\t type: mime\n\t });\n\t }\n\t }\n\t });\n\t qq.ExifRestorer = function() {\n\t var ExifRestorer = {};\n\t ExifRestorer.KEY_STR = \"ABCDEFGHIJKLMNOP\" + \"QRSTUVWXYZabcdef\" + \"ghijklmnopqrstuv\" + \"wxyz0123456789+/\" + \"=\";\n\t ExifRestorer.encode64 = function(input) {\n\t var output = \"\", chr1, chr2, chr3 = \"\", enc1, enc2, enc3, enc4 = \"\", i = 0;\n\t do {\n\t chr1 = input[i++];\n\t chr2 = input[i++];\n\t chr3 = input[i++];\n\t enc1 = chr1 >> 2;\n\t enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n\t enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n\t enc4 = chr3 & 63;\n\t if (isNaN(chr2)) {\n\t enc3 = enc4 = 64;\n\t } else if (isNaN(chr3)) {\n\t enc4 = 64;\n\t }\n\t output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n\t chr1 = chr2 = chr3 = \"\";\n\t enc1 = enc2 = enc3 = enc4 = \"\";\n\t } while (i < input.length);\n\t return output;\n\t };\n\t ExifRestorer.restore = function(origFileBase64, resizedFileBase64) {\n\t var expectedBase64Header = \"data:image/jpeg;base64,\";\n\t if (!origFileBase64.match(expectedBase64Header)) {\n\t return resizedFileBase64;\n\t }\n\t var rawImage = this.decode64(origFileBase64.replace(expectedBase64Header, \"\"));\n\t var segments = this.slice2Segments(rawImage);\n\t var image = this.exifManipulation(resizedFileBase64, segments);\n\t return expectedBase64Header + this.encode64(image);\n\t };\n\t ExifRestorer.exifManipulation = function(resizedFileBase64, segments) {\n\t var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray), aBuffer = new Uint8Array(newImageArray);\n\t return aBuffer;\n\t };\n\t ExifRestorer.getExifArray = function(segments) {\n\t var seg;\n\t for (var x = 0; x < segments.length; x++) {\n\t seg = segments[x];\n\t if (seg[0] == 255 & seg[1] == 225) {\n\t return seg;\n\t }\n\t }\n\t return [];\n\t };\n\t ExifRestorer.insertExif = function(resizedFileBase64, exifArray) {\n\t var imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\"), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;\n\t array = array.concat(exifArray);\n\t array = array.concat(ato);\n\t return array;\n\t };\n\t ExifRestorer.slice2Segments = function(rawImageArray) {\n\t var head = 0, segments = [];\n\t while (1) {\n\t if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 218) {\n\t break;\n\t }\n\t if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 216) {\n\t head += 2;\n\t } else {\n\t var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3], endPoint = head + length + 2, seg = rawImageArray.slice(head, endPoint);\n\t segments.push(seg);\n\t head = endPoint;\n\t }\n\t if (head > rawImageArray.length) {\n\t break;\n\t }\n\t }\n\t return segments;\n\t };\n\t ExifRestorer.decode64 = function(input) {\n\t var output = \"\", chr1, chr2, chr3 = \"\", enc1, enc2, enc3, enc4 = \"\", i = 0, buf = [];\n\t var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n\t if (base64test.exec(input)) {\n\t throw new Error(\"There were invalid base64 characters in the input text. \" + \"Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\");\n\t }\n\t input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\t do {\n\t enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n\t enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n\t enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n\t enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n\t chr1 = enc1 << 2 | enc2 >> 4;\n\t chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n\t chr3 = (enc3 & 3) << 6 | enc4;\n\t buf.push(chr1);\n\t if (enc3 != 64) {\n\t buf.push(chr2);\n\t }\n\t if (enc4 != 64) {\n\t buf.push(chr3);\n\t }\n\t chr1 = chr2 = chr3 = \"\";\n\t enc1 = enc2 = enc3 = enc4 = \"\";\n\t } while (i < input.length);\n\t return buf;\n\t };\n\t return ExifRestorer;\n\t }();\n\t qq.TotalProgress = function(callback, getSize) {\n\t \"use strict\";\n\t var perFileProgress = {}, totalLoaded = 0, totalSize = 0, lastLoadedSent = -1, lastTotalSent = -1, callbackProxy = function(loaded, total) {\n\t if (loaded !== lastLoadedSent || total !== lastTotalSent) {\n\t callback(loaded, total);\n\t }\n\t lastLoadedSent = loaded;\n\t lastTotalSent = total;\n\t }, noRetryableFiles = function(failed, retryable) {\n\t var none = true;\n\t qq.each(failed, function(idx, failedId) {\n\t if (qq.indexOf(retryable, failedId) >= 0) {\n\t none = false;\n\t return false;\n\t }\n\t });\n\t return none;\n\t }, onCancel = function(id) {\n\t updateTotalProgress(id, -1, -1);\n\t delete perFileProgress[id];\n\t }, onAllComplete = function(successful, failed, retryable) {\n\t if (failed.length === 0 || noRetryableFiles(failed, retryable)) {\n\t callbackProxy(totalSize, totalSize);\n\t this.reset();\n\t }\n\t }, onNew = function(id) {\n\t var size = getSize(id);\n\t if (size > 0) {\n\t updateTotalProgress(id, 0, size);\n\t perFileProgress[id] = {\n\t loaded: 0,\n\t total: size\n\t };\n\t }\n\t }, updateTotalProgress = function(id, newLoaded, newTotal) {\n\t var oldLoaded = perFileProgress[id] ? perFileProgress[id].loaded : 0, oldTotal = perFileProgress[id] ? perFileProgress[id].total : 0;\n\t if (newLoaded === -1 && newTotal === -1) {\n\t totalLoaded -= oldLoaded;\n\t totalSize -= oldTotal;\n\t } else {\n\t if (newLoaded) {\n\t totalLoaded += newLoaded - oldLoaded;\n\t }\n\t if (newTotal) {\n\t totalSize += newTotal - oldTotal;\n\t }\n\t }\n\t callbackProxy(totalLoaded, totalSize);\n\t };\n\t qq.extend(this, {\n\t onAllComplete: onAllComplete,\n\t onStatusChange: function(id, oldStatus, newStatus) {\n\t if (newStatus === qq.status.CANCELED || newStatus === qq.status.REJECTED) {\n\t onCancel(id);\n\t } else if (newStatus === qq.status.SUBMITTING) {\n\t onNew(id);\n\t }\n\t },\n\t onIndividualProgress: function(id, loaded, total) {\n\t updateTotalProgress(id, loaded, total);\n\t perFileProgress[id] = {\n\t loaded: loaded,\n\t total: total\n\t };\n\t },\n\t onNewSize: function(id) {\n\t onNew(id);\n\t },\n\t reset: function() {\n\t perFileProgress = {};\n\t totalLoaded = 0;\n\t totalSize = 0;\n\t }\n\t });\n\t };\n\t qq.PasteSupport = function(o) {\n\t \"use strict\";\n\t var options, detachPasteHandler;\n\t options = {\n\t targetElement: null,\n\t callbacks: {\n\t log: function(message, level) {},\n\t pasteReceived: function(blob) {}\n\t }\n\t };\n\t function isImage(item) {\n\t return item.type && item.type.indexOf(\"image/\") === 0;\n\t }\n\t function registerPasteHandler() {\n\t detachPasteHandler = qq(options.targetElement).attach(\"paste\", function(event) {\n\t var clipboardData = event.clipboardData;\n\t if (clipboardData) {\n\t qq.each(clipboardData.items, function(idx, item) {\n\t if (isImage(item)) {\n\t var blob = item.getAsFile();\n\t options.callbacks.pasteReceived(blob);\n\t }\n\t });\n\t }\n\t });\n\t }\n\t function unregisterPasteHandler() {\n\t if (detachPasteHandler) {\n\t detachPasteHandler();\n\t }\n\t }\n\t qq.extend(options, o);\n\t registerPasteHandler();\n\t qq.extend(this, {\n\t reset: function() {\n\t unregisterPasteHandler();\n\t }\n\t });\n\t };\n\t qq.FormSupport = function(options, startUpload, log) {\n\t \"use strict\";\n\t var self = this, interceptSubmit = options.interceptSubmit, formEl = options.element, autoUpload = options.autoUpload;\n\t qq.extend(this, {\n\t newEndpoint: null,\n\t newAutoUpload: autoUpload,\n\t attachedToForm: false,\n\t getFormInputsAsObject: function() {\n\t if (formEl == null) {\n\t return null;\n\t }\n\t return self._form2Obj(formEl);\n\t }\n\t });\n\t function determineNewEndpoint(formEl) {\n\t if (formEl.getAttribute(\"action\")) {\n\t self.newEndpoint = formEl.getAttribute(\"action\");\n\t }\n\t }\n\t function validateForm(formEl, nativeSubmit) {\n\t if (formEl.checkValidity && !formEl.checkValidity()) {\n\t log(\"Form did not pass validation checks - will not upload.\", \"error\");\n\t nativeSubmit();\n\t } else {\n\t return true;\n\t }\n\t }\n\t function maybeUploadOnSubmit(formEl) {\n\t var nativeSubmit = formEl.submit;\n\t qq(formEl).attach(\"submit\", function(event) {\n\t event = event || window.event;\n\t if (event.preventDefault) {\n\t event.preventDefault();\n\t } else {\n\t event.returnValue = false;\n\t }\n\t validateForm(formEl, nativeSubmit) && startUpload();\n\t });\n\t formEl.submit = function() {\n\t validateForm(formEl, nativeSubmit) && startUpload();\n\t };\n\t }\n\t function determineFormEl(formEl) {\n\t if (formEl) {\n\t if (qq.isString(formEl)) {\n\t formEl = document.getElementById(formEl);\n\t }\n\t if (formEl) {\n\t log(\"Attaching to form element.\");\n\t determineNewEndpoint(formEl);\n\t interceptSubmit && maybeUploadOnSubmit(formEl);\n\t }\n\t }\n\t return formEl;\n\t }\n\t formEl = determineFormEl(formEl);\n\t this.attachedToForm = !!formEl;\n\t };\n\t qq.extend(qq.FormSupport.prototype, {\n\t _form2Obj: function(form) {\n\t \"use strict\";\n\t var obj = {}, notIrrelevantType = function(type) {\n\t var irrelevantTypes = [ \"button\", \"image\", \"reset\", \"submit\" ];\n\t return qq.indexOf(irrelevantTypes, type.toLowerCase()) < 0;\n\t }, radioOrCheckbox = function(type) {\n\t return qq.indexOf([ \"checkbox\", \"radio\" ], type.toLowerCase()) >= 0;\n\t }, ignoreValue = function(el) {\n\t if (radioOrCheckbox(el.type) && !el.checked) {\n\t return true;\n\t }\n\t return el.disabled && el.type.toLowerCase() !== \"hidden\";\n\t }, selectValue = function(select) {\n\t var value = null;\n\t qq.each(qq(select).children(), function(idx, child) {\n\t if (child.tagName.toLowerCase() === \"option\" && child.selected) {\n\t value = child.value;\n\t return false;\n\t }\n\t });\n\t return value;\n\t };\n\t qq.each(form.elements, function(idx, el) {\n\t if ((qq.isInput(el, true) || el.tagName.toLowerCase() === \"textarea\") && notIrrelevantType(el.type) && !ignoreValue(el)) {\n\t obj[el.name] = el.value;\n\t } else if (el.tagName.toLowerCase() === \"select\" && !ignoreValue(el)) {\n\t var value = selectValue(el);\n\t if (value !== null) {\n\t obj[el.name] = value;\n\t }\n\t }\n\t });\n\t return obj;\n\t }\n\t });\n\t qq.traditional = qq.traditional || {};\n\t qq.traditional.FormUploadHandler = function(options, proxy) {\n\t \"use strict\";\n\t var handler = this, getName = proxy.getName, getUuid = proxy.getUuid, log = proxy.log;\n\t function getIframeContentJson(id, iframe) {\n\t var response, doc, innerHtml;\n\t try {\n\t doc = iframe.contentDocument || iframe.contentWindow.document;\n\t innerHtml = doc.body.innerHTML;\n\t log(\"converting iframe's innerHTML to JSON\");\n\t log(\"innerHTML = \" + innerHtml);\n\t if (innerHtml && innerHtml.match(/^<pre/i)) {\n\t innerHtml = doc.body.firstChild.firstChild.nodeValue;\n\t }\n\t response = handler._parseJsonResponse(innerHtml);\n\t } catch (error) {\n\t log(\"Error when attempting to parse form upload response (\" + error.message + \")\", \"error\");\n\t response = {\n\t success: false\n\t };\n\t }\n\t return response;\n\t }\n\t function createForm(id, iframe) {\n\t var params = options.paramsStore.get(id), method = options.method.toLowerCase() === \"get\" ? \"GET\" : \"POST\", endpoint = options.endpointStore.get(id), name = getName(id);\n\t params[options.uuidName] = getUuid(id);\n\t params[options.filenameParam] = name;\n\t return handler._initFormForUpload({\n\t method: method,\n\t endpoint: endpoint,\n\t params: params,\n\t paramsInBody: options.paramsInBody,\n\t targetName: iframe.name\n\t });\n\t }\n\t this.uploadFile = function(id) {\n\t var input = handler.getInput(id), iframe = handler._createIframe(id), promise = new qq.Promise(), form;\n\t form = createForm(id, iframe);\n\t form.appendChild(input);\n\t handler._attachLoadEvent(iframe, function(responseFromMessage) {\n\t log(\"iframe loaded\");\n\t var response = responseFromMessage ? responseFromMessage : getIframeContentJson(id, iframe);\n\t handler._detachLoadEvent(id);\n\t if (!options.cors.expected) {\n\t qq(iframe).remove();\n\t }\n\t if (response.success) {\n\t promise.success(response);\n\t } else {\n\t promise.failure(response);\n\t }\n\t });\n\t log(\"Sending upload request for \" + id);\n\t form.submit();\n\t qq(form).remove();\n\t return promise;\n\t };\n\t qq.extend(this, new qq.FormUploadHandler({\n\t options: {\n\t isCors: options.cors.expected,\n\t inputName: options.inputName\n\t },\n\t proxy: {\n\t onCancel: options.onCancel,\n\t getName: getName,\n\t getUuid: getUuid,\n\t log: log\n\t }\n\t }));\n\t };\n\t qq.traditional = qq.traditional || {};\n\t qq.traditional.XhrUploadHandler = function(spec, proxy) {\n\t \"use strict\";\n\t var handler = this, getName = proxy.getName, getSize = proxy.getSize, getUuid = proxy.getUuid, log = proxy.log, multipart = spec.forceMultipart || spec.paramsInBody, addChunkingSpecificParams = function(id, params, chunkData) {\n\t var size = getSize(id), name = getName(id);\n\t if (!spec.omitDefaultParams) {\n\t params[spec.chunking.paramNames.partIndex] = chunkData.part;\n\t params[spec.chunking.paramNames.partByteOffset] = chunkData.start;\n\t params[spec.chunking.paramNames.chunkSize] = chunkData.size;\n\t params[spec.chunking.paramNames.totalParts] = chunkData.count;\n\t params[spec.totalFileSizeName] = size;\n\t }\n\t if (multipart && !spec.omitDefaultParams) {\n\t params[spec.filenameParam] = name;\n\t }\n\t }, allChunksDoneRequester = new qq.traditional.AllChunksDoneAjaxRequester({\n\t cors: spec.cors,\n\t endpoint: spec.chunking.success.endpoint,\n\t headers: spec.chunking.success.headers,\n\t jsonPayload: spec.chunking.success.jsonPayload,\n\t log: log,\n\t method: spec.chunking.success.method,\n\t params: spec.chunking.success.params\n\t }), createReadyStateChangedHandler = function(id, xhr) {\n\t var promise = new qq.Promise();\n\t xhr.onreadystatechange = function() {\n\t if (xhr.readyState === 4) {\n\t var result = onUploadOrChunkComplete(id, xhr);\n\t if (result.success) {\n\t promise.success(result.response, xhr);\n\t } else {\n\t promise.failure(result.response, xhr);\n\t }\n\t }\n\t };\n\t return promise;\n\t }, getChunksCompleteParams = function(id) {\n\t var params = spec.paramsStore.get(id), name = getName(id), size = getSize(id);\n\t params[spec.uuidName] = getUuid(id);\n\t params[spec.filenameParam] = name;\n\t params[spec.totalFileSizeName] = size;\n\t params[spec.chunking.paramNames.totalParts] = handler._getTotalChunks(id);\n\t return params;\n\t }, isErrorUploadResponse = function(xhr, response) {\n\t return qq.indexOf([ 200, 201, 202, 203, 204 ], xhr.status) < 0 || spec.requireSuccessJson && !response.success || response.reset;\n\t }, onUploadOrChunkComplete = function(id, xhr) {\n\t var response;\n\t log(\"xhr - server response received for \" + id);\n\t log(\"responseText = \" + xhr.responseText);\n\t response = parseResponse(true, xhr);\n\t return {\n\t success: !isErrorUploadResponse(xhr, response),\n\t response: response\n\t };\n\t }, parseResponse = function(upload, xhr) {\n\t var response = {};\n\t try {\n\t log(qq.format(\"Received response status {} with body: {}\", xhr.status, xhr.responseText));\n\t response = qq.parseJson(xhr.responseText);\n\t } catch (error) {\n\t upload && spec.requireSuccessJson && log(\"Error when attempting to parse xhr response text (\" + error.message + \")\", \"error\");\n\t }\n\t return response;\n\t }, sendChunksCompleteRequest = function(id) {\n\t var promise = new qq.Promise();\n\t allChunksDoneRequester.complete(id, handler._createXhr(id), getChunksCompleteParams(id), spec.customHeaders.get(id)).then(function(xhr) {\n\t promise.success(parseResponse(false, xhr), xhr);\n\t }, function(xhr) {\n\t promise.failure(parseResponse(false, xhr), xhr);\n\t });\n\t return promise;\n\t }, setParamsAndGetEntityToSend = function(entityToSendParams) {\n\t var fileOrBlob = entityToSendParams.fileOrBlob;\n\t var id = entityToSendParams.id;\n\t var xhr = entityToSendParams.xhr;\n\t var xhrOverrides = entityToSendParams.xhrOverrides || {};\n\t var customParams = entityToSendParams.customParams || {};\n\t var defaultParams = entityToSendParams.params || {};\n\t var xhrOverrideParams = xhrOverrides.params || {};\n\t var params;\n\t var formData = multipart ? new FormData() : null, method = xhrOverrides.method || spec.method, endpoint = xhrOverrides.endpoint || spec.endpointStore.get(id), name = getName(id), size = getSize(id);\n\t if (spec.omitDefaultParams) {\n\t params = qq.extend({}, customParams);\n\t qq.extend(params, xhrOverrideParams);\n\t } else {\n\t params = qq.extend({}, customParams);\n\t qq.extend(params, xhrOverrideParams);\n\t qq.extend(params, defaultParams);\n\t params[spec.uuidName] = getUuid(id);\n\t params[spec.filenameParam] = name;\n\t if (multipart) {\n\t params[spec.totalFileSizeName] = size;\n\t } else if (!spec.paramsInBody) {\n\t params[spec.inputName] = name;\n\t }\n\t }\n\t if (!spec.paramsInBody) {\n\t endpoint = qq.obj2url(params, endpoint);\n\t }\n\t xhr.open(method, endpoint, true);\n\t if (spec.cors.expected && spec.cors.sendCredentials) {\n\t xhr.withCredentials = true;\n\t }\n\t if (multipart) {\n\t if (spec.paramsInBody) {\n\t qq.obj2FormData(params, formData);\n\t }\n\t formData.append(spec.inputName, fileOrBlob);\n\t return formData;\n\t }\n\t return fileOrBlob;\n\t }, setUploadHeaders = function(headersOptions) {\n\t var headerOverrides = headersOptions.headerOverrides;\n\t var id = headersOptions.id;\n\t var xhr = headersOptions.xhr;\n\t if (headerOverrides) {\n\t qq.each(headerOverrides, function(headerName, headerValue) {\n\t xhr.setRequestHeader(headerName, headerValue);\n\t });\n\t } else {\n\t var extraHeaders = spec.customHeaders.get(id), fileOrBlob = handler.getFile(id);\n\t xhr.setRequestHeader(\"Accept\", \"application/json\");\n\t xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\t xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n\t if (!multipart) {\n\t xhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\n\t xhr.setRequestHeader(\"X-Mime-Type\", fileOrBlob.type);\n\t }\n\t qq.each(extraHeaders, function(name, val) {\n\t xhr.setRequestHeader(name, val);\n\t });\n\t }\n\t };\n\t qq.extend(this, {\n\t uploadChunk: function(uploadChunkParams) {\n\t var id = uploadChunkParams.id;\n\t var chunkIdx = uploadChunkParams.chunkIdx;\n\t var overrides = uploadChunkParams.overrides || {};\n\t var resuming = uploadChunkParams.resuming;\n\t var chunkData = handler._getChunkData(id, chunkIdx), xhr = handler._createXhr(id, chunkIdx), promise, toSend, customParams, params = {};\n\t promise = createReadyStateChangedHandler(id, xhr);\n\t handler._registerProgressHandler(id, chunkIdx, chunkData.size);\n\t customParams = spec.paramsStore.get(id);\n\t addChunkingSpecificParams(id, params, chunkData);\n\t if (resuming) {\n\t params[spec.resume.paramNames.resuming] = true;\n\t }\n\t toSend = setParamsAndGetEntityToSend({\n\t fileOrBlob: chunkData.blob,\n\t id: id,\n\t customParams: customParams,\n\t params: params,\n\t xhr: xhr,\n\t xhrOverrides: overrides\n\t });\n\t setUploadHeaders({\n\t headerOverrides: overrides.headers,\n\t id: id,\n\t xhr: xhr\n\t });\n\t xhr.send(toSend);\n\t return promise;\n\t },\n\t uploadFile: function(id) {\n\t var fileOrBlob = handler.getFile(id), promise, xhr, customParams, toSend;\n\t xhr = handler._createXhr(id);\n\t handler._registerProgressHandler(id);\n\t promise = createReadyStateChangedHandler(id, xhr);\n\t customParams = spec.paramsStore.get(id);\n\t toSend = setParamsAndGetEntityToSend({\n\t fileOrBlob: fileOrBlob,\n\t id: id,\n\t customParams: customParams,\n\t xhr: xhr\n\t });\n\t setUploadHeaders({\n\t id: id,\n\t xhr: xhr\n\t });\n\t xhr.send(toSend);\n\t return promise;\n\t }\n\t });\n\t qq.extend(this, new qq.XhrUploadHandler({\n\t options: qq.extend({\n\t namespace: \"traditional\"\n\t }, spec),\n\t proxy: qq.extend({\n\t getEndpoint: spec.endpointStore.get\n\t }, proxy)\n\t }));\n\t qq.override(this, function(super_) {\n\t return {\n\t finalizeChunks: function(id) {\n\t proxy.onFinalizing(id);\n\t if (spec.chunking.success.endpoint) {\n\t return sendChunksCompleteRequest(id);\n\t } else {\n\t return super_.finalizeChunks(id, qq.bind(parseResponse, this, true));\n\t }\n\t }\n\t };\n\t });\n\t };\n\t qq.traditional.AllChunksDoneAjaxRequester = function(o) {\n\t \"use strict\";\n\t var requester, options = {\n\t cors: {\n\t allowXdr: false,\n\t expected: false,\n\t sendCredentials: false\n\t },\n\t endpoint: null,\n\t log: function(str, level) {},\n\t method: \"POST\"\n\t }, promises = {}, endpointHandler = {\n\t get: function(id) {\n\t if (qq.isFunction(options.endpoint)) {\n\t return options.endpoint(id);\n\t }\n\t return options.endpoint;\n\t }\n\t };\n\t qq.extend(options, o);\n\t requester = qq.extend(this, new qq.AjaxRequester({\n\t acceptHeader: \"application/json\",\n\t contentType: options.jsonPayload ? \"application/json\" : \"application/x-www-form-urlencoded\",\n\t validMethods: [ options.method ],\n\t method: options.method,\n\t endpointStore: endpointHandler,\n\t allowXRequestedWithAndCacheControl: false,\n\t cors: options.cors,\n\t log: options.log,\n\t onComplete: function(id, xhr, isError) {\n\t var promise = promises[id];\n\t delete promises[id];\n\t if (isError) {\n\t promise.failure(xhr);\n\t } else {\n\t promise.success(xhr);\n\t }\n\t }\n\t }));\n\t qq.extend(this, {\n\t complete: function(id, xhr, params, headers) {\n\t var promise = new qq.Promise();\n\t options.log(\"Submitting All Chunks Done request for \" + id);\n\t promises[id] = promise;\n\t requester.initTransport(id).withParams(options.params(id) || params).withHeaders(options.headers(id) || headers).send(xhr);\n\t return promise;\n\t }\n\t });\n\t };\n\t qq.DragAndDrop = function(o) {\n\t \"use strict\";\n\t var options, HIDE_ZONES_EVENT_NAME = \"qq-hidezones\", HIDE_BEFORE_ENTER_ATTR = \"qq-hide-dropzone\", uploadDropZones = [], droppedFiles = [], disposeSupport = new qq.DisposeSupport();\n\t options = {\n\t dropZoneElements: [],\n\t allowMultipleItems: true,\n\t classes: {\n\t dropActive: null\n\t },\n\t callbacks: new qq.DragAndDrop.callbacks()\n\t };\n\t qq.extend(options, o, true);\n\t function uploadDroppedFiles(files, uploadDropZone) {\n\t var filesAsArray = Array.prototype.slice.call(files);\n\t options.callbacks.dropLog(\"Grabbed \" + files.length + \" dropped files.\");\n\t uploadDropZone.dropDisabled(false);\n\t options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement());\n\t }\n\t function traverseFileTree(entry) {\n\t var parseEntryPromise = new qq.Promise();\n\t if (entry.isFile) {\n\t entry.file(function(file) {\n\t file.qqPath = extractDirectoryPath(entry);\n\t droppedFiles.push(file);\n\t parseEntryPromise.success();\n\t }, function(fileError) {\n\t options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n\t parseEntryPromise.failure();\n\t });\n\t } else if (entry.isDirectory) {\n\t getFilesInDirectory(entry).then(function allEntriesRead(entries) {\n\t var entriesLeft = entries.length;\n\t qq.each(entries, function(idx, entry) {\n\t traverseFileTree(entry).done(function() {\n\t entriesLeft -= 1;\n\t if (entriesLeft === 0) {\n\t parseEntryPromise.success();\n\t }\n\t });\n\t });\n\t if (!entries.length) {\n\t parseEntryPromise.success();\n\t }\n\t }, function readFailure(fileError) {\n\t options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n\t parseEntryPromise.failure();\n\t });\n\t }\n\t return parseEntryPromise;\n\t }\n\t function extractDirectoryPath(entry) {\n\t var name = entry.name, fullPath = entry.fullPath, indexOfNameInFullPath = fullPath.lastIndexOf(name);\n\t fullPath = fullPath.substr(0, indexOfNameInFullPath);\n\t if (fullPath.charAt(0) === \"/\") {\n\t fullPath = fullPath.substr(1);\n\t }\n\t return fullPath;\n\t }\n\t function getFilesInDirectory(entry, reader, accumEntries, existingPromise) {\n\t var promise = existingPromise || new qq.Promise(), dirReader = reader || entry.createReader();\n\t dirReader.readEntries(function readSuccess(entries) {\n\t var newEntries = accumEntries ? accumEntries.concat(entries) : entries;\n\t if (entries.length) {\n\t setTimeout(function() {\n\t getFilesInDirectory(entry, dirReader, newEntries, promise);\n\t }, 0);\n\t } else {\n\t promise.success(newEntries);\n\t }\n\t }, promise.failure);\n\t return promise;\n\t }\n\t function handleDataTransfer(dataTransfer, uploadDropZone) {\n\t var pendingFolderPromises = [], handleDataTransferPromise = new qq.Promise();\n\t options.callbacks.processingDroppedFiles();\n\t uploadDropZone.dropDisabled(true);\n\t if (dataTransfer.files.length > 1 && !options.allowMultipleItems) {\n\t options.callbacks.processingDroppedFilesComplete([]);\n\t options.callbacks.dropError(\"tooManyFilesError\", \"\");\n\t uploadDropZone.dropDisabled(false);\n\t handleDataTransferPromise.failure();\n\t } else {\n\t droppedFiles = [];\n\t if (qq.isFolderDropSupported(dataTransfer)) {\n\t qq.each(dataTransfer.items, function(idx, item) {\n\t var entry = item.webkitGetAsEntry();\n\t if (entry) {\n\t if (entry.isFile) {\n\t droppedFiles.push(item.getAsFile());\n\t } else {\n\t pendingFolderPromises.push(traverseFileTree(entry).done(function() {\n\t pendingFolderPromises.pop();\n\t if (pendingFolderPromises.length === 0) {\n\t handleDataTransferPromise.success();\n\t }\n\t }));\n\t }\n\t }\n\t });\n\t } else {\n\t droppedFiles = dataTransfer.files;\n\t }\n\t if (pendingFolderPromises.length === 0) {\n\t handleDataTransferPromise.success();\n\t }\n\t }\n\t return handleDataTransferPromise;\n\t }\n\t function setupDropzone(dropArea) {\n\t var dropZone = new qq.UploadDropZone({\n\t HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME,\n\t element: dropArea,\n\t onEnter: function(e) {\n\t qq(dropArea).addClass(options.classes.dropActive);\n\t e.stopPropagation();\n\t },\n\t onLeaveNotDescendants: function(e) {\n\t qq(dropArea).removeClass(options.classes.dropActive);\n\t },\n\t onDrop: function(e) {\n\t handleDataTransfer(e.dataTransfer, dropZone).then(function() {\n\t uploadDroppedFiles(droppedFiles, dropZone);\n\t }, function() {\n\t options.callbacks.dropLog(\"Drop event DataTransfer parsing failed. No files will be uploaded.\", \"error\");\n\t });\n\t }\n\t });\n\t disposeSupport.addDisposer(function() {\n\t dropZone.dispose();\n\t });\n\t qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide();\n\t uploadDropZones.push(dropZone);\n\t return dropZone;\n\t }\n\t function isFileDrag(dragEvent) {\n\t var fileDrag;\n\t qq.each(dragEvent.dataTransfer.types, function(key, val) {\n\t if (val === \"Files\") {\n\t fileDrag = true;\n\t return false;\n\t }\n\t });\n\t return fileDrag;\n\t }\n\t function leavingDocumentOut(e) {\n\t if (qq.safari()) {\n\t return e.x < 0 || e.y < 0;\n\t }\n\t return e.x === 0 && e.y === 0;\n\t }\n\t function setupDragDrop() {\n\t var dropZones = options.dropZoneElements, maybeHideDropZones = function() {\n\t setTimeout(function() {\n\t qq.each(dropZones, function(idx, dropZone) {\n\t qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();\n\t qq(dropZone).removeClass(options.classes.dropActive);\n\t });\n\t }, 10);\n\t };\n\t qq.each(dropZones, function(idx, dropZone) {\n\t var uploadDropZone = setupDropzone(dropZone);\n\t if (dropZones.length && qq.supportedFeatures.fileDrop) {\n\t disposeSupport.attach(document, \"dragenter\", function(e) {\n\t if (!uploadDropZone.dropDisabled() && isFileDrag(e)) {\n\t qq.each(dropZones, function(idx, dropZone) {\n\t if (dropZone instanceof HTMLElement && qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR)) {\n\t qq(dropZone).css({\n\t display: \"block\"\n\t });\n\t }\n\t });\n\t }\n\t });\n\t }\n\t });\n\t disposeSupport.attach(document, \"dragleave\", function(e) {\n\t if (leavingDocumentOut(e)) {\n\t maybeHideDropZones();\n\t }\n\t });\n\t disposeSupport.attach(qq(document).children()[0], \"mouseenter\", function(e) {\n\t maybeHideDropZones();\n\t });\n\t disposeSupport.attach(document, \"drop\", function(e) {\n\t if (isFileDrag(e)) {\n\t e.preventDefault();\n\t maybeHideDropZones();\n\t }\n\t });\n\t disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, maybeHideDropZones);\n\t }\n\t setupDragDrop();\n\t qq.extend(this, {\n\t setupExtraDropzone: function(element) {\n\t options.dropZoneElements.push(element);\n\t setupDropzone(element);\n\t },\n\t removeDropzone: function(element) {\n\t var i, dzs = options.dropZoneElements;\n\t for (i in dzs) {\n\t if (dzs[i] === element) {\n\t return dzs.splice(i, 1);\n\t }\n\t }\n\t },\n\t dispose: function() {\n\t disposeSupport.dispose();\n\t qq.each(uploadDropZones, function(idx, dropZone) {\n\t dropZone.dispose();\n\t });\n\t }\n\t });\n\t this._testing = {};\n\t this._testing.extractDirectoryPath = extractDirectoryPath;\n\t };\n\t qq.DragAndDrop.callbacks = function() {\n\t \"use strict\";\n\t return {\n\t processingDroppedFiles: function() {},\n\t processingDroppedFilesComplete: function(files, targetEl) {},\n\t dropError: function(code, errorSpecifics) {\n\t qq.log(\"Drag & drop error code '\" + code + \" with these specifics: '\" + errorSpecifics + \"'\", \"error\");\n\t },\n\t dropLog: function(message, level) {\n\t qq.log(message, level);\n\t }\n\t };\n\t };\n\t qq.UploadDropZone = function(o) {\n\t \"use strict\";\n\t var disposeSupport = new qq.DisposeSupport(), options, element, preventDrop, dropOutsideDisabled;\n\t options = {\n\t element: null,\n\t onEnter: function(e) {},\n\t onLeave: function(e) {},\n\t onLeaveNotDescendants: function(e) {},\n\t onDrop: function(e) {}\n\t };\n\t qq.extend(options, o);\n\t element = options.element;\n\t function dragoverShouldBeCanceled() {\n\t return qq.safari() || qq.firefox() && qq.windows();\n\t }\n\t function disableDropOutside(e) {\n\t if (!dropOutsideDisabled) {\n\t if (dragoverShouldBeCanceled) {\n\t disposeSupport.attach(document, \"dragover\", function(e) {\n\t e.preventDefault();\n\t });\n\t } else {\n\t disposeSupport.attach(document, \"dragover\", function(e) {\n\t if (e.dataTransfer) {\n\t e.dataTransfer.dropEffect = \"none\";\n\t e.preventDefault();\n\t }\n\t });\n\t }\n\t dropOutsideDisabled = true;\n\t }\n\t }\n\t function isValidFileDrag(e) {\n\t if (!qq.supportedFeatures.fileDrop) {\n\t return false;\n\t }\n\t var effectTest, dt = e.dataTransfer, isSafari = qq.safari();\n\t effectTest = qq.ie() && qq.supportedFeatures.fileDrop ? true : dt.effectAllowed !== \"none\";\n\t return dt && effectTest && (dt.files && dt.files.length || !isSafari && dt.types.contains && dt.types.contains(\"Files\") || dt.types.includes && dt.types.includes(\"Files\"));\n\t }\n\t function isOrSetDropDisabled(isDisabled) {\n\t if (isDisabled !== undefined) {\n\t preventDrop = isDisabled;\n\t }\n\t return preventDrop;\n\t }\n\t function triggerHidezonesEvent() {\n\t var hideZonesEvent;\n\t function triggerUsingOldApi() {\n\t hideZonesEvent = document.createEvent(\"Event\");\n\t hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true);\n\t }\n\t if (window.CustomEvent) {\n\t try {\n\t hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME);\n\t } catch (err) {\n\t triggerUsingOldApi();\n\t }\n\t } else {\n\t triggerUsingOldApi();\n\t }\n\t document.dispatchEvent(hideZonesEvent);\n\t }\n\t function attachEvents() {\n\t disposeSupport.attach(element, \"dragover\", function(e) {\n\t if (!isValidFileDrag(e)) {\n\t return;\n\t }\n\t var effect = qq.ie() && qq.supportedFeatures.fileDrop ? null : e.dataTransfer.effectAllowed;\n\t if (effect === \"move\" || effect === \"linkMove\") {\n\t e.dataTransfer.dropEffect = \"move\";\n\t } else {\n\t e.dataTransfer.dropEffect = \"copy\";\n\t }\n\t e.stopPropagation();\n\t e.preventDefault();\n\t });\n\t disposeSupport.attach(element, \"dragenter\", function(e) {\n\t if (!isOrSetDropDisabled()) {\n\t if (!isValidFileDrag(e)) {\n\t return;\n\t }\n\t options.onEnter(e);\n\t }\n\t });\n\t disposeSupport.attach(element, \"dragleave\", function(e) {\n\t if (!isValidFileDrag(e)) {\n\t return;\n\t }\n\t options.onLeave(e);\n\t var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n\t if (qq(this).contains(relatedTarget)) {\n\t return;\n\t }\n\t options.onLeaveNotDescendants(e);\n\t });\n\t disposeSupport.attach(element, \"drop\", function(e) {\n\t if (!isOrSetDropDisabled()) {\n\t if (!isValidFileDrag(e)) {\n\t return;\n\t }\n\t e.preventDefault();\n\t e.stopPropagation();\n\t options.onDrop(e);\n\t triggerHidezonesEvent();\n\t }\n\t });\n\t }\n\t disableDropOutside();\n\t attachEvents();\n\t qq.extend(this, {\n\t dropDisabled: function(isDisabled) {\n\t return isOrSetDropDisabled(isDisabled);\n\t },\n\t dispose: function() {\n\t disposeSupport.dispose();\n\t },\n\t getElement: function() {\n\t return element;\n\t }\n\t });\n\t this._testing = {};\n\t this._testing.isValidFileDrag = isValidFileDrag;\n\t };\n\t (function() {\n\t \"use strict\";\n\t qq.uiPublicApi = {\n\t addInitialFiles: function(cannedFileList) {\n\t this._parent.prototype.addInitialFiles.apply(this, arguments);\n\t this._templating.addCacheToDom();\n\t },\n\t clearStoredFiles: function() {\n\t this._parent.prototype.clearStoredFiles.apply(this, arguments);\n\t this._templating.clearFiles();\n\t },\n\t addExtraDropzone: function(element) {\n\t this._dnd && this._dnd.setupExtraDropzone(element);\n\t },\n\t removeExtraDropzone: function(element) {\n\t if (this._dnd) {\n\t return this._dnd.removeDropzone(element);\n\t }\n\t },\n\t getItemByFileId: function(id) {\n\t if (!this._templating.isHiddenForever(id)) {\n\t return this._templating.getFileContainer(id);\n\t }\n\t },\n\t reset: function() {\n\t this._parent.prototype.reset.apply(this, arguments);\n\t this._templating.reset();\n\t if (!this._options.button && this._templating.getButton()) {\n\t this._defaultButtonId = this._createUploadButton({\n\t element: this._templating.getButton(),\n\t title: this._options.text.fileInputTitle\n\t }).getButtonId();\n\t }\n\t if (this._dnd) {\n\t this._dnd.dispose();\n\t this._dnd = this._setupDragAndDrop();\n\t }\n\t this._totalFilesInBatch = 0;\n\t this._filesInBatchAddedToUi = 0;\n\t this._setupClickAndEditEventHandlers();\n\t },\n\t setName: function(id, newName) {\n\t var formattedFilename = this._options.formatFileName(newName);\n\t this._parent.prototype.setName.apply(this, arguments);\n\t this._templating.updateFilename(id, formattedFilename);\n\t },\n\t pauseUpload: function(id) {\n\t var paused = this._parent.prototype.pauseUpload.apply(this, arguments);\n\t paused && this._templating.uploadPaused(id);\n\t return paused;\n\t },\n\t continueUpload: function(id) {\n\t var continued = this._parent.prototype.continueUpload.apply(this, arguments);\n\t continued && this._templating.uploadContinued(id);\n\t return continued;\n\t },\n\t getId: function(fileContainerOrChildEl) {\n\t return this._templating.getFileId(fileContainerOrChildEl);\n\t },\n\t getDropTarget: function(fileId) {\n\t var file = this.getFile(fileId);\n\t return file.qqDropTarget;\n\t }\n\t };\n\t qq.uiPrivateApi = {\n\t _getButton: function(buttonId) {\n\t var button = this._parent.prototype._getButton.apply(this, arguments);\n\t if (!button) {\n\t if (buttonId === this._defaultButtonId) {\n\t button = this._templating.getButton();\n\t }\n\t }\n\t return button;\n\t },\n\t _removeFileItem: function(fileId) {\n\t this._templating.removeFile(fileId);\n\t },\n\t _setupClickAndEditEventHandlers: function() {\n\t this._fileButtonsClickHandler = qq.FileButtonsClickHandler && this._bindFileButtonsClickEvent();\n\t this._focusinEventSupported = !qq.firefox();\n\t if (this._isEditFilenameEnabled()) {\n\t this._filenameClickHandler = this._bindFilenameClickEvent();\n\t this._filenameInputFocusInHandler = this._bindFilenameInputFocusInEvent();\n\t this._filenameInputFocusHandler = this._bindFilenameInputFocusEvent();\n\t }\n\t },\n\t _setupDragAndDrop: function() {\n\t var self = this, dropZoneElements = this._options.dragAndDrop.extraDropzones, templating = this._templating, defaultDropZone = templating.getDropZone();\n\t defaultDropZone && dropZoneElements.push(defaultDropZone);\n\t return new qq.DragAndDrop({\n\t dropZoneElements: dropZoneElements,\n\t allowMultipleItems: this._options.multiple,\n\t classes: {\n\t dropActive: this._options.classes.dropActive\n\t },\n\t callbacks: {\n\t processingDroppedFiles: function() {\n\t templating.showDropProcessing();\n\t },\n\t processingDroppedFilesComplete: function(files, targetEl) {\n\t templating.hideDropProcessing();\n\t qq.each(files, function(idx, file) {\n\t file.qqDropTarget = targetEl;\n\t });\n\t if (files.length) {\n\t self.addFiles(files, null, null);\n\t }\n\t },\n\t dropError: function(code, errorData) {\n\t self._itemError(code, errorData);\n\t },\n\t dropLog: function(message, level) {\n\t self.log(message, level);\n\t }\n\t }\n\t });\n\t },\n\t _bindFileButtonsClickEvent: function() {\n\t var self = this;\n\t return new qq.FileButtonsClickHandler({\n\t templating: this._templating,\n\t log: function(message, lvl) {\n\t self.log(message, lvl);\n\t },\n\t onDeleteFile: function(fileId) {\n\t self.deleteFile(fileId);\n\t },\n\t onCancel: function(fileId) {\n\t self.cancel(fileId);\n\t },\n\t onRetry: function(fileId) {\n\t self.retry(fileId);\n\t },\n\t onPause: function(fileId) {\n\t self.pauseUpload(fileId);\n\t },\n\t onContinue: function(fileId) {\n\t self.continueUpload(fileId);\n\t },\n\t onGetName: function(fileId) {\n\t return self.getName(fileId);\n\t }\n\t });\n\t },\n\t _isEditFilenameEnabled: function() {\n\t return this._templating.isEditFilenamePossible() && !this._options.autoUpload && qq.FilenameClickHandler && qq.FilenameInputFocusHandler && qq.FilenameInputFocusHandler;\n\t },\n\t _filenameEditHandler: function() {\n\t var self = this, templating = this._templating;\n\t return {\n\t templating: templating,\n\t log: function(message, lvl) {\n\t self.log(message, lvl);\n\t },\n\t onGetUploadStatus: function(fileId) {\n\t return self.getUploads({\n\t id: fileId\n\t }).status;\n\t },\n\t onGetName: function(fileId) {\n\t return self.getName(fileId);\n\t },\n\t onSetName: function(id, newName) {\n\t self.setName(id, newName);\n\t },\n\t onEditingStatusChange: function(id, isEditing) {\n\t var qqInput = qq(templating.getEditInput(id)), qqFileContainer = qq(templating.getFileContainer(id));\n\t if (isEditing) {\n\t qqInput.addClass(\"qq-editing\");\n\t templating.hideFilename(id);\n\t templating.hideEditIcon(id);\n\t } else {\n\t qqInput.removeClass(\"qq-editing\");\n\t templating.showFilename(id);\n\t templating.showEditIcon(id);\n\t }\n\t qqFileContainer.addClass(\"qq-temp\").removeClass(\"qq-temp\");\n\t }\n\t };\n\t },\n\t _onUploadStatusChange: function(id, oldStatus, newStatus) {\n\t this._parent.prototype._onUploadStatusChange.apply(this, arguments);\n\t if (this._isEditFilenameEnabled()) {\n\t if (this._templating.getFileContainer(id) && newStatus !== qq.status.SUBMITTED) {\n\t this._templating.markFilenameEditable(id);\n\t this._templating.hideEditIcon(id);\n\t }\n\t }\n\t if (oldStatus === qq.status.UPLOAD_RETRYING && newStatus === qq.status.UPLOADING) {\n\t this._templating.hideRetry(id);\n\t this._templating.setStatusText(id);\n\t qq(this._templating.getFileContainer(id)).removeClass(this._classes.retrying);\n\t } else if (newStatus === qq.status.UPLOAD_FAILED) {\n\t this._templating.hidePause(id);\n\t }\n\t },\n\t _bindFilenameInputFocusInEvent: function() {\n\t var spec = qq.extend({}, this._filenameEditHandler());\n\t return new qq.FilenameInputFocusInHandler(spec);\n\t },\n\t _bindFilenameInputFocusEvent: function() {\n\t var spec = qq.extend({}, this._filenameEditHandler());\n\t return new qq.FilenameInputFocusHandler(spec);\n\t },\n\t _bindFilenameClickEvent: function() {\n\t var spec = qq.extend({}, this._filenameEditHandler());\n\t return new qq.FilenameClickHandler(spec);\n\t },\n\t _storeForLater: function(id) {\n\t this._parent.prototype._storeForLater.apply(this, arguments);\n\t this._templating.hideSpinner(id);\n\t },\n\t _onAllComplete: function(successful, failed) {\n\t this._parent.prototype._onAllComplete.apply(this, arguments);\n\t this._templating.resetTotalProgress();\n\t },\n\t _onSubmit: function(id, name) {\n\t var file = this.getFile(id);\n\t if (file && file.qqPath && this._options.dragAndDrop.reportDirectoryPaths) {\n\t this._paramsStore.addReadOnly(id, {\n\t qqpath: file.qqPath\n\t });\n\t }\n\t this._parent.prototype._onSubmit.apply(this, arguments);\n\t this._addToList(id, name);\n\t },\n\t _onSubmitted: function(id) {\n\t if (this._isEditFilenameEnabled()) {\n\t this._templating.markFilenameEditable(id);\n\t this._templating.showEditIcon(id);\n\t if (!this._focusinEventSupported) {\n\t this._filenameInputFocusHandler.addHandler(this._templating.getEditInput(id));\n\t }\n\t }\n\t },\n\t _onProgress: function(id, name, loaded, total) {\n\t this._parent.prototype._onProgress.apply(this, arguments);\n\t this._templating.updateProgress(id, loaded, total);\n\t if (total === 0 || Math.round(loaded / total * 100) === 100) {\n\t this._templating.hideCancel(id);\n\t this._templating.hidePause(id);\n\t this._templating.hideProgress(id);\n\t this._templating.setStatusText(id, this._options.text.waitingForResponse);\n\t this._displayFileSize(id);\n\t } else {\n\t this._displayFileSize(id, loaded, total);\n\t }\n\t },\n\t _onTotalProgress: function(loaded, total) {\n\t this._parent.prototype._onTotalProgress.apply(this, arguments);\n\t this._templating.updateTotalProgress(loaded, total);\n\t },\n\t _onComplete: function(id, name, result, xhr) {\n\t var parentRetVal = this._parent.prototype._onComplete.apply(this, arguments), templating = this._templating, fileContainer = templating.getFileContainer(id), self = this;\n\t function completeUpload(result) {\n\t if (!fileContainer) {\n\t return;\n\t }\n\t templating.setStatusText(id);\n\t qq(fileContainer).removeClass(self._classes.retrying);\n\t templating.hideProgress(id);\n\t if (self.getUploads({\n\t id: id\n\t }).status !== qq.status.UPLOAD_FAILED) {\n\t templating.hideCancel(id);\n\t }\n\t templating.hideSpinner(id);\n\t if (result.success) {\n\t self._markFileAsSuccessful(id);\n\t } else {\n\t qq(fileContainer).addClass(self._classes.fail);\n\t templating.showCancel(id);\n\t if (templating.isRetryPossible() && !self._preventRetries[id]) {\n\t qq(fileContainer).addClass(self._classes.retryable);\n\t templating.showRetry(id);\n\t }\n\t self._controlFailureTextDisplay(id, result);\n\t }\n\t }\n\t if (parentRetVal instanceof qq.Promise) {\n\t parentRetVal.done(function(newResult) {\n\t completeUpload(newResult);\n\t });\n\t } else {\n\t completeUpload(result);\n\t }\n\t return parentRetVal;\n\t },\n\t _markFileAsSuccessful: function(id) {\n\t var templating = this._templating;\n\t if (this._isDeletePossible()) {\n\t templating.showDeleteButton(id);\n\t }\n\t qq(templating.getFileContainer(id)).addClass(this._classes.success);\n\t this._maybeUpdateThumbnail(id);\n\t },\n\t _onUploadPrep: function(id) {\n\t this._parent.prototype._onUploadPrep.apply(this, arguments);\n\t this._templating.showSpinner(id);\n\t },\n\t _onUpload: function(id, name) {\n\t var parentRetVal = this._parent.prototype._onUpload.apply(this, arguments);\n\t this._templating.showSpinner(id);\n\t return parentRetVal;\n\t },\n\t _onUploadChunk: function(id, chunkData) {\n\t this._parent.prototype._onUploadChunk.apply(this, arguments);\n\t if (chunkData.partIndex > 0 && this._handler.isResumable(id)) {\n\t this._templating.allowPause(id);\n\t }\n\t },\n\t _onCancel: function(id, name) {\n\t this._parent.prototype._onCancel.apply(this, arguments);\n\t this._removeFileItem(id);\n\t if (this._getNotFinished() === 0) {\n\t this._templating.resetTotalProgress();\n\t }\n\t },\n\t _onBeforeAutoRetry: function(id) {\n\t var retryNumForDisplay, maxAuto, retryNote;\n\t this._parent.prototype._onBeforeAutoRetry.apply(this, arguments);\n\t this._showCancelLink(id);\n\t if (this._options.retry.showAutoRetryNote) {\n\t retryNumForDisplay = this._autoRetries[id];\n\t maxAuto = this._options.retry.maxAutoAttempts;\n\t retryNote = this._options.retry.autoRetryNote.replace(/\\{retryNum\\}/g, retryNumForDisplay);\n\t retryNote = retryNote.replace(/\\{maxAuto\\}/g, maxAuto);\n\t this._templating.setStatusText(id, retryNote);\n\t qq(this._templating.getFileContainer(id)).addClass(this._classes.retrying);\n\t }\n\t },\n\t _onBeforeManualRetry: function(id) {\n\t if (this._parent.prototype._onBeforeManualRetry.apply(this, arguments)) {\n\t this._templating.resetProgress(id);\n\t qq(this._templating.getFileContainer(id)).removeClass(this._classes.fail);\n\t this._templating.setStatusText(id);\n\t this._templating.showSpinner(id);\n\t this._showCancelLink(id);\n\t return true;\n\t } else {\n\t qq(this._templating.getFileContainer(id)).addClass(this._classes.retryable);\n\t this._templating.showRetry(id);\n\t return false;\n\t }\n\t },\n\t _onSubmitDelete: function(id) {\n\t var onSuccessCallback = qq.bind(this._onSubmitDeleteSuccess, this);\n\t this._parent.prototype._onSubmitDelete.call(this, id, onSuccessCallback);\n\t },\n\t _onSubmitDeleteSuccess: function(id, uuid, additionalMandatedParams) {\n\t if (this._options.deleteFile.forceConfirm) {\n\t this._showDeleteConfirm.apply(this, arguments);\n\t } else {\n\t this._sendDeleteRequest.apply(this, arguments);\n\t }\n\t },\n\t _onDeleteComplete: function(id, xhr, isError) {\n\t this._parent.prototype._onDeleteComplete.apply(this, arguments);\n\t this._templating.hideSpinner(id);\n\t if (isError) {\n\t this._templating.setStatusText(id, this._options.deleteFile.deletingFailedText);\n\t this._templating.showDeleteButton(id);\n\t } else {\n\t this._removeFileItem(id);\n\t }\n\t },\n\t _sendDeleteRequest: function(id, uuid, additionalMandatedParams) {\n\t this._templating.hideDeleteButton(id);\n\t this._templating.showSpinner(id);\n\t this._templating.setStatusText(id, this._options.deleteFile.deletingStatusText);\n\t this._deleteHandler.sendDelete.apply(this, arguments);\n\t },\n\t _showDeleteConfirm: function(id, uuid, mandatedParams) {\n\t var fileName = this.getName(id), confirmMessage = this._options.deleteFile.confirmMessage.replace(/\\{filename\\}/g, fileName), uuid = this.getUuid(id), deleteRequestArgs = arguments, self = this, retVal;\n\t retVal = this._options.showConfirm(confirmMessage);\n\t if (qq.isGenericPromise(retVal)) {\n\t retVal.then(function() {\n\t self._sendDeleteRequest.apply(self, deleteRequestArgs);\n\t });\n\t } else if (retVal !== false) {\n\t self._sendDeleteRequest.apply(self, deleteRequestArgs);\n\t }\n\t },\n\t _addToList: function(id, name, canned) {\n\t var prependData, prependIndex = 0, dontDisplay = this._handler.isProxied(id) && this._options.scaling.hideScaled, record;\n\t if (this._options.display.prependFiles) {\n\t if (this._totalFilesInBatch > 1 && this._filesInBatchAddedToUi > 0) {\n\t prependIndex = this._filesInBatchAddedToUi - 1;\n\t }\n\t prependData = {\n\t index: prependIndex\n\t };\n\t }\n\t if (!canned) {\n\t if (this._options.disableCancelForFormUploads && !qq.supportedFeatures.ajaxUploading) {\n\t this._templating.disableCancel();\n\t }\n\t if (!this._options.multiple) {\n\t record = this.getUploads({\n\t id: id\n\t });\n\t this._handledProxyGroup = this._handledProxyGroup || record.proxyGroupId;\n\t if (record.proxyGroupId !== this._handledProxyGroup || !record.proxyGroupId) {\n\t this._handler.cancelAll();\n\t this._clearList();\n\t this._handledProxyGroup = null;\n\t }\n\t }\n\t }\n\t if (canned) {\n\t this._templating.addFileToCache(id, this._options.formatFileName(name), prependData, dontDisplay);\n\t this._templating.updateThumbnail(id, this._thumbnailUrls[id], true, this._options.thumbnails.customResizer);\n\t } else {\n\t this._templating.addFile(id, this._options.formatFileName(name), prependData, dontDisplay);\n\t this._templating.generatePreview(id, this.getFile(id), this._options.thumbnails.customResizer);\n\t }\n\t this._filesInBatchAddedToUi += 1;\n\t if (canned || this._options.display.fileSizeOnSubmit && qq.supportedFeatures.ajaxUploading) {\n\t this._displayFileSize(id);\n\t }\n\t },\n\t _clearList: function() {\n\t this._templating.clearFiles();\n\t this.clearStoredFiles();\n\t },\n\t _displayFileSize: function(id, loadedSize, totalSize) {\n\t var size = this.getSize(id), sizeForDisplay = this._formatSize(size);\n\t if (size >= 0) {\n\t if (loadedSize !== undefined && totalSize !== undefined) {\n\t sizeForDisplay = this._formatProgress(loadedSize, totalSize);\n\t }\n\t this._templating.updateSize(id, sizeForDisplay);\n\t }\n\t },\n\t _formatProgress: function(uploadedSize, totalSize) {\n\t var message = this._options.text.formatProgress;\n\t function r(name, replacement) {\n\t message = message.replace(name, replacement);\n\t }\n\t r(\"{percent}\", Math.round(uploadedSize / totalSize * 100));\n\t r(\"{total_size}\", this._formatSize(totalSize));\n\t return message;\n\t },\n\t _controlFailureTextDisplay: function(id, response) {\n\t var mode, responseProperty, failureReason;\n\t mode = this._options.failedUploadTextDisplay.mode;\n\t responseProperty = this._options.failedUploadTextDisplay.responseProperty;\n\t if (mode === \"custom\") {\n\t failureReason = response[responseProperty];\n\t if (!failureReason) {\n\t failureReason = this._options.text.failUpload;\n\t }\n\t this._templating.setStatusText(id, failureReason);\n\t if (this._options.failedUploadTextDisplay.enableTooltip) {\n\t this._showTooltip(id, failureReason);\n\t }\n\t } else if (mode === \"default\") {\n\t this._templating.setStatusText(id, this._options.text.failUpload);\n\t } else if (mode !== \"none\") {\n\t this.log(\"failedUploadTextDisplay.mode value of '\" + mode + \"' is not valid\", \"warn\");\n\t }\n\t },\n\t _showTooltip: function(id, text) {\n\t this._templating.getFileContainer(id).title = text;\n\t },\n\t _showCancelLink: function(id) {\n\t if (!this._options.disableCancelForFormUploads || qq.supportedFeatures.ajaxUploading) {\n\t this._templating.showCancel(id);\n\t }\n\t },\n\t _itemError: function(code, name, item) {\n\t var message = this._parent.prototype._itemError.apply(this, arguments);\n\t this._options.showMessage(message);\n\t },\n\t _batchError: function(message) {\n\t this._parent.prototype._batchError.apply(this, arguments);\n\t this._options.showMessage(message);\n\t },\n\t _setupPastePrompt: function() {\n\t var self = this;\n\t this._options.callbacks.onPasteReceived = function() {\n\t var message = self._options.paste.namePromptMessage, defaultVal = self._options.paste.defaultName;\n\t return self._options.showPrompt(message, defaultVal);\n\t };\n\t },\n\t _fileOrBlobRejected: function(id, name) {\n\t this._totalFilesInBatch -= 1;\n\t this._parent.prototype._fileOrBlobRejected.apply(this, arguments);\n\t },\n\t _prepareItemsForUpload: function(items, params, endpoint) {\n\t this._totalFilesInBatch = items.length;\n\t this._filesInBatchAddedToUi = 0;\n\t this._parent.prototype._prepareItemsForUpload.apply(this, arguments);\n\t },\n\t _maybeUpdateThumbnail: function(fileId) {\n\t var thumbnailUrl = this._thumbnailUrls[fileId], fileStatus = this.getUploads({\n\t id: fileId\n\t }).status;\n\t if (fileStatus !== qq.status.DELETED && (thumbnailUrl || this._options.thumbnails.placeholders.waitUntilResponse || !qq.supportedFeatures.imagePreviews)) {\n\t this._templating.updateThumbnail(fileId, thumbnailUrl, this._options.thumbnails.customResizer);\n\t }\n\t },\n\t _addCannedFile: function(sessionData) {\n\t var id = this._parent.prototype._addCannedFile.apply(this, arguments);\n\t this._addToList(id, this.getName(id), true);\n\t this._templating.hideSpinner(id);\n\t this._templating.hideCancel(id);\n\t this._markFileAsSuccessful(id);\n\t return id;\n\t },\n\t _setSize: function(id, newSize) {\n\t this._parent.prototype._setSize.apply(this, arguments);\n\t this._templating.updateSize(id, this._formatSize(newSize));\n\t },\n\t _sessionRequestComplete: function() {\n\t this._templating.addCacheToDom();\n\t this._parent.prototype._sessionRequestComplete.apply(this, arguments);\n\t }\n\t };\n\t })();\n\t qq.FineUploader = function(o, namespace) {\n\t \"use strict\";\n\t var self = this;\n\t this._parent = namespace ? qq[namespace].FineUploaderBasic : qq.FineUploaderBasic;\n\t this._parent.apply(this, arguments);\n\t qq.extend(this._options, {\n\t element: null,\n\t button: null,\n\t listElement: null,\n\t dragAndDrop: {\n\t extraDropzones: [],\n\t reportDirectoryPaths: false\n\t },\n\t text: {\n\t formatProgress: \"{percent}% of {total_size}\",\n\t failUpload: \"Upload failed\",\n\t waitingForResponse: \"Processing...\",\n\t paused: \"Paused\"\n\t },\n\t template: \"qq-template\",\n\t classes: {\n\t retrying: \"qq-upload-retrying\",\n\t retryable: \"qq-upload-retryable\",\n\t success: \"qq-upload-success\",\n\t fail: \"qq-upload-fail\",\n\t editable: \"qq-editable\",\n\t hide: \"qq-hide\",\n\t dropActive: \"qq-upload-drop-area-active\"\n\t },\n\t failedUploadTextDisplay: {\n\t mode: \"default\",\n\t responseProperty: \"error\",\n\t enableTooltip: true\n\t },\n\t messages: {\n\t tooManyFilesError: \"You may only drop one file\",\n\t unsupportedBrowser: \"Unrecoverable error - this browser does not permit file uploading of any kind.\"\n\t },\n\t retry: {\n\t showAutoRetryNote: true,\n\t autoRetryNote: \"Retrying {retryNum}/{maxAuto}...\"\n\t },\n\t deleteFile: {\n\t forceConfirm: false,\n\t confirmMessage: \"Are you sure you want to delete {filename}?\",\n\t deletingStatusText: \"Deleting...\",\n\t deletingFailedText: \"Delete failed\"\n\t },\n\t display: {\n\t fileSizeOnSubmit: false,\n\t prependFiles: false\n\t },\n\t paste: {\n\t promptForName: false,\n\t namePromptMessage: \"Please name this image\"\n\t },\n\t thumbnails: {\n\t customResizer: null,\n\t maxCount: 0,\n\t placeholders: {\n\t waitUntilResponse: false,\n\t notAvailablePath: null,\n\t waitingPath: null\n\t },\n\t timeBetweenThumbs: 750\n\t },\n\t scaling: {\n\t hideScaled: false\n\t },\n\t showMessage: function(message) {\n\t if (self._templating.hasDialog(\"alert\")) {\n\t return self._templating.showDialog(\"alert\", message);\n\t } else {\n\t setTimeout(function() {\n\t window.alert(message);\n\t }, 0);\n\t }\n\t },\n\t showConfirm: function(message) {\n\t if (self._templating.hasDialog(\"confirm\")) {\n\t return self._templating.showDialog(\"confirm\", message);\n\t } else {\n\t return window.confirm(message);\n\t }\n\t },\n\t showPrompt: function(message, defaultValue) {\n\t if (self._templating.hasDialog(\"prompt\")) {\n\t return self._templating.showDialog(\"prompt\", message, defaultValue);\n\t } else {\n\t return window.prompt(message, defaultValue);\n\t }\n\t }\n\t }, true);\n\t qq.extend(this._options, o, true);\n\t this._templating = new qq.Templating({\n\t log: qq.bind(this.log, this),\n\t templateIdOrEl: this._options.template,\n\t containerEl: this._options.element,\n\t fileContainerEl: this._options.listElement,\n\t button: this._options.button,\n\t imageGenerator: this._imageGenerator,\n\t classes: {\n\t hide: this._options.classes.hide,\n\t editable: this._options.classes.editable\n\t },\n\t limits: {\n\t maxThumbs: this._options.thumbnails.maxCount,\n\t timeBetweenThumbs: this._options.thumbnails.timeBetweenThumbs\n\t },\n\t placeholders: {\n\t waitUntilUpdate: this._options.thumbnails.placeholders.waitUntilResponse,\n\t thumbnailNotAvailable: this._options.thumbnails.placeholders.notAvailablePath,\n\t waitingForThumbnail: this._options.thumbnails.placeholders.waitingPath\n\t },\n\t text: this._options.text\n\t });\n\t if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) {\n\t this._templating.renderFailure(this._options.messages.unsupportedBrowserIos8Safari);\n\t } else if (!qq.supportedFeatures.uploading || this._options.cors.expected && !qq.supportedFeatures.uploadCors) {\n\t this._templating.renderFailure(this._options.messages.unsupportedBrowser);\n\t } else {\n\t this._wrapCallbacks();\n\t this._templating.render();\n\t this._classes = this._options.classes;\n\t if (!this._options.button && this._templating.getButton()) {\n\t this._defaultButtonId = this._createUploadButton({\n\t element: this._templating.getButton(),\n\t title: this._options.text.fileInputTitle\n\t }).getButtonId();\n\t }\n\t this._setupClickAndEditEventHandlers();\n\t if (qq.DragAndDrop && qq.supportedFeatures.fileDrop) {\n\t this._dnd = this._setupDragAndDrop();\n\t }\n\t if (this._options.paste.targetElement && this._options.paste.promptForName) {\n\t if (qq.PasteSupport) {\n\t this._setupPastePrompt();\n\t } else {\n\t this.log(\"Paste support module not found.\", \"error\");\n\t }\n\t }\n\t this._totalFilesInBatch = 0;\n\t this._filesInBatchAddedToUi = 0;\n\t }\n\t };\n\t qq.extend(qq.FineUploader.prototype, qq.basePublicApi);\n\t qq.extend(qq.FineUploader.prototype, qq.basePrivateApi);\n\t qq.extend(qq.FineUploader.prototype, qq.uiPublicApi);\n\t qq.extend(qq.FineUploader.prototype, qq.uiPrivateApi);\n\t qq.Templating = function(spec) {\n\t \"use strict\";\n\t var FILE_ID_ATTR = \"qq-file-id\", FILE_CLASS_PREFIX = \"qq-file-id-\", THUMBNAIL_MAX_SIZE_ATTR = \"qq-max-size\", THUMBNAIL_SERVER_SCALE_ATTR = \"qq-server-scale\", HIDE_DROPZONE_ATTR = \"qq-hide-dropzone\", DROPZPONE_TEXT_ATTR = \"qq-drop-area-text\", IN_PROGRESS_CLASS = \"qq-in-progress\", HIDDEN_FOREVER_CLASS = \"qq-hidden-forever\", fileBatch = {\n\t content: document.createDocumentFragment(),\n\t map: {}\n\t }, isCancelDisabled = false, generatedThumbnails = 0, thumbnailQueueMonitorRunning = false, thumbGenerationQueue = [], thumbnailMaxSize = -1, options = {\n\t log: null,\n\t limits: {\n\t maxThumbs: 0,\n\t timeBetweenThumbs: 750\n\t },\n\t templateIdOrEl: \"qq-template\",\n\t containerEl: null,\n\t fileContainerEl: null,\n\t button: null,\n\t imageGenerator: null,\n\t classes: {\n\t hide: \"qq-hide\",\n\t editable: \"qq-editable\"\n\t },\n\t placeholders: {\n\t waitUntilUpdate: false,\n\t thumbnailNotAvailable: null,\n\t waitingForThumbnail: null\n\t },\n\t text: {\n\t paused: \"Paused\"\n\t }\n\t }, selectorClasses = {\n\t button: \"qq-upload-button-selector\",\n\t alertDialog: \"qq-alert-dialog-selector\",\n\t dialogCancelButton: \"qq-cancel-button-selector\",\n\t confirmDialog: \"qq-confirm-dialog-selector\",\n\t dialogMessage: \"qq-dialog-message-selector\",\n\t dialogOkButton: \"qq-ok-button-selector\",\n\t promptDialog: \"qq-prompt-dialog-selector\",\n\t uploader: \"qq-uploader-selector\",\n\t drop: \"qq-upload-drop-area-selector\",\n\t list: \"qq-upload-list-selector\",\n\t progressBarContainer: \"qq-progress-bar-container-selector\",\n\t progressBar: \"qq-progress-bar-selector\",\n\t totalProgressBarContainer: \"qq-total-progress-bar-container-selector\",\n\t totalProgressBar: \"qq-total-progress-bar-selector\",\n\t file: \"qq-upload-file-selector\",\n\t spinner: \"qq-upload-spinner-selector\",\n\t size: \"qq-upload-size-selector\",\n\t cancel: \"qq-upload-cancel-selector\",\n\t pause: \"qq-upload-pause-selector\",\n\t continueButton: \"qq-upload-continue-selector\",\n\t deleteButton: \"qq-upload-delete-selector\",\n\t retry: \"qq-upload-retry-selector\",\n\t statusText: \"qq-upload-status-text-selector\",\n\t editFilenameInput: \"qq-edit-filename-selector\",\n\t editNameIcon: \"qq-edit-filename-icon-selector\",\n\t dropText: \"qq-upload-drop-area-text-selector\",\n\t dropProcessing: \"qq-drop-processing-selector\",\n\t dropProcessingSpinner: \"qq-drop-processing-spinner-selector\",\n\t thumbnail: \"qq-thumbnail-selector\"\n\t }, previewGeneration = {}, cachedThumbnailNotAvailableImg = new qq.Promise(), cachedWaitingForThumbnailImg = new qq.Promise(), log, isEditElementsExist, isRetryElementExist, templateDom, container, fileList, showThumbnails, serverScale, cacheThumbnailPlaceholders = function() {\n\t var notAvailableUrl = options.placeholders.thumbnailNotAvailable, waitingUrl = options.placeholders.waitingForThumbnail, spec = {\n\t maxSize: thumbnailMaxSize,\n\t scale: serverScale\n\t };\n\t if (showThumbnails) {\n\t if (notAvailableUrl) {\n\t options.imageGenerator.generate(notAvailableUrl, new Image(), spec).then(function(updatedImg) {\n\t cachedThumbnailNotAvailableImg.success(updatedImg);\n\t }, function() {\n\t cachedThumbnailNotAvailableImg.failure();\n\t log(\"Problem loading 'not available' placeholder image at \" + notAvailableUrl, \"error\");\n\t });\n\t } else {\n\t cachedThumbnailNotAvailableImg.failure();\n\t }\n\t if (waitingUrl) {\n\t options.imageGenerator.generate(waitingUrl, new Image(), spec).then(function(updatedImg) {\n\t cachedWaitingForThumbnailImg.success(updatedImg);\n\t }, function() {\n\t cachedWaitingForThumbnailImg.failure();\n\t log(\"Problem loading 'waiting for thumbnail' placeholder image at \" + waitingUrl, \"error\");\n\t });\n\t } else {\n\t cachedWaitingForThumbnailImg.failure();\n\t }\n\t }\n\t }, displayWaitingImg = function(thumbnail) {\n\t var waitingImgPlacement = new qq.Promise();\n\t cachedWaitingForThumbnailImg.then(function(img) {\n\t maybeScalePlaceholderViaCss(img, thumbnail);\n\t if (!thumbnail.src) {\n\t thumbnail.src = img.src;\n\t thumbnail.onload = function() {\n\t thumbnail.onload = null;\n\t show(thumbnail);\n\t waitingImgPlacement.success();\n\t };\n\t } else {\n\t waitingImgPlacement.success();\n\t }\n\t }, function() {\n\t hide(thumbnail);\n\t waitingImgPlacement.success();\n\t });\n\t return waitingImgPlacement;\n\t }, generateNewPreview = function(id, blob, spec) {\n\t var thumbnail = getThumbnail(id);\n\t log(\"Generating new thumbnail for \" + id);\n\t blob.qqThumbnailId = id;\n\t return options.imageGenerator.generate(blob, thumbnail, spec).then(function() {\n\t generatedThumbnails++;\n\t show(thumbnail);\n\t previewGeneration[id].success();\n\t }, function() {\n\t previewGeneration[id].failure();\n\t if (!options.placeholders.waitUntilUpdate) {\n\t maybeSetDisplayNotAvailableImg(id, thumbnail);\n\t }\n\t });\n\t }, generateNextQueuedPreview = function() {\n\t if (thumbGenerationQueue.length) {\n\t thumbnailQueueMonitorRunning = true;\n\t var queuedThumbRequest = thumbGenerationQueue.shift();\n\t if (queuedThumbRequest.update) {\n\t processUpdateQueuedPreviewRequest(queuedThumbRequest);\n\t } else {\n\t processNewQueuedPreviewRequest(queuedThumbRequest);\n\t }\n\t } else {\n\t thumbnailQueueMonitorRunning = false;\n\t }\n\t }, getCancel = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.cancel);\n\t }, getContinue = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.continueButton);\n\t }, getDialog = function(type) {\n\t return getTemplateEl(container, selectorClasses[type + \"Dialog\"]);\n\t }, getDelete = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.deleteButton);\n\t }, getDropProcessing = function() {\n\t return getTemplateEl(container, selectorClasses.dropProcessing);\n\t }, getEditIcon = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.editNameIcon);\n\t }, getFile = function(id) {\n\t return fileBatch.map[id] || qq(fileList).getFirstByClass(FILE_CLASS_PREFIX + id);\n\t }, getFilename = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.file);\n\t }, getPause = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.pause);\n\t }, getProgress = function(id) {\n\t if (id == null) {\n\t return getTemplateEl(container, selectorClasses.totalProgressBarContainer) || getTemplateEl(container, selectorClasses.totalProgressBar);\n\t }\n\t return getTemplateEl(getFile(id), selectorClasses.progressBarContainer) || getTemplateEl(getFile(id), selectorClasses.progressBar);\n\t }, getRetry = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.retry);\n\t }, getSize = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.size);\n\t }, getSpinner = function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.spinner);\n\t }, getTemplateEl = function(context, cssClass) {\n\t return context && qq(context).getFirstByClass(cssClass);\n\t }, getThumbnail = function(id) {\n\t return showThumbnails && getTemplateEl(getFile(id), selectorClasses.thumbnail);\n\t }, hide = function(el) {\n\t el && qq(el).addClass(options.classes.hide);\n\t }, maybeScalePlaceholderViaCss = function(placeholder, thumbnail) {\n\t var maxWidth = placeholder.style.maxWidth, maxHeight = placeholder.style.maxHeight;\n\t if (maxHeight && maxWidth && !thumbnail.style.maxWidth && !thumbnail.style.maxHeight) {\n\t qq(thumbnail).css({\n\t maxWidth: maxWidth,\n\t maxHeight: maxHeight\n\t });\n\t }\n\t }, maybeSetDisplayNotAvailableImg = function(id, thumbnail) {\n\t var previewing = previewGeneration[id] || new qq.Promise().failure(), notAvailableImgPlacement = new qq.Promise();\n\t cachedThumbnailNotAvailableImg.then(function(img) {\n\t previewing.then(function() {\n\t notAvailableImgPlacement.success();\n\t }, function() {\n\t maybeScalePlaceholderViaCss(img, thumbnail);\n\t thumbnail.onload = function() {\n\t thumbnail.onload = null;\n\t notAvailableImgPlacement.success();\n\t };\n\t thumbnail.src = img.src;\n\t show(thumbnail);\n\t });\n\t });\n\t return notAvailableImgPlacement;\n\t }, parseAndGetTemplate = function() {\n\t var scriptEl, scriptHtml, fileListNode, tempTemplateEl, fileListEl, defaultButton, dropArea, thumbnail, dropProcessing, dropTextEl, uploaderEl;\n\t log(\"Parsing template\");\n\t if (options.templateIdOrEl == null) {\n\t throw new Error(\"You MUST specify either a template element or ID!\");\n\t }\n\t if (qq.isString(options.templateIdOrEl)) {\n\t scriptEl = document.getElementById(options.templateIdOrEl);\n\t if (scriptEl === null) {\n\t throw new Error(qq.format(\"Cannot find template script at ID '{}'!\", options.templateIdOrEl));\n\t }\n\t scriptHtml = scriptEl.innerHTML;\n\t } else {\n\t if (options.templateIdOrEl.innerHTML === undefined) {\n\t throw new Error(\"You have specified an invalid value for the template option! \" + \"It must be an ID or an Element.\");\n\t }\n\t scriptHtml = options.templateIdOrEl.innerHTML;\n\t }\n\t scriptHtml = qq.trimStr(scriptHtml);\n\t tempTemplateEl = document.createElement(\"div\");\n\t tempTemplateEl.appendChild(qq.toElement(scriptHtml));\n\t uploaderEl = qq(tempTemplateEl).getFirstByClass(selectorClasses.uploader);\n\t if (options.button) {\n\t defaultButton = qq(tempTemplateEl).getFirstByClass(selectorClasses.button);\n\t if (defaultButton) {\n\t qq(defaultButton).remove();\n\t }\n\t }\n\t if (!qq.DragAndDrop || !qq.supportedFeatures.fileDrop) {\n\t dropProcessing = qq(tempTemplateEl).getFirstByClass(selectorClasses.dropProcessing);\n\t if (dropProcessing) {\n\t qq(dropProcessing).remove();\n\t }\n\t }\n\t dropArea = qq(tempTemplateEl).getFirstByClass(selectorClasses.drop);\n\t if (dropArea && !qq.DragAndDrop) {\n\t log(\"DnD module unavailable.\", \"info\");\n\t qq(dropArea).remove();\n\t }\n\t if (!qq.supportedFeatures.fileDrop) {\n\t uploaderEl.removeAttribute(DROPZPONE_TEXT_ATTR);\n\t if (dropArea && qq(dropArea).hasAttribute(HIDE_DROPZONE_ATTR)) {\n\t qq(dropArea).css({\n\t display: \"none\"\n\t });\n\t }\n\t } else if (qq(uploaderEl).hasAttribute(DROPZPONE_TEXT_ATTR) && dropArea) {\n\t dropTextEl = qq(dropArea).getFirstByClass(selectorClasses.dropText);\n\t dropTextEl && qq(dropTextEl).remove();\n\t }\n\t thumbnail = qq(tempTemplateEl).getFirstByClass(selectorClasses.thumbnail);\n\t if (!showThumbnails) {\n\t thumbnail && qq(thumbnail).remove();\n\t } else if (thumbnail) {\n\t thumbnailMaxSize = parseInt(thumbnail.getAttribute(THUMBNAIL_MAX_SIZE_ATTR));\n\t thumbnailMaxSize = thumbnailMaxSize > 0 ? thumbnailMaxSize : null;\n\t serverScale = qq(thumbnail).hasAttribute(THUMBNAIL_SERVER_SCALE_ATTR);\n\t }\n\t showThumbnails = showThumbnails && thumbnail;\n\t isEditElementsExist = qq(tempTemplateEl).getByClass(selectorClasses.editFilenameInput).length > 0;\n\t isRetryElementExist = qq(tempTemplateEl).getByClass(selectorClasses.retry).length > 0;\n\t fileListNode = qq(tempTemplateEl).getFirstByClass(selectorClasses.list);\n\t if (fileListNode == null) {\n\t throw new Error(\"Could not find the file list container in the template!\");\n\t }\n\t fileListEl = fileListNode.children[0].cloneNode(true);\n\t fileListNode.innerHTML = \"\";\n\t if (tempTemplateEl.getElementsByTagName(\"DIALOG\").length) {\n\t document.createElement(\"dialog\");\n\t }\n\t log(\"Template parsing complete\");\n\t return {\n\t template: tempTemplateEl,\n\t fileTemplate: fileListEl\n\t };\n\t }, prependFile = function(el, index, fileList) {\n\t var parentEl = fileList, beforeEl = parentEl.firstChild;\n\t if (index > 0) {\n\t beforeEl = qq(parentEl).children()[index].nextSibling;\n\t }\n\t parentEl.insertBefore(el, beforeEl);\n\t }, processNewQueuedPreviewRequest = function(queuedThumbRequest) {\n\t var id = queuedThumbRequest.id, optFileOrBlob = queuedThumbRequest.optFileOrBlob, relatedThumbnailId = optFileOrBlob && optFileOrBlob.qqThumbnailId, thumbnail = getThumbnail(id), spec = {\n\t customResizeFunction: queuedThumbRequest.customResizeFunction,\n\t maxSize: thumbnailMaxSize,\n\t orient: true,\n\t scale: true\n\t };\n\t if (qq.supportedFeatures.imagePreviews) {\n\t if (thumbnail) {\n\t if (options.limits.maxThumbs && options.limits.maxThumbs <= generatedThumbnails) {\n\t maybeSetDisplayNotAvailableImg(id, thumbnail);\n\t generateNextQueuedPreview();\n\t } else {\n\t displayWaitingImg(thumbnail).done(function() {\n\t previewGeneration[id] = new qq.Promise();\n\t previewGeneration[id].done(function() {\n\t setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n\t });\n\t if (relatedThumbnailId != null) {\n\t useCachedPreview(id, relatedThumbnailId);\n\t } else {\n\t generateNewPreview(id, optFileOrBlob, spec);\n\t }\n\t });\n\t }\n\t } else {\n\t generateNextQueuedPreview();\n\t }\n\t } else if (thumbnail) {\n\t displayWaitingImg(thumbnail);\n\t generateNextQueuedPreview();\n\t }\n\t }, processUpdateQueuedPreviewRequest = function(queuedThumbRequest) {\n\t var id = queuedThumbRequest.id, thumbnailUrl = queuedThumbRequest.thumbnailUrl, showWaitingImg = queuedThumbRequest.showWaitingImg, thumbnail = getThumbnail(id), spec = {\n\t customResizeFunction: queuedThumbRequest.customResizeFunction,\n\t scale: serverScale,\n\t maxSize: thumbnailMaxSize\n\t };\n\t if (thumbnail) {\n\t if (thumbnailUrl) {\n\t if (options.limits.maxThumbs && options.limits.maxThumbs <= generatedThumbnails) {\n\t maybeSetDisplayNotAvailableImg(id, thumbnail);\n\t generateNextQueuedPreview();\n\t } else {\n\t if (showWaitingImg) {\n\t displayWaitingImg(thumbnail);\n\t }\n\t return options.imageGenerator.generate(thumbnailUrl, thumbnail, spec).then(function() {\n\t show(thumbnail);\n\t generatedThumbnails++;\n\t setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n\t }, function() {\n\t maybeSetDisplayNotAvailableImg(id, thumbnail);\n\t setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n\t });\n\t }\n\t } else {\n\t maybeSetDisplayNotAvailableImg(id, thumbnail);\n\t generateNextQueuedPreview();\n\t }\n\t }\n\t }, setProgressBarWidth = function(id, percent) {\n\t var bar = getProgress(id), progressBarSelector = id == null ? selectorClasses.totalProgressBar : selectorClasses.progressBar;\n\t if (bar && !qq(bar).hasClass(progressBarSelector)) {\n\t bar = qq(bar).getFirstByClass(progressBarSelector);\n\t }\n\t if (bar) {\n\t qq(bar).css({\n\t width: percent + \"%\"\n\t });\n\t bar.setAttribute(\"aria-valuenow\", percent);\n\t }\n\t }, show = function(el) {\n\t el && qq(el).removeClass(options.classes.hide);\n\t }, useCachedPreview = function(targetThumbnailId, cachedThumbnailId) {\n\t var targetThumbnail = getThumbnail(targetThumbnailId), cachedThumbnail = getThumbnail(cachedThumbnailId);\n\t log(qq.format(\"ID {} is the same file as ID {}. Will use generated thumbnail from ID {} instead.\", targetThumbnailId, cachedThumbnailId, cachedThumbnailId));\n\t previewGeneration[cachedThumbnailId].then(function() {\n\t generatedThumbnails++;\n\t previewGeneration[targetThumbnailId].success();\n\t log(qq.format(\"Now using previously generated thumbnail created for ID {} on ID {}.\", cachedThumbnailId, targetThumbnailId));\n\t targetThumbnail.src = cachedThumbnail.src;\n\t show(targetThumbnail);\n\t }, function() {\n\t previewGeneration[targetThumbnailId].failure();\n\t if (!options.placeholders.waitUntilUpdate) {\n\t maybeSetDisplayNotAvailableImg(targetThumbnailId, targetThumbnail);\n\t }\n\t });\n\t };\n\t qq.extend(options, spec);\n\t log = options.log;\n\t if (!qq.supportedFeatures.imagePreviews) {\n\t options.limits.timeBetweenThumbs = 0;\n\t options.limits.maxThumbs = 0;\n\t }\n\t container = options.containerEl;\n\t showThumbnails = options.imageGenerator !== undefined;\n\t templateDom = parseAndGetTemplate();\n\t cacheThumbnailPlaceholders();\n\t qq.extend(this, {\n\t render: function() {\n\t log(\"Rendering template in DOM.\");\n\t generatedThumbnails = 0;\n\t container.appendChild(templateDom.template.cloneNode(true));\n\t hide(getDropProcessing());\n\t this.hideTotalProgress();\n\t fileList = options.fileContainerEl || getTemplateEl(container, selectorClasses.list);\n\t log(\"Template rendering complete\");\n\t },\n\t renderFailure: function(message) {\n\t var cantRenderEl = qq.toElement(message);\n\t container.innerHTML = \"\";\n\t container.appendChild(cantRenderEl);\n\t },\n\t reset: function() {\n\t container.innerHTML = \"\";\n\t this.render();\n\t },\n\t clearFiles: function() {\n\t fileList.innerHTML = \"\";\n\t },\n\t disableCancel: function() {\n\t isCancelDisabled = true;\n\t },\n\t addFile: function(id, name, prependInfo, hideForever, batch) {\n\t var fileEl = templateDom.fileTemplate.cloneNode(true), fileNameEl = getTemplateEl(fileEl, selectorClasses.file), uploaderEl = getTemplateEl(container, selectorClasses.uploader), fileContainer = batch ? fileBatch.content : fileList, thumb;\n\t if (batch) {\n\t fileBatch.map[id] = fileEl;\n\t }\n\t qq(fileEl).addClass(FILE_CLASS_PREFIX + id);\n\t uploaderEl.removeAttribute(DROPZPONE_TEXT_ATTR);\n\t if (fileNameEl) {\n\t qq(fileNameEl).setText(name);\n\t fileNameEl.setAttribute(\"title\", name);\n\t }\n\t fileEl.setAttribute(FILE_ID_ATTR, id);\n\t if (prependInfo) {\n\t prependFile(fileEl, prependInfo.index, fileContainer);\n\t } else {\n\t fileContainer.appendChild(fileEl);\n\t }\n\t if (hideForever) {\n\t fileEl.style.display = \"none\";\n\t qq(fileEl).addClass(HIDDEN_FOREVER_CLASS);\n\t } else {\n\t hide(getProgress(id));\n\t hide(getSize(id));\n\t hide(getDelete(id));\n\t hide(getRetry(id));\n\t hide(getPause(id));\n\t hide(getContinue(id));\n\t if (isCancelDisabled) {\n\t this.hideCancel(id);\n\t }\n\t thumb = getThumbnail(id);\n\t if (thumb && !thumb.src) {\n\t cachedWaitingForThumbnailImg.then(function(waitingImg) {\n\t thumb.src = waitingImg.src;\n\t if (waitingImg.style.maxHeight && waitingImg.style.maxWidth) {\n\t qq(thumb).css({\n\t maxHeight: waitingImg.style.maxHeight,\n\t maxWidth: waitingImg.style.maxWidth\n\t });\n\t }\n\t show(thumb);\n\t });\n\t }\n\t }\n\t },\n\t addFileToCache: function(id, name, prependInfo, hideForever) {\n\t this.addFile(id, name, prependInfo, hideForever, true);\n\t },\n\t addCacheToDom: function() {\n\t fileList.appendChild(fileBatch.content);\n\t fileBatch.content = document.createDocumentFragment();\n\t fileBatch.map = {};\n\t },\n\t removeFile: function(id) {\n\t qq(getFile(id)).remove();\n\t },\n\t getFileId: function(el) {\n\t var currentNode = el;\n\t if (currentNode) {\n\t while (currentNode.getAttribute(FILE_ID_ATTR) == null) {\n\t currentNode = currentNode.parentNode;\n\t }\n\t return parseInt(currentNode.getAttribute(FILE_ID_ATTR));\n\t }\n\t },\n\t getFileList: function() {\n\t return fileList;\n\t },\n\t markFilenameEditable: function(id) {\n\t var filename = getFilename(id);\n\t filename && qq(filename).addClass(options.classes.editable);\n\t },\n\t updateFilename: function(id, name) {\n\t var filenameEl = getFilename(id);\n\t if (filenameEl) {\n\t qq(filenameEl).setText(name);\n\t filenameEl.setAttribute(\"title\", name);\n\t }\n\t },\n\t hideFilename: function(id) {\n\t hide(getFilename(id));\n\t },\n\t showFilename: function(id) {\n\t show(getFilename(id));\n\t },\n\t isFileName: function(el) {\n\t return qq(el).hasClass(selectorClasses.file);\n\t },\n\t getButton: function() {\n\t return options.button || getTemplateEl(container, selectorClasses.button);\n\t },\n\t hideDropProcessing: function() {\n\t hide(getDropProcessing());\n\t },\n\t showDropProcessing: function() {\n\t show(getDropProcessing());\n\t },\n\t getDropZone: function() {\n\t return getTemplateEl(container, selectorClasses.drop);\n\t },\n\t isEditFilenamePossible: function() {\n\t return isEditElementsExist;\n\t },\n\t hideRetry: function(id) {\n\t hide(getRetry(id));\n\t },\n\t isRetryPossible: function() {\n\t return isRetryElementExist;\n\t },\n\t showRetry: function(id) {\n\t show(getRetry(id));\n\t },\n\t getFileContainer: function(id) {\n\t return getFile(id);\n\t },\n\t showEditIcon: function(id) {\n\t var icon = getEditIcon(id);\n\t icon && qq(icon).addClass(options.classes.editable);\n\t },\n\t isHiddenForever: function(id) {\n\t return qq(getFile(id)).hasClass(HIDDEN_FOREVER_CLASS);\n\t },\n\t hideEditIcon: function(id) {\n\t var icon = getEditIcon(id);\n\t icon && qq(icon).removeClass(options.classes.editable);\n\t },\n\t isEditIcon: function(el) {\n\t return qq(el).hasClass(selectorClasses.editNameIcon, true);\n\t },\n\t getEditInput: function(id) {\n\t return getTemplateEl(getFile(id), selectorClasses.editFilenameInput);\n\t },\n\t isEditInput: function(el) {\n\t return qq(el).hasClass(selectorClasses.editFilenameInput, true);\n\t },\n\t updateProgress: function(id, loaded, total) {\n\t var bar = getProgress(id), percent;\n\t if (bar && total > 0) {\n\t percent = Math.round(loaded / total * 100);\n\t if (percent === 100) {\n\t hide(bar);\n\t } else {\n\t show(bar);\n\t }\n\t setProgressBarWidth(id, percent);\n\t }\n\t },\n\t updateTotalProgress: function(loaded, total) {\n\t this.updateProgress(null, loaded, total);\n\t },\n\t hideProgress: function(id) {\n\t var bar = getProgress(id);\n\t bar && hide(bar);\n\t },\n\t hideTotalProgress: function() {\n\t this.hideProgress();\n\t },\n\t resetProgress: function(id) {\n\t setProgressBarWidth(id, 0);\n\t this.hideTotalProgress(id);\n\t },\n\t resetTotalProgress: function() {\n\t this.resetProgress();\n\t },\n\t showCancel: function(id) {\n\t if (!isCancelDisabled) {\n\t var cancel = getCancel(id);\n\t cancel && qq(cancel).removeClass(options.classes.hide);\n\t }\n\t },\n\t hideCancel: function(id) {\n\t hide(getCancel(id));\n\t },\n\t isCancel: function(el) {\n\t return qq(el).hasClass(selectorClasses.cancel, true);\n\t },\n\t allowPause: function(id) {\n\t show(getPause(id));\n\t hide(getContinue(id));\n\t },\n\t uploadPaused: function(id) {\n\t this.setStatusText(id, options.text.paused);\n\t this.allowContinueButton(id);\n\t hide(getSpinner(id));\n\t },\n\t hidePause: function(id) {\n\t hide(getPause(id));\n\t },\n\t isPause: function(el) {\n\t return qq(el).hasClass(selectorClasses.pause, true);\n\t },\n\t isContinueButton: function(el) {\n\t return qq(el).hasClass(selectorClasses.continueButton, true);\n\t },\n\t allowContinueButton: function(id) {\n\t show(getContinue(id));\n\t hide(getPause(id));\n\t },\n\t uploadContinued: function(id) {\n\t this.setStatusText(id, \"\");\n\t this.allowPause(id);\n\t show(getSpinner(id));\n\t },\n\t showDeleteButton: function(id) {\n\t show(getDelete(id));\n\t },\n\t hideDeleteButton: function(id) {\n\t hide(getDelete(id));\n\t },\n\t isDeleteButton: function(el) {\n\t return qq(el).hasClass(selectorClasses.deleteButton, true);\n\t },\n\t isRetry: function(el) {\n\t return qq(el).hasClass(selectorClasses.retry, true);\n\t },\n\t updateSize: function(id, text) {\n\t var size = getSize(id);\n\t if (size) {\n\t show(size);\n\t qq(size).setText(text);\n\t }\n\t },\n\t setStatusText: function(id, text) {\n\t var textEl = getTemplateEl(getFile(id), selectorClasses.statusText);\n\t if (textEl) {\n\t if (text == null) {\n\t qq(textEl).clearText();\n\t } else {\n\t qq(textEl).setText(text);\n\t }\n\t }\n\t },\n\t hideSpinner: function(id) {\n\t qq(getFile(id)).removeClass(IN_PROGRESS_CLASS);\n\t hide(getSpinner(id));\n\t },\n\t showSpinner: function(id) {\n\t qq(getFile(id)).addClass(IN_PROGRESS_CLASS);\n\t show(getSpinner(id));\n\t },\n\t generatePreview: function(id, optFileOrBlob, customResizeFunction) {\n\t if (!this.isHiddenForever(id)) {\n\t thumbGenerationQueue.push({\n\t id: id,\n\t customResizeFunction: customResizeFunction,\n\t optFileOrBlob: optFileOrBlob\n\t });\n\t !thumbnailQueueMonitorRunning && generateNextQueuedPreview();\n\t }\n\t },\n\t updateThumbnail: function(id, thumbnailUrl, showWaitingImg, customResizeFunction) {\n\t if (!this.isHiddenForever(id)) {\n\t thumbGenerationQueue.push({\n\t customResizeFunction: customResizeFunction,\n\t update: true,\n\t id: id,\n\t thumbnailUrl: thumbnailUrl,\n\t showWaitingImg: showWaitingImg\n\t });\n\t !thumbnailQueueMonitorRunning && generateNextQueuedPreview();\n\t }\n\t },\n\t hasDialog: function(type) {\n\t return qq.supportedFeatures.dialogElement && !!getDialog(type);\n\t },\n\t showDialog: function(type, message, defaultValue) {\n\t var dialog = getDialog(type), messageEl = getTemplateEl(dialog, selectorClasses.dialogMessage), inputEl = dialog.getElementsByTagName(\"INPUT\")[0], cancelBtn = getTemplateEl(dialog, selectorClasses.dialogCancelButton), okBtn = getTemplateEl(dialog, selectorClasses.dialogOkButton), promise = new qq.Promise(), closeHandler = function() {\n\t cancelBtn.removeEventListener(\"click\", cancelClickHandler);\n\t okBtn && okBtn.removeEventListener(\"click\", okClickHandler);\n\t promise.failure();\n\t }, cancelClickHandler = function() {\n\t cancelBtn.removeEventListener(\"click\", cancelClickHandler);\n\t dialog.close();\n\t }, okClickHandler = function() {\n\t dialog.removeEventListener(\"close\", closeHandler);\n\t okBtn.removeEventListener(\"click\", okClickHandler);\n\t dialog.close();\n\t promise.success(inputEl && inputEl.value);\n\t };\n\t dialog.addEventListener(\"close\", closeHandler);\n\t cancelBtn.addEventListener(\"click\", cancelClickHandler);\n\t okBtn && okBtn.addEventListener(\"click\", okClickHandler);\n\t if (inputEl) {\n\t inputEl.value = defaultValue;\n\t }\n\t messageEl.textContent = message;\n\t dialog.showModal();\n\t return promise;\n\t }\n\t });\n\t };\n\t qq.UiEventHandler = function(s, protectedApi) {\n\t \"use strict\";\n\t var disposer = new qq.DisposeSupport(), spec = {\n\t eventType: \"click\",\n\t attachTo: null,\n\t onHandled: function(target, event) {}\n\t };\n\t qq.extend(this, {\n\t addHandler: function(element) {\n\t addHandler(element);\n\t },\n\t dispose: function() {\n\t disposer.dispose();\n\t }\n\t });\n\t function addHandler(element) {\n\t disposer.attach(element, spec.eventType, function(event) {\n\t event = event || window.event;\n\t var target = event.target || event.srcElement;\n\t spec.onHandled(target, event);\n\t });\n\t }\n\t qq.extend(protectedApi, {\n\t getFileIdFromItem: function(item) {\n\t return item.qqFileId;\n\t },\n\t getDisposeSupport: function() {\n\t return disposer;\n\t }\n\t });\n\t qq.extend(spec, s);\n\t if (spec.attachTo) {\n\t addHandler(spec.attachTo);\n\t }\n\t };\n\t qq.FileButtonsClickHandler = function(s) {\n\t \"use strict\";\n\t var inheritedInternalApi = {}, spec = {\n\t templating: null,\n\t log: function(message, lvl) {},\n\t onDeleteFile: function(fileId) {},\n\t onCancel: function(fileId) {},\n\t onRetry: function(fileId) {},\n\t onPause: function(fileId) {},\n\t onContinue: function(fileId) {},\n\t onGetName: function(fileId) {}\n\t }, buttonHandlers = {\n\t cancel: function(id) {\n\t spec.onCancel(id);\n\t },\n\t retry: function(id) {\n\t spec.onRetry(id);\n\t },\n\t deleteButton: function(id) {\n\t spec.onDeleteFile(id);\n\t },\n\t pause: function(id) {\n\t spec.onPause(id);\n\t },\n\t continueButton: function(id) {\n\t spec.onContinue(id);\n\t }\n\t };\n\t function examineEvent(target, event) {\n\t qq.each(buttonHandlers, function(buttonType, handler) {\n\t var firstLetterCapButtonType = buttonType.charAt(0).toUpperCase() + buttonType.slice(1), fileId;\n\t if (spec.templating[\"is\" + firstLetterCapButtonType](target)) {\n\t fileId = spec.templating.getFileId(target);\n\t qq.preventDefault(event);\n\t spec.log(qq.format(\"Detected valid file button click event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n\t handler(fileId);\n\t return false;\n\t }\n\t });\n\t }\n\t qq.extend(spec, s);\n\t spec.eventType = \"click\";\n\t spec.onHandled = examineEvent;\n\t spec.attachTo = spec.templating.getFileList();\n\t qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));\n\t };\n\t qq.FilenameClickHandler = function(s) {\n\t \"use strict\";\n\t var inheritedInternalApi = {}, spec = {\n\t templating: null,\n\t log: function(message, lvl) {},\n\t classes: {\n\t file: \"qq-upload-file\",\n\t editNameIcon: \"qq-edit-filename-icon\"\n\t },\n\t onGetUploadStatus: function(fileId) {},\n\t onGetName: function(fileId) {}\n\t };\n\t qq.extend(spec, s);\n\t function examineEvent(target, event) {\n\t if (spec.templating.isFileName(target) || spec.templating.isEditIcon(target)) {\n\t var fileId = spec.templating.getFileId(target), status = spec.onGetUploadStatus(fileId);\n\t if (status === qq.status.SUBMITTED) {\n\t spec.log(qq.format(\"Detected valid filename click event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n\t qq.preventDefault(event);\n\t inheritedInternalApi.handleFilenameEdit(fileId, target, true);\n\t }\n\t }\n\t }\n\t spec.eventType = \"click\";\n\t spec.onHandled = examineEvent;\n\t qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));\n\t };\n\t qq.FilenameInputFocusInHandler = function(s, inheritedInternalApi) {\n\t \"use strict\";\n\t var spec = {\n\t templating: null,\n\t onGetUploadStatus: function(fileId) {},\n\t log: function(message, lvl) {}\n\t };\n\t if (!inheritedInternalApi) {\n\t inheritedInternalApi = {};\n\t }\n\t function handleInputFocus(target, event) {\n\t if (spec.templating.isEditInput(target)) {\n\t var fileId = spec.templating.getFileId(target), status = spec.onGetUploadStatus(fileId);\n\t if (status === qq.status.SUBMITTED) {\n\t spec.log(qq.format(\"Detected valid filename input focus event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n\t inheritedInternalApi.handleFilenameEdit(fileId, target);\n\t }\n\t }\n\t }\n\t spec.eventType = \"focusin\";\n\t spec.onHandled = handleInputFocus;\n\t qq.extend(spec, s);\n\t qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));\n\t };\n\t qq.FilenameInputFocusHandler = function(spec) {\n\t \"use strict\";\n\t spec.eventType = \"focus\";\n\t spec.attachTo = null;\n\t qq.extend(this, new qq.FilenameInputFocusInHandler(spec, {}));\n\t };\n\t qq.FilenameEditHandler = function(s, inheritedInternalApi) {\n\t \"use strict\";\n\t var spec = {\n\t templating: null,\n\t log: function(message, lvl) {},\n\t onGetUploadStatus: function(fileId) {},\n\t onGetName: function(fileId) {},\n\t onSetName: function(fileId, newName) {},\n\t onEditingStatusChange: function(fileId, isEditing) {}\n\t };\n\t function getFilenameSansExtension(fileId) {\n\t var filenameSansExt = spec.onGetName(fileId), extIdx = filenameSansExt.lastIndexOf(\".\");\n\t if (extIdx > 0) {\n\t filenameSansExt = filenameSansExt.substr(0, extIdx);\n\t }\n\t return filenameSansExt;\n\t }\n\t function getOriginalExtension(fileId) {\n\t var origName = spec.onGetName(fileId);\n\t return qq.getExtension(origName);\n\t }\n\t function handleNameUpdate(newFilenameInputEl, fileId) {\n\t var newName = newFilenameInputEl.value, origExtension;\n\t if (newName !== undefined && qq.trimStr(newName).length > 0) {\n\t origExtension = getOriginalExtension(fileId);\n\t if (origExtension !== undefined) {\n\t newName = newName + \".\" + origExtension;\n\t }\n\t spec.onSetName(fileId, newName);\n\t }\n\t spec.onEditingStatusChange(fileId, false);\n\t }\n\t function registerInputBlurHandler(inputEl, fileId) {\n\t inheritedInternalApi.getDisposeSupport().attach(inputEl, \"blur\", function() {\n\t handleNameUpdate(inputEl, fileId);\n\t });\n\t }\n\t function registerInputEnterKeyHandler(inputEl, fileId) {\n\t inheritedInternalApi.getDisposeSupport().attach(inputEl, \"keyup\", function(event) {\n\t var code = event.keyCode || event.which;\n\t if (code === 13) {\n\t handleNameUpdate(inputEl, fileId);\n\t }\n\t });\n\t }\n\t qq.extend(spec, s);\n\t spec.attachTo = spec.templating.getFileList();\n\t qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));\n\t qq.extend(inheritedInternalApi, {\n\t handleFilenameEdit: function(id, target, focusInput) {\n\t var newFilenameInputEl = spec.templating.getEditInput(id);\n\t spec.onEditingStatusChange(id, true);\n\t newFilenameInputEl.value = getFilenameSansExtension(id);\n\t if (focusInput) {\n\t newFilenameInputEl.focus();\n\t }\n\t registerInputBlurHandler(newFilenameInputEl, id);\n\t registerInputEnterKeyHandler(newFilenameInputEl, id);\n\t }\n\t });\n\t };\n\t})(window);\n\t//# sourceMappingURL=fine-uploader.js.map\n\n/***/ },\n\n/***/ 1142:\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tmodule.exports = __webpack_require__(1141);\n\n\n/***/ },\n\n/***/ 1219:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1234)\n\t__vue_script__ = __webpack_require__(1221)\n\t__vue_template__ = __webpack_require__(1227)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1221:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseField = __webpack_require__(984);\n\t\n\texports.default = {\n\t name: 'horizontal-form-field',\n\t mixins: [_baseField.BaseField]\n\t};\n\n/***/ },\n\n/***/ 1222:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _baseForm = __webpack_require__(1076);\n\t\n\tvar _baseForm2 = _interopRequireDefault(_baseForm);\n\t\n\tvar _horizontalField = __webpack_require__(1219);\n\t\n\tvar _horizontalField2 = _interopRequireDefault(_horizontalField);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t name: 'form-horizontal',\n\t mixins: [_baseForm2.default],\n\t components: { Field: _horizontalField2.default }\n\t};\n\n/***/ },\n\n/***/ 1225:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".horizontal-field .form-control{color:#555}.horizontal-field label.help-block{margin-bottom:0}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/horizontal-field.vue\"],\"names\":[],\"mappings\":\"AAAA,gCAAgC,UAAU,CAAC,mCAAmC,eAAe,CAAC\",\"file\":\"horizontal-field.vue\",\"sourcesContent\":[\".horizontal-field .form-control{color:#555}.horizontal-field label.help-block{margin-bottom:0}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1227:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div class=horizontal-field :class=\\\"{\\n 'form-group': !is_hidden,\\n 'has-error': errors.length,\\n 'has-success': success,\\n }\\\"> <label v-if=!is_hidden :for=field.id :class=\\\"{ 'required': required && !is_bool }\\\" class=\\\"col-sm-3 control-label\\\"> <i v-if=errors.length class=\\\"fa fa-times-circle-o\\\"></i> {{ is_bool ? '' : field.label }} <span v-if=!is_hidden v-show=description class=form-help v-popover=description popover-trigger=hover popover-placement=left> </span> </label> <div class=col-sm-9> <component :is=widget :field=field :value=value :model=model :description=description :property=property :placeholder=placeholder :required=required :readonly=readonly> </component> <label :for=field.id class=help-block v-for=\\\"error in errors\\\" track-by=$index>{{error}}</label> </div> </div> \";\n\n/***/ },\n\n/***/ 1228:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <form role=form class=form-horizontal v-el:form> <field v-for=\\\"field in fields\\\" :field=field track-by=id :schema=schema :model=model></field> </form> \";\n\n/***/ },\n\n/***/ 1231:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__vue_script__ = __webpack_require__(1222)\n\t__vue_template__ = __webpack_require__(1228)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1234:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1225);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1252:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _getPrototypeOf = __webpack_require__(21);\n\t\n\tvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\t\n\tvar _classCallCheck2 = __webpack_require__(20);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _createClass2 = __webpack_require__(46);\n\t\n\tvar _createClass3 = _interopRequireDefault(_createClass2);\n\t\n\tvar _possibleConstructorReturn2 = __webpack_require__(27);\n\t\n\tvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\t\n\tvar _inherits2 = __webpack_require__(26);\n\t\n\tvar _inherits3 = _interopRequireDefault(_inherits2);\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tvar _logger = __webpack_require__(19);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar CommunityResource = function (_Model) {\n\t (0, _inherits3.default)(CommunityResource, _Model);\n\t\n\t function CommunityResource() {\n\t (0, _classCallCheck3.default)(this, CommunityResource);\n\t return (0, _possibleConstructorReturn3.default)(this, (CommunityResource.__proto__ || (0, _getPrototypeOf2.default)(CommunityResource)).apply(this, arguments));\n\t }\n\t\n\t (0, _createClass3.default)(CommunityResource, [{\n\t key: 'fetch',\n\t value: function fetch(ident) {\n\t ident = ident || this.id;\n\t if (ident) {\n\t this.loading = true;\n\t this.$api('datasets.retrieve_community_resource', {\n\t community: ident\n\t }, this.on_fetched);\n\t } else {\n\t _logger2.default.error('Unable to fetch CommunityResource: no identifier specified');\n\t }\n\t return this;\n\t }\n\t }, {\n\t key: 'save',\n\t value: function save(on_error) {\n\t if (this.id) {\n\t this.update(this, on_error);\n\t } else {\n\t this.loading = true;\n\t this.$api('datasets.create_community_resource', {\n\t payload: this\n\t }, this.on_fetched, this.on_error(on_error));\n\t }\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update(data, on_error) {\n\t this.loading = true;\n\t this.$api('datasets.update_community_resource', {\n\t community: this.id,\n\t payload: data\n\t }, this.on_fetched, this.on_error(on_error));\n\t }\n\t }, {\n\t key: 'delete',\n\t value: function _delete(on_error) {\n\t var _this2 = this;\n\t\n\t this.loading = true;\n\t this.$api('datasets.delete_community_resource', {\n\t community: this.id\n\t }, function () {\n\t return _this2.$emit('updated');\n\t }, this.on_error(on_error));\n\t }\n\t }]);\n\t return CommunityResource;\n\t}(_base.Model);\n\t\n\texports.default = CommunityResource;\n\n/***/ },\n\n/***/ 1275:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _getPrototypeOf = __webpack_require__(21);\n\t\n\tvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\t\n\tvar _classCallCheck2 = __webpack_require__(20);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _createClass2 = __webpack_require__(46);\n\t\n\tvar _createClass3 = _interopRequireDefault(_createClass2);\n\t\n\tvar _possibleConstructorReturn2 = __webpack_require__(27);\n\t\n\tvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\t\n\tvar _inherits2 = __webpack_require__(26);\n\t\n\tvar _inherits3 = _interopRequireDefault(_inherits2);\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tvar _logger = __webpack_require__(19);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar Resource = function (_Model) {\n\t (0, _inherits3.default)(Resource, _Model);\n\t\n\t function Resource() {\n\t (0, _classCallCheck3.default)(this, Resource);\n\t return (0, _possibleConstructorReturn3.default)(this, (Resource.__proto__ || (0, _getPrototypeOf2.default)(Resource)).apply(this, arguments));\n\t }\n\t\n\t (0, _createClass3.default)(Resource, [{\n\t key: 'fetch',\n\t value: function fetch(datasetId, resourceId) {\n\t if (datasetId && resourceId) {\n\t this.loading = true;\n\t this.$api('datasets.get_resource', { dataset: datasetId, rid: resourceId }, this.on_fetched);\n\t } else {\n\t _logger2.default.error('Unable to fetch Resource: no identifier(s) specified');\n\t }\n\t return this;\n\t }\n\t }]);\n\t return Resource;\n\t}(_base.Model);\n\t\n\texports.default = Resource;\n\t;\n\n/***/ },\n\n/***/ 1280:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.schemas = exports.Schemas = undefined;\n\t\n\tvar _getPrototypeOf = __webpack_require__(21);\n\t\n\tvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\t\n\tvar _classCallCheck2 = __webpack_require__(20);\n\t\n\tvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\t\n\tvar _possibleConstructorReturn2 = __webpack_require__(27);\n\t\n\tvar _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);\n\t\n\tvar _inherits2 = __webpack_require__(26);\n\t\n\tvar _inherits3 = _interopRequireDefault(_inherits2);\n\t\n\tvar _base = __webpack_require__(39);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar Schemas = exports.Schemas = function (_List) {\n\t (0, _inherits3.default)(Schemas, _List);\n\t\n\t function Schemas(options) {\n\t (0, _classCallCheck3.default)(this, Schemas);\n\t\n\t var _this = (0, _possibleConstructorReturn3.default)(this, (Schemas.__proto__ || (0, _getPrototypeOf2.default)(Schemas)).call(this, options));\n\t\n\t _this.$options.ns = 'datasets';\n\t _this.$options.fetch = 'schemas';\n\t _this.sorted = 'label';\n\t return _this;\n\t }\n\t\n\t return Schemas;\n\t}(_base.List);\n\t\n\tvar schemas = exports.schemas = new Schemas().fetch();\n\texports.default = schemas;\n\n/***/ },\n\n/***/ 1283:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _assign = __webpack_require__(136);\n\t\n\tvar _assign2 = _interopRequireDefault(_assign);\n\t\n\tvar _api = __webpack_require__(99);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tvar _dataset = __webpack_require__(319);\n\t\n\tvar _dataset2 = _interopRequireDefault(_dataset);\n\t\n\tvar _resource = __webpack_require__(1275);\n\t\n\tvar _resource2 = _interopRequireDefault(_resource);\n\t\n\tvar _communityresource = __webpack_require__(1252);\n\t\n\tvar _communityresource2 = _interopRequireDefault(_communityresource);\n\t\n\tvar _horizontalForm = __webpack_require__(1231);\n\t\n\tvar _horizontalForm2 = _interopRequireDefault(_horizontalForm);\n\t\n\tvar _uploader = __webpack_require__(1097);\n\t\n\tvar _uploader2 = _interopRequireDefault(_uploader);\n\t\n\tvar _resource_types = __webpack_require__(336);\n\t\n\tvar _resource_types2 = _interopRequireDefault(_resource_types);\n\t\n\tvar _schemas = __webpack_require__(1280);\n\t\n\tvar _schemas2 = _interopRequireDefault(_schemas);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t components: { FormHorizontal: _horizontalForm2.default },\n\t mixins: [_uploader2.default],\n\t props: {\n\t dataset: {\n\t type: Object,\n\t default: function _default() {\n\t return new _dataset2.default();\n\t }\n\t },\n\t resource: {\n\t type: Object,\n\t default: function _default() {\n\t return new _resource2.default({\n\t data: {\n\t filetype: 'remote',\n\t type: 'main'\n\t }\n\t });\n\t }\n\t },\n\t isUpload: {\n\t type: Boolean,\n\t default: false\n\t }\n\t },\n\t created: function created() {\n\t var _this = this;\n\t\n\t _schemas2.default.$on('updated', function () {\n\t _this.hasSchemas = _schemas2.default.has_data;\n\t });\n\t },\n\t data: function data() {\n\t return {\n\t hasSchemas: _schemas2.default.has_data,\n\t hasChosenRemoteFile: false,\n\t generic_fields: [{\n\t id: 'title',\n\t label: this._('Title')\n\t }, {\n\t id: 'type',\n\t label: this._('Type'),\n\t widget: 'select-input',\n\t values: _resource_types2.default,\n\t map: function map(item) {\n\t return { value: item.id, text: item.label };\n\t }\n\t }, {\n\t id: 'description',\n\t label: this._('Description'),\n\t rows: 3\n\t }],\n\t progress: 0\n\t };\n\t },\n\t\n\t computed: {\n\t canDrop: function canDrop() {\n\t return this.isUpload && !this.files.length;\n\t },\n\t hasData: function hasData() {\n\t return Boolean(this.resource.url || this.hasChosenRemoteFile);\n\t },\n\t hasUploadedFile: function hasUploadedFile() {\n\t return this.resource.filetype == 'file';\n\t },\n\t file_fields: function file_fields() {\n\t var readonly = this.resource.filetype === 'file';\n\t return [{\n\t id: 'url',\n\t label: this._('URL'),\n\t widget: 'url-field',\n\t readonly: readonly\n\t }, {\n\t id: 'filesize',\n\t label: this._('Size'),\n\t readonly: readonly\n\t }, {\n\t id: 'format',\n\t label: this._('Format'),\n\t widget: 'format-completer',\n\t readonly: readonly\n\t }, {\n\t id: 'mime',\n\t label: this._('Mime Type'),\n\t widget: 'mime-completer',\n\t readonly: readonly\n\t }, {\n\t id: 'checksum',\n\t label: this._('Checksum'),\n\t widget: 'checksum',\n\t readonly: readonly\n\t }];\n\t },\n\t fields: function fields() {\n\t return this.generic_fields.concat(this.schema_field).concat(this.file_fields);\n\t },\n\t schema_field: function schema_field() {\n\t if (this.hasSchemas) {\n\t var values = [{ name: '', title: '' }].concat(_schemas2.default.data);\n\t return [{\n\t id: 'schema.name',\n\t label: this.resource.schema && this.resource.schema.url ? this._('Schema (Url already set)') : this._('Schema'),\n\t widget: 'select-input',\n\t values: values,\n\t map: function map(item) {\n\t return { value: item.name, text: item.title };\n\t }\n\t }];\n\t }\n\t\n\t return [];\n\t },\n\t is_community: function is_community() {\n\t return this.resource instanceof _communityresource2.default;\n\t },\n\t upload_endpoint: function upload_endpoint() {\n\t var operations = _api2.default.datasets && _api2.default.datasets.operations;\n\t if (!this.isUpload || !operations) return;\n\t var params = {};\n\t if (typeof this.dataset !== 'undefined') {\n\t params = { dataset: this.dataset.id };\n\t }\n\t if (this.resource.id) {\n\t if (this.is_community) {\n\t params.community = this.resource.id;\n\t } else {\n\t params.rid = this.resource.id;\n\t }\n\t }\n\t var route_new = this.resource.id ? '' : 'new_';\n\t var route_namespace = this.is_community ? 'community_' : 'dataset_';\n\t var endpoint = 'upload_' + route_new + route_namespace + 'resource';\n\t return operations[endpoint].urlify(params);\n\t }\n\t },\n\t events: {\n\t 'uploader:progress': function uploaderProgress(id, uploaded, total) {\n\t this.progress = Math.round(uploaded * 100 / total);\n\t },\n\t 'uploader:complete': function uploaderComplete(id, response) {\n\t if (!this.is_community) {\n\t this.dataset.resources.unshift(response);\n\t }\n\t\n\t if (this.$refs.form) {\n\t var title = this.$refs.form.serialize().title || this.resource.title;\n\t if (title) {\n\t response.title = title;\n\t }\n\t }\n\t this.resource.on_fetched({ obj: response });\n\t this.postUpload();\n\t }\n\t },\n\t methods: {\n\t manual: function manual() {\n\t this.hasChosenRemoteFile = true;\n\t this.resource.filetype = 'remote';\n\t this.isUpload = false;\n\t },\n\t postUpload: function postUpload() {\n\t this.resource.filetype = 'file';\n\t this.isUpload = false;\n\t },\n\t serialize: function serialize() {\n\t var result = (0, _assign2.default)({}, this.resource, this.$refs.form.serialize(), this.getSchemaValue());\n\t\n\t delete result.extras;\n\t return result;\n\t },\n\t getSchemaValue: function getSchemaValue() {\n\t if (!this.$refs.form.$form) return {};\n\t\n\t var el = this.$refs.form.$form.querySelector(\"select[name='schema.name']\");\n\t if (!el) return {};\n\t\n\t return { schema: { name: el.value ? el.value : null } };\n\t },\n\t validate: function validate() {\n\t return this.$refs.form.validate();\n\t },\n\t on_error: function on_error(response) {\n\t return this.$refs.form.on_error(response);\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1287:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".actions-list{margin-bottom:0}.actions-list .list-group-item{height:68px;background-color:#fbfbfb;margin:0 0 10px;border-radius:0;border:4px solid transparent;padding:0}.actions-list .list-group-item:last-child{margin-bottom:0}.actions-list .list-group-item .action-icon{float:left;width:60px;height:60px;background-color:#0073b7;margin:0}.actions-list .list-group-item .action-icon span{color:#fff;line-height:60px;text-align:center;display:block}.actions-list .list-group-item .list-group-item-text{margin-left:70px;font-weight:400}.actions-list .list-group-item .list-group-item-heading{margin-left:70px;margin-top:9px;margin-bottom:3px;font-weight:700}.actions-list .list-group-item:hover{background-color:#eee}.actions-list .list-group-item:hover .action-icon{background-color:#fbfbfb}.resource-upload-dropzone{border:4px dashed #d2d6de;min-height:150px;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.resource-upload-dropzone .lead{margin-bottom:0}.drop-active .resource-upload-dropzone{border:4px dashed #00a65a}.resource-upload-dropzone .col-sm-9>div{margin-right:15px}.resource-choose-upload{text-align:center}.resource-choose-upload a{text-decoration:underline}.modal-body .resource-choose-upload a{color:#fff}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/dataset/resource/form.vue\"],\"names\":[],\"mappings\":\"AAAA,cAAc,eAAe,CAAC,+BAA+B,YAAY,yBAAyB,gBAAgB,gBAAgB,6BAA6B,SAAS,CAAC,0CAA0C,eAAe,CAAC,4CAA4C,WAAW,WAAW,YAAY,yBAAyB,QAAQ,CAAC,iDAAiD,WAAW,iBAAiB,kBAAkB,aAAa,CAAC,qDAAqD,iBAAiB,eAAkB,CAAC,wDAAwD,iBAAiB,eAAe,kBAAkB,eAAgB,CAAC,qCAAqC,qBAAqB,CAAC,kDAAkD,wBAAwB,CAAC,0BAA0B,0BAA0B,iBAAiB,iBAAiB,oBAAoB,kBAAkB,CAAC,gCAAgC,eAAe,CAAC,uCAAuC,yBAAyB,CAAC,wCAAwC,iBAAiB,CAAC,wBAAwB,iBAAiB,CAAC,0BAA0B,yBAAyB,CAAC,sCAAsC,UAAW,CAAC\",\"file\":\"form.vue\",\"sourcesContent\":[\".actions-list{margin-bottom:0}.actions-list .list-group-item{height:68px;background-color:#fbfbfb;margin:0 0 10px;border-radius:0;border:4px solid transparent;padding:0}.actions-list .list-group-item:last-child{margin-bottom:0}.actions-list .list-group-item .action-icon{float:left;width:60px;height:60px;background-color:#0073b7;margin:0}.actions-list .list-group-item .action-icon span{color:#fff;line-height:60px;text-align:center;display:block}.actions-list .list-group-item .list-group-item-text{margin-left:70px;font-weight:normal}.actions-list .list-group-item .list-group-item-heading{margin-left:70px;margin-top:9px;margin-bottom:3px;font-weight:bold}.actions-list .list-group-item:hover{background-color:#eee}.actions-list .list-group-item:hover .action-icon{background-color:#fbfbfb}.resource-upload-dropzone{border:4px dashed #d2d6de;min-height:150px;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.resource-upload-dropzone .lead{margin-bottom:0}.drop-active .resource-upload-dropzone{border:4px dashed #00a65a}.resource-upload-dropzone .col-sm-9>div{margin-right:15px}.resource-choose-upload{text-align:center}.resource-choose-upload a{text-decoration:underline}.modal-body .resource-choose-upload a{color:white}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1290:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div> <form-horizontal v-if=\\\"hasData && !isUpload\\\" class=\\\"resource-form file-resource-form\\\" :fields=fields :model=resource v-ref:form> </form-horizontal> <div v-for=\\\"file in files\\\" track-by=id class=\\\"info-box bg-aqua\\\"> <span class=info-box-icon> <span class=\\\"fa fa-cloud-upload\\\"></span> </span> <div class=info-box-content> <span class=info-box-text>{{file.name}}</span> <span class=info-box-number>{{file.size | filesize}}</span> <div class=progress> <div class=progress-bar :style=\\\"{width: progress+'%'}\\\"></div> </div> <span class=progress-description> {{progress}}% </span> </div> </div> <div class=resource-choose-upload v-show=\\\"isUpload && !files.length\\\"> <div class=resource-upload-dropzone> <div class=row> <div class=\\\"text-center col-xs-12\\\"> <span class=\\\"fa fa-download fa-4x dropicon\\\"></span> </div> <div class=\\\"text-center col-xs-12 lead\\\"> <p>{{ _(\\\"Drag a file here\\\") }}</p> </div> <div class=\\\"text-center col-xs-12\\\"> <p>{{ _( \\\"or\\\") }}</p> </div> <div class=\\\"text-center col-xs-12\\\"> <span v-el:upload-btn class=\\\"btn btn-outline btn-flat\\\"> {{ _(\\\"Select a file from your computer\\\") }} </span> </div> </div> </div> <div v-if=!hasUploadedFile> <a href @click.prevent.stop=manual> {{ _(\\\"You can also link to an existing remote file or URL by clicking here.\\\") }} </a> </div> </div> </div> \";\n\n/***/ },\n\n/***/ 1294:\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_script__, __vue_template__\n\t__webpack_require__(1298)\n\t__vue_script__ = __webpack_require__(1283)\n\t__vue_template__ = __webpack_require__(1290)\n\tmodule.exports = __vue_script__ || {}\n\tif (module.exports.__esModule) module.exports = module.exports.default\n\tif (__vue_template__) {\n\t(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n\t}\n\n\n/***/ },\n\n/***/ 1298:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1287);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ },\n\n/***/ 1323:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _keys = __webpack_require__(332);\n\t\n\tvar _keys2 = _interopRequireDefault(_keys);\n\t\n\tvar _getIterator2 = __webpack_require__(200);\n\t\n\tvar _getIterator3 = _interopRequireDefault(_getIterator2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t ready: function ready() {\n\t var _iteratorNormalCompletion = true;\n\t var _didIteratorError = false;\n\t var _iteratorError = undefined;\n\t\n\t try {\n\t for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(this.$options.watchRefs)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t var $ref = _step.value;\n\t\n\t this.watchRef($ref, this.$options.watchRefs[$ref]);\n\t }\n\t } catch (err) {\n\t _didIteratorError = true;\n\t _iteratorError = err;\n\t } finally {\n\t try {\n\t if (!_iteratorNormalCompletion && _iterator.return) {\n\t _iterator.return();\n\t }\n\t } finally {\n\t if (_didIteratorError) {\n\t throw _iteratorError;\n\t }\n\t }\n\t }\n\t },\n\t\n\t methods: {\n\t watchRef: function watchRef($ref, handler) {\n\t var _this = this;\n\t\n\t var component = $ref.split('.')[0];\n\t\n\t var wait = function wait() {\n\t if (_this.$refs[component] === undefined) {\n\t setTimeout(wait, 1);\n\t return;\n\t }\n\t _this.$watch('$refs.' + $ref, handler.bind(_this));\n\t };\n\t wait();\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1415:\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _assign = __webpack_require__(136);\n\t\n\tvar _assign2 = _interopRequireDefault(_assign);\n\t\n\tvar _api = __webpack_require__(99);\n\t\n\tvar _api2 = _interopRequireDefault(_api);\n\t\n\tvar _dataset = __webpack_require__(319);\n\t\n\tvar _dataset2 = _interopRequireDefault(_dataset);\n\t\n\tvar _resource = __webpack_require__(1275);\n\t\n\tvar _resource2 = _interopRequireDefault(_resource);\n\t\n\tvar _communityresource = __webpack_require__(1252);\n\t\n\tvar _communityresource2 = _interopRequireDefault(_communityresource);\n\t\n\tvar _modal = __webpack_require__(318);\n\t\n\tvar _modal2 = _interopRequireDefault(_modal);\n\t\n\tvar _form = __webpack_require__(1294);\n\t\n\tvar _form2 = _interopRequireDefault(_form);\n\t\n\tvar _card = __webpack_require__(324);\n\t\n\tvar _card2 = _interopRequireDefault(_card);\n\t\n\tvar _card3 = __webpack_require__(334);\n\t\n\tvar _card4 = _interopRequireDefault(_card3);\n\t\n\tvar _filters = __webpack_require__(335);\n\t\n\tvar _filters2 = _interopRequireDefault(_filters);\n\t\n\tvar _watchRefs = __webpack_require__(1323);\n\t\n\tvar _watchRefs2 = _interopRequireDefault(_watchRefs);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t name: 'resource-modal',\n\t components: { Modal: _modal2.default, ResourceForm: _form2.default, OrgCard: _card2.default, UserCard: _card4.default },\n\t mixins: [_filters2.default, _watchRefs2.default],\n\t data: function data() {\n\t return {\n\t edit: false,\n\t confirm: false,\n\t dataset: this.$parent.$parent.dataset,\n\t resource: {},\n\t next_route: null,\n\t isUpload: false,\n\t hasUploadedFile: false,\n\t successMsg: undefined\n\t };\n\t },\n\t\n\t computed: {\n\t can_edit: function can_edit() {\n\t if (this.is_community) {\n\t return this.$root.me.can_edit(this.resource);\n\t } else {\n\t return this.$root.me.can_edit(this.dataset);\n\t }\n\t },\n\t is_community: function is_community() {\n\t return this.resource instanceof _communityresource2.default;\n\t }\n\t },\n\t events: {\n\t 'modal:closed': function modalClosed() {\n\t if (this.next_route) {\n\t this.$go(this.next_route);\n\t }\n\t }\n\t },\n\t route: {\n\t data: function data() {\n\t var _this = this;\n\t\n\t if (this.$route.matched.length > 1) {\n\t var idx = this.$route.matched.length - 2;\n\t var parent = this.$route.matched[idx];\n\t this.next_route = {\n\t name: parent.handler.name,\n\t params: parent.params\n\t };\n\t }\n\t if (this.$route.name.includes('community')) {\n\t this.resource = new _communityresource2.default();\n\t this.resource.fetch(this.$route.params.rid);\n\t this.resource.$once('updated', function () {\n\t _this.updHandler = _this.resource.$once('updated', _this.on_success);\n\t });\n\t } else if (this.dataset.loading) {\n\t this.updHandler = this.dataset.$once('updated', this.resource_from_dataset);\n\t } else {\n\t this.resource_from_dataset();\n\t }\n\t },\n\t deactivate: function deactivate() {\n\t if (this.updHandler) {\n\t this.updHandler.remove();\n\t this.updHandler = undefined;\n\t }\n\t }\n\t },\n\t methods: {\n\t cancel: function cancel() {\n\t if (this.confirm) {\n\t this.confirm = false;\n\t } else if (this.edit && !this.isUpload) {\n\t this.edit = false;\n\t } else if (this.isUpload) {\n\t this.$refs.form.isUpload = false;\n\t }\n\t },\n\t upload: function upload() {\n\t this.$refs.form.isUpload = true;\n\t },\n\t save: function save() {\n\t var $form = this.$refs.form;\n\t if ($form.validate()) {\n\t this.successMsg = this._('Your resource has been updated.');\n\t if (this.is_community) {\n\t (0, _assign2.default)(this.resource, $form.serialize());\n\t this.resource.save($form.on_error);\n\t } else {\n\t this.dataset.save_resource($form.serialize(), $form.on_error);\n\t }\n\t return true;\n\t }\n\t },\n\t on_success: function on_success() {\n\t this.$dispatch('notify', {\n\t autoclose: true,\n\t title: this._('Changes saved'),\n\t details: this.successMsg\n\t });\n\t this.$refs.modal.close();\n\t },\n\t delete_confirmed: function delete_confirmed() {\n\t this.successMsg = this._('Your resource has been deleted.');\n\t if (this.is_community) {\n\t this.resource.delete();\n\t } else {\n\t this.dataset.delete_resource(this.resource.id);\n\t }\n\t },\n\t resource_from_dataset: function resource_from_dataset() {\n\t var rid = this.$route.params.rid;\n\t var data = this.dataset.resources.find(function (resource) {\n\t return resource.id === rid;\n\t });\n\t if (data) {\n\t this.resource = new _resource2.default({ data: data });\n\t this.updHandler = this.dataset.$once('updated', this.on_success);\n\t }\n\t }\n\t },\n\t watchRefs: {\n\t 'form.isUpload': function formIsUpload(isUpload) {\n\t this.isUpload = isUpload;\n\t },\n\t 'form.hasUploadedFile': function formHasUploadedFile(hasUploadedFile) {\n\t this.hasUploadedFile = hasUploadedFile;\n\t }\n\t }\n\t};\n\n/***/ },\n\n/***/ 1491:\n/***/ function(module, exports, __webpack_require__) {\n\n\texports = module.exports = __webpack_require__(37)();\n\t// imports\n\t\n\t\n\t// module\n\texports.push([module.id, \".resource-modal dd a{color:#fff;text-decoration:underline}.resource-modal .dl-wide dd{word-break:break-all}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/dataset/resource/modal.vue\"],\"names\":[],\"mappings\":\"AAAA,qBAAqB,WAAY,yBAAyB,CAAC,4BAA4B,oBAAoB,CAAC\",\"file\":\"modal.vue\",\"sourcesContent\":[\".resource-modal dd a{color:white;text-decoration:underline}.resource-modal .dl-wide dd{word-break:break-all}\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n\n/***/ 1517:\n/***/ function(module, exports) {\n\n\tmodule.exports = \" <div> <modal :title=resource.title class=resource-modal :large=edit :class=\\\"{ 'modal-danger': confirm, 'modal-primary': !confirm }\\\" v-ref:modal> <div class=modal-body> <div v-show=\\\"!edit && !confirm\\\"> {{{ resource.description | markdown }}} <dl class=\\\"dl-horizontal dl-wide\\\"> <dt>{{ _('Type') }}</dt> <dd>{{ resource | resource_type_label }}</dd> <dt>{{ _('Location') }}</dt> <dd v-if=\\\"resource.filetype == 'file'\\\"> {{ _('This resource is hosted on our servers') }} </dd> <dd v-if=\\\"resource.filetype == 'remote'\\\"> {{ _('This resource is hosted on an external server') }} </dd> <dt>{{ _('URL') }}</dt> <dd><a :href=resource.url>{{resource.url}}</a></dd> <dt v-if=resource.format>{{ _('Format') }}</dt> <dd v-if=resource.format>{{ resource.format }}</dd> <dt v-if=\\\"resource.schema?.name || resource.schema?.url\\\">{{ _('Schema') }}</dt> <dd v-if=resource.schema?.name>{{ resource.schema.name }}</dd> <dd v-if=resource.schema?.url>{{ resource.schema.url }}</dd> <dt v-if=resource.mime>{{ _('Mime Type') }}</dt> <dd v-if=resource.mime>{{ resource.mime }}</dd> <dt v-if=resource.filesize>{{ _('Size') }}</dt> <dd v-if=resource.filesize>{{ resource.filesize }}</dd> <dt v-if=resource.checksum>{{ resource.checksum.type }}</dt> <dd v-if=resource.checksum>{{ resource.checksum.value }}</dd> <dt v-if=resource.created_at>{{ _('Created on') }}</dt> <dd v-if=resource.created_at>{{ resource.created_at | dt }}</dd> <dt v-if=resource.last_modified>{{ _('Modified on') }}</dt> <dd v-if=resource.last_modified>{{ resource.last_modified | dt }}</dd> <dt v-if=\\\"resource.metrics && resource.metrics.downloads\\\">{{ _('Downloads') }}</dt> <dd v-if=\\\"resource.metrics && resource.metrics.downloads\\\">{{ resource.metrics.downloads }}</dd> <dt v-if=is_community>{{ _('Publish by') }}</dt> <dd v-if=is_community> <user-card v-if=resource.owner :user=resource.owner></user-card> <org-card v-if=resource.organization :organization=resource.organization></org-card> </dd> </dl> </div> <resource-form v-show=edit v-ref:form :dataset=dataset :resource=resource></resource-form> <div v-show=confirm> <p class=\\\"lead text-center\\\"> {{ _('You are about to delete this resource') }} </p> <p class=\\\"lead text-center\\\"> {{ _('Are you sure ?') }} </p> </div> </div> <footer class=\\\"modal-footer text-center\\\"> <button type=button v-show=\\\"!edit && !confirm && !isUpload\\\" class=\\\"btn btn-primary btn-flat pull-left\\\" @click=$refs.modal.close> {{ _('Close') }} </button> <button type=button v-show=\\\"edit || confirm || isUpload\\\" class=\\\"btn btn-flat pull-left\\\" :class=\\\"{'btn-danger': confirm, 'btn-primary': !confirm}\\\" @click=cancel> {{ _('Cancel') }} </button> <button type=button v-show=\\\"!edit && !confirm && can_edit\\\" class=\\\"btn btn-danger btn-flat\\\" @click=\\\"confirm = true\\\"> {{ _('Delete') }} </button> <button type=button v-show=\\\"!edit && !confirm && can_edit\\\" class=\\\"btn btn-outline btn-flat\\\" @click=\\\"edit = true\\\"> {{ _('Edit') }} </button> <button type=button v-show=confirm class=\\\"btn btn-warning btn-flat\\\" @click=delete_confirmed> {{ _('Confirm') }} </button> <button type=button v-show=\\\"edit && hasUploadedFile && !isUpload\\\" class=\\\"btn btn-outline btn-flat\\\" @click=upload> {{ _('Replace the file') }} </button> <button type=button v-show=\\\"edit && !isUpload\\\" class=\\\"btn btn-outline btn-flat\\\" @click=save> {{ _('Save') }} </button> </footer> </modal> </div> \";\n\n/***/ },\n\n/***/ 1642:\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a <style> tag\n\t\n\t// load the styles\n\tvar content = __webpack_require__(1491);\n\tif(typeof content === 'string') content = [[module.id, content, '']];\n\t// add the styles to the DOM\n\tvar update = __webpack_require__(38)(content, {\"sourceMap\":true});\n\tif(content.locals) module.exports = content.locals;\n\t// Hot Module Replacement\n\tif(false) {\n\t\t// When the styles change, update the <style> tags\n\t\tif(!content.locals) {\n\t\t\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\", function() {\n\t\t\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\");\n\t\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\t\tupdate(newContent);\n\t\t\t});\n\t\t}\n\t\t// When the module is disposed, remove the <style> tags\n\t\tmodule.hot.dispose(function() { update(); });\n\t}\n\n/***/ }\n\n});\n\n\n/** WEBPACK FOOTER **\n ** chunks/2.614b3e73b072982fd9b1.js\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./modal.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./modal.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/dataset/resource/modal.vue\n ** module id = 344\n ** module chunks = 2\n **/","import log from 'logger';\nimport u from 'utils';\nimport Vue from 'vue';\n\n/**\n * Base inheritable properties reusable by nested components\n */\nexport const FieldComponentMixin = {\n props: {\n field: {\n type: Object,\n default() { return {};}\n },\n model: Object,\n value: null, // Means any type\n description: null,\n property: Object,\n required: Boolean,\n placeholder: String,\n readonly: Boolean\n },\n methods: {\n onChange(evt) {\n this.$dispatch('field:value-change', evt.target.value);\n }\n }\n};\n\n/**\n * Common form fields behaviors\n */\nexport const BaseField = {\n name: 'base-field',\n data() {\n return {\n errors: [],\n success: undefined,\n isField: true,\n };\n },\n components: {\n // Only register the common components\n 'text-input': require('components/form/text-input.vue'),\n 'number-input': require('components/form/number-input.vue'),\n 'hidden-input': require('components/form/hidden-input.vue'),\n 'select-input': require('components/form/select-input.vue'),\n 'select-input-group': require('components/form/select-input-group.vue'),\n 'markdown-editor': require('components/form/markdown-editor.vue'),\n 'date-picker': require('components/form/date-picker.vue'),\n 'checkbox': require('components/form/checkbox.vue')\n },\n events: {\n 'field:value-change': function(value) {\n this.$dispatch('field:change', this, value);\n return true; // Let the event continue its bubbling\n }\n },\n props: {\n field: {\n type: Object,\n default() { return {};},\n required: true\n },\n model: {\n type: Object,\n default() { return {};},\n required: true\n },\n schema: {\n type: Object,\n default() { return {};},\n required: true\n }\n },\n computed: {\n description() {\n const property = this.property;\n return property && property.hasOwnProperty('description')\n ? property.description\n : undefined;\n },\n property() {\n if (!this.schema.properties.hasOwnProperty(this.field.id)) {\n log.warn('Field \"' + this.field.id + '\" not found in schema');\n return {};\n }\n\n return this.schema.properties[this.field.id];\n },\n required() {\n if (!this.field || !this.schema.hasOwnProperty('required')) {\n return false;\n }\n return this.schema.required.indexOf(this.field.id) >= 0;\n },\n is_bool() {\n return this.property && this.property.type === 'boolean';\n },\n is_hidden() {\n return this.field && this.field.type === 'hidden';\n },\n value() {\n let value;\n if (this.model && this.field) {\n value = u.getattr(this.model, this.field.id);\n }\n if ((value === undefined || value === null) && this.property && this.property.hasOwnProperty('default')) {\n value = this.property.default;\n }\n return value;\n },\n placeholder() {\n return this.field.placeholder || this.field.label || '';\n },\n readonly() {\n // $parent is form\n return this.$parent.readonly || this.field.readonly || false;\n },\n widget() {\n let widget;\n if (this.field.widget) {\n widget = this.field.widget;\n } else if (this.property.type === 'boolean') {\n widget = 'checkbox';\n } else if (this.property.type === 'integer') {\n widget = 'number-input';\n } else if (this.property.type === 'string') {\n if (this.property.format === 'markdown') {\n widget = 'markdown-editor';\n } else if (this.property.enum) {\n widget = 'select-input';\n }\n }\n widget = widget || 'text-input';\n\n // Lazy load component if needed\n if (!Vue.util.resolveAsset(this.$options, 'components', widget)) {\n this.$options.components[widget] = function(resolve, reject) {\n require(['./' + widget + '.vue'], resolve);\n };\n }\n return widget;\n }\n },\n watch: {\n value(value) {\n this.$dispatch('field:change', this, value);\n }\n }\n};\n\nexport default BaseField;\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/components/form/base-field.js\n **/","module.exports = { \"default\": require(\"core-js/library/fn/array/from\"), __esModule: true };\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/babel-runtime/core-js/array/from.js\n ** module id = 990\n ** module chunks = 0 1 2 4 5 6 7 8 9 10 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","\"use strict\";\n\nexports.__esModule = true;\n\nvar _from = require(\"../core-js/array/from\");\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n } else {\n return (0, _from2.default)(arr);\n }\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/babel-runtime/helpers/toConsumableArray.js\n ** module id = 1034\n ** module chunks = 0 1 2 4 5 6 7 8 10 11 12 13 14 16 17 23 24 25 26 27 28 29 30 33\n **/","require('../../modules/es6.string.iterator');\nrequire('../../modules/es6.array.from');\nmodule.exports = require('../../modules/_core').Array.from;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/core-js/library/fn/array/from.js\n ** module id = 1035\n ** module chunks = 0 1 2 4 5 6 7 8 9 10 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./date-picker.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./date-picker.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/date-picker.vue\n ** module id = 1040\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./select-input.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./select-input.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/select-input.vue\n ** module id = 1041\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\")\n__vue_script__ = require(\"!!babel-loader!../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./calendar.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./calendar.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/calendar.vue\n ** module id = 1042\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./checkbox.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./checkbox.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/checkbox.vue\n ** module id = 1043\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./hidden-input.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./hidden-input.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/hidden-input.vue\n ** module id = 1044\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./markdown-editor.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./markdown-editor.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/markdown-editor.vue\n ** module id = 1045\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./number-input.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./number-input.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/number-input.vue\n ** module id = 1046\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./select-input-group.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./select-input-group.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/select-input-group.vue\n ** module id = 1047\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./text-input.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./text-input.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/text-input.vue\n ** module id = 1048\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","<template>\n<div class=\"calendar\" :class=\"[ 'view' ]\">\n <div class=\"calendar-{{view}}\">\n <nav>\n <button class=\"prev\" @click.prevent=\"previous\" :disabled=\"previousDisabled\">\n <span class=\"fa fa-chevron-left\"></span>\n </button>\n <button class=\"switch\" @click.prevent=\"zoomOut\">{{ rangeDisplay }}</button>\n <button class=\"next\" @click.prevent=\"next\" :disabled=\"nextDisabled\">\n <span class=\"fa fa-chevron-right\"></span>\n </button>\n </nav>\n <main v-if=\"view == 'days'\" class=\"days\">\n <header>\n <span class=\"dow\" v-for=\"day in days\">{{ day }}</span>\n </header>\n <div v-for=\"week in monthDays(current)\">\n <button v-for=\"day in week\" class=\"day\" :class=\"dayClasses(day)\"\n @click.prevent=\"pickDay(day)\" :disabled=\"isDisabled(day)\">\n {{ day.date() }}\n </button>\n </div>\n </main>\n <main v-if=\"view == 'months'\" class=\"months\">\n <button v-for=\"(idx, month) in months\" class=\"month\" @click.prevent=\"pickMonth(idx)\"\n :disabled=\"isMonthDisabled(idx)\">\n {{ month }}\n </button>\n </main>\n <main v-if=\"view == 'years'\" class=\"years\">\n <button v-for=\"year in yearsRange\" class=\"year\" @click.prevent=\"pickYear(year)\"\n :disabled=\"isYearDisabled(year)\">\n {{ year }}\n </button>\n </main>\n <footer>\n <button @click.prevent=\"pickDay(today)\">{{ _('Today') }}</button>\n <button @click.prevent=\"clear\">\n <span class=\"fa fa-remove\"></span>\n {{ _('Clear') }}\n </button>\n </footer>\n </div>\n</div>\n</template>\n\n<script>\nimport moment from 'moment';\n\nconst VIEWS = ['days', 'months', 'years'];\nconst MONTH_FORMAT = 'MMMM YYYY';\n\nfunction optionalMoment(value) {\n return value ? moment(value) : null\n}\n\nexport default {\n name: 'calendar',\n props: {\n selected: {\n type: moment,\n coerce: optionalMoment,\n default: null,\n },\n min: {\n type: moment,\n coerce: optionalMoment,\n default: null,\n },\n max: {\n type: moment,\n coerce: optionalMoment,\n default: null,\n },\n view: {\n type: String,\n default: 'days'\n }\n },\n data() {\n const current = this.selected || moment();\n return {\n current: current,\n today: moment()\n };\n },\n computed: {\n days() {\n const days = [];\n const weekdays = moment.weekdaysMin();\n const first = moment.localeData().firstDayOfWeek();\n for (let i = 0; i < 7; i++) {\n days.push(weekdays[(i + first) % 7]);\n }\n return days;\n },\n months() {\n return moment.monthsShort();\n },\n monthDisplay() {\n return this.current.format(MONTH_FORMAT);\n },\n rangeDisplay() {\n if (this.view == 'days') {\n return this.current.format(MONTH_FORMAT);\n } else if (this.view == 'months') {\n return this.current.year();\n } else if (this.view == 'years') {\n const start = this.current.clone().subtract(5, 'years');\n const end = this.current.clone().add(6, 'years');\n return `${start.year()}-${end.year()}`;\n }\n },\n yearsRange() {\n const start = this.current.clone().subtract(5, 'years');\n const years = [];\n\n for (let i=0; i < 12; i++) {\n years.push(start.clone().add(i, 'years').year());\n }\n return years;\n },\n nextValue() {\n const value = this.current.clone();\n if (this.view === 'days') {\n value.add(1, 'months');\n } else if (this.view === 'months') {\n value.add(1, 'years');\n } else if (this.view === 'years') {\n value.add(12, 'years');\n }\n return value;\n },\n previousValue() {\n const value = this.current.clone();\n if (this.view === 'days') {\n value.subtract(1, 'months');\n } else if (this.view === 'months') {\n value.subtract(1, 'year');\n } else if (this.view === 'years') {\n value.subtract(12, 'years');\n }\n return value;\n },\n nextDisabled() {\n if (!this.max) return;\n switch (this.view) {\n case 'days': return this.nextValue.isAfter(this.max, 'month');\n case 'months': return this.nextValue.isAfter(this.max, 'year');\n case 'years': return this.yearsRange.slice(-1).pop() >= this.max.year();\n }\n },\n previousDisabled() {\n if (!this.min) return;\n switch (this.view) {\n case 'days': return this.previousValue.isBefore(this.min, 'month');\n case 'months': return this.previousValue.isBefore(this.min, 'year');\n case 'years': return this.yearsRange[0] <= this.min.year();\n }\n }\n },\n methods: {\n monthDays(date) {\n const start = date.clone().startOf('month').startOf('week');\n const end = date.clone().endOf('month').endOf('week');\n const days = [];\n let row;\n\n for (let i=0; i <= end.diff(start, 'days'); i++) {\n if (i % 7 === 0) {\n row = [];\n days.push(row);\n }\n row.push(start.clone().add(i, 'days'));\n }\n return days;\n },\n next() {\n this.current = this.nextValue;\n },\n previous() {\n this.current = this.previousValue;\n },\n zoomOut() {\n if (VIEWS.indexOf(this.view) + 1 < VIEWS.length) {\n this.view = VIEWS[VIEWS.indexOf(this.view) + 1];\n }\n },\n pickDay(day) {\n this.selected = day;\n this.$dispatch('calendar:date:selected', day);\n },\n pickMonth(month) {\n this.current = this.current.month(month);\n this.view = 'days';\n this.$dispatch('calendar:month:selected', month);\n },\n pickYear(year) {\n this.current = this.current.year(year);\n this.view = 'months';\n this.$dispatch('calendar:year:selected', year);\n },\n\n isOld(day) {\n return day.isBefore(this.current.startOf('month'));\n },\n\n isNew(day) {\n return day.isAfter(this.current.endOf('month'));\n },\n\n isDisabled(day) {\n const isBeforeMin = this.min && day.isBefore(this.min, 'day');\n const isAfterMax = this.max && day.isAfter(this.max, 'day');\n return isBeforeMin || isAfterMax;\n },\n\n isMonthDisabled(idx) {\n const month = this.current.clone().month(idx);\n const isBeforeMin = this.min && month.isBefore(this.min, 'month');\n const isAfterMax = this.max && month.isAfter(this.max, 'month');\n return isBeforeMin || isAfterMax;\n },\n\n isYearDisabled(year) {\n const isBeforeMin = this.min && year < this.min.year();\n const isAfterMax = this.max && year > this.max.year();\n return isBeforeMin || isAfterMax;\n },\n\n dayClasses(day) {\n return {\n old: this.isOld(day),\n new: this.isNew(day),\n today: day.isSame(this.today, 'day'),\n active: day.isSame(this.selected, 'day')\n };\n },\n\n focus() {\n // Focus active or first button\n const button = this.$el.querySelector('main button.active:not(:disabled)')\n || this.$el.querySelector('main button:not(:disabled)');\n if (button) button.focus();\n },\n\n clear() {\n this.selected = null;\n this.current = this.today.clone();\n this.view = 'days';\n this.$dispatch('calendar:date:cleared');\n }\n },\n watch: {\n selected(value) {\n if (!value) return;\n this.current = value.clone();\n }\n }\n};\n</script>\n\n<style lang=\"less\">\n// Needs to chose between udata and admin variables\n// Choice might happen after the core/admin split\n@import '~bootstrap/less/variables';\n@import '~bootstrap/less/mixins';\n\n.calendar {\n @unit: 30px;\n color: black;\n\n min-width: 7 * @unit;\n\n > * {\n display: block;\n }\n\n .fa-remove {\n color: red;\n }\n\n border-radius: @border-radius-base;\n\n nav {\n font-weight: bold;\n display: flex;\n\n .switch {\n flex: 2 0 50%;\n }\n\n .prev, .next {\n flex: 1;\n }\n }\n\n main {\n display: flex;\n flex-wrap: wrap;\n\n\n header {\n font-weight: bold;\n span {\n height: @unit;\n padding-top: 10px;\n line-height: 20px;\n }\n }\n\n &.days {\n > * {\n display: flex;\n flex: 1 0 100%;\n }\n\n span, button {\n flex: 1 0 @unit;\n text-align: center;\n }\n }\n\n &.months, &.years {\n flex-wrap: wrap;\n button {\n flex: 1 0 25%;\n text-align: center;\n height: 54px;\n line-height: 54px;\n }\n }\n }\n\n footer {\n font-weight: bold;\n display: flex;\n }\n\n button {\n height: @unit;\n width: 100%;\n background: none;\n border: none;\n border-radius: @border-radius-base;\n\n &:hover {\n background: @gray-lighter;\n }\n\n &.old,\n &.new {\n color: @btn-link-disabled-color;\n }\n\n &.day:hover,\n &:focus {\n background: @gray-lighter;\n cursor: pointer;\n }\n\n &:disabled,\n &:disabled:hover {\n background: none;\n color: @btn-link-disabled-color;\n cursor: not-allowed;\n }\n\n &.today {\n @today-bg: lighten(orange, 30%);\n @today-color: #000;\n .button-variant(@today-color, @today-bg, darken(@today-bg, 20%));\n position: relative;\n\n &:focus {\n background: darken(@today-bg, 10%);\n }\n\n &:disabled,\n &:disabled:active {\n background: @today-bg;\n color: @btn-link-disabled-color;\n }\n\n &:before {\n content: '';\n display: inline-block;\n border: solid transparent;\n border-width: 0 0 7px 7px;\n border-bottom-color: @today-color;\n border-top-color: @today-bg;\n position: absolute;\n bottom: 4px;\n right: 4px;\n }\n }\n\n &.active {\n .button-variant(@btn-primary-color, @btn-primary-bg, @btn-primary-border);\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\n &.today:before {\n border-bottom-color: @btn-primary-color;\n }\n }\n }\n}\n</style>\n\n\n\n/** WEBPACK FOOTER **\n ** calendar.vue?33e37ad1\n **/","<style lang=\"less\">\n.checkbox-form-field label {\n font-weight: bold;\n}\n</style>\n\n<template>\n<div class=\"checkbox checkbox-form-field\">\n <label :for=\"field.id\" :class=\"{ 'required': required }\">\n <input type=\"checkbox\"\n :id=\"field.id\"\n :name=\"field.id\"\n :checked=\"value\"\n @input=\"onChange\"\n ></input>\n {{ field.label }}\n </label>\n</div>\n</template>\n\n<script>\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'Checkbox',\n mixins: [FieldComponentMixin],\n methods: {\n onChange(evt) {\n this.$dispatch('field:value-change', evt.target.checked);\n }\n }\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** checkbox.vue?ae00ad50\n **/","<style lang=\"less\">\n.date-picker {\n .dropdown-menu {\n min-width: 100%;\n width: auto;\n }\n}\n</style>\n\n<template>\n<div class=\"input-group dropdown date-picker\" :class=\"{ 'open': picking }\"\n v-outside=\"onOutside\">\n <span class=\"input-group-addon\"><span class=\"fa fa-calendar\"></span></span>\n <input type=\"text\" class=\"form-control\" v-el:input\n @focus=\"onFocus\" @input=\"onChange | debounce 500\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :value=\"value|dt dateFormat ''\"\n :readonly=\"readonly\"></input>\n <div class=\"dropdown-menu dropdown-menu-right\">\n <calendar v-ref:calendar :selected=\"value\"></calendar>\n </div>\n <input v-if=\"serializable\" v-el:hidden type=\"hidden\"\n :name=\"field.id\"\n :value=\"value|dt ISO_FORMAT ''\">\n </input>\n</div>\n</template>\n\n<script>\nimport moment from 'moment';\nimport Calendar from 'components/calendar.vue';\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nconst DEFAULT_FORMAT = 'L';\nconst ISO_FORMAT = 'YYYY-MM-DDTHH:mm:ss';\n\nexport default {\n name: 'date-picker',\n mixins: [FieldComponentMixin],\n props: {\n serializable: {\n type: Boolean,\n default: true\n }\n },\n components: {Calendar},\n data() {\n return {\n picking: false,\n ISO_FORMAT,\n };\n },\n computed: {\n dateFormat() {\n return this.field.format || DEFAULT_FORMAT;\n }\n },\n events: {\n 'calendar:date:selected': function(date) {\n this.value = date\n this.picking = false;\n return true;\n },\n 'calendar:date:cleared': function() {\n this.value = null;\n this.picking = false;\n return true;\n }\n },\n methods: {\n onFocus() {\n if (!this.picking) this.$nextTick(this.$refs.calendar.focus);\n this.picking = true;\n },\n onChange(e) {\n try {\n this.value = moment(e.target.value, this.dateFormat);\n } catch(e) {\n // Don't do anything while typing (ie. incomplete date is unparseable)\n }\n },\n onOutside() {\n this.picking = false;\n }\n }\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** date-picker.vue?22d87736\n **/","<template>\n<input type=\"hidden\"\n :id=\"field.id\"\n :name=\"field.id\"\n :value=\"value\"\n :required=\"required\"></input>\n</template>\n\n<script>\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'hidden-input',\n mixins: [FieldComponentMixin]\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** hidden-input.vue?0410c942\n **/","<!-- Markdown editor widget -->\n<style lang=\"less\">\n@import '~less/udata/markdown';\n\n@padding: 6px 12px;\n\n.md-editor {\n > textarea {\n background: white;\n padding: @padding;\n border-bottom: none;\n }\n\n &.active {\n border-color: #3c8dbc;\n -webkit-box-shadow: none;\n box-shadow: none;\n\n }\n\n .form-group.has-error & {\n border-color: #dd4b39;\n }\n\n .form-group.has-success & {\n border-color: #00a65a;\n }\n\n .btn {\n border-radius: 0;\n\n &.btn-default {\n background-color: white;\n }\n }\n\n .md-preview {\n color: black;\n padding: @padding;\n max-width: 100%;\n\n .markdown();\n }\n}\n</style>\n\n<template>\n<textarea class=\"form-control\" :rows=\"field.rows || rows || 6\"\n :id=\"field.id\"\n :name=\"field.id\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :readonly=\"readonly\"\n @input=\"onChange\">{{value || ''}}</textarea>\n</template>\n\n<script>\nimport $ from 'jquery';\nimport config from 'config';\nimport {_} from 'i18n';\nimport {FieldComponentMixin} from 'components/form/base-field';\nimport markdown from 'helpers/markdown';\n\nconst EXCERPT_TOKEN = '<!--- excerpt -->';\n\nrequire('bootstrap-markdown/js/bootstrap-markdown');\n\n$.fn.markdown.messages[config.lang] = {\n 'Bold': _('Bold'),\n 'Italic': _('Italic'),\n 'Heading': _('Heading'),\n 'URL/Link': _('URL/Link'),\n 'Image': _('Image'),\n 'List': _('List'),\n 'Preview': _('Preview'),\n 'strong text': _('strong text'),\n 'emphasized text': _('emphasized text'),\n 'heading text': _('heading text'),\n 'enter link description here': _('enter link description here'),\n 'Insert Hyperlink': _('Insert Hyperlink'),\n 'enter image description here': _('enter image description here'),\n 'Insert Image Hyperlink': _('Insert Image Hyperlink'),\n 'enter image title here': _('enter image title here'),\n 'list text here': _('list text here')\n};\n\nexport default {\n name: 'markdown-editor',\n props: ['rows'],\n mixins: [FieldComponentMixin],\n ready: function() {\n $(this.$el).markdown({\n language: config.lang,\n autofocus: false,\n savable: false,\n resize: 'both',\n iconlibrary: 'fa',\n onPreview: (e) => markdown(e.getContent()),\n additionalButtons: [\n [{\n name: 'extras',\n data: [{\n name: 'btnSummary',\n title: _('Summary'),\n icon: 'fa fa-scissors',\n callback: function(e){\n var selected = e.getSelection(),\n cursor = selected.start;\n\n e.replaceSelection(EXCERPT_TOKEN);\n e.setSelection(cursor, cursor + EXCERPT_TOKEN.length);\n }\n }]\n }]\n ]\n });\n }\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** markdown-editor.vue?5db87f49\n **/","<template>\n<input type=\"number\" class=\"form-control\"\n :id=\"field.id\"\n :name=\"field.id\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :readonly=\"readonly\"\n :value=\"value\"\n @input=\"onChange\"></input>\n</template>\n\n<script>\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'number-input',\n mixins: [FieldComponentMixin],\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** number-input.vue?a69a5016\n **/","<template>\n<select class=\"form-control\" v-model=\"value\"\n :multiple=\"field.multiple\"\n :id=\"field.id\"\n :name=\"field.id\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :disabled=\"readonly\"\n @change=\"onChange\">\n <optgroup v-for=\"(group, ids) in field.groups\" :label=\"group\">\n <option v-for=\"option in options | extract group\" :value=\"option.value\" :selected=\"option.value == value\">\n {{option.text || option.value}}\n </option>\n </optgroup>\n</select>\n</template>\n\n<script>\nimport {List} from 'models/base';\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'select-input-group',\n mixins: [FieldComponentMixin],\n props: {\n groups: {\n type: Object,\n default() {\n return {}\n }\n }\n },\n computed: {\n options: function() {\n if (!this.property && !this.field) return [];\n\n if (this.field.values) {\n if (this.field.values instanceof List) {\n return this.field.values.items;\n }\n return this.field.values;\n } else if (this.property.enum && this.field.labels) {\n return this.property.enum.map(function(value) {\n return {value: value, text: this.field.labels[value]};\n });\n } else if (this.property.enum) {\n return this.property.enum.map(function(value) {\n return {value: value, text: value};\n });\n }\n\n return [];\n }\n },\n filters: {\n extract: function(items, group) {\n if (this.field.map) {\n items = items.map(this.field.map);\n return items.filter(item => this.field.groups[group].map(license => license.value).includes(item.value));\n }\n return items;\n }\n },\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** select-input-group.vue?7c0f61f9\n **/","<template>\n<select class=\"form-control\" v-model=\"value\"\n :multiple=\"field.multiple\"\n :id=\"field.id\"\n :name=\"field.id\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :disabled=\"readonly\"\n @change=\"onChange\">\n <option v-for=\"option in options | extract\" :value=\"option.value\">\n {{option.text || option.value}}\n </option>\n</select>\n</template>\n\n<script>\nimport {List} from 'models/base';\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'select-input',\n mixins: [FieldComponentMixin],\n computed: {\n options: function() {\n if (!this.property && !this.field) return [];\n\n if (this.field.values) {\n if (this.field.values instanceof List) {\n return this.field.values.items;\n }\n return this.field.values;\n } else if (this.property.enum && this.field.labels) {\n return this.property.enum.map(function(value) {\n return {value: value, text: this.field.labels[value]};\n });\n } else if (this.property.enum) {\n return this.property.enum.map(function(value) {\n return {value: value, text: value};\n });\n }\n\n return [];\n }\n },\n filters: {\n extract: function(items) {\n if (this.field.map) {\n return items.map(this.field.map);\n }\n return items;\n }\n },\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** select-input.vue?ac6a6526\n **/","<template>\n<input type=\"text\" class=\"form-control\"\n :id=\"field.id\"\n :name=\"field.id\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :readonly=\"readonly\"\n :value=\"value\"\n @input=\"onChange\"></input>\n</template>\n\n<script>\nimport {FieldComponentMixin} from 'components/form/base-field';\n\nexport default {\n name: 'text-input',\n mixins: [FieldComponentMixin],\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** text-input.vue?2faba799\n **/","/* ===================================================\n * bootstrap-markdown.js v2.10.0\n * http://github.com/toopay/bootstrap-markdown\n * ===================================================\n * Copyright 2013-2016 Taufan Aditya\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n(function(factory){\n if (typeof define === \"function\" && define.amd) {\n //RequireJS\n define([\"jquery\"], factory);\n } else if (typeof exports === 'object') {\n //Backbone.js\n factory(require('jquery'));\n } else {\n //Jquery plugin\n factory(jQuery);\n }\n}(function($){\n \"use strict\"; // jshint ;_;\n\n /* MARKDOWN CLASS DEFINITION\n * ========================== */\n\n var Markdown = function (element, options) {\n // @TODO : remove this BC on next major release\n // @see : https://github.com/toopay/bootstrap-markdown/issues/109\n var opts = ['autofocus', 'savable', 'hideable', 'width', \n 'height', 'resize', 'iconlibrary', 'language', \n 'footer', 'fullscreen', 'hiddenButtons', 'disabledButtons'];\n $.each(opts,function(_, opt){\n if (typeof $(element).data(opt) !== 'undefined') {\n options = typeof options == 'object' ? options : {}\n options[opt] = $(element).data(opt)\n }\n });\n // End BC\n\n // Class Properties\n this.$ns = 'bootstrap-markdown';\n this.$element = $(element);\n this.$editable = {el:null, type:null,attrKeys:[], attrValues:[], content:null};\n this.$options = $.extend(true, {}, $.fn.markdown.defaults, options, this.$element.data('options'));\n this.$oldContent = null;\n this.$isPreview = false;\n this.$isFullscreen = false;\n this.$editor = null;\n this.$textarea = null;\n this.$handler = [];\n this.$callback = [];\n this.$nextTab = [];\n\n this.showEditor();\n };\n\n Markdown.prototype = {\n\n constructor: Markdown\n\n , __alterButtons: function(name,alter) {\n var handler = this.$handler, isAll = (name == 'all'),that = this;\n\n $.each(handler,function(k,v) {\n var halt = true;\n if (isAll) {\n halt = false;\n } else {\n halt = v.indexOf(name) < 0;\n }\n\n if (halt === false) {\n alter(that.$editor.find('button[data-handler=\"'+v+'\"]'));\n }\n });\n }\n\n , __buildButtons: function(buttonsArray, container) {\n var i,\n ns = this.$ns,\n handler = this.$handler,\n callback = this.$callback;\n\n for (i=0;i<buttonsArray.length;i++) {\n // Build each group container\n var y, btnGroups = buttonsArray[i];\n for (y=0;y<btnGroups.length;y++) {\n // Build each button group\n var z,\n buttons = btnGroups[y].data,\n btnGroupContainer = $('<div/>', {\n 'class': 'btn-group'\n });\n\n for (z=0;z<buttons.length;z++) {\n var button = buttons[z],\n buttonContainer, buttonIconContainer,\n buttonHandler = ns+'-'+button.name,\n buttonIcon = this.__getIcon(button.icon),\n btnText = button.btnText ? button.btnText : '',\n btnClass = button.btnClass ? button.btnClass : 'btn',\n tabIndex = button.tabIndex ? button.tabIndex : '-1',\n hotkey = typeof button.hotkey !== 'undefined' ? button.hotkey : '',\n hotkeyCaption = typeof jQuery.hotkeys !== 'undefined' && hotkey !== '' ? ' ('+hotkey+')' : '';\n\n // Construct the button object\n buttonContainer = $('<button></button>');\n buttonContainer.text(' ' + this.__localize(btnText)).addClass('btn-default btn-sm').addClass(btnClass);\n if(btnClass.match(/btn\\-(primary|success|info|warning|danger|link)/)){\n buttonContainer.removeClass('btn-default');\n }\n buttonContainer.attr({\n 'type': 'button',\n 'title': this.__localize(button.title) + hotkeyCaption,\n 'tabindex': tabIndex,\n 'data-provider': ns,\n 'data-handler': buttonHandler,\n 'data-hotkey': hotkey\n });\n if (button.toggle === true){\n buttonContainer.attr('data-toggle', 'button');\n }\n buttonIconContainer = $('<span/>');\n buttonIconContainer.addClass(buttonIcon);\n buttonIconContainer.prependTo(buttonContainer);\n\n // Attach the button object\n btnGroupContainer.append(buttonContainer);\n\n // Register handler and callback\n handler.push(buttonHandler);\n callback.push(button.callback);\n }\n\n // Attach the button group into container dom\n container.append(btnGroupContainer);\n }\n }\n\n return container;\n }\n , __setListener: function() {\n // Set size and resizable Properties\n var hasRows = typeof this.$textarea.attr('rows') !== 'undefined',\n maxRows = this.$textarea.val().split(\"\\n\").length > 5 ? this.$textarea.val().split(\"\\n\").length : '5',\n rowsVal = hasRows ? this.$textarea.attr('rows') : maxRows;\n\n this.$textarea.attr('rows',rowsVal);\n if (this.$options.resize) {\n this.$textarea.css('resize',this.$options.resize);\n }\n\n this.$textarea.on({\n 'focus' : $.proxy(this.focus, this),\n 'keyup' : $.proxy(this.keyup, this),\n 'change' : $.proxy(this.change, this),\n 'select' : $.proxy(this.select, this)\n });\n\n if (this.eventSupported('keydown')) {\n this.$textarea.on('keydown', $.proxy(this.keydown, this));\n }\n\n if (this.eventSupported('keypress')) {\n this.$textarea.on('keypress', $.proxy(this.keypress, this))\n }\n\n // Re-attach markdown data\n this.$textarea.data('markdown',this);\n }\n\n , __handle: function(e) {\n var target = $(e.currentTarget),\n handler = this.$handler,\n callback = this.$callback,\n handlerName = target.attr('data-handler'),\n callbackIndex = handler.indexOf(handlerName),\n callbackHandler = callback[callbackIndex];\n\n // Trigger the focusin\n $(e.currentTarget).focus();\n\n callbackHandler(this);\n\n // Trigger onChange for each button handle\n this.change(this);\n\n // Unless it was the save handler,\n // focusin the textarea\n if (handlerName.indexOf('cmdSave') < 0) {\n this.$textarea.focus();\n }\n\n e.preventDefault();\n }\n\n , __localize: function(string) {\n var messages = $.fn.markdown.messages,\n language = this.$options.language;\n if (\n typeof messages !== 'undefined' &&\n typeof messages[language] !== 'undefined' &&\n typeof messages[language][string] !== 'undefined'\n ) {\n return messages[language][string];\n }\n return string;\n }\n\n , __getIcon: function(src) {\n return typeof src == 'object' ? src[this.$options.iconlibrary] : src;\n }\n\n , setFullscreen: function(mode) {\n var $editor = this.$editor,\n $textarea = this.$textarea;\n\n if (mode === true) {\n $editor.addClass('md-fullscreen-mode');\n $('body').addClass('md-nooverflow');\n this.$options.onFullscreen(this);\n } else {\n $editor.removeClass('md-fullscreen-mode');\n $('body').removeClass('md-nooverflow');\n\n if (this.$isPreview == true) this.hidePreview().showPreview()\n }\n\n this.$isFullscreen = mode;\n $textarea.focus();\n }\n\n , showEditor: function() {\n var instance = this,\n textarea,\n ns = this.$ns,\n container = this.$element,\n originalHeigth = container.css('height'),\n originalWidth = container.css('width'),\n editable = this.$editable,\n handler = this.$handler,\n callback = this.$callback,\n options = this.$options,\n editor = $( '<div/>', {\n 'class': 'md-editor',\n click: function() {\n instance.focus();\n }\n });\n\n // Prepare the editor\n if (this.$editor === null) {\n // Create the panel\n var editorHeader = $('<div/>', {\n 'class': 'md-header btn-toolbar'\n });\n\n // Merge the main & additional button groups together\n var allBtnGroups = [];\n if (options.buttons.length > 0) allBtnGroups = allBtnGroups.concat(options.buttons[0]);\n if (options.additionalButtons.length > 0) {\n // iterate the additional button groups\n $.each(options.additionalButtons[0], function(idx, buttonGroup){\n \n // see if the group name of the addional group matches an existing group\n var matchingGroups = $.grep(allBtnGroups, function(allButtonGroup, allIdx){\n return allButtonGroup.name === buttonGroup.name;\n });\n\n // if it matches add the addional buttons to that group, if not just add it to the all buttons group\n if(matchingGroups.length > 0) {\n matchingGroups[0].data = matchingGroups[0].data.concat(buttonGroup.data);\n } else { \n allBtnGroups.push(options.additionalButtons[0][idx]);\n }\n\n });\n } \n\n // Reduce and/or reorder the button groups\n if (options.reorderButtonGroups.length > 0) {\n allBtnGroups = allBtnGroups\n .filter(function(btnGroup) {\n return options.reorderButtonGroups.indexOf(btnGroup.name) > -1;\n })\n .sort(function(a, b) {\n if (options.reorderButtonGroups.indexOf(a.name) < options.reorderButtonGroups.indexOf(b.name)) return -1;\n if (options.reorderButtonGroups.indexOf(a.name) > options.reorderButtonGroups.indexOf(b.name)) return 1;\n return 0;\n });\n }\n\n // Build the buttons\n if (allBtnGroups.length > 0) {\n editorHeader = this.__buildButtons([allBtnGroups], editorHeader);\n }\n\n if (options.fullscreen.enable) {\n editorHeader.append('<div class=\"md-controls\"><a class=\"md-control md-control-fullscreen\" href=\"#\"><span class=\"'+this.__getIcon(options.fullscreen.icons.fullscreenOn)+'\"></span></a></div>').on('click', '.md-control-fullscreen', function(e) {\n e.preventDefault();\n instance.setFullscreen(true);\n });\n }\n\n editor.append(editorHeader);\n\n // Wrap the textarea\n if (container.is('textarea')) {\n container.before(editor);\n textarea = container;\n textarea.addClass('md-input');\n editor.append(textarea);\n } else {\n var rawContent = (typeof toMarkdown == 'function') ? toMarkdown(container.html()) : container.html(),\n currentContent = $.trim(rawContent);\n\n // This is some arbitrary content that could be edited\n textarea = $('<textarea/>', {\n 'class': 'md-input',\n 'val' : currentContent\n });\n\n editor.append(textarea);\n\n // Save the editable\n editable.el = container;\n editable.type = container.prop('tagName').toLowerCase();\n editable.content = container.html();\n\n $(container[0].attributes).each(function(){\n editable.attrKeys.push(this.nodeName);\n editable.attrValues.push(this.nodeValue);\n });\n\n // Set editor to blocked the original container\n container.replaceWith(editor);\n }\n\n var editorFooter = $('<div/>', {\n 'class': 'md-footer'\n }),\n createFooter = false,\n footer = '';\n // Create the footer if savable\n if (options.savable) {\n createFooter = true;\n var saveHandler = 'cmdSave';\n\n // Register handler and callback\n handler.push(saveHandler);\n callback.push(options.onSave);\n\n editorFooter.append('<button class=\"btn btn-success\" data-provider=\"'\n + ns\n + '\" data-handler=\"'\n + saveHandler\n + '\"><i class=\"icon icon-white icon-ok\"></i> '\n + this.__localize('Save')\n + '</button>');\n\n\n }\n\n footer = typeof options.footer === 'function' ? options.footer(this) : options.footer;\n\n if ($.trim(footer) !== '') {\n createFooter = true;\n editorFooter.append(footer);\n }\n\n if (createFooter) editor.append(editorFooter);\n\n // Set width\n if (options.width && options.width !== 'inherit') {\n if (jQuery.isNumeric(options.width)) {\n editor.css('display', 'table');\n textarea.css('width', options.width + 'px');\n } else {\n editor.addClass(options.width);\n }\n }\n\n // Set height\n if (options.height && options.height !== 'inherit') {\n if (jQuery.isNumeric(options.height)) {\n var height = options.height;\n if (editorHeader) height = Math.max(0, height - editorHeader.outerHeight());\n if (editorFooter) height = Math.max(0, height - editorFooter.outerHeight());\n textarea.css('height', height + 'px');\n } else {\n editor.addClass(options.height);\n }\n }\n\n // Reference\n this.$editor = editor;\n this.$textarea = textarea;\n this.$editable = editable;\n this.$oldContent = this.getContent();\n\n this.__setListener();\n\n // Set editor attributes, data short-hand API and listener\n this.$editor.attr('id',(new Date()).getTime());\n this.$editor.on('click', '[data-provider=\"bootstrap-markdown\"]', $.proxy(this.__handle, this));\n\n if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n this.$editor.addClass('md-editor-disabled');\n this.disableButtons('all');\n }\n\n if (this.eventSupported('keydown') && typeof jQuery.hotkeys === 'object') {\n editorHeader.find('[data-provider=\"bootstrap-markdown\"]').each(function() {\n var $button = $(this),\n hotkey = $button.attr('data-hotkey');\n if (hotkey.toLowerCase() !== '') {\n textarea.bind('keydown', hotkey, function() {\n $button.trigger('click');\n return false;\n });\n }\n });\n }\n\n if (options.initialstate === 'preview') {\n this.showPreview();\n } else if (options.initialstate === 'fullscreen' && options.fullscreen.enable) {\n this.setFullscreen(true);\n }\n\n } else {\n this.$editor.show();\n }\n\n if (options.autofocus) {\n this.$textarea.focus();\n this.$editor.addClass('active');\n }\n\n if (options.fullscreen.enable && options.fullscreen !== false) {\n this.$editor.append('<div class=\"md-fullscreen-controls\">'\n + '<a href=\"#\" class=\"exit-fullscreen\" title=\"Exit fullscreen\"><span class=\"' + this.__getIcon(options.fullscreen.icons.fullscreenOff) + '\">'\n + '</span></a>'\n + '</div>');\n this.$editor.on('click', '.exit-fullscreen', function(e) {\n e.preventDefault();\n instance.setFullscreen(false);\n });\n }\n\n // hide hidden buttons from options\n this.hideButtons(options.hiddenButtons);\n\n // disable disabled buttons from options\n this.disableButtons(options.disabledButtons);\n\n // Trigger the onShow hook\n options.onShow(this);\n\n return this;\n }\n\n , parseContent: function(val) {\n var content;\n\n // parse with supported markdown parser\n var val = val || this.$textarea.val();\n\n if (this.$options.parser) {\n content = this.$options.parser(val);\n } else if (typeof markdown == 'object') {\n content = markdown.toHTML(val);\n } else if (typeof marked == 'function') {\n content = marked(val);\n } else {\n content = val;\n }\n\n return content;\n }\n\n , showPreview: function() {\n var options = this.$options,\n container = this.$textarea,\n afterContainer = container.next(),\n replacementContainer = $('<div/>',{'class':'md-preview','data-provider':'markdown-preview'}),\n content,\n callbackContent;\n\n if (this.$isPreview == true) {\n // Avoid sequenced element creation on missused scenario\n // @see https://github.com/toopay/bootstrap-markdown/issues/170\n return this;\n }\n \n // Give flag that tell the editor enter preview mode\n this.$isPreview = true;\n // Disable all buttons\n this.disableButtons('all').enableButtons('cmdPreview');\n\n // Try to get the content from callback\n callbackContent = options.onPreview(this);\n // Set the content based from the callback content if string otherwise parse value from textarea\n content = typeof callbackContent == 'string' ? callbackContent : this.parseContent();\n\n // Build preview element\n replacementContainer.html(content);\n\n if (afterContainer && afterContainer.attr('class') == 'md-footer') {\n // If there is footer element, insert the preview container before it\n replacementContainer.insertBefore(afterContainer);\n } else {\n // Otherwise, just append it after textarea\n container.parent().append(replacementContainer);\n }\n\n // Set the preview element dimensions\n replacementContainer.css({\n width: container.outerWidth() + 'px',\n height: container.outerHeight() + 'px'\n });\n\n if (this.$options.resize) {\n replacementContainer.css('resize',this.$options.resize);\n }\n\n // Hide the last-active textarea\n container.hide();\n\n // Attach the editor instances\n replacementContainer.data('markdown',this);\n\n if (this.$element.is(':disabled') || this.$element.is('[readonly]')) {\n this.$editor.addClass('md-editor-disabled');\n this.disableButtons('all');\n }\n\n return this;\n }\n\n , hidePreview: function() {\n // Give flag that tell the editor quit preview mode\n this.$isPreview = false;\n\n // Obtain the preview container\n var container = this.$editor.find('div[data-provider=\"markdown-preview\"]');\n\n // Remove the preview container\n container.remove();\n\n // Enable all buttons\n this.enableButtons('all');\n // Disable configured disabled buttons\n this.disableButtons(this.$options.disabledButtons);\n\n // Back to the editor\n this.$textarea.show();\n this.__setListener();\n\n return this;\n }\n\n , isDirty: function() {\n return this.$oldContent != this.getContent();\n }\n\n , getContent: function() {\n return this.$textarea.val();\n }\n\n , setContent: function(content) {\n this.$textarea.val(content);\n\n return this;\n }\n\n , findSelection: function(chunk) {\n var content = this.getContent(), startChunkPosition;\n\n if (startChunkPosition = content.indexOf(chunk), startChunkPosition >= 0 && chunk.length > 0) {\n var oldSelection = this.getSelection(), selection;\n\n this.setSelection(startChunkPosition,startChunkPosition+chunk.length);\n selection = this.getSelection();\n\n this.setSelection(oldSelection.start,oldSelection.end);\n\n return selection;\n } else {\n return null;\n }\n }\n\n , getSelection: function() {\n\n var e = this.$textarea[0];\n\n return (\n\n ('selectionStart' in e && function() {\n var l = e.selectionEnd - e.selectionStart;\n return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) };\n }) ||\n\n /* browser not supported */\n function() {\n return null;\n }\n\n )();\n\n }\n\n , setSelection: function(start,end) {\n\n var e = this.$textarea[0];\n\n return (\n\n ('selectionStart' in e && function() {\n e.selectionStart = start;\n e.selectionEnd = end;\n return;\n }) ||\n\n /* browser not supported */\n function() {\n return null;\n }\n\n )();\n\n }\n\n , replaceSelection: function(text) {\n\n var e = this.$textarea[0];\n\n return (\n\n ('selectionStart' in e && function() {\n e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length);\n // Set cursor to the last replacement end\n e.selectionStart = e.value.length;\n return this;\n }) ||\n\n /* browser not supported */\n function() {\n e.value += text;\n return jQuery(e);\n }\n\n )();\n }\n\n , getNextTab: function() {\n // Shift the nextTab\n if (this.$nextTab.length === 0) {\n return null;\n } else {\n var nextTab, tab = this.$nextTab.shift();\n\n if (typeof tab == 'function') {\n nextTab = tab();\n } else if (typeof tab == 'object' && tab.length > 0) {\n nextTab = tab;\n }\n\n return nextTab;\n }\n }\n\n , setNextTab: function(start,end) {\n // Push new selection into nextTab collections\n if (typeof start == 'string') {\n var that = this;\n this.$nextTab.push(function(){\n return that.findSelection(start);\n });\n } else if (typeof start == 'number' && typeof end == 'number') {\n var oldSelection = this.getSelection();\n\n this.setSelection(start,end);\n this.$nextTab.push(this.getSelection());\n\n this.setSelection(oldSelection.start,oldSelection.end);\n }\n\n return;\n }\n\n , __parseButtonNameParam: function (names) {\n return typeof names == 'string' ?\n names.split(' ') :\n names;\n\n }\n\n , enableButtons: function(name) {\n var buttons = this.__parseButtonNameParam(name),\n that = this;\n\n $.each(buttons, function(i, v) {\n that.__alterButtons(buttons[i], function (el) {\n el.removeAttr('disabled');\n });\n });\n\n return this;\n }\n\n , disableButtons: function(name) {\n var buttons = this.__parseButtonNameParam(name),\n that = this;\n\n $.each(buttons, function(i, v) {\n that.__alterButtons(buttons[i], function (el) {\n el.attr('disabled','disabled');\n });\n });\n\n return this;\n }\n\n , hideButtons: function(name) {\n var buttons = this.__parseButtonNameParam(name),\n that = this;\n\n $.each(buttons, function(i, v) {\n that.__alterButtons(buttons[i], function (el) {\n el.addClass('hidden');\n });\n });\n\n return this;\n }\n\n , showButtons: function(name) {\n var buttons = this.__parseButtonNameParam(name),\n that = this;\n\n $.each(buttons, function(i, v) {\n that.__alterButtons(buttons[i], function (el) {\n el.removeClass('hidden');\n });\n });\n\n return this;\n }\n\n , eventSupported: function(eventName) {\n var isSupported = eventName in this.$element;\n if (!isSupported) {\n this.$element.setAttribute(eventName, 'return;');\n isSupported = typeof this.$element[eventName] === 'function';\n }\n return isSupported;\n }\n\n , keyup: function (e) {\n var blocked = false;\n switch(e.keyCode) {\n case 40: // down arrow\n case 38: // up arrow\n case 16: // shift\n case 17: // ctrl\n case 18: // alt\n break;\n\n case 9: // tab\n var nextTab;\n if (nextTab = this.getNextTab(),nextTab !== null) {\n // Get the nextTab if exists\n var that = this;\n setTimeout(function(){\n that.setSelection(nextTab.start,nextTab.end);\n },500);\n\n blocked = true;\n } else {\n // The next tab memory contains nothing...\n // check the cursor position to determine tab action\n var cursor = this.getSelection();\n\n if (cursor.start == cursor.end && cursor.end == this.getContent().length) {\n // The cursor already reach the end of the content\n blocked = false;\n } else {\n // Put the cursor to the end\n this.setSelection(this.getContent().length,this.getContent().length);\n\n blocked = true;\n }\n }\n\n break;\n\n case 13: // enter\n blocked = false;\n break;\n case 27: // escape\n if (this.$isFullscreen) this.setFullscreen(false);\n blocked = false;\n break;\n\n default:\n blocked = false;\n }\n\n if (blocked) {\n e.stopPropagation();\n e.preventDefault();\n }\n\n this.$options.onChange(this);\n }\n\n , change: function(e) {\n this.$options.onChange(this);\n return this;\n }\n , select: function (e) {\n this.$options.onSelect(this);\n return this;\n }\n , focus: function (e) {\n var options = this.$options,\n isHideable = options.hideable,\n editor = this.$editor;\n\n editor.addClass('active');\n\n // Blur other markdown(s)\n $(document).find('.md-editor').each(function(){\n if ($(this).attr('id') !== editor.attr('id')) {\n var attachedMarkdown;\n\n if (attachedMarkdown = $(this).find('textarea').data('markdown'),\n attachedMarkdown === null) {\n attachedMarkdown = $(this).find('div[data-provider=\"markdown-preview\"]').data('markdown');\n }\n\n if (attachedMarkdown) {\n attachedMarkdown.blur();\n }\n }\n });\n\n // Trigger the onFocus hook\n options.onFocus(this);\n\n return this;\n }\n\n , blur: function (e) {\n var options = this.$options,\n isHideable = options.hideable,\n editor = this.$editor,\n editable = this.$editable;\n\n if (editor.hasClass('active') || this.$element.parent().length === 0) {\n editor.removeClass('active');\n\n if (isHideable) {\n // Check for editable elements\n if (editable.el !== null) {\n // Build the original element\n var oldElement = $('<'+editable.type+'/>'),\n content = this.getContent(),\n currentContent = this.parseContent(content);\n\n $(editable.attrKeys).each(function(k,v) {\n oldElement.attr(editable.attrKeys[k],editable.attrValues[k]);\n });\n\n // Get the editor content\n oldElement.html(currentContent);\n\n editor.replaceWith(oldElement);\n } else {\n editor.hide();\n }\n }\n\n // Trigger the onBlur hook\n options.onBlur(this);\n }\n\n return this;\n }\n\n };\n\n /* MARKDOWN PLUGIN DEFINITION\n * ========================== */\n\n var old = $.fn.markdown;\n\n $.fn.markdown = function (option) {\n return this.each(function () {\n var $this = $(this)\n , data = $this.data('markdown')\n , options = typeof option == 'object' && option;\n if (!data) $this.data('markdown', (data = new Markdown(this, options)))\n })\n };\n\n $.fn.markdown.messages = {};\n\n $.fn.markdown.defaults = {\n /* Editor Properties */\n autofocus: false,\n hideable: false,\n savable: false,\n width: 'inherit',\n height: 'inherit',\n resize: 'none',\n iconlibrary: 'glyph',\n language: 'en',\n initialstate: 'editor',\n parser: null,\n\n /* Buttons Properties */\n buttons: [\n [{\n name: 'groupFont',\n data: [{\n name: 'cmdBold',\n hotkey: 'Ctrl+B',\n title: 'Bold',\n icon: { glyph: 'glyphicon glyphicon-bold', fa: 'fa fa-bold', 'fa-3': 'icon-bold' },\n callback: function(e){\n // Give/remove ** surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('strong text');\n } else {\n chunk = selected.text;\n }\n\n // transform selection and set the cursor into chunked text\n if (content.substr(selected.start-2,2) === '**'\n && content.substr(selected.end,2) === '**' ) {\n e.setSelection(selected.start-2,selected.end+2);\n e.replaceSelection(chunk);\n cursor = selected.start-2;\n } else {\n e.replaceSelection('**'+chunk+'**');\n cursor = selected.start+2;\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n },{\n name: 'cmdItalic',\n title: 'Italic',\n hotkey: 'Ctrl+I',\n icon: { glyph: 'glyphicon glyphicon-italic', fa: 'fa fa-italic', 'fa-3': 'icon-italic' },\n callback: function(e){\n // Give/remove * surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('emphasized text');\n } else {\n chunk = selected.text;\n }\n\n // transform selection and set the cursor into chunked text\n if (content.substr(selected.start-1,1) === '_'\n && content.substr(selected.end,1) === '_' ) {\n e.setSelection(selected.start-1,selected.end+1);\n e.replaceSelection(chunk);\n cursor = selected.start-1;\n } else {\n e.replaceSelection('_'+chunk+'_');\n cursor = selected.start+1;\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n },{\n name: 'cmdHeading',\n title: 'Heading',\n hotkey: 'Ctrl+H',\n icon: { glyph: 'glyphicon glyphicon-header', fa: 'fa fa-header', 'fa-3': 'icon-font' },\n callback: function(e){\n // Append/remove ### surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent(), pointer, prevChar;\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('heading text');\n } else {\n chunk = selected.text + '\\n';\n }\n\n // transform selection and set the cursor into chunked text\n if ((pointer = 4, content.substr(selected.start-pointer,pointer) === '### ')\n || (pointer = 3, content.substr(selected.start-pointer,pointer) === '###')) {\n e.setSelection(selected.start-pointer,selected.end);\n e.replaceSelection(chunk);\n cursor = selected.start-pointer;\n } else if (selected.start > 0 && (prevChar = content.substr(selected.start-1,1), !!prevChar && prevChar != '\\n')) {\n e.replaceSelection('\\n\\n### '+chunk);\n cursor = selected.start+6;\n } else {\n // Empty string before element\n e.replaceSelection('### '+chunk);\n cursor = selected.start+4;\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n }]\n },{\n name: 'groupLink',\n data: [{\n name: 'cmdUrl',\n title: 'URL/Link',\n hotkey: 'Ctrl+L',\n icon: { glyph: 'glyphicon glyphicon-link', fa: 'fa fa-link', 'fa-3': 'icon-link' },\n callback: function(e){\n // Give [] surround the selection and prepend the link\n var chunk, cursor, selected = e.getSelection(), content = e.getContent(), link;\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('enter link description here');\n } else {\n chunk = selected.text;\n }\n\n link = prompt(e.__localize('Insert Hyperlink'),'http://');\n\n var urlRegex = new RegExp('^((http|https)://|(mailto:)|(//))[a-z0-9]', 'i');\n if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n var sanitizedLink = $('<div>'+link+'</div>').text();\n\n // transform selection and set the cursor into chunked text\n e.replaceSelection('['+chunk+']('+sanitizedLink+')');\n cursor = selected.start+1;\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n }\n },{\n name: 'cmdImage',\n title: 'Image',\n hotkey: 'Ctrl+G',\n icon: { glyph: 'glyphicon glyphicon-picture', fa: 'fa fa-picture-o', 'fa-3': 'icon-picture' },\n callback: function(e){\n // Give ![] surround the selection and prepend the image link\n var chunk, cursor, selected = e.getSelection(), content = e.getContent(), link;\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('enter image description here');\n } else {\n chunk = selected.text;\n }\n\n link = prompt(e.__localize('Insert Image Hyperlink'),'http://');\n\n var urlRegex = new RegExp('^((http|https)://|(//))[a-z0-9]', 'i');\n if (link !== null && link !== '' && link !== 'http://' && urlRegex.test(link)) {\n var sanitizedLink = $('<div>'+link+'</div>').text();\n\n // transform selection and set the cursor into chunked text\n e.replaceSelection('+'\")');\n cursor = selected.start+2;\n\n // Set the next tab\n e.setNextTab(e.__localize('enter image title here'));\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n }\n }]\n },{\n name: 'groupMisc',\n data: [{\n name: 'cmdList',\n hotkey: 'Ctrl+U',\n title: 'Unordered List',\n icon: { glyph: 'glyphicon glyphicon-list', fa: 'fa fa-list', 'fa-3': 'icon-list-ul' },\n callback: function(e){\n // Prepend/Give - surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n // transform selection and set the cursor into chunked text\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('list text here');\n\n e.replaceSelection('- '+chunk);\n // Set the cursor\n cursor = selected.start+2;\n } else {\n if (selected.text.indexOf('\\n') < 0) {\n chunk = selected.text;\n\n e.replaceSelection('- '+chunk);\n\n // Set the cursor\n cursor = selected.start+2;\n } else {\n var list = [];\n\n list = selected.text.split('\\n');\n chunk = list[0];\n\n $.each(list,function(k,v) {\n list[k] = '- '+v;\n });\n\n e.replaceSelection('\\n\\n'+list.join('\\n'));\n\n // Set the cursor\n cursor = selected.start+4;\n }\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n },\n {\n name: 'cmdListO',\n hotkey: 'Ctrl+O',\n title: 'Ordered List',\n icon: { glyph: 'glyphicon glyphicon-th-list', fa: 'fa fa-list-ol', 'fa-3': 'icon-list-ol' },\n callback: function(e) {\n\n // Prepend/Give - surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n // transform selection and set the cursor into chunked text\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('list text here');\n e.replaceSelection('1. '+chunk);\n // Set the cursor\n cursor = selected.start+3;\n } else {\n if (selected.text.indexOf('\\n') < 0) {\n chunk = selected.text;\n\n e.replaceSelection('1. '+chunk);\n\n // Set the cursor\n cursor = selected.start+3;\n } else {\n var list = [];\n\n list = selected.text.split('\\n');\n chunk = list[0];\n\n $.each(list,function(k,v) {\n list[k] = '1. '+v;\n });\n\n e.replaceSelection('\\n\\n'+list.join('\\n'));\n\n // Set the cursor\n cursor = selected.start+5;\n }\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n },\n {\n name: 'cmdCode',\n hotkey: 'Ctrl+K',\n title: 'Code',\n icon: { glyph: 'glyphicon glyphicon-asterisk', fa: 'fa fa-code', 'fa-3': 'icon-code' },\n callback: function(e) {\n // Give/remove ** surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('code text here');\n } else {\n chunk = selected.text;\n }\n\n // transform selection and set the cursor into chunked text\n if (content.substr(selected.start-4,4) === '```\\n'\n && content.substr(selected.end,4) === '\\n```') {\n e.setSelection(selected.start-4, selected.end+4);\n e.replaceSelection(chunk);\n cursor = selected.start-4;\n } else if (content.substr(selected.start-1,1) === '`'\n && content.substr(selected.end,1) === '`') {\n e.setSelection(selected.start-1,selected.end+1);\n e.replaceSelection(chunk);\n cursor = selected.start-1;\n } else if (content.indexOf('\\n') > -1) {\n e.replaceSelection('```\\n'+chunk+'\\n```');\n cursor = selected.start+4;\n } else {\n e.replaceSelection('`'+chunk+'`');\n cursor = selected.start+1;\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n },\n {\n name: 'cmdQuote',\n hotkey: 'Ctrl+Q',\n title: 'Quote',\n icon: { glyph: 'glyphicon glyphicon-comment', fa: 'fa fa-quote-left', 'fa-3': 'icon-quote-left' },\n callback: function(e) {\n // Prepend/Give - surround the selection\n var chunk, cursor, selected = e.getSelection(), content = e.getContent();\n\n // transform selection and set the cursor into chunked text\n if (selected.length === 0) {\n // Give extra word\n chunk = e.__localize('quote here');\n\n e.replaceSelection('> '+chunk);\n\n // Set the cursor\n cursor = selected.start+2;\n } else {\n if (selected.text.indexOf('\\n') < 0) {\n chunk = selected.text;\n\n e.replaceSelection('> '+chunk);\n\n // Set the cursor\n cursor = selected.start+2;\n } else {\n var list = [];\n\n list = selected.text.split('\\n');\n chunk = list[0];\n\n $.each(list,function(k,v) {\n list[k] = '> '+v;\n });\n\n e.replaceSelection('\\n\\n'+list.join('\\n'));\n\n // Set the cursor\n cursor = selected.start+4;\n }\n }\n\n // Set the cursor\n e.setSelection(cursor,cursor+chunk.length);\n }\n }]\n },{\n name: 'groupUtil',\n data: [{\n name: 'cmdPreview',\n toggle: true,\n hotkey: 'Ctrl+P',\n title: 'Preview',\n btnText: 'Preview',\n btnClass: 'btn btn-primary btn-sm',\n icon: { glyph: 'glyphicon glyphicon-search', fa: 'fa fa-search', 'fa-3': 'icon-search' },\n callback: function(e){\n // Check the preview mode and toggle based on this flag\n var isPreview = e.$isPreview,content;\n\n if (isPreview === false) {\n // Give flag that tell the editor enter preview mode\n e.showPreview();\n } else {\n e.hidePreview();\n }\n }\n }]\n }]\n ],\n additionalButtons:[], // Place to hook more buttons by code\n reorderButtonGroups:[],\n hiddenButtons:[], // Default hidden buttons\n disabledButtons:[], // Default disabled buttons\n footer: '',\n fullscreen: {\n enable: true,\n icons: {\n fullscreenOn: {\n fa: 'fa fa-expand',\n glyph: 'glyphicon glyphicon-fullscreen',\n 'fa-3': 'icon-resize-full'\n },\n fullscreenOff: {\n fa: 'fa fa-compress',\n glyph: 'glyphicon glyphicon-fullscreen',\n 'fa-3': 'icon-resize-small'\n }\n }\n },\n\n /* Events hook */\n onShow: function (e) {},\n onPreview: function (e) {},\n onSave: function (e) {},\n onBlur: function (e) {},\n onFocus: function (e) {},\n onChange: function(e) {},\n onFullscreen: function(e) {},\n onSelect: function (e) {}\n };\n\n $.fn.markdown.Constructor = Markdown;\n\n\n /* MARKDOWN NO CONFLICT\n * ==================== */\n\n $.fn.markdown.noConflict = function () {\n $.fn.markdown = old;\n return this;\n };\n\n /* MARKDOWN GLOBAL FUNCTION & DATA-API\n * ==================================== */\n var initMarkdown = function(el) {\n var $this = el;\n\n if ($this.data('markdown')) {\n $this.data('markdown').showEditor();\n return;\n }\n\n $this.markdown()\n };\n\n var blurNonFocused = function(e) {\n var $activeElement = $(document.activeElement);\n\n // Blur event\n $(document).find('.md-editor').each(function(){\n var $this = $(this),\n focused = $activeElement.closest('.md-editor')[0] === this,\n attachedMarkdown = $this.find('textarea').data('markdown') ||\n $this.find('div[data-provider=\"markdown-preview\"]').data('markdown');\n\n if (attachedMarkdown && !focused) {\n attachedMarkdown.blur();\n }\n })\n };\n\n $(document)\n .on('click.markdown.data-api', '[data-provide=\"markdown-editable\"]', function (e) {\n initMarkdown($(this));\n e.preventDefault();\n })\n .on('click focusin', function (e) {\n blurNonFocused(e);\n })\n .ready(function(){\n $('textarea[data-provide=\"markdown\"]').each(function(){\n initMarkdown($(this));\n })\n });\n\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/bootstrap-markdown/js/bootstrap-markdown.js\n ** module id = 1058\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".calendar{color:#000;min-width:210px;border-radius:4px}.calendar>*{display:block}.calendar .fa-remove{color:red}.calendar nav{font-weight:700;display:flex}.calendar nav .switch{flex:2 0 50%}.calendar nav .next,.calendar nav .prev{flex:1}.calendar main{display:flex;flex-wrap:wrap}.calendar main header{font-weight:700}.calendar main header span{height:30px;padding-top:10px;line-height:20px}.calendar main.days>*{display:flex;flex:1 0 100%}.calendar main.days button,.calendar main.days span{flex:1 0 30px;text-align:center}.calendar main.months,.calendar main.years{flex-wrap:wrap}.calendar main.months button,.calendar main.years button{flex:1 0 25%;text-align:center;height:54px;line-height:54px}.calendar footer{font-weight:700;display:flex}.calendar button{height:30px;width:100%;background:none;border:none;border-radius:4px}.calendar button:hover{background:#eee}.calendar button.new,.calendar button.old{color:#777}.calendar button.day:hover,.calendar button:focus{background:#eee;cursor:pointer}.calendar button:disabled,.calendar button:disabled:hover{background:none;color:#777;cursor:not-allowed}.calendar button.today{color:#000;background-color:#ffdb99;border-color:#ffb733;position:relative}.calendar button.today.focus,.calendar button.today:focus{color:#000;background-color:#ffc966;border-color:#b37400}.calendar button.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.calendar button.today.active,.calendar button.today:active,.open>.dropdown-toggle.calendar button.today{color:#000;background-color:#ffc966;background-image:none;border-color:#f59e00}.calendar button.today.active.focus,.calendar button.today.active:focus,.calendar button.today.active:hover,.calendar button.today:active.focus,.calendar button.today:active:focus,.calendar button.today:active:hover,.open>.dropdown-toggle.calendar button.today.focus,.open>.dropdown-toggle.calendar button.today:focus,.open>.dropdown-toggle.calendar button.today:hover{color:#000;background-color:#ffbc42;border-color:#b37400}.calendar button.today.disabled.focus,.calendar button.today.disabled:focus,.calendar button.today.disabled:hover,.calendar button.today[disabled].focus,.calendar button.today[disabled]:focus,.calendar button.today[disabled]:hover,fieldset[disabled] .calendar button.today.focus,fieldset[disabled] .calendar button.today:focus,fieldset[disabled] .calendar button.today:hover{background-color:#ffdb99;border-color:#ffb733}.calendar button.today .badge{color:#ffdb99;background-color:#000}.calendar button.today:focus{background:#ffc966}.calendar button.today:disabled,.calendar button.today:disabled:active{background:#ffdb99;color:#777}.calendar button.today:before{content:\\\"\\\";display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#000;border-top-color:#ffdb99;position:absolute;bottom:4px;right:4px}.calendar button.active{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.calendar button.active.focus,.calendar button.active:focus{color:#fff;background-color:#286090;border-color:#122b40}.calendar button.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.calendar button.active.active,.calendar button.active:active,.open>.dropdown-toggle.calendar button.active{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.calendar button.active.active.focus,.calendar button.active.active:focus,.calendar button.active.active:hover,.calendar button.active:active.focus,.calendar button.active:active:focus,.calendar button.active:active:hover,.open>.dropdown-toggle.calendar button.active.focus,.open>.dropdown-toggle.calendar button.active:focus,.open>.dropdown-toggle.calendar button.active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.calendar button.active.disabled.focus,.calendar button.active.disabled:focus,.calendar button.active.disabled:hover,.calendar button.active[disabled].focus,.calendar button.active[disabled]:focus,.calendar button.active[disabled]:hover,fieldset[disabled] .calendar button.active.focus,fieldset[disabled] .calendar button.active:focus,fieldset[disabled] .calendar button.active:hover{background-color:#337ab7;border-color:#2e6da4}.calendar button.active .badge{color:#337ab7;background-color:#fff}.calendar button.active.today:before{border-bottom-color:#fff}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/calendar.vue\"],\"names\":[],\"mappings\":\"AAAA,UAAU,WAAY,gBAAgB,iBAAiB,CAAC,YAAY,aAAa,CAAC,qBAAqB,SAAS,CAAC,cAAc,gBAAiB,YAAY,CAAC,sBAAsB,YAAY,CAAC,wCAAwC,MAAM,CAAC,eAAe,aAAa,cAAc,CAAC,sBAAsB,eAAgB,CAAC,2BAA2B,YAAY,iBAAiB,gBAAgB,CAAC,sBAAsB,aAAa,aAAa,CAAC,oDAAoD,cAAc,iBAAiB,CAAC,2CAA2C,cAAc,CAAC,yDAAyD,aAAa,kBAAkB,YAAY,gBAAgB,CAAC,iBAAiB,gBAAiB,YAAY,CAAC,iBAAiB,YAAY,WAAW,gBAAgB,YAAY,iBAAiB,CAAC,uBAAuB,eAAe,CAAC,0CAA0C,UAAU,CAAC,kDAAkD,gBAAgB,cAAc,CAAC,0DAA0D,gBAAgB,WAAW,kBAAkB,CAAC,uBAAuB,WAAW,yBAAyB,qBAAqB,iBAAiB,CAAC,0DAA0D,WAAW,yBAAyB,oBAAoB,CAAC,6BAA6B,WAAW,yBAAyB,oBAAoB,CAAC,yGAAyG,WAAW,yBAAyB,sBAAsB,oBAAoB,CAAC,iXAAiX,WAAW,yBAAyB,oBAAoB,CAAC,uXAAuX,yBAAyB,oBAAoB,CAAC,8BAA8B,cAAc,qBAAqB,CAAC,6BAA6B,kBAAkB,CAAC,uEAAuE,mBAAmB,UAAU,CAAC,8BAA8B,WAAW,qBAAqB,yBAAyB,yBAAyB,yBAAyB,yBAAyB,kBAAkB,WAAW,SAAS,CAAC,wBAAwB,WAAW,yBAAyB,qBAAqB,oCAAqC,CAAC,4DAA4D,WAAW,yBAAyB,oBAAoB,CAAC,8BAA8B,WAAW,yBAAyB,oBAAoB,CAAC,4GAA4G,WAAW,yBAAyB,sBAAsB,oBAAoB,CAAC,0XAA0X,WAAW,yBAAyB,oBAAoB,CAAC,gYAAgY,yBAAyB,oBAAoB,CAAC,+BAA+B,cAAc,qBAAqB,CAAC,qCAAqC,wBAAwB,CAAC\",\"file\":\"calendar.vue\",\"sourcesContent\":[\".calendar{color:black;min-width:210px;border-radius:4px}.calendar>*{display:block}.calendar .fa-remove{color:red}.calendar nav{font-weight:bold;display:flex}.calendar nav .switch{flex:2 0 50%}.calendar nav .prev,.calendar nav .next{flex:1}.calendar main{display:flex;flex-wrap:wrap}.calendar main header{font-weight:bold}.calendar main header span{height:30px;padding-top:10px;line-height:20px}.calendar main.days>*{display:flex;flex:1 0 100%}.calendar main.days span,.calendar main.days button{flex:1 0 30px;text-align:center}.calendar main.months,.calendar main.years{flex-wrap:wrap}.calendar main.months button,.calendar main.years button{flex:1 0 25%;text-align:center;height:54px;line-height:54px}.calendar footer{font-weight:bold;display:flex}.calendar button{height:30px;width:100%;background:none;border:none;border-radius:4px}.calendar button:hover{background:#eee}.calendar button.old,.calendar button.new{color:#777}.calendar button.day:hover,.calendar button:focus{background:#eee;cursor:pointer}.calendar button:disabled,.calendar button:disabled:hover{background:none;color:#777;cursor:not-allowed}.calendar button.today{color:#000;background-color:#ffdb99;border-color:#ffb733;position:relative}.calendar button.today:focus,.calendar button.today.focus{color:#000;background-color:#ffc966;border-color:#b37400}.calendar button.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.calendar button.today:active,.calendar button.today.active,.open>.dropdown-toggle.calendar button.today{color:#000;background-color:#ffc966;background-image:none;border-color:#f59e00}.calendar button.today:active:hover,.calendar button.today.active:hover,.open>.dropdown-toggle.calendar button.today:hover,.calendar button.today:active:focus,.calendar button.today.active:focus,.open>.dropdown-toggle.calendar button.today:focus,.calendar button.today:active.focus,.calendar button.today.active.focus,.open>.dropdown-toggle.calendar button.today.focus{color:#000;background-color:#ffbc42;border-color:#b37400}.calendar button.today.disabled:hover,.calendar button.today[disabled]:hover,fieldset[disabled] .calendar button.today:hover,.calendar button.today.disabled:focus,.calendar button.today[disabled]:focus,fieldset[disabled] .calendar button.today:focus,.calendar button.today.disabled.focus,.calendar button.today[disabled].focus,fieldset[disabled] .calendar button.today.focus{background-color:#ffdb99;border-color:#ffb733}.calendar button.today .badge{color:#ffdb99;background-color:#000}.calendar button.today:focus{background:#ffc966}.calendar button.today:disabled,.calendar button.today:disabled:active{background:#ffdb99;color:#777}.calendar button.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#000;border-top-color:#ffdb99;position:absolute;bottom:4px;right:4px}.calendar button.active{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.calendar button.active:focus,.calendar button.active.focus{color:#fff;background-color:#286090;border-color:#122b40}.calendar button.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.calendar button.active:active,.calendar button.active.active,.open>.dropdown-toggle.calendar button.active{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.calendar button.active:active:hover,.calendar button.active.active:hover,.open>.dropdown-toggle.calendar button.active:hover,.calendar button.active:active:focus,.calendar button.active.active:focus,.open>.dropdown-toggle.calendar button.active:focus,.calendar button.active:active.focus,.calendar button.active.active.focus,.open>.dropdown-toggle.calendar button.active.focus{color:#fff;background-color:#204d74;border-color:#122b40}.calendar button.active.disabled:hover,.calendar button.active[disabled]:hover,fieldset[disabled] .calendar button.active:hover,.calendar button.active.disabled:focus,.calendar button.active[disabled]:focus,fieldset[disabled] .calendar button.active:focus,.calendar button.active.disabled.focus,.calendar button.active[disabled].focus,fieldset[disabled] .calendar button.active.focus{background-color:#337ab7;border-color:#2e6da4}.calendar button.active .badge{color:#337ab7;background-color:#fff}.calendar button.active.today:before{border-bottom-color:#fff}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/calendar.vue\n ** module id = 1059\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".checkbox-form-field label{font-weight:700}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/checkbox.vue\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B,eAAgB,CAAC\",\"file\":\"checkbox.vue\",\"sourcesContent\":[\".checkbox-form-field label{font-weight:bold}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/checkbox.vue\n ** module id = 1060\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".date-picker .dropdown-menu{min-width:100%;width:auto}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/date-picker.vue\"],\"names\":[],\"mappings\":\"AAAA,4BAA4B,eAAe,UAAU,CAAC\",\"file\":\"date-picker.vue\",\"sourcesContent\":[\".date-picker .dropdown-menu{min-width:100%;width:auto}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/date-picker.vue\n ** module id = 1061\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \"table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777}caption,th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.markdown img{max-width:100%;margin:auto;display:block}.markdown img+em{display:block;text-align:center;margin:.3em .1em}.markdown table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.markdown table>tbody>tr>td,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>td,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.markdown table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.markdown table>caption+thead>tr:first-child>td,.markdown table>caption+thead>tr:first-child>th,.markdown table>colgroup+thead>tr:first-child>td,.markdown table>colgroup+thead>tr:first-child>th,.markdown table>thead:first-child>tr:first-child>td,.markdown table>thead:first-child>tr:first-child>th{border-top:0}.markdown table>tbody+tbody{border-top:2px solid #ddd}.markdown table .table{background-color:#fff}.markdown table>tbody>tr>td,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>td,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>thead>tr>th{border:1px solid #ddd}.markdown table>thead>tr>td,.markdown table>thead>tr>th{border-bottom-width:2px}.markdown table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.markdown table>tbody>tr:hover{background-color:#f5f5f5}.md-editor>textarea{background:#fff;padding:6px 12px;border-bottom:none}.md-editor.active{border-color:#3c8dbc;box-shadow:none}.form-group.has-error .md-editor{border-color:#dd4b39}.form-group.has-success .md-editor{border-color:#00a65a}.md-editor .btn{border-radius:0}.md-editor .btn.btn-default{background-color:#fff}.md-editor .md-preview{color:#000;padding:6px 12px;max-width:100%}.md-editor .md-preview img{max-width:100%;margin:auto;display:block}.md-editor .md-preview img+em{display:block;text-align:center;margin:.3em .1em}.md-editor .md-preview table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>td,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.md-editor .md-preview table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.md-editor .md-preview table>caption+thead>tr:first-child>td,.md-editor .md-preview table>caption+thead>tr:first-child>th,.md-editor .md-preview table>colgroup+thead>tr:first-child>td,.md-editor .md-preview table>colgroup+thead>tr:first-child>th,.md-editor .md-preview table>thead:first-child>tr:first-child>td,.md-editor .md-preview table>thead:first-child>tr:first-child>th{border-top:0}.md-editor .md-preview table>tbody+tbody{border-top:2px solid #ddd}.md-editor .md-preview table .table{background-color:#fff}.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>td,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{border:1px solid #ddd}.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>thead>tr>th{border-bottom-width:2px}.md-editor .md-preview table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.md-editor .md-preview table>tbody>tr:hover{background-color:#f5f5f5}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/markdown-editor.vue\"],\"names\":[],\"mappings\":\"AAAA,MAAM,4BAA4B,CAAC,uBAAyB,gBAAgB,qBAAqB,UAAU,CAAC,4CAAgD,gBAAgB,mBAAmB,UAAU,CAAC,QAAQ,gBAAgB,mBAAmB,UAAW,CAAgB,WAAhB,eAAe,CAAoB,OAAO,WAAW,eAAe,kBAAkB,CAAC,kHAAkH,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,mBAAmB,sBAAsB,4BAA4B,CAAC,oPAAoP,YAAY,CAAC,mBAAmB,yBAAyB,CAAC,cAAc,qBAAqB,CAAC,8KAA8K,WAAW,CAAC,AAAsC,wLAAwK,qBAAqB,CAAC,wDAAwD,uBAAuB,CAAC,yCAAyC,wBAAwB,CAAC,AAAqD,oVAAwT,wBAAwB,CAAC,4LAA4L,wBAAwB,CAAC,oUAAoU,wBAAwB,CAAC,iMAAiM,wBAAwB,CAAC,gSAAgS,wBAAwB,CAAC,kLAAkL,wBAAwB,CAAC,oUAAoU,wBAAwB,CAAC,iMAAiM,wBAAwB,CAAC,wTAAwT,wBAAwB,CAAC,4LAA4L,wBAAwB,CAAC,kBAAkB,gBAAgB,eAAe,CAAC,oCAAoC,kBAAkB,WAAW,mBAAmB,kBAAkB,4CAA4C,qBAAqB,CAAC,yBAAyB,eAAe,CAAC,8NAA8N,kBAAkB,CAAC,kCAAkC,QAAQ,CAAC,4VAA4V,aAAa,CAAC,sVAAsV,cAAc,CAAC,oOAAoO,eAAe,CAAC,CAAC,cAAc,eAAe,YAAY,aAAa,CAAC,iBAAiB,cAAc,kBAAkB,gBAAgB,CAAC,gBAAgB,WAAW,eAAe,mBAAmB,qBAAqB,CAAC,wKAAwK,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,4BAA4B,sBAAsB,4BAA4B,CAAC,0SAA0S,YAAY,CAAC,4BAA4B,yBAAyB,CAAC,uBAAuB,qBAAqB,CAAC,wKAAwK,qBAAqB,CAAC,wDAAwD,uBAAuB,CAAC,0CAA0C,wBAAwB,CAAC,+BAA+B,wBAAwB,CAAC,oBAAoB,gBAAiB,iBAAiB,kBAAkB,CAAC,kBAAkB,qBAAqB,eAAe,CAAC,iCAAiC,oBAAoB,CAAC,mCAAmC,oBAAoB,CAAC,gBAAgB,eAAe,CAAC,4BAA4B,qBAAsB,CAAC,uBAAuB,WAAY,iBAAiB,cAAc,CAAC,2BAA2B,eAAe,YAAY,aAAa,CAAC,8BAA8B,cAAc,kBAAkB,gBAAgB,CAAC,6BAA6B,WAAW,eAAe,mBAAmB,qBAAqB,CAAC,sPAAsP,YAAY,uBAAuB,mBAAmB,yBAAyB,CAAC,yCAAyC,sBAAsB,4BAA4B,CAAC,wXAAwX,YAAY,CAAC,yCAAyC,yBAAyB,CAAC,oCAAoC,qBAAqB,CAAC,sPAAsP,qBAAqB,CAAC,kFAAkF,uBAAuB,CAAC,uDAAuD,wBAAwB,CAAC,4CAA4C,wBAAwB,CAAC\",\"file\":\"markdown-editor.vue\",\"sourcesContent\":[\"table{background-color:transparent}table col[class*=\\\"col-\\\"]{position:static;display:table-column;float:none}table td[class*=\\\"col-\\\"],table th[class*=\\\"col-\\\"]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.markdown img{max-width:100%;margin:auto;display:block}.markdown img+em{display:block;text-align:center;margin:.3em .1em}.markdown table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.markdown table>thead>tr>th,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>tbody>tr>td,.markdown table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.markdown table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.markdown table>caption+thead>tr:first-child>th,.markdown table>colgroup+thead>tr:first-child>th,.markdown table>thead:first-child>tr:first-child>th,.markdown table>caption+thead>tr:first-child>td,.markdown table>colgroup+thead>tr:first-child>td,.markdown table>thead:first-child>tr:first-child>td{border-top:0}.markdown table>tbody+tbody{border-top:2px solid #ddd}.markdown table .table{background-color:#fff}.markdown table>thead>tr>th,.markdown table>tbody>tr>th,.markdown table>tfoot>tr>th,.markdown table>thead>tr>td,.markdown table>tbody>tr>td,.markdown table>tfoot>tr>td{border:1px solid #ddd}.markdown table>thead>tr>th,.markdown table>thead>tr>td{border-bottom-width:2px}.markdown table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.markdown table>tbody>tr:hover{background-color:#f5f5f5}.md-editor>textarea{background:white;padding:6px 12px;border-bottom:none}.md-editor.active{border-color:#3c8dbc;box-shadow:none}.form-group.has-error .md-editor{border-color:#dd4b39}.form-group.has-success .md-editor{border-color:#00a65a}.md-editor .btn{border-radius:0}.md-editor .btn.btn-default{background-color:white}.md-editor .md-preview{color:black;padding:6px 12px;max-width:100%}.md-editor .md-preview img{max-width:100%;margin:auto;display:block}.md-editor .md-preview img+em{display:block;text-align:center;margin:.3em .1em}.md-editor .md-preview table{width:100%;max-width:100%;margin-bottom:20px;border:1px solid #ddd}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.md-editor .md-preview table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.md-editor .md-preview table>caption+thead>tr:first-child>th,.md-editor .md-preview table>colgroup+thead>tr:first-child>th,.md-editor .md-preview table>thead:first-child>tr:first-child>th,.md-editor .md-preview table>caption+thead>tr:first-child>td,.md-editor .md-preview table>colgroup+thead>tr:first-child>td,.md-editor .md-preview table>thead:first-child>tr:first-child>td{border-top:0}.md-editor .md-preview table>tbody+tbody{border-top:2px solid #ddd}.md-editor .md-preview table .table{background-color:#fff}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>tbody>tr>th,.md-editor .md-preview table>tfoot>tr>th,.md-editor .md-preview table>thead>tr>td,.md-editor .md-preview table>tbody>tr>td,.md-editor .md-preview table>tfoot>tr>td{border:1px solid #ddd}.md-editor .md-preview table>thead>tr>th,.md-editor .md-preview table>thead>tr>td{border-bottom-width:2px}.md-editor .md-preview table>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.md-editor .md-preview table>tbody>tr:hover{background-color:#f5f5f5}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/markdown-editor.vue\n ** module id = 1062\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <div class=calendar :class=\\\"[ 'view' ]\\\"> <div class=calendar-{{view}}> <nav> <button class=prev @click.prevent=previous :disabled=previousDisabled> <span class=\\\"fa fa-chevron-left\\\"></span> </button> <button class=switch @click.prevent=zoomOut>{{ rangeDisplay }}</button> <button class=next @click.prevent=next :disabled=nextDisabled> <span class=\\\"fa fa-chevron-right\\\"></span> </button> </nav> <main v-if=\\\"view == 'days'\\\" class=days> <header> <span class=dow v-for=\\\"day in days\\\">{{ day }}</span> </header> <div v-for=\\\"week in monthDays(current)\\\"> <button v-for=\\\"day in week\\\" class=day :class=dayClasses(day) @click.prevent=pickDay(day) :disabled=isDisabled(day)> {{ day.date() }} </button> </div> </main> <main v-if=\\\"view == 'months'\\\" class=months> <button v-for=\\\"(idx, month) in months\\\" class=month @click.prevent=pickMonth(idx) :disabled=isMonthDisabled(idx)> {{ month }} </button> </main> <main v-if=\\\"view == 'years'\\\" class=years> <button v-for=\\\"year in yearsRange\\\" class=year @click.prevent=pickYear(year) :disabled=isYearDisabled(year)> {{ year }} </button> </main> <footer> <button @click.prevent=pickDay(today)>{{ _('Today') }}</button> <button @click.prevent=clear> <span class=\\\"fa fa-remove\\\"></span> {{ _('Clear') }} </button> </footer> </div> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/calendar.vue\n ** module id = 1063\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <div class=\\\"checkbox checkbox-form-field\\\"> <label :for=field.id :class=\\\"{ 'required': required }\\\"> <input type=checkbox :id=field.id :name=field.id :checked=value @input=onChange> {{ field.label }} </label> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/checkbox.vue\n ** module id = 1064\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <div class=\\\"input-group dropdown date-picker\\\" :class=\\\"{ 'open': picking }\\\" v-outside=onOutside> <span class=input-group-addon><span class=\\\"fa fa-calendar\\\"></span></span> <input type=text class=form-control v-el:input @focus=onFocus @input=\\\"onChange | debounce 500\\\" :placeholder=placeholder :required=required :value=\\\"value|dt dateFormat ''\\\" :readonly=readonly> <div class=\\\"dropdown-menu dropdown-menu-right\\\"> <calendar v-ref:calendar :selected=value></calendar> </div> <input v-if=serializable v-el:hidden type=hidden :name=field.id :value=\\\"value|dt ISO_FORMAT ''\\\"> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/date-picker.vue\n ** module id = 1065\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <input type=hidden :id=field.id :name=field.id :value=value :required=required> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/hidden-input.vue\n ** module id = 1066\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <textarea class=form-control :rows=\\\"field.rows || rows || 6\\\" :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly @input=onChange>{{value || ''}}</textarea> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/markdown-editor.vue\n ** module id = 1067\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <input type=number class=form-control :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly :value=value @input=onChange> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/number-input.vue\n ** module id = 1068\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <select class=form-control v-model=value :multiple=field.multiple :id=field.id :name=field.id :placeholder=placeholder :required=required :disabled=readonly @change=onChange> <optgroup v-for=\\\"(group, ids) in field.groups\\\" :label=group> <option v-for=\\\"option in options | extract group\\\" :value=option.value :selected=\\\"option.value == value\\\"> {{option.text || option.value}} </option> </optgroup> </select> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/select-input-group.vue\n ** module id = 1069\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <select class=form-control v-model=value :multiple=field.multiple :id=field.id :name=field.id :placeholder=placeholder :required=required :disabled=readonly @change=onChange> <option v-for=\\\"option in options | extract\\\" :value=option.value> {{option.text || option.value}} </option> </select> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/select-input.vue\n ** module id = 1070\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","module.exports = \" <input type=text class=form-control :id=field.id :name=field.id :placeholder=placeholder :required=required :readonly=readonly :value=value @input=onChange> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/text-input.vue\n ** module id = 1071\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../node_modules/css-loader/index.js?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../node_modules/css-loader/index.js?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../node_modules/css-loader/index.js?sourceMap!../../node_modules/vue-loader/lib/style-rewriter.js!../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./calendar.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/calendar.vue\n ** module id = 1072\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./checkbox.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/checkbox.vue\n ** module id = 1073\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./date-picker.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/date-picker.vue\n ** module id = 1074\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./markdown-editor.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/markdown-editor.vue\n ** module id = 1075\n ** module chunks = 0 1 2 4 5 6 7 9 11 12 13 14 16 17 19 23 24 25 26 27 28 29 30\n **/","import API from 'api';\nimport {_} from 'i18n';\nimport {setattr, isObject, isString, findComponent, flattenObject} from 'utils';\nimport log from 'logger';\nimport moment from 'moment';\nimport $ from 'jquery-validation'; // Ensure jquery & jquery.validate plugin are both loaded\n\n// Remove warning for non-interpolated variables\nconst interpolation = {defaultVariables: {'O': '{O}', '1': '{1}', 'ISO': '{ISO}'}};\n\n// jQuery validate\n$.extend($.validator.messages, {\n required: _('valid-required'),\n remote: _('valid-remote'),\n email: _('valid-email'),\n url: _('valid-url'),\n date: _('valid-date'),\n dateISO: _('valid-date-iso', {interpolation: interpolation}),\n number: _('valid-number'),\n digits: _('valid-digits'),\n creditcard: _('valid-creditcard'),\n equalTo: _('valid-equal-to'),\n maxlength: $.validator.format(_('valid-maxlength', {interpolation: interpolation})),\n minlength: $.validator.format(_('valid-minlength', {interpolation: interpolation})),\n rangelength: $.validator.format(_('valid-range-length', {interpolation: interpolation})),\n range: $.validator.format(_('valid-range', {interpolation: interpolation})),\n max: $.validator.format(_('valid-max', {interpolation: interpolation})),\n min: $.validator.format(_('valid-min', {interpolation: interpolation}))\n});\n\n\n/**\n * Rule for depend dates, should be greater that param.\n */\n$.validator.addMethod('dateGreaterThan', function(value, element, param) {\n const start = moment(document.getElementById(param).value);\n return this.optional(element) || moment(value).isAfter(start);\n}, $.validator.format(_('Date should be after start date')));\n\n\nfunction empty_schema() {\n return {properties: {}, required: []};\n}\n\n/**\n * Input type which are text or formated text\n *\n * See: https://www.w3.org/TR/html5/forms.html#attr-input-type\n */\nconst TEXT_INPUTS = [\n 'color',\n 'date',\n 'datetime',\n 'datetime-local',\n 'email',\n 'hidden',\n 'month',\n 'number',\n 'range',\n 'search',\n 'tel',\n 'text',\n 'time',\n 'url',\n 'week',\n];\n\n/**\n * Form tags that should be considered as text\n */\nconst TEXT_TAGS = ['select', 'textarea'];\n\nexport default {\n name: 'base-form',\n props: {\n fields: Array,\n model: Object,\n defs: Object,\n readonly: {\n type: Boolean,\n default: false\n },\n fill: Boolean\n },\n events: {\n 'field:change': function(field, value) {\n this.$dispatch('form:change', this, field, value);\n return true; // Let the event continue its bubbling\n }\n },\n computed: {\n schema() {\n if (!this.fields || !(this.model || this.defs)) {\n return empty_schema();\n }\n const s = empty_schema();\n const schema = this.defs || this.model && this.model.__schema__ || empty_schema();\n\n this.fields.forEach((field) => {\n if (schema.hasOwnProperty('properties') && schema.properties.hasOwnProperty(field.id)) {\n s.properties[field.id] = schema.properties[field.id];\n if (schema.required && schema.required.indexOf(field.id) >= 0) {\n s.required.push(field.id);\n }\n return;\n }\n\n const properties = field.id.split('.');\n let currentSchema = schema;\n let required = true;\n let path = '';\n let prop;\n\n for (prop of properties) {\n path += path === '' ? prop : ('.' + prop);\n\n // Handle root level $ref\n if (currentSchema.hasOwnProperty('$ref')) {\n currentSchema = API.resolve(currentSchema.$ref);\n }\n\n if (!currentSchema.properties || !currentSchema.properties.hasOwnProperty(prop)) {\n log.warn(`Property \"${prop}\" not found in schema`);\n return;\n }\n\n required = (\n required\n && currentSchema.hasOwnProperty('required')\n && currentSchema.required.indexOf(prop) >= 0\n );\n\n if (required && s.required.indexOf(path) < 0) {\n s.required.push(path);\n }\n\n // Handle property level $ref\n if (currentSchema.properties[prop].hasOwnProperty('$ref')) {\n currentSchema = API.resolve(currentSchema.properties[prop].$ref);\n }\n }\n\n s.properties[field.id] = currentSchema.properties[prop];\n if (required && !field.id in s.required) {\n s.required.push(field.id);\n }\n });\n\n return s;\n },\n $form() {\n if (!this) return; // Prevent console noise on a non significant error\n return this.$refs.form || this.$els.form || this.$el;\n }\n },\n attached() {\n $(this.$form).validate({\n ignore: '',\n errorClass: 'help-block',\n highlight: this.highlight,\n unhighlight: this.unhighlight,\n success: this.success,\n showErrors: this.showErrors,\n errorPlacement() {},\n });\n this.$broadcast('form:ready');\n },\n beforeDestroy() {\n if (this.$form) {\n this.$broadcast('form:beforeDestroy');\n $(this.$form).data('validator', null);\n this.$broadcast('form:destroy');\n }\n },\n methods: {\n /**\n * Trigger a form validation\n */\n validate() {\n return $(this.$form).valid();\n },\n /**\n * Serialize Form into an Object\n *\n * @return {Object}\n */\n serialize() {\n if (!this.$form) return;\n const elements = this.$form.querySelectorAll('input,textarea,select');\n const out = {};\n\n Array.prototype.map.call(elements, function(el) {\n let value;\n if (el.tagName.toLowerCase() === 'select' && el.multiple) {\n value = [...el.options];\n value = value.filter(option => option.selected);\n value = value.map(option => option.value);\n } else if (TEXT_TAGS.includes(el.tagName.toLowerCase()) || TEXT_INPUTS.includes(el.type.toLowerCase())) {\n value = el.value || null;\n } else if (el.type === 'checkbox') {\n value = el.checked;\n } else {\n value = el.value;\n }\n return {name: el.name, value: value};\n }).forEach(function(item) {\n setattr(out, item.name, item.value);\n });\n\n // Filter out empty optional objects\n // TODO: handle recursion\n for (const prop in out) {\n if (isObject(out[prop]) && this.schema.required.indexOf(prop) < 0) {\n let falsy = true;\n for (const attr in out[prop]) {\n if (out[prop].hasOwnProperty(attr)) {\n falsy &= !out[prop][attr];\n }\n }\n if (falsy) {\n delete out[prop];\n }\n }\n }\n\n return out;\n },\n on_error(response) {\n const messages = [];\n\n // Errors occuring before submission are simple strings\n if (isString(response)) {\n log.error(response); // Technical and non translatable, logged for better handling later\n // TODO: Optional Sentry handling\n return;\n }\n\n // Display the error identifier if present\n if (response.headers && 'X-Sentry-ID' in response.headers) {\n messages.push(\n this._('The error identifier is {id}', {id: response.headers['X-Sentry-ID']})\n );\n }\n\n if ('data' in response) {\n let data = {};\n try {\n data = JSON.parse(response.data);\n } catch (e) {\n log.warn('Parsing error:', e);\n // TODO: Optional Sentry handling\n }\n\n if ('errors' in data) {\n this.fill_errors(data.errors);\n return; // Form errors does not need to be notified\n } else if ('message' in data) {\n messages.push(data.message);\n }\n }\n\n if (!messages.length) {\n messages.push(this._('An unkown error occured'));\n }\n\n this.$dispatch('notify', {\n type: 'error',\n icon: 'exclamation-triangle',\n title: this._('An error occured'),\n details: messages.join('\\n'),\n });\n },\n fill_errors(errors) {\n Object.entries(flattenObject(errors)).forEach(([field, errs]) => {\n const el = this.$form.querySelector(`[name=\"${field}\"]`);\n const $field = this.findField(el);\n $field.errors = errs;\n $field.success = false;\n });\n },\n highlight(element) {\n this.findField(element).success = false;\n },\n unhighlight(element) {\n this.findField(element).errors = [];\n },\n /**\n * Inject jQuery.Validation errors into their fields\n *\n * See: https://jqueryvalidation.org/category/plugin/#showerrors\n */\n showErrors(errorMap, errorList) {\n errorList.forEach(error => {\n this.findField(error.element).errors = [error.message];\n });\n $(this.$form).data('validator').defaultShowErrors();\n },\n /**\n * Mark a field as `success`\n */\n success(label, el) {\n this.findField(el).success = true;\n },\n /**\n * Find the form field containing a given DOM field\n *\n * @param {Element} el The DOM element to match\n */\n findField(el) {\n let $component = findComponent(this, el);\n while (!$component.isField) {\n $component = $component.$parent;\n }\n return $component;\n }\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/components/form/base-form.js\n **/","/*!\n * jQuery Validation Plugin v1.20.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2023 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t// - A user defined a `submitHandler`\n\t\t\t\t\t// - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t// was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && isContentEditable ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\nvar trim = function( str ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n};\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift => 16\n\t\t\t// Ctrl => 17\n\t\t\t// Alt => 18\n\t\t\t// Caps lock => 20\n\t\t\t// End => 35\n\t\t\t// Home => 36\n\t\t\t// Left arrow => 37\n\t\t\t// Up arrow => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow => 40\n\t\t\t// Insert => 45\n\t\t\t// Num lock => 144\n\t\t\t// AltGr key => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar currentForm = this.currentForm,\n\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.trigger( \"focus\" )\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( isContentEditable ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Abort any pending Ajax request from a previous call to this method.\n\t\t\tthis.abortRequest( element );\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \". Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t// method: \"method name\",\n\t\t// parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass );\n\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\tif ( string === undefined ) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\telementAjaxPort: function( element ) {\n\t\t\treturn \"validate\" + element.name;\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {\n\t\t\t\t$( this.currentForm ).trigger( \"submit\" );\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tabortRequest: function( element ) {\n\t\t\tvar port;\n\n\t\t\tif ( this.pending[ element.name ] ) {\n\t\t\t\tport = this.elementAjaxPort( element );\n\t\t\t\t$.ajaxAbort( port );\n\n\t\t\t\tthis.pendingRequest--;\n\n\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t}\n\n\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ type === \"date\" ? \"dateISO\" : method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\n\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = true;\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: ( function() {\n\t\t\tvar called = false;\n\n\t\t\treturn function( value, element ) {\n\t\t\t\tif ( !called ) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t};\n\t\t}() ),\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: this.elementAjaxPort( element ),\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// $.ajaxAbort( port );\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n// Abort the previous request without sending a new one\n$.ajaxAbort = function( port ) {\n\tif ( pendingRequests[ port ] ) {\n\t\tpendingRequests[ port ].abort();\n\t\tdelete pendingRequests[ port ];\n\t}\n};\nreturn $;\n}));\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/jquery-validation/dist/jquery.validate.js\n ** module id = 1077\n ** module chunks = 0 1 2 4 5 7 12 13 14 16 17 23 24 25 26 27 28 29 30 33\n **/","var hide = require('./_hide');\nmodule.exports = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else hide(target, key, src[key]);\n } return target;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/core-js/library/modules/_redefine-all.js\n ** module id = 1084\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","import config from 'config';\nimport i18n from 'i18n';\nimport log from 'logger';\nimport qq from 'fine-uploader';\nimport allowedExtensions from 'models/allowedExtensions';\n\nconst HAS_FILE_API = window.File && window.FileReader && window.FileList && window.Blob;\nconst _1GO = Math.pow(1024, 3);\nconst _1MO = Math.pow(1024, 2);\nconst _1KO = 1024;\n\n// Passthru interpolation\nconst interpolation = {defaultVariables: {\n file: '{file}',\n minSizeLimit: '{minSizeLimit}',\n sizeLimit: '{sizeLimit}',\n netItems: '{netItems}',\n itemLimit: '{itemLimit}',\n extensions: '{extensions}',\n}};\n\nconst messages = {\n emptyError: i18n._('{file} is empty, please select files again without it.', {interpolation: interpolation}),\n maxHeightImageError: i18n._('Image is too tall.'),\n maxWidthImageError: i18n._('Image is too wide.'),\n minHeightImageError: i18n._('Image is not tall enough.'),\n minWidthImageError: i18n._('Image is not wide enough.'),\n minSizeError: i18n._('{file} is too small, minimum file size is {minSizeLimit}.', {interpolation: interpolation}),\n noFilesError: i18n._('No files to upload.'),\n onLeave: i18n._('The files are being uploaded, if you leave now the upload will be canceled.'),\n retryFailTooManyItemsError: i18n._('Retry failed - you have reached your file limit.'),\n sizeError: i18n._('{file} is too large, maximum file size is {sizeLimit}.', {interpolation: interpolation}),\n tooManyItemsError: i18n._('Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.', {interpolation: interpolation}),\n typeError: i18n._('{file} has an invalid extension. Valid extension(s): {extensions}.', {interpolation: interpolation}),\n unsupportedBrowserIos8Safari: i18n._('Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues.'),\n};\n\n/**\n * This is a mixin handling the fine-uploader logic.\n *\n * See the official documentation for more details:\n * http://docs.fineuploader.com/\n */\nexport default {\n /*\n * Default options\n */\n // Start upload as soon as file is dropped\n autoUpload: true,\n // Allow multiple uploads\n uploadMultiple: true,\n // The class added to the active drop zone\n dropActive: 'drop-active',\n // Wther or not to allow chunked uploads\n chunk: true,\n\n data() {\n return {\n files: [],\n errors: new Set(), // Track files ID for which errors has already been advertised\n dropping: false,\n upload_endpoint: null,\n HAS_FILE_API,\n };\n },\n computed: {\n canDrop() {\n return true;\n },\n },\n ready() {\n this.$dnd = new qq.DragAndDrop({\n dropZoneElements: this.canDrop ? [this.$el] : [],\n classes: {\n dropActive: this.$options.dropActive || 'drop-active'\n },\n callbacks: {\n processingDroppedFilesComplete: this.on_dropped_files_complete\n }\n });\n this._build_uploader();\n },\n\n watch: {\n canDrop(canDrop) {\n if (canDrop) {\n this.$dnd.setupExtraDropzone(this.$el);\n } else {\n this.$dnd.dispose();\n }\n },\n upload_endpoint() {\n this._build_uploader();\n }\n },\n filters: {\n fileext(filename) {\n return filename.split('.').pop();\n },\n filesize(size) {\n if (!size || size <= 0) {\n return '-';\n }\n if (size > _1GO) {\n return Math.round(size * 100 / _1GO) / 100 + ' Go';\n } else if (size > _1MO) {\n return Math.round(size * 10 / _1MO) / 10 + ' Mo';\n } else if (size > _1KO) {\n return Math.round(size * 10 / _1KO) / 10 + ' Ko';\n } else {\n return size + ' o';\n }\n }\n },\n\n methods: {\n _build_uploader() {\n if (!this.upload_endpoint) return;\n this.$uploader = new qq.FineUploaderBasic({\n debug: DEBUG,\n multiple: this.$options.uploadMultiple,\n uploaderType: 'basic',\n autoUpload: this.$options.autoUpload,\n button: this.$els.uploadBtn,\n request: {\n endpoint: this.upload_endpoint,\n inputName: 'file',\n uuidName: 'uuid',\n totalFileSizeName: 'size',\n filenameParam: 'filename',\n },\n chunking: {\n enabled: this.$options.chunk,\n concurrent: {\n enabled: this.$options.chunk,\n },\n paramNames: {\n chunkSize: 'chunksize',\n partByteOffset: 'partbyteoffset',\n partIndex: 'partindex',\n totalParts: 'totalparts'\n },\n success: {\n endpoint: this.upload_endpoint,\n }\n },\n retry: {\n enableAuto: true\n },\n callbacks: {\n onUpload: this.on_upload,\n onSubmitted: this.on_submit,\n onProgress: this.on_progress,\n onComplete: this.on_complete,\n onError: this.on_upload_error,\n },\n validation: {allowedExtensions: this.$options.allowedExtensions || allowedExtensions.items},\n messages,\n });\n },\n\n /**\n * Manually start uploading\n */\n upload(params) {\n if (params) {\n this.$uploader.setParams(params);\n }\n this.$uploader.uploadStoredFiles();\n },\n\n /**\n * Dispatch the file-picked event.\n *\n * See: http://docs.fineuploader.com/branch/master/api/events.html#submit\n */\n on_submit(id) {\n if (HAS_FILE_API) {\n const file = this.$uploader.getFile(id);\n file.id = id;\n file.progress = 0;\n this.files.push(file);\n this.$emit('uploader:file-submit', id, file);\n }\n },\n\n /**\n * Display the progress on upload started.\n *\n * See: http://docs.fineuploader.com/branch/master/api/events.html#upload\n */\n on_upload(id) {\n this.$emit('uploader:upload', id);\n },\n\n /**\n * Update progress bar on upload progress.\n *\n * See: http://docs.fineuploader.com/branch/master/api/events.html#progress\n */\n on_progress(id, name, uploaded, total) {\n const file = this.$uploader.getFile(id);\n file.progress = Math.round(uploaded * 100 / total);\n this.$emit('uploader:progress', id, uploaded, total);\n },\n\n /**\n * Dispatch a \"complete\" event on upload complete\n *\n * See: http://docs.fineuploader.com/branch/master/api/events.html#complete\n */\n on_complete(id, name, response) {\n if (!response.success) return;\n const file = this.$uploader.getFile(id);\n this.files.$remove(file);\n this.$emit('uploader:complete', id, response, file);\n },\n\n /**\n * Trigger file upload on drop complete\n *\n * See: http://docs.fineuploader.com/branch/master/features/drag-and-drop.html#processingDroppedFilesComplete\n */\n on_dropped_files_complete(files) {\n if (this.canDrop) {\n this.$uploader.addFiles(files); // this submits the dropped files to Fine Uploader\n }\n },\n\n /**\n * Fine-uploader error handler\n *\n * See: http://docs.fineuploader.com/branch/master/api/events.html#error\n */\n on_upload_error(id, name, reason, xhr) {\n if (this.errors.has(id)) return; // Already notified on first chunk error\n // If there is a JSON message display it instead of the non-explicit default one\n if (xhr) {\n try {\n const data = JSON.parse(xhr.responseText);\n reason = data.error || data.message || reason;\n } catch(e) {\n log.error('Unable to parse error', xhr.responseText);\n }\n }\n if (reason === 'XHR returned response code 0') {\n reason = this._('Unknown error while communicating with the server');\n }\n if (xhr && config.sentry.dsn) {\n const sentryId = xhr.getResponseHeader('X-Sentry-ID');\n if (sentryId) {\n reason = [reason, this._('The error identifier is {id}', {id: sentryId})].join('\\n');\n }\n }\n this.$dispatch('notify', {\n type: 'error',\n icon: 'exclamation-triangle',\n title: this._('Upload error on {name}', {name}),\n details: reason,\n });\n this.$emit('uploader:error', id, name, reason);\n this.errors.add(id);\n },\n\n clear() {\n this.$uploader.clearStoredFiles();\n }\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/mixins/uploader.js\n **/","import {List} from 'models/base';\n\nexport class AllowedExtensions extends List {\n constructor(options) {\n super(options);\n this.$options.ns = 'datasets';\n this.$options.fetch = 'allowed_extensions';\n }\n}\n\nexport default new AllowedExtensions().fetch();\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/models/allowedExtensions.js\n **/","module.exports = { \"default\": require(\"core-js/library/fn/set\"), __esModule: true };\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/babel-runtime/core-js/set.js\n ** module id = 1119\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.set');\nrequire('../modules/es7.set.to-json');\nrequire('../modules/es7.set.of');\nrequire('../modules/es7.set.from');\nmodule.exports = require('../modules/_core').Set;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/core-js/library/fn/set.js\n ** module id = 1120\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar meta = require('./_meta');\nvar fails = require('./_fails');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar setToStringTag = require('./_set-to-string-tag');\nvar dP = require('./_object-dp').f;\nvar each = require('./_array-methods')(0);\nvar DESCRIPTORS = require('./_descriptors');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME, '_c');\n target._c = new Base();\n if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);\n });\n each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {\n var IS_ADDER = KEY == 'add' || KEY == 'set';\n if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {\n anInstance(this, C, KEY);\n if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;\n var result = this._c[KEY](a === 0 ? 0 : a, b);\n return IS_ADDER ? this : result;\n });\n });\n IS_WEAK || dP(C.prototype, 'size', {\n get: function () {\n return this._c.size;\n }\n });\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F, O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/core-js/library/modules/_collection.js\n ** module id = 1127\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","'use strict';\nvar global = require('./_global');\nvar core = require('./_core');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/core-js/library/modules/_set-species.js\n ** module id = 1130\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","// Fine Uploader 5.16.2 - MIT licensed. http://fineuploader.com\n(function(global) {\n var qq = function(element) {\n \"use strict\";\n return {\n hide: function() {\n element.style.display = \"none\";\n return this;\n },\n attach: function(type, fn) {\n if (element.addEventListener) {\n element.addEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.attachEvent(\"on\" + type, fn);\n }\n return function() {\n qq(element).detach(type, fn);\n };\n },\n detach: function(type, fn) {\n if (element.removeEventListener) {\n element.removeEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.detachEvent(\"on\" + type, fn);\n }\n return this;\n },\n contains: function(descendant) {\n if (!descendant) {\n return false;\n }\n if (element === descendant) {\n return true;\n }\n if (element.contains) {\n return element.contains(descendant);\n } else {\n return !!(descendant.compareDocumentPosition(element) & 8);\n }\n },\n insertBefore: function(elementB) {\n elementB.parentNode.insertBefore(element, elementB);\n return this;\n },\n remove: function() {\n element.parentNode.removeChild(element);\n return this;\n },\n css: function(styles) {\n if (element.style == null) {\n throw new qq.Error(\"Can't apply style to node as it is not on the HTMLElement prototype chain!\");\n }\n if (styles.opacity != null) {\n if (typeof element.style.opacity !== \"string\" && typeof element.filters !== \"undefined\") {\n styles.filter = \"alpha(opacity=\" + Math.round(100 * styles.opacity) + \")\";\n }\n }\n qq.extend(element.style, styles);\n return this;\n },\n hasClass: function(name, considerParent) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className));\n },\n addClass: function(name) {\n if (!qq(element).hasClass(name)) {\n element.className += \" \" + name;\n }\n return this;\n },\n removeClass: function(name) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n element.className = element.className.replace(re, \" \").replace(/^\\s+|\\s+$/g, \"\");\n return this;\n },\n getByClass: function(className, first) {\n var candidates, result = [];\n if (first && element.querySelector) {\n return element.querySelector(\".\" + className);\n } else if (element.querySelectorAll) {\n return element.querySelectorAll(\".\" + className);\n }\n candidates = element.getElementsByTagName(\"*\");\n qq.each(candidates, function(idx, val) {\n if (qq(val).hasClass(className)) {\n result.push(val);\n }\n });\n return first ? result[0] : result;\n },\n getFirstByClass: function(className) {\n return qq(element).getByClass(className, true);\n },\n children: function() {\n var children = [], child = element.firstChild;\n while (child) {\n if (child.nodeType === 1) {\n children.push(child);\n }\n child = child.nextSibling;\n }\n return children;\n },\n setText: function(text) {\n element.innerText = text;\n element.textContent = text;\n return this;\n },\n clearText: function() {\n return qq(element).setText(\"\");\n },\n hasAttribute: function(attrName) {\n var attrVal;\n if (element.hasAttribute) {\n if (!element.hasAttribute(attrName)) {\n return false;\n }\n return /^false$/i.exec(element.getAttribute(attrName)) == null;\n } else {\n attrVal = element[attrName];\n if (attrVal === undefined) {\n return false;\n }\n return /^false$/i.exec(attrVal) == null;\n }\n }\n };\n };\n (function() {\n \"use strict\";\n qq.canvasToBlob = function(canvas, mime, quality) {\n return qq.dataUriToBlob(canvas.toDataURL(mime, quality));\n };\n qq.dataUriToBlob = function(dataUri) {\n var arrayBuffer, byteString, createBlob = function(data, mime) {\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder();\n if (blobBuilder) {\n blobBuilder.append(data);\n return blobBuilder.getBlob(mime);\n } else {\n return new Blob([ data ], {\n type: mime\n });\n }\n }, intArray, mimeString;\n if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n byteString = atob(dataUri.split(\",\")[1]);\n } else {\n byteString = decodeURI(dataUri.split(\",\")[1]);\n }\n mimeString = dataUri.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n arrayBuffer = new ArrayBuffer(byteString.length);\n intArray = new Uint8Array(arrayBuffer);\n qq.each(byteString, function(idx, character) {\n intArray[idx] = character.charCodeAt(0);\n });\n return createBlob(arrayBuffer, mimeString);\n };\n qq.log = function(message, level) {\n if (window.console) {\n if (!level || level === \"info\") {\n window.console.log(message);\n } else {\n if (window.console[level]) {\n window.console[level](message);\n } else {\n window.console.log(\"<\" + level + \"> \" + message);\n }\n }\n }\n };\n qq.isObject = function(variable) {\n return variable && !variable.nodeType && Object.prototype.toString.call(variable) === \"[object Object]\";\n };\n qq.isFunction = function(variable) {\n return typeof variable === \"function\";\n };\n qq.isArray = function(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\" || value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer;\n };\n qq.isItemList = function(maybeItemList) {\n return Object.prototype.toString.call(maybeItemList) === \"[object DataTransferItemList]\";\n };\n qq.isNodeList = function(maybeNodeList) {\n return Object.prototype.toString.call(maybeNodeList) === \"[object NodeList]\" || maybeNodeList.item && maybeNodeList.namedItem;\n };\n qq.isString = function(maybeString) {\n return Object.prototype.toString.call(maybeString) === \"[object String]\";\n };\n qq.trimStr = function(string) {\n if (String.prototype.trim) {\n return string.trim();\n }\n return string.replace(/^\\s+|\\s+$/g, \"\");\n };\n qq.format = function(str) {\n var args = Array.prototype.slice.call(arguments, 1), newStr = str, nextIdxToReplace = newStr.indexOf(\"{}\");\n qq.each(args, function(idx, val) {\n var strBefore = newStr.substring(0, nextIdxToReplace), strAfter = newStr.substring(nextIdxToReplace + 2);\n newStr = strBefore + val + strAfter;\n nextIdxToReplace = newStr.indexOf(\"{}\", nextIdxToReplace + val.length);\n if (nextIdxToReplace < 0) {\n return false;\n }\n });\n return newStr;\n };\n qq.isFile = function(maybeFile) {\n return window.File && Object.prototype.toString.call(maybeFile) === \"[object File]\";\n };\n qq.isFileList = function(maybeFileList) {\n return window.FileList && Object.prototype.toString.call(maybeFileList) === \"[object FileList]\";\n };\n qq.isFileOrInput = function(maybeFileOrInput) {\n return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput);\n };\n qq.isInput = function(maybeInput, notFile) {\n var evaluateType = function(type) {\n var normalizedType = type.toLowerCase();\n if (notFile) {\n return normalizedType !== \"file\";\n }\n return normalizedType === \"file\";\n };\n if (window.HTMLInputElement) {\n if (Object.prototype.toString.call(maybeInput) === \"[object HTMLInputElement]\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n if (maybeInput.tagName) {\n if (maybeInput.tagName.toLowerCase() === \"input\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n return false;\n };\n qq.isBlob = function(maybeBlob) {\n if (window.Blob && Object.prototype.toString.call(maybeBlob) === \"[object Blob]\") {\n return true;\n }\n };\n qq.isXhrUploadSupported = function() {\n var input = document.createElement(\"input\");\n input.type = \"file\";\n return input.multiple !== undefined && typeof File !== \"undefined\" && typeof FormData !== \"undefined\" && typeof qq.createXhrInstance().upload !== \"undefined\";\n };\n qq.createXhrInstance = function() {\n if (window.XMLHttpRequest) {\n return new XMLHttpRequest();\n }\n try {\n return new ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n } catch (error) {\n qq.log(\"Neither XHR or ActiveX are supported!\", \"error\");\n return null;\n }\n };\n qq.isFolderDropSupported = function(dataTransfer) {\n return dataTransfer.items && dataTransfer.items.length > 0 && dataTransfer.items[0].webkitGetAsEntry;\n };\n qq.isFileChunkingSupported = function() {\n return !qq.androidStock() && qq.isXhrUploadSupported() && (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined);\n };\n qq.sliceBlob = function(fileOrBlob, start, end) {\n var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice;\n return slicer.call(fileOrBlob, start, end);\n };\n qq.arrayBufferToHex = function(buffer) {\n var bytesAsHex = \"\", bytes = new Uint8Array(buffer);\n qq.each(bytes, function(idx, byt) {\n var byteAsHexStr = byt.toString(16);\n if (byteAsHexStr.length < 2) {\n byteAsHexStr = \"0\" + byteAsHexStr;\n }\n bytesAsHex += byteAsHexStr;\n });\n return bytesAsHex;\n };\n qq.readBlobToHex = function(blob, startOffset, length) {\n var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length), fileReader = new FileReader(), promise = new qq.Promise();\n fileReader.onload = function() {\n promise.success(qq.arrayBufferToHex(fileReader.result));\n };\n fileReader.onerror = promise.failure;\n fileReader.readAsArrayBuffer(initialBlob);\n return promise;\n };\n qq.extend = function(first, second, extendNested) {\n qq.each(second, function(prop, val) {\n if (extendNested && qq.isObject(val)) {\n if (first[prop] === undefined) {\n first[prop] = {};\n }\n qq.extend(first[prop], val, true);\n } else {\n first[prop] = val;\n }\n });\n return first;\n };\n qq.override = function(target, sourceFn) {\n var super_ = {}, source = sourceFn(super_);\n qq.each(source, function(srcPropName, srcPropVal) {\n if (target[srcPropName] !== undefined) {\n super_[srcPropName] = target[srcPropName];\n }\n target[srcPropName] = srcPropVal;\n });\n return target;\n };\n qq.indexOf = function(arr, elt, from) {\n if (arr.indexOf) {\n return arr.indexOf(elt, from);\n }\n from = from || 0;\n var len = arr.length;\n if (from < 0) {\n from += len;\n }\n for (;from < len; from += 1) {\n if (arr.hasOwnProperty(from) && arr[from] === elt) {\n return from;\n }\n }\n return -1;\n };\n qq.getUniqueId = function() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n var r = Math.random() * 16 | 0, v = c == \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n };\n qq.ie = function() {\n return navigator.userAgent.indexOf(\"MSIE\") !== -1 || navigator.userAgent.indexOf(\"Trident\") !== -1;\n };\n qq.ie7 = function() {\n return navigator.userAgent.indexOf(\"MSIE 7\") !== -1;\n };\n qq.ie8 = function() {\n return navigator.userAgent.indexOf(\"MSIE 8\") !== -1;\n };\n qq.ie10 = function() {\n return navigator.userAgent.indexOf(\"MSIE 10\") !== -1;\n };\n qq.ie11 = function() {\n return qq.ie() && navigator.userAgent.indexOf(\"rv:11\") !== -1;\n };\n qq.edge = function() {\n return navigator.userAgent.indexOf(\"Edge\") >= 0;\n };\n qq.safari = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Apple\") !== -1;\n };\n qq.chrome = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Google\") !== -1;\n };\n qq.opera = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Opera\") !== -1;\n };\n qq.firefox = function() {\n return !qq.edge() && !qq.ie11() && navigator.userAgent.indexOf(\"Mozilla\") !== -1 && navigator.vendor !== undefined && navigator.vendor === \"\";\n };\n qq.windows = function() {\n return navigator.platform === \"Win32\";\n };\n qq.android = function() {\n return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n };\n qq.androidStock = function() {\n return qq.android() && navigator.userAgent.toLowerCase().indexOf(\"chrome\") < 0;\n };\n qq.ios6 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 6_\") !== -1;\n };\n qq.ios7 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 7_\") !== -1;\n };\n qq.ios8 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_\") !== -1;\n };\n qq.ios800 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_0 \") !== -1;\n };\n qq.ios = function() {\n return navigator.userAgent.indexOf(\"iPad\") !== -1 || navigator.userAgent.indexOf(\"iPod\") !== -1 || navigator.userAgent.indexOf(\"iPhone\") !== -1;\n };\n qq.iosChrome = function() {\n return qq.ios() && navigator.userAgent.indexOf(\"CriOS\") !== -1;\n };\n qq.iosSafari = function() {\n return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf(\"Safari\") !== -1;\n };\n qq.iosSafariWebView = function() {\n return qq.ios() && !qq.iosChrome() && !qq.iosSafari();\n };\n qq.preventDefault = function(e) {\n if (e.preventDefault) {\n e.preventDefault();\n } else {\n e.returnValue = false;\n }\n };\n qq.toElement = function() {\n var div = document.createElement(\"div\");\n return function(html) {\n div.innerHTML = html;\n var element = div.firstChild;\n div.removeChild(element);\n return element;\n };\n }();\n qq.each = function(iterableItem, callback) {\n var keyOrIndex, retVal;\n if (iterableItem) {\n if (window.Storage && iterableItem.constructor === window.Storage) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex)));\n if (retVal === false) {\n break;\n }\n }\n } else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n } else if (qq.isString(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex));\n if (retVal === false) {\n break;\n }\n }\n } else {\n for (keyOrIndex in iterableItem) {\n if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n }\n }\n }\n };\n qq.bind = function(oldFunc, context) {\n if (qq.isFunction(oldFunc)) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var newArgs = qq.extend([], args);\n if (arguments.length) {\n newArgs = newArgs.concat(Array.prototype.slice.call(arguments));\n }\n return oldFunc.apply(context, newArgs);\n };\n }\n throw new Error(\"first parameter must be a function!\");\n };\n qq.obj2url = function(obj, temp, prefixDone) {\n var uristrings = [], prefix = \"&\", add = function(nextObj, i) {\n var nextTemp = temp ? /\\[\\]$/.test(temp) ? temp : temp + \"[\" + i + \"]\" : i;\n if (nextTemp !== \"undefined\" && i !== \"undefined\") {\n uristrings.push(typeof nextObj === \"object\" ? qq.obj2url(nextObj, nextTemp, true) : Object.prototype.toString.call(nextObj) === \"[object Function]\" ? encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj()) : encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj));\n }\n };\n if (!prefixDone && temp) {\n prefix = /\\?/.test(temp) ? /\\?$/.test(temp) ? \"\" : \"&\" : \"?\";\n uristrings.push(temp);\n uristrings.push(qq.obj2url(obj));\n } else if (Object.prototype.toString.call(obj) === \"[object Array]\" && typeof obj !== \"undefined\") {\n qq.each(obj, function(idx, val) {\n add(val, idx);\n });\n } else if (typeof obj !== \"undefined\" && obj !== null && typeof obj === \"object\") {\n qq.each(obj, function(prop, val) {\n add(val, prop);\n });\n } else {\n uristrings.push(encodeURIComponent(temp) + \"=\" + encodeURIComponent(obj));\n }\n if (temp) {\n return uristrings.join(prefix);\n } else {\n return uristrings.join(prefix).replace(/^&/, \"\").replace(/%20/g, \"+\");\n }\n };\n qq.obj2FormData = function(obj, formData, arrayKeyName) {\n if (!formData) {\n formData = new FormData();\n }\n qq.each(obj, function(key, val) {\n key = arrayKeyName ? arrayKeyName + \"[\" + key + \"]\" : key;\n if (qq.isObject(val)) {\n qq.obj2FormData(val, formData, key);\n } else if (qq.isFunction(val)) {\n formData.append(key, val());\n } else {\n formData.append(key, val);\n }\n });\n return formData;\n };\n qq.obj2Inputs = function(obj, form) {\n var input;\n if (!form) {\n form = document.createElement(\"form\");\n }\n qq.obj2FormData(obj, {\n append: function(key, val) {\n input = document.createElement(\"input\");\n input.setAttribute(\"name\", key);\n input.setAttribute(\"value\", val);\n form.appendChild(input);\n }\n });\n return form;\n };\n qq.parseJson = function(json) {\n if (window.JSON && qq.isFunction(JSON.parse)) {\n return JSON.parse(json);\n } else {\n return eval(\"(\" + json + \")\");\n }\n };\n qq.getExtension = function(filename) {\n var extIdx = filename.lastIndexOf(\".\") + 1;\n if (extIdx > 0) {\n return filename.substr(extIdx, filename.length - extIdx);\n }\n };\n qq.getFilename = function(blobOrFileInput) {\n if (qq.isInput(blobOrFileInput)) {\n return blobOrFileInput.value.replace(/.*(\\/|\\\\)/, \"\");\n } else if (qq.isFile(blobOrFileInput)) {\n if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) {\n return blobOrFileInput.fileName;\n }\n }\n return blobOrFileInput.name;\n };\n qq.DisposeSupport = function() {\n var disposers = [];\n return {\n dispose: function() {\n var disposer;\n do {\n disposer = disposers.shift();\n if (disposer) {\n disposer();\n }\n } while (disposer);\n },\n attach: function() {\n var args = arguments;\n this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1)));\n },\n addDisposer: function(disposeFunction) {\n disposers.push(disposeFunction);\n }\n };\n };\n })();\n (function() {\n \"use strict\";\n if (typeof define === \"function\" && define.amd) {\n define(function() {\n return qq;\n });\n } else if (typeof module !== \"undefined\" && module.exports) {\n module.exports = qq;\n } else {\n global.qq = qq;\n }\n })();\n (function() {\n \"use strict\";\n qq.Error = function(message) {\n this.message = \"[Fine Uploader \" + qq.version + \"] \" + message;\n };\n qq.Error.prototype = new Error();\n })();\n qq.version = \"5.16.2\";\n qq.supportedFeatures = function() {\n \"use strict\";\n var supportsUploading, supportsUploadingBlobs, supportsFileDrop, supportsAjaxFileUploading, supportsFolderDrop, supportsChunking, supportsResume, supportsUploadViaPaste, supportsUploadCors, supportsDeleteFileXdr, supportsDeleteFileCorsXhr, supportsDeleteFileCors, supportsFolderSelection, supportsImagePreviews, supportsUploadProgress;\n function testSupportsFileInputElement() {\n var supported = true, tempInput;\n try {\n tempInput = document.createElement(\"input\");\n tempInput.type = \"file\";\n qq(tempInput).hide();\n if (tempInput.disabled) {\n supported = false;\n }\n } catch (ex) {\n supported = false;\n }\n return supported;\n }\n function isChrome14OrHigher() {\n return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\\/[1][4-9]|Chrome\\/[2-9][0-9]/) !== undefined;\n }\n function isCrossOriginXhrSupported() {\n if (window.XMLHttpRequest) {\n var xhr = qq.createXhrInstance();\n return xhr.withCredentials !== undefined;\n }\n return false;\n }\n function isXdrSupported() {\n return window.XDomainRequest !== undefined;\n }\n function isCrossOriginAjaxSupported() {\n if (isCrossOriginXhrSupported()) {\n return true;\n }\n return isXdrSupported();\n }\n function isFolderSelectionSupported() {\n return document.createElement(\"input\").webkitdirectory !== undefined;\n }\n function isLocalStorageSupported() {\n try {\n return !!window.localStorage && qq.isFunction(window.localStorage.setItem);\n } catch (error) {\n return false;\n }\n }\n function isDragAndDropSupported() {\n var span = document.createElement(\"span\");\n return (\"draggable\" in span || \"ondragstart\" in span && \"ondrop\" in span) && !qq.android() && !qq.ios();\n }\n supportsUploading = testSupportsFileInputElement();\n supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported();\n supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock();\n supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported();\n supportsFolderDrop = supportsFileDrop && function() {\n var input = document.createElement(\"input\");\n input.type = \"file\";\n return !!(\"webkitdirectory\" in (input || document.querySelectorAll(\"input[type=file]\")[0]));\n }();\n supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported();\n supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported();\n supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher();\n supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading);\n supportsDeleteFileCorsXhr = isCrossOriginXhrSupported();\n supportsDeleteFileXdr = isXdrSupported();\n supportsDeleteFileCors = isCrossOriginAjaxSupported();\n supportsFolderSelection = isFolderSelectionSupported();\n supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined;\n supportsUploadProgress = function() {\n if (supportsAjaxFileUploading) {\n return !qq.androidStock() && !qq.iosChrome();\n }\n return false;\n }();\n return {\n ajaxUploading: supportsAjaxFileUploading,\n blobUploading: supportsUploadingBlobs,\n canDetermineSize: supportsAjaxFileUploading,\n chunking: supportsChunking,\n deleteFileCors: supportsDeleteFileCors,\n deleteFileCorsXdr: supportsDeleteFileXdr,\n deleteFileCorsXhr: supportsDeleteFileCorsXhr,\n dialogElement: !!window.HTMLDialogElement,\n fileDrop: supportsFileDrop,\n folderDrop: supportsFolderDrop,\n folderSelection: supportsFolderSelection,\n imagePreviews: supportsImagePreviews,\n imageValidation: supportsImagePreviews,\n itemSizeValidation: supportsAjaxFileUploading,\n pause: supportsChunking,\n progressBar: supportsUploadProgress,\n resume: supportsResume,\n scaling: supportsImagePreviews && supportsUploadingBlobs,\n tiffPreviews: qq.safari(),\n unlimitedScaledImageSize: !qq.ios(),\n uploading: supportsUploading,\n uploadCors: supportsUploadCors,\n uploadCustomHeaders: supportsAjaxFileUploading,\n uploadNonMultipart: supportsAjaxFileUploading,\n uploadViaPaste: supportsUploadViaPaste\n };\n }();\n qq.isGenericPromise = function(maybePromise) {\n \"use strict\";\n return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then));\n };\n qq.Promise = function() {\n \"use strict\";\n var successArgs, failureArgs, successCallbacks = [], failureCallbacks = [], doneCallbacks = [], state = 0;\n qq.extend(this, {\n then: function(onSuccess, onFailure) {\n if (state === 0) {\n if (onSuccess) {\n successCallbacks.push(onSuccess);\n }\n if (onFailure) {\n failureCallbacks.push(onFailure);\n }\n } else if (state === -1) {\n onFailure && onFailure.apply(null, failureArgs);\n } else if (onSuccess) {\n onSuccess.apply(null, successArgs);\n }\n return this;\n },\n done: function(callback) {\n if (state === 0) {\n doneCallbacks.push(callback);\n } else {\n callback.apply(null, failureArgs === undefined ? successArgs : failureArgs);\n }\n return this;\n },\n success: function() {\n state = 1;\n successArgs = arguments;\n if (successCallbacks.length) {\n qq.each(successCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n return this;\n },\n failure: function() {\n state = -1;\n failureArgs = arguments;\n if (failureCallbacks.length) {\n qq.each(failureCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n return this;\n }\n });\n };\n qq.BlobProxy = function(referenceBlob, onCreate) {\n \"use strict\";\n qq.extend(this, {\n referenceBlob: referenceBlob,\n create: function() {\n return onCreate(referenceBlob);\n }\n });\n };\n qq.UploadButton = function(o) {\n \"use strict\";\n var self = this, disposeSupport = new qq.DisposeSupport(), options = {\n acceptFiles: null,\n element: null,\n focusClass: \"qq-upload-button-focus\",\n folders: false,\n hoverClass: \"qq-upload-button-hover\",\n ios8BrowserCrashWorkaround: false,\n multiple: false,\n name: \"qqfile\",\n onChange: function(input) {},\n title: null\n }, input, buttonId;\n qq.extend(options, o);\n buttonId = qq.getUniqueId();\n function createInput() {\n var input = document.createElement(\"input\");\n input.setAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME, buttonId);\n input.setAttribute(\"title\", options.title);\n self.setMultiple(options.multiple, input);\n if (options.folders && qq.supportedFeatures.folderSelection) {\n input.setAttribute(\"webkitdirectory\", \"\");\n }\n if (options.acceptFiles) {\n input.setAttribute(\"accept\", options.acceptFiles);\n }\n input.setAttribute(\"type\", \"file\");\n input.setAttribute(\"name\", options.name);\n qq(input).css({\n position: \"absolute\",\n right: 0,\n top: 0,\n fontFamily: \"Arial\",\n fontSize: qq.ie() && !qq.ie8() ? \"3500px\" : \"118px\",\n margin: 0,\n padding: 0,\n cursor: \"pointer\",\n opacity: 0\n });\n !qq.ie7() && qq(input).css({\n height: \"100%\"\n });\n options.element.appendChild(input);\n disposeSupport.attach(input, \"change\", function() {\n options.onChange(input);\n });\n disposeSupport.attach(input, \"mouseover\", function() {\n qq(options.element).addClass(options.hoverClass);\n });\n disposeSupport.attach(input, \"mouseout\", function() {\n qq(options.element).removeClass(options.hoverClass);\n });\n disposeSupport.attach(input, \"focus\", function() {\n qq(options.element).addClass(options.focusClass);\n });\n disposeSupport.attach(input, \"blur\", function() {\n qq(options.element).removeClass(options.focusClass);\n });\n return input;\n }\n qq(options.element).css({\n position: \"relative\",\n overflow: \"hidden\",\n direction: \"ltr\"\n });\n qq.extend(this, {\n getInput: function() {\n return input;\n },\n getButtonId: function() {\n return buttonId;\n },\n setMultiple: function(isMultiple, optInput) {\n var input = optInput || this.getInput();\n if (options.ios8BrowserCrashWorkaround && qq.ios8() && (qq.iosChrome() || qq.iosSafariWebView())) {\n input.setAttribute(\"multiple\", \"\");\n } else {\n if (isMultiple) {\n input.setAttribute(\"multiple\", \"\");\n } else {\n input.removeAttribute(\"multiple\");\n }\n }\n },\n setAcceptFiles: function(acceptFiles) {\n if (acceptFiles !== options.acceptFiles) {\n input.setAttribute(\"accept\", acceptFiles);\n }\n },\n reset: function() {\n if (input.parentNode) {\n qq(input).remove();\n }\n qq(options.element).removeClass(options.focusClass);\n input = null;\n input = createInput();\n }\n });\n input = createInput();\n };\n qq.UploadButton.BUTTON_ID_ATTR_NAME = \"qq-button-id\";\n qq.UploadData = function(uploaderProxy) {\n \"use strict\";\n var data = [], byUuid = {}, byStatus = {}, byProxyGroupId = {}, byBatchId = {};\n function getDataByIds(idOrIds) {\n if (qq.isArray(idOrIds)) {\n var entries = [];\n qq.each(idOrIds, function(idx, id) {\n entries.push(data[id]);\n });\n return entries;\n }\n return data[idOrIds];\n }\n function getDataByUuids(uuids) {\n if (qq.isArray(uuids)) {\n var entries = [];\n qq.each(uuids, function(idx, uuid) {\n entries.push(data[byUuid[uuid]]);\n });\n return entries;\n }\n return data[byUuid[uuids]];\n }\n function getDataByStatus(status) {\n var statusResults = [], statuses = [].concat(status);\n qq.each(statuses, function(index, statusEnum) {\n var statusResultIndexes = byStatus[statusEnum];\n if (statusResultIndexes !== undefined) {\n qq.each(statusResultIndexes, function(i, dataIndex) {\n statusResults.push(data[dataIndex]);\n });\n }\n });\n return statusResults;\n }\n qq.extend(this, {\n addFile: function(spec) {\n var status = spec.status || qq.status.SUBMITTING, id = data.push({\n name: spec.name,\n originalName: spec.name,\n uuid: spec.uuid,\n size: spec.size == null ? -1 : spec.size,\n status: status,\n file: spec.file\n }) - 1;\n if (spec.batchId) {\n data[id].batchId = spec.batchId;\n if (byBatchId[spec.batchId] === undefined) {\n byBatchId[spec.batchId] = [];\n }\n byBatchId[spec.batchId].push(id);\n }\n if (spec.proxyGroupId) {\n data[id].proxyGroupId = spec.proxyGroupId;\n if (byProxyGroupId[spec.proxyGroupId] === undefined) {\n byProxyGroupId[spec.proxyGroupId] = [];\n }\n byProxyGroupId[spec.proxyGroupId].push(id);\n }\n data[id].id = id;\n byUuid[spec.uuid] = id;\n if (byStatus[status] === undefined) {\n byStatus[status] = [];\n }\n byStatus[status].push(id);\n spec.onBeforeStatusChange && spec.onBeforeStatusChange(id);\n uploaderProxy.onStatusChange(id, null, status);\n return id;\n },\n retrieve: function(optionalFilter) {\n if (qq.isObject(optionalFilter) && data.length) {\n if (optionalFilter.id !== undefined) {\n return getDataByIds(optionalFilter.id);\n } else if (optionalFilter.uuid !== undefined) {\n return getDataByUuids(optionalFilter.uuid);\n } else if (optionalFilter.status) {\n return getDataByStatus(optionalFilter.status);\n }\n } else {\n return qq.extend([], data, true);\n }\n },\n removeFileRef: function(id) {\n var record = getDataByIds(id);\n if (record) {\n delete record.file;\n }\n },\n reset: function() {\n data = [];\n byUuid = {};\n byStatus = {};\n byBatchId = {};\n },\n setStatus: function(id, newStatus) {\n var oldStatus = data[id].status, byStatusOldStatusIndex = qq.indexOf(byStatus[oldStatus], id);\n byStatus[oldStatus].splice(byStatusOldStatusIndex, 1);\n data[id].status = newStatus;\n if (byStatus[newStatus] === undefined) {\n byStatus[newStatus] = [];\n }\n byStatus[newStatus].push(id);\n uploaderProxy.onStatusChange(id, oldStatus, newStatus);\n },\n uuidChanged: function(id, newUuid) {\n var oldUuid = data[id].uuid;\n data[id].uuid = newUuid;\n byUuid[newUuid] = id;\n delete byUuid[oldUuid];\n },\n updateName: function(id, newName) {\n data[id].name = newName;\n },\n updateSize: function(id, newSize) {\n data[id].size = newSize;\n },\n setParentId: function(targetId, parentId) {\n data[targetId].parentId = parentId;\n },\n getIdsInProxyGroup: function(id) {\n var proxyGroupId = data[id].proxyGroupId;\n if (proxyGroupId) {\n return byProxyGroupId[proxyGroupId];\n }\n return [];\n },\n getIdsInBatch: function(id) {\n var batchId = data[id].batchId;\n return byBatchId[batchId];\n }\n });\n };\n qq.status = {\n SUBMITTING: \"submitting\",\n SUBMITTED: \"submitted\",\n REJECTED: \"rejected\",\n QUEUED: \"queued\",\n CANCELED: \"canceled\",\n PAUSED: \"paused\",\n UPLOADING: \"uploading\",\n UPLOAD_FINALIZING: \"upload finalizing\",\n UPLOAD_RETRYING: \"retrying upload\",\n UPLOAD_SUCCESSFUL: \"upload successful\",\n UPLOAD_FAILED: \"upload failed\",\n DELETE_FAILED: \"delete failed\",\n DELETING: \"deleting\",\n DELETED: \"deleted\"\n };\n (function() {\n \"use strict\";\n qq.basePublicApi = {\n addBlobs: function(blobDataOrArray, params, endpoint) {\n this.addFiles(blobDataOrArray, params, endpoint);\n },\n addInitialFiles: function(cannedFileList) {\n var self = this;\n qq.each(cannedFileList, function(index, cannedFile) {\n self._addCannedFile(cannedFile);\n });\n },\n addFiles: function(data, params, endpoint) {\n this._maybeHandleIos8SafariWorkaround();\n var batchId = this._storedIds.length === 0 ? qq.getUniqueId() : this._currentBatchId, processBlob = qq.bind(function(blob) {\n this._handleNewFile({\n blob: blob,\n name: this._options.blobs.defaultName\n }, batchId, verifiedFiles);\n }, this), processBlobData = qq.bind(function(blobData) {\n this._handleNewFile(blobData, batchId, verifiedFiles);\n }, this), processCanvas = qq.bind(function(canvas) {\n var blob = qq.canvasToBlob(canvas);\n this._handleNewFile({\n blob: blob,\n name: this._options.blobs.defaultName + \".png\"\n }, batchId, verifiedFiles);\n }, this), processCanvasData = qq.bind(function(canvasData) {\n var normalizedQuality = canvasData.quality && canvasData.quality / 100, blob = qq.canvasToBlob(canvasData.canvas, canvasData.type, normalizedQuality);\n this._handleNewFile({\n blob: blob,\n name: canvasData.name\n }, batchId, verifiedFiles);\n }, this), processFileOrInput = qq.bind(function(fileOrInput) {\n if (qq.isInput(fileOrInput) && qq.supportedFeatures.ajaxUploading) {\n var files = Array.prototype.slice.call(fileOrInput.files), self = this;\n qq.each(files, function(idx, file) {\n self._handleNewFile(file, batchId, verifiedFiles);\n });\n } else {\n this._handleNewFile(fileOrInput, batchId, verifiedFiles);\n }\n }, this), normalizeData = function() {\n if (qq.isFileList(data)) {\n data = Array.prototype.slice.call(data);\n }\n data = [].concat(data);\n }, self = this, verifiedFiles = [];\n this._currentBatchId = batchId;\n if (data) {\n normalizeData();\n qq.each(data, function(idx, fileContainer) {\n if (qq.isFileOrInput(fileContainer)) {\n processFileOrInput(fileContainer);\n } else if (qq.isBlob(fileContainer)) {\n processBlob(fileContainer);\n } else if (qq.isObject(fileContainer)) {\n if (fileContainer.blob && fileContainer.name) {\n processBlobData(fileContainer);\n } else if (fileContainer.canvas && fileContainer.name) {\n processCanvasData(fileContainer);\n }\n } else if (fileContainer.tagName && fileContainer.tagName.toLowerCase() === \"canvas\") {\n processCanvas(fileContainer);\n } else {\n self.log(fileContainer + \" is not a valid file container! Ignoring!\", \"warn\");\n }\n });\n this.log(\"Received \" + verifiedFiles.length + \" files.\");\n this._prepareItemsForUpload(verifiedFiles, params, endpoint);\n }\n },\n cancel: function(id) {\n var uploadData = this._uploadData.retrieve({\n id: id\n });\n if (uploadData && uploadData.status === qq.status.UPLOAD_FINALIZING) {\n this.log(qq.format(\"Ignoring cancel for file ID {} ({}). Finalizing upload.\", id, this.getName(id)), \"error\");\n } else {\n this._handler.cancel(id);\n }\n },\n cancelAll: function() {\n var storedIdsCopy = [], self = this;\n qq.extend(storedIdsCopy, this._storedIds);\n qq.each(storedIdsCopy, function(idx, storedFileId) {\n self.cancel(storedFileId);\n });\n this._handler.cancelAll();\n },\n clearStoredFiles: function() {\n this._storedIds = [];\n },\n continueUpload: function(id) {\n var uploadData = this._uploadData.retrieve({\n id: id\n });\n if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {\n return false;\n }\n if (uploadData.status === qq.status.PAUSED) {\n this.log(qq.format(\"Paused file ID {} ({}) will be continued. Not paused.\", id, this.getName(id)));\n this._uploadFile(id);\n return true;\n } else {\n this.log(qq.format(\"Ignoring continue for file ID {} ({}). Not paused.\", id, this.getName(id)), \"error\");\n }\n return false;\n },\n deleteFile: function(id) {\n return this._onSubmitDelete(id);\n },\n doesExist: function(fileOrBlobId) {\n return this._handler.isValid(fileOrBlobId);\n },\n drawThumbnail: function(fileId, imgOrCanvas, maxSize, fromServer, customResizeFunction) {\n var promiseToReturn = new qq.Promise(), fileOrUrl, options;\n if (this._imageGenerator) {\n fileOrUrl = this._thumbnailUrls[fileId];\n options = {\n customResizeFunction: customResizeFunction,\n maxSize: maxSize > 0 ? maxSize : null,\n scale: maxSize > 0\n };\n if (!fromServer && qq.supportedFeatures.imagePreviews) {\n fileOrUrl = this.getFile(fileId);\n }\n if (fileOrUrl == null) {\n promiseToReturn.failure({\n container: imgOrCanvas,\n error: \"File or URL not found.\"\n });\n } else {\n this._imageGenerator.generate(fileOrUrl, imgOrCanvas, options).then(function success(modifiedContainer) {\n promiseToReturn.success(modifiedContainer);\n }, function failure(container, reason) {\n promiseToReturn.failure({\n container: container,\n error: reason || \"Problem generating thumbnail\"\n });\n });\n }\n } else {\n promiseToReturn.failure({\n container: imgOrCanvas,\n error: \"Missing image generator module\"\n });\n }\n return promiseToReturn;\n },\n getButton: function(fileId) {\n return this._getButton(this._buttonIdsForFileIds[fileId]);\n },\n getEndpoint: function(fileId) {\n return this._endpointStore.get(fileId);\n },\n getFile: function(fileOrBlobId) {\n var file = this._handler.getFile(fileOrBlobId);\n var uploadDataRecord;\n if (!file) {\n uploadDataRecord = this._uploadData.retrieve({\n id: fileOrBlobId\n });\n if (uploadDataRecord) {\n file = uploadDataRecord.file;\n }\n }\n return file || null;\n },\n getInProgress: function() {\n return this._uploadData.retrieve({\n status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED ]\n }).length;\n },\n getName: function(id) {\n return this._uploadData.retrieve({\n id: id\n }).name;\n },\n getParentId: function(id) {\n var uploadDataEntry = this.getUploads({\n id: id\n }), parentId = null;\n if (uploadDataEntry) {\n if (uploadDataEntry.parentId !== undefined) {\n parentId = uploadDataEntry.parentId;\n }\n }\n return parentId;\n },\n getResumableFilesData: function() {\n return this._handler.getResumableFilesData();\n },\n getSize: function(id) {\n return this._uploadData.retrieve({\n id: id\n }).size;\n },\n getNetUploads: function() {\n return this._netUploaded;\n },\n getRemainingAllowedItems: function() {\n var allowedItems = this._currentItemLimit;\n if (allowedItems > 0) {\n return allowedItems - this._netUploadedOrQueued;\n }\n return null;\n },\n getUploads: function(optionalFilter) {\n return this._uploadData.retrieve(optionalFilter);\n },\n getUuid: function(id) {\n return this._uploadData.retrieve({\n id: id\n }).uuid;\n },\n isResumable: function(id) {\n return this._handler.hasResumeRecord(id);\n },\n log: function(str, level) {\n if (this._options.debug && (!level || level === \"info\")) {\n qq.log(\"[Fine Uploader \" + qq.version + \"] \" + str);\n } else if (level && level !== \"info\") {\n qq.log(\"[Fine Uploader \" + qq.version + \"] \" + str, level);\n }\n },\n pauseUpload: function(id) {\n var uploadData = this._uploadData.retrieve({\n id: id\n });\n if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) {\n return false;\n }\n if (qq.indexOf([ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING ], uploadData.status) >= 0) {\n if (this._handler.pause(id)) {\n this._uploadData.setStatus(id, qq.status.PAUSED);\n return true;\n } else {\n this.log(qq.format(\"Unable to pause file ID {} ({}).\", id, this.getName(id)), \"error\");\n }\n } else {\n this.log(qq.format(\"Ignoring pause for file ID {} ({}). Not in progress.\", id, this.getName(id)), \"error\");\n }\n return false;\n },\n removeFileRef: function(id) {\n this._handler.expunge(id);\n this._uploadData.removeFileRef(id);\n },\n reset: function() {\n this.log(\"Resetting uploader...\");\n this._handler.reset();\n this._storedIds = [];\n this._autoRetries = [];\n this._retryTimeouts = [];\n this._preventRetries = [];\n this._thumbnailUrls = [];\n qq.each(this._buttons, function(idx, button) {\n button.reset();\n });\n this._paramsStore.reset();\n this._endpointStore.reset();\n this._netUploadedOrQueued = 0;\n this._netUploaded = 0;\n this._uploadData.reset();\n this._buttonIdsForFileIds = [];\n this._pasteHandler && this._pasteHandler.reset();\n this._options.session.refreshOnReset && this._refreshSessionData();\n this._succeededSinceLastAllComplete = [];\n this._failedSinceLastAllComplete = [];\n this._totalProgress && this._totalProgress.reset();\n this._customResumeDataStore.reset();\n },\n retry: function(id) {\n return this._manualRetry(id);\n },\n scaleImage: function(id, specs) {\n var self = this;\n return qq.Scaler.prototype.scaleImage(id, specs, {\n log: qq.bind(self.log, self),\n getFile: qq.bind(self.getFile, self),\n uploadData: self._uploadData\n });\n },\n setCustomHeaders: function(headers, id) {\n this._customHeadersStore.set(headers, id);\n },\n setCustomResumeData: function(id, data) {\n this._customResumeDataStore.set(data, id);\n },\n setDeleteFileCustomHeaders: function(headers, id) {\n this._deleteFileCustomHeadersStore.set(headers, id);\n },\n setDeleteFileEndpoint: function(endpoint, id) {\n this._deleteFileEndpointStore.set(endpoint, id);\n },\n setDeleteFileParams: function(params, id) {\n this._deleteFileParamsStore.set(params, id);\n },\n setEndpoint: function(endpoint, id) {\n this._endpointStore.set(endpoint, id);\n },\n setForm: function(elementOrId) {\n this._updateFormSupportAndParams(elementOrId);\n },\n setItemLimit: function(newItemLimit) {\n this._currentItemLimit = newItemLimit;\n },\n setName: function(id, newName) {\n this._uploadData.updateName(id, newName);\n },\n setParams: function(params, id) {\n this._paramsStore.set(params, id);\n },\n setUuid: function(id, newUuid) {\n return this._uploadData.uuidChanged(id, newUuid);\n },\n setStatus: function(id, newStatus) {\n var fileRecord = this.getUploads({\n id: id\n });\n if (!fileRecord) {\n throw new qq.Error(id + \" is not a valid file ID.\");\n }\n switch (newStatus) {\n case qq.status.DELETED:\n this._onDeleteComplete(id, null, false);\n break;\n\n case qq.status.DELETE_FAILED:\n this._onDeleteComplete(id, null, true);\n break;\n\n default:\n var errorMessage = \"Method setStatus called on '\" + name + \"' not implemented yet for \" + newStatus;\n this.log(errorMessage);\n throw new qq.Error(errorMessage);\n }\n },\n uploadStoredFiles: function() {\n if (this._storedIds.length === 0) {\n this._itemError(\"noFilesError\");\n } else {\n this._uploadStoredFiles();\n }\n }\n };\n qq.basePrivateApi = {\n _addCannedFile: function(sessionData) {\n var self = this;\n return this._uploadData.addFile({\n uuid: sessionData.uuid,\n name: sessionData.name,\n size: sessionData.size,\n status: qq.status.UPLOAD_SUCCESSFUL,\n onBeforeStatusChange: function(id) {\n sessionData.deleteFileEndpoint && self.setDeleteFileEndpoint(sessionData.deleteFileEndpoint, id);\n sessionData.deleteFileParams && self.setDeleteFileParams(sessionData.deleteFileParams, id);\n if (sessionData.thumbnailUrl) {\n self._thumbnailUrls[id] = sessionData.thumbnailUrl;\n }\n self._netUploaded++;\n self._netUploadedOrQueued++;\n }\n });\n },\n _annotateWithButtonId: function(file, associatedInput) {\n if (qq.isFile(file)) {\n file.qqButtonId = this._getButtonId(associatedInput);\n }\n },\n _batchError: function(message) {\n this._options.callbacks.onError(null, null, message, undefined);\n },\n _createDeleteHandler: function() {\n var self = this;\n return new qq.DeleteFileAjaxRequester({\n method: this._options.deleteFile.method.toUpperCase(),\n maxConnections: this._options.maxConnections,\n uuidParamName: this._options.request.uuidName,\n customHeaders: this._deleteFileCustomHeadersStore,\n paramsStore: this._deleteFileParamsStore,\n endpointStore: this._deleteFileEndpointStore,\n cors: this._options.cors,\n log: qq.bind(self.log, self),\n onDelete: function(id) {\n self._onDelete(id);\n self._options.callbacks.onDelete(id);\n },\n onDeleteComplete: function(id, xhrOrXdr, isError) {\n self._onDeleteComplete(id, xhrOrXdr, isError);\n self._options.callbacks.onDeleteComplete(id, xhrOrXdr, isError);\n }\n });\n },\n _createPasteHandler: function() {\n var self = this;\n return new qq.PasteSupport({\n targetElement: this._options.paste.targetElement,\n callbacks: {\n log: qq.bind(self.log, self),\n pasteReceived: function(blob) {\n self._handleCheckedCallback({\n name: \"onPasteReceived\",\n callback: qq.bind(self._options.callbacks.onPasteReceived, self, blob),\n onSuccess: qq.bind(self._handlePasteSuccess, self, blob),\n identifier: \"pasted image\"\n });\n }\n }\n });\n },\n _createStore: function(initialValue, _readOnlyValues_) {\n var store = {}, catchall = initialValue, perIdReadOnlyValues = {}, readOnlyValues = _readOnlyValues_, copy = function(orig) {\n if (qq.isObject(orig)) {\n return qq.extend({}, orig);\n }\n return orig;\n }, getReadOnlyValues = function() {\n if (qq.isFunction(readOnlyValues)) {\n return readOnlyValues();\n }\n return readOnlyValues;\n }, includeReadOnlyValues = function(id, existing) {\n if (readOnlyValues && qq.isObject(existing)) {\n qq.extend(existing, getReadOnlyValues());\n }\n if (perIdReadOnlyValues[id]) {\n qq.extend(existing, perIdReadOnlyValues[id]);\n }\n };\n return {\n set: function(val, id) {\n if (id == null) {\n store = {};\n catchall = copy(val);\n } else {\n store[id] = copy(val);\n }\n },\n get: function(id) {\n var values;\n if (id != null && store[id]) {\n values = store[id];\n } else {\n values = copy(catchall);\n }\n includeReadOnlyValues(id, values);\n return copy(values);\n },\n addReadOnly: function(id, values) {\n if (qq.isObject(store)) {\n if (id === null) {\n if (qq.isFunction(values)) {\n readOnlyValues = values;\n } else {\n readOnlyValues = readOnlyValues || {};\n qq.extend(readOnlyValues, values);\n }\n } else {\n perIdReadOnlyValues[id] = perIdReadOnlyValues[id] || {};\n qq.extend(perIdReadOnlyValues[id], values);\n }\n }\n },\n remove: function(fileId) {\n return delete store[fileId];\n },\n reset: function() {\n store = {};\n perIdReadOnlyValues = {};\n catchall = initialValue;\n }\n };\n },\n _createUploadDataTracker: function() {\n var self = this;\n return new qq.UploadData({\n getName: function(id) {\n return self.getName(id);\n },\n getUuid: function(id) {\n return self.getUuid(id);\n },\n getSize: function(id) {\n return self.getSize(id);\n },\n onStatusChange: function(id, oldStatus, newStatus) {\n self._onUploadStatusChange(id, oldStatus, newStatus);\n self._options.callbacks.onStatusChange(id, oldStatus, newStatus);\n self._maybeAllComplete(id, newStatus);\n if (self._totalProgress) {\n setTimeout(function() {\n self._totalProgress.onStatusChange(id, oldStatus, newStatus);\n }, 0);\n }\n }\n });\n },\n _createUploadButton: function(spec) {\n var self = this, acceptFiles = spec.accept || this._options.validation.acceptFiles, allowedExtensions = spec.allowedExtensions || this._options.validation.allowedExtensions, button;\n function allowMultiple() {\n if (qq.supportedFeatures.ajaxUploading) {\n if (self._options.workarounds.iosEmptyVideos && qq.ios() && !qq.ios6() && self._isAllowedExtension(allowedExtensions, \".mov\")) {\n return false;\n }\n if (spec.multiple === undefined) {\n return self._options.multiple;\n }\n return spec.multiple;\n }\n return false;\n }\n button = new qq.UploadButton({\n acceptFiles: acceptFiles,\n element: spec.element,\n focusClass: this._options.classes.buttonFocus,\n folders: spec.folders,\n hoverClass: this._options.classes.buttonHover,\n ios8BrowserCrashWorkaround: this._options.workarounds.ios8BrowserCrash,\n multiple: allowMultiple(),\n name: this._options.request.inputName,\n onChange: function(input) {\n self._onInputChange(input);\n },\n title: spec.title == null ? this._options.text.fileInputTitle : spec.title\n });\n this._disposeSupport.addDisposer(function() {\n button.dispose();\n });\n self._buttons.push(button);\n return button;\n },\n _createUploadHandler: function(additionalOptions, namespace) {\n var self = this, lastOnProgress = {}, options = {\n debug: this._options.debug,\n maxConnections: this._options.maxConnections,\n cors: this._options.cors,\n paramsStore: this._paramsStore,\n endpointStore: this._endpointStore,\n chunking: this._options.chunking,\n resume: this._options.resume,\n blobs: this._options.blobs,\n log: qq.bind(self.log, self),\n preventRetryParam: this._options.retry.preventRetryResponseProperty,\n onProgress: function(id, name, loaded, total) {\n if (loaded < 0 || total < 0) {\n return;\n }\n if (lastOnProgress[id]) {\n if (lastOnProgress[id].loaded !== loaded || lastOnProgress[id].total !== total) {\n self._onProgress(id, name, loaded, total);\n self._options.callbacks.onProgress(id, name, loaded, total);\n }\n } else {\n self._onProgress(id, name, loaded, total);\n self._options.callbacks.onProgress(id, name, loaded, total);\n }\n lastOnProgress[id] = {\n loaded: loaded,\n total: total\n };\n },\n onComplete: function(id, name, result, xhr) {\n delete lastOnProgress[id];\n var status = self.getUploads({\n id: id\n }).status, retVal;\n if (status === qq.status.UPLOAD_SUCCESSFUL || status === qq.status.UPLOAD_FAILED) {\n return;\n }\n retVal = self._onComplete(id, name, result, xhr);\n if (retVal instanceof qq.Promise) {\n retVal.done(function() {\n self._options.callbacks.onComplete(id, name, result, xhr);\n });\n } else {\n self._options.callbacks.onComplete(id, name, result, xhr);\n }\n },\n onCancel: function(id, name, cancelFinalizationEffort) {\n var promise = new qq.Promise();\n self._handleCheckedCallback({\n name: \"onCancel\",\n callback: qq.bind(self._options.callbacks.onCancel, self, id, name),\n onFailure: promise.failure,\n onSuccess: function() {\n cancelFinalizationEffort.then(function() {\n self._onCancel(id, name);\n });\n promise.success();\n },\n identifier: id\n });\n return promise;\n },\n onUploadPrep: qq.bind(this._onUploadPrep, this),\n onUpload: function(id, name) {\n self._onUpload(id, name);\n var onUploadResult = self._options.callbacks.onUpload(id, name);\n if (qq.isGenericPromise(onUploadResult)) {\n self.log(qq.format(\"onUpload for {} returned a Promise - waiting for resolution.\", id));\n return onUploadResult;\n }\n return new qq.Promise().success();\n },\n onUploadChunk: function(id, name, chunkData) {\n self._onUploadChunk(id, chunkData);\n var onUploadChunkResult = self._options.callbacks.onUploadChunk(id, name, chunkData);\n if (qq.isGenericPromise(onUploadChunkResult)) {\n self.log(qq.format(\"onUploadChunk for {}.{} returned a Promise - waiting for resolution.\", id, chunkData.partIndex));\n return onUploadChunkResult;\n }\n return new qq.Promise().success();\n },\n onUploadChunkSuccess: function(id, chunkData, result, xhr) {\n self._onUploadChunkSuccess(id, chunkData);\n self._options.callbacks.onUploadChunkSuccess.apply(self, arguments);\n },\n onResume: function(id, name, chunkData, customResumeData) {\n return self._options.callbacks.onResume(id, name, chunkData, customResumeData);\n },\n onAutoRetry: function(id, name, responseJSON, xhr) {\n return self._onAutoRetry.apply(self, arguments);\n },\n onUuidChanged: function(id, newUuid) {\n self.log(\"Server requested UUID change from '\" + self.getUuid(id) + \"' to '\" + newUuid + \"'\");\n self.setUuid(id, newUuid);\n },\n getName: qq.bind(self.getName, self),\n getUuid: qq.bind(self.getUuid, self),\n getSize: qq.bind(self.getSize, self),\n setSize: qq.bind(self._setSize, self),\n getDataByUuid: function(uuid) {\n return self.getUploads({\n uuid: uuid\n });\n },\n isQueued: function(id) {\n var status = self.getUploads({\n id: id\n }).status;\n return status === qq.status.QUEUED || status === qq.status.SUBMITTED || status === qq.status.UPLOAD_RETRYING || status === qq.status.PAUSED;\n },\n getIdsInProxyGroup: self._uploadData.getIdsInProxyGroup,\n getIdsInBatch: self._uploadData.getIdsInBatch,\n isInProgress: function(id) {\n return self.getUploads({\n id: id\n }).status === qq.status.UPLOADING;\n },\n getCustomResumeData: qq.bind(self._getCustomResumeData, self),\n setStatus: function(id, status) {\n self._uploadData.setStatus(id, status);\n }\n };\n qq.each(this._options.request, function(prop, val) {\n options[prop] = val;\n });\n options.customHeaders = this._customHeadersStore;\n if (additionalOptions) {\n qq.each(additionalOptions, function(key, val) {\n options[key] = val;\n });\n }\n return new qq.UploadHandlerController(options, namespace);\n },\n _fileOrBlobRejected: function(id) {\n this._netUploadedOrQueued--;\n this._uploadData.setStatus(id, qq.status.REJECTED);\n },\n _formatSize: function(bytes) {\n if (bytes === 0) {\n return bytes + this._options.text.sizeSymbols[0];\n }\n var i = -1;\n do {\n bytes = bytes / 1e3;\n i++;\n } while (bytes > 999);\n return Math.max(bytes, .1).toFixed(1) + this._options.text.sizeSymbols[i];\n },\n _generateExtraButtonSpecs: function() {\n var self = this;\n this._extraButtonSpecs = {};\n qq.each(this._options.extraButtons, function(idx, extraButtonOptionEntry) {\n var multiple = extraButtonOptionEntry.multiple, validation = qq.extend({}, self._options.validation, true), extraButtonSpec = qq.extend({}, extraButtonOptionEntry);\n if (multiple === undefined) {\n multiple = self._options.multiple;\n }\n if (extraButtonSpec.validation) {\n qq.extend(validation, extraButtonOptionEntry.validation, true);\n }\n qq.extend(extraButtonSpec, {\n multiple: multiple,\n validation: validation\n }, true);\n self._initExtraButton(extraButtonSpec);\n });\n },\n _getButton: function(buttonId) {\n var extraButtonsSpec = this._extraButtonSpecs[buttonId];\n if (extraButtonsSpec) {\n return extraButtonsSpec.element;\n } else if (buttonId === this._defaultButtonId) {\n return this._options.button;\n }\n },\n _getButtonId: function(buttonOrFileInputOrFile) {\n var inputs, fileInput, fileBlobOrInput = buttonOrFileInputOrFile;\n if (fileBlobOrInput instanceof qq.BlobProxy) {\n fileBlobOrInput = fileBlobOrInput.referenceBlob;\n }\n if (fileBlobOrInput && !qq.isBlob(fileBlobOrInput)) {\n if (qq.isFile(fileBlobOrInput)) {\n return fileBlobOrInput.qqButtonId;\n } else if (fileBlobOrInput.tagName.toLowerCase() === \"input\" && fileBlobOrInput.type.toLowerCase() === \"file\") {\n return fileBlobOrInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);\n }\n inputs = fileBlobOrInput.getElementsByTagName(\"input\");\n qq.each(inputs, function(idx, input) {\n if (input.getAttribute(\"type\") === \"file\") {\n fileInput = input;\n return false;\n }\n });\n if (fileInput) {\n return fileInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME);\n }\n }\n },\n _getCustomResumeData: function(fileId) {\n return this._customResumeDataStore.get(fileId);\n },\n _getNotFinished: function() {\n return this._uploadData.retrieve({\n status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED, qq.status.SUBMITTING, qq.status.SUBMITTED, qq.status.PAUSED ]\n }).length;\n },\n _getValidationBase: function(buttonId) {\n var extraButtonSpec = this._extraButtonSpecs[buttonId];\n return extraButtonSpec ? extraButtonSpec.validation : this._options.validation;\n },\n _getValidationDescriptor: function(fileWrapper) {\n if (fileWrapper.file instanceof qq.BlobProxy) {\n return {\n name: qq.getFilename(fileWrapper.file.referenceBlob),\n size: fileWrapper.file.referenceBlob.size\n };\n }\n return {\n name: this.getUploads({\n id: fileWrapper.id\n }).name,\n size: this.getUploads({\n id: fileWrapper.id\n }).size\n };\n },\n _getValidationDescriptors: function(fileWrappers) {\n var self = this, fileDescriptors = [];\n qq.each(fileWrappers, function(idx, fileWrapper) {\n fileDescriptors.push(self._getValidationDescriptor(fileWrapper));\n });\n return fileDescriptors;\n },\n _handleCameraAccess: function() {\n if (this._options.camera.ios && qq.ios()) {\n var acceptIosCamera = \"image/*;capture=camera\", button = this._options.camera.button, buttonId = button ? this._getButtonId(button) : this._defaultButtonId, optionRoot = this._options;\n if (buttonId && buttonId !== this._defaultButtonId) {\n optionRoot = this._extraButtonSpecs[buttonId];\n }\n optionRoot.multiple = false;\n if (optionRoot.validation.acceptFiles === null) {\n optionRoot.validation.acceptFiles = acceptIosCamera;\n } else {\n optionRoot.validation.acceptFiles += \",\" + acceptIosCamera;\n }\n qq.each(this._buttons, function(idx, button) {\n if (button.getButtonId() === buttonId) {\n button.setMultiple(optionRoot.multiple);\n button.setAcceptFiles(optionRoot.acceptFiles);\n return false;\n }\n });\n }\n },\n _handleCheckedCallback: function(details) {\n var self = this, callbackRetVal = details.callback();\n if (qq.isGenericPromise(callbackRetVal)) {\n this.log(details.name + \" - waiting for \" + details.name + \" promise to be fulfilled for \" + details.identifier);\n return callbackRetVal.then(function(successParam) {\n self.log(details.name + \" promise success for \" + details.identifier);\n details.onSuccess(successParam);\n }, function() {\n if (details.onFailure) {\n self.log(details.name + \" promise failure for \" + details.identifier);\n details.onFailure();\n } else {\n self.log(details.name + \" promise failure for \" + details.identifier);\n }\n });\n }\n if (callbackRetVal !== false) {\n details.onSuccess(callbackRetVal);\n } else {\n if (details.onFailure) {\n this.log(details.name + \" - return value was 'false' for \" + details.identifier + \". Invoking failure callback.\");\n details.onFailure();\n } else {\n this.log(details.name + \" - return value was 'false' for \" + details.identifier + \". Will not proceed.\");\n }\n }\n return callbackRetVal;\n },\n _handleNewFile: function(file, batchId, newFileWrapperList) {\n var self = this, uuid = qq.getUniqueId(), size = -1, name = qq.getFilename(file), actualFile = file.blob || file, handler = this._customNewFileHandler ? this._customNewFileHandler : qq.bind(self._handleNewFileGeneric, self);\n if (!qq.isInput(actualFile) && actualFile.size >= 0) {\n size = actualFile.size;\n }\n handler(actualFile, name, uuid, size, newFileWrapperList, batchId, this._options.request.uuidName, {\n uploadData: self._uploadData,\n paramsStore: self._paramsStore,\n addFileToHandler: function(id, file) {\n self._handler.add(id, file);\n self._netUploadedOrQueued++;\n self._trackButton(id);\n }\n });\n },\n _handleNewFileGeneric: function(file, name, uuid, size, fileList, batchId) {\n var id = this._uploadData.addFile({\n uuid: uuid,\n name: name,\n size: size,\n batchId: batchId,\n file: file\n });\n this._handler.add(id, file);\n this._trackButton(id);\n this._netUploadedOrQueued++;\n fileList.push({\n id: id,\n file: file\n });\n },\n _handlePasteSuccess: function(blob, extSuppliedName) {\n var extension = blob.type.split(\"/\")[1], name = extSuppliedName;\n if (name == null) {\n name = this._options.paste.defaultName;\n }\n name += \".\" + extension;\n this.addFiles({\n name: name,\n blob: blob\n });\n },\n _handleDeleteSuccess: function(id) {\n if (this.getUploads({\n id: id\n }).status !== qq.status.DELETED) {\n var name = this.getName(id);\n this._netUploadedOrQueued--;\n this._netUploaded--;\n this._handler.expunge(id);\n this._uploadData.setStatus(id, qq.status.DELETED);\n this.log(\"Delete request for '\" + name + \"' has succeeded.\");\n }\n },\n _handleDeleteFailed: function(id, xhrOrXdr) {\n var name = this.getName(id);\n this._uploadData.setStatus(id, qq.status.DELETE_FAILED);\n this.log(\"Delete request for '\" + name + \"' has failed.\", \"error\");\n if (!xhrOrXdr || xhrOrXdr.withCredentials === undefined) {\n this._options.callbacks.onError(id, name, \"Delete request failed\", xhrOrXdr);\n } else {\n this._options.callbacks.onError(id, name, \"Delete request failed with response code \" + xhrOrXdr.status, xhrOrXdr);\n }\n },\n _initExtraButton: function(spec) {\n var button = this._createUploadButton({\n accept: spec.validation.acceptFiles,\n allowedExtensions: spec.validation.allowedExtensions,\n element: spec.element,\n folders: spec.folders,\n multiple: spec.multiple,\n title: spec.fileInputTitle\n });\n this._extraButtonSpecs[button.getButtonId()] = spec;\n },\n _initFormSupportAndParams: function() {\n this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this));\n if (this._formSupport && this._formSupport.attachedToForm) {\n this._paramsStore = this._createStore(this._options.request.params, this._formSupport.getFormInputsAsObject);\n this._options.autoUpload = this._formSupport.newAutoUpload;\n if (this._formSupport.newEndpoint) {\n this._options.request.endpoint = this._formSupport.newEndpoint;\n }\n } else {\n this._paramsStore = this._createStore(this._options.request.params);\n }\n },\n _isDeletePossible: function() {\n if (!qq.DeleteFileAjaxRequester || !this._options.deleteFile.enabled) {\n return false;\n }\n if (this._options.cors.expected) {\n if (qq.supportedFeatures.deleteFileCorsXhr) {\n return true;\n }\n if (qq.supportedFeatures.deleteFileCorsXdr && this._options.cors.allowXdr) {\n return true;\n }\n return false;\n }\n return true;\n },\n _isAllowedExtension: function(allowed, fileName) {\n var valid = false;\n if (!allowed.length) {\n return true;\n }\n qq.each(allowed, function(idx, allowedExt) {\n if (qq.isString(allowedExt)) {\n var extRegex = new RegExp(\"\\\\.\" + allowedExt + \"$\", \"i\");\n if (fileName.match(extRegex) != null) {\n valid = true;\n return false;\n }\n }\n });\n return valid;\n },\n _itemError: function(code, maybeNameOrNames, item) {\n var message = this._options.messages[code], allowedExtensions = [], names = [].concat(maybeNameOrNames), name = names[0], buttonId = this._getButtonId(item), validationBase = this._getValidationBase(buttonId), extensionsForMessage, placeholderMatch;\n function r(name, replacement) {\n message = message.replace(name, replacement);\n }\n qq.each(validationBase.allowedExtensions, function(idx, allowedExtension) {\n if (qq.isString(allowedExtension)) {\n allowedExtensions.push(allowedExtension);\n }\n });\n extensionsForMessage = allowedExtensions.join(\", \").toLowerCase();\n r(\"{file}\", this._options.formatFileName(name));\n r(\"{extensions}\", extensionsForMessage);\n r(\"{sizeLimit}\", this._formatSize(validationBase.sizeLimit));\n r(\"{minSizeLimit}\", this._formatSize(validationBase.minSizeLimit));\n placeholderMatch = message.match(/(\\{\\w+\\})/g);\n if (placeholderMatch !== null) {\n qq.each(placeholderMatch, function(idx, placeholder) {\n r(placeholder, names[idx]);\n });\n }\n this._options.callbacks.onError(null, name, message, undefined);\n return message;\n },\n _manualRetry: function(id, callback) {\n if (this._onBeforeManualRetry(id)) {\n this._netUploadedOrQueued++;\n this._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);\n if (callback) {\n callback(id);\n } else {\n this._handler.retry(id);\n }\n return true;\n }\n },\n _maybeAllComplete: function(id, status) {\n var self = this, notFinished = this._getNotFinished();\n if (status === qq.status.UPLOAD_SUCCESSFUL) {\n this._succeededSinceLastAllComplete.push(id);\n } else if (status === qq.status.UPLOAD_FAILED) {\n this._failedSinceLastAllComplete.push(id);\n }\n if (notFinished === 0 && (this._succeededSinceLastAllComplete.length || this._failedSinceLastAllComplete.length)) {\n setTimeout(function() {\n self._onAllComplete(self._succeededSinceLastAllComplete, self._failedSinceLastAllComplete);\n }, 0);\n }\n },\n _maybeHandleIos8SafariWorkaround: function() {\n var self = this;\n if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) {\n setTimeout(function() {\n window.alert(self._options.messages.unsupportedBrowserIos8Safari);\n }, 0);\n throw new qq.Error(this._options.messages.unsupportedBrowserIos8Safari);\n }\n },\n _maybeParseAndSendUploadError: function(id, name, response, xhr) {\n if (!response.success) {\n if (xhr && xhr.status !== 200 && !response.error) {\n this._options.callbacks.onError(id, name, \"XHR returned response code \" + xhr.status, xhr);\n } else {\n var errorReason = response.error ? response.error : this._options.text.defaultResponseError;\n this._options.callbacks.onError(id, name, errorReason, xhr);\n }\n }\n },\n _maybeProcessNextItemAfterOnValidateCallback: function(validItem, items, index, params, endpoint) {\n var self = this;\n if (items.length > index) {\n if (validItem || !this._options.validation.stopOnFirstInvalidFile) {\n setTimeout(function() {\n var validationDescriptor = self._getValidationDescriptor(items[index]), buttonId = self._getButtonId(items[index].file), button = self._getButton(buttonId);\n self._handleCheckedCallback({\n name: \"onValidate\",\n callback: qq.bind(self._options.callbacks.onValidate, self, validationDescriptor, button),\n onSuccess: qq.bind(self._onValidateCallbackSuccess, self, items, index, params, endpoint),\n onFailure: qq.bind(self._onValidateCallbackFailure, self, items, index, params, endpoint),\n identifier: \"Item '\" + validationDescriptor.name + \"', size: \" + validationDescriptor.size\n });\n }, 0);\n } else if (!validItem) {\n for (;index < items.length; index++) {\n self._fileOrBlobRejected(items[index].id);\n }\n }\n }\n },\n _onAllComplete: function(successful, failed) {\n this._totalProgress && this._totalProgress.onAllComplete(successful, failed, this._preventRetries);\n this._options.callbacks.onAllComplete(qq.extend([], successful), qq.extend([], failed));\n this._succeededSinceLastAllComplete = [];\n this._failedSinceLastAllComplete = [];\n },\n _onAutoRetry: function(id, name, responseJSON, xhr, callback) {\n var self = this;\n self._preventRetries[id] = responseJSON[self._options.retry.preventRetryResponseProperty];\n if (self._shouldAutoRetry(id)) {\n var retryWaitPeriod = self._options.retry.autoAttemptDelay * 1e3;\n self._maybeParseAndSendUploadError.apply(self, arguments);\n self._options.callbacks.onAutoRetry(id, name, self._autoRetries[id]);\n self._onBeforeAutoRetry(id, name);\n self._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING);\n self._retryTimeouts[id] = setTimeout(function() {\n self.log(\"Starting retry for \" + name + \"...\");\n if (callback) {\n callback(id);\n } else {\n self._handler.retry(id);\n }\n }, retryWaitPeriod);\n return true;\n }\n },\n _onBeforeAutoRetry: function(id, name) {\n this.log(\"Waiting \" + this._options.retry.autoAttemptDelay + \" seconds before retrying \" + name + \"...\");\n },\n _onBeforeManualRetry: function(id) {\n var itemLimit = this._currentItemLimit, fileName;\n if (this._preventRetries[id]) {\n this.log(\"Retries are forbidden for id \" + id, \"warn\");\n return false;\n } else if (this._handler.isValid(id)) {\n fileName = this.getName(id);\n if (this._options.callbacks.onManualRetry(id, fileName) === false) {\n return false;\n }\n if (itemLimit > 0 && this._netUploadedOrQueued + 1 > itemLimit) {\n this._itemError(\"retryFailTooManyItems\");\n return false;\n }\n this.log(\"Retrying upload for '\" + fileName + \"' (id: \" + id + \")...\");\n return true;\n } else {\n this.log(\"'\" + id + \"' is not a valid file ID\", \"error\");\n return false;\n }\n },\n _onCancel: function(id, name) {\n this._netUploadedOrQueued--;\n clearTimeout(this._retryTimeouts[id]);\n var storedItemIndex = qq.indexOf(this._storedIds, id);\n if (!this._options.autoUpload && storedItemIndex >= 0) {\n this._storedIds.splice(storedItemIndex, 1);\n }\n this._uploadData.setStatus(id, qq.status.CANCELED);\n },\n _onComplete: function(id, name, result, xhr) {\n if (!result.success) {\n this._netUploadedOrQueued--;\n this._uploadData.setStatus(id, qq.status.UPLOAD_FAILED);\n if (result[this._options.retry.preventRetryResponseProperty] === true) {\n this._preventRetries[id] = true;\n }\n } else {\n if (result.thumbnailUrl) {\n this._thumbnailUrls[id] = result.thumbnailUrl;\n }\n this._netUploaded++;\n this._uploadData.setStatus(id, qq.status.UPLOAD_SUCCESSFUL);\n }\n this._maybeParseAndSendUploadError(id, name, result, xhr);\n return result.success ? true : false;\n },\n _onDelete: function(id) {\n this._uploadData.setStatus(id, qq.status.DELETING);\n },\n _onDeleteComplete: function(id, xhrOrXdr, isError) {\n var name = this.getName(id);\n if (isError) {\n this._handleDeleteFailed(id, xhrOrXdr);\n } else {\n this._handleDeleteSuccess(id);\n }\n },\n _onInputChange: function(input) {\n var fileIndex;\n if (qq.supportedFeatures.ajaxUploading) {\n for (fileIndex = 0; fileIndex < input.files.length; fileIndex++) {\n this._annotateWithButtonId(input.files[fileIndex], input);\n }\n this.addFiles(input.files);\n } else if (input.value.length > 0) {\n this.addFiles(input);\n }\n qq.each(this._buttons, function(idx, button) {\n button.reset();\n });\n },\n _onProgress: function(id, name, loaded, total) {\n this._totalProgress && this._totalProgress.onIndividualProgress(id, loaded, total);\n },\n _onSubmit: function(id, name) {},\n _onSubmitCallbackSuccess: function(id, name) {\n this._onSubmit.apply(this, arguments);\n this._uploadData.setStatus(id, qq.status.SUBMITTED);\n this._onSubmitted.apply(this, arguments);\n if (this._options.autoUpload) {\n this._options.callbacks.onSubmitted.apply(this, arguments);\n this._uploadFile(id);\n } else {\n this._storeForLater(id);\n this._options.callbacks.onSubmitted.apply(this, arguments);\n }\n },\n _onSubmitDelete: function(id, onSuccessCallback, additionalMandatedParams) {\n var uuid = this.getUuid(id), adjustedOnSuccessCallback;\n if (onSuccessCallback) {\n adjustedOnSuccessCallback = qq.bind(onSuccessCallback, this, id, uuid, additionalMandatedParams);\n }\n if (this._isDeletePossible()) {\n this._handleCheckedCallback({\n name: \"onSubmitDelete\",\n callback: qq.bind(this._options.callbacks.onSubmitDelete, this, id),\n onSuccess: adjustedOnSuccessCallback || qq.bind(this._deleteHandler.sendDelete, this, id, uuid, additionalMandatedParams),\n identifier: id\n });\n return true;\n } else {\n this.log(\"Delete request ignored for ID \" + id + \", delete feature is disabled or request not possible \" + \"due to CORS on a user agent that does not support pre-flighting.\", \"warn\");\n return false;\n }\n },\n _onSubmitted: function(id) {},\n _onTotalProgress: function(loaded, total) {\n this._options.callbacks.onTotalProgress(loaded, total);\n },\n _onUploadPrep: function(id) {},\n _onUpload: function(id, name) {\n this._uploadData.setStatus(id, qq.status.UPLOADING);\n },\n _onUploadChunk: function(id, chunkData) {},\n _onUploadChunkSuccess: function(id, chunkData) {\n if (!this._preventRetries[id] && this._options.retry.enableAuto) {\n this._autoRetries[id] = 0;\n }\n },\n _onUploadStatusChange: function(id, oldStatus, newStatus) {\n if (newStatus === qq.status.PAUSED) {\n clearTimeout(this._retryTimeouts[id]);\n }\n },\n _onValidateBatchCallbackFailure: function(fileWrappers) {\n var self = this;\n qq.each(fileWrappers, function(idx, fileWrapper) {\n self._fileOrBlobRejected(fileWrapper.id);\n });\n },\n _onValidateBatchCallbackSuccess: function(validationDescriptors, items, params, endpoint, button) {\n var errorMessage, itemLimit = this._currentItemLimit, proposedNetFilesUploadedOrQueued = this._netUploadedOrQueued;\n if (itemLimit === 0 || proposedNetFilesUploadedOrQueued <= itemLimit) {\n if (items.length > 0) {\n this._handleCheckedCallback({\n name: \"onValidate\",\n callback: qq.bind(this._options.callbacks.onValidate, this, validationDescriptors[0], button),\n onSuccess: qq.bind(this._onValidateCallbackSuccess, this, items, 0, params, endpoint),\n onFailure: qq.bind(this._onValidateCallbackFailure, this, items, 0, params, endpoint),\n identifier: \"Item '\" + items[0].file.name + \"', size: \" + items[0].file.size\n });\n } else {\n this._itemError(\"noFilesError\");\n }\n } else {\n this._onValidateBatchCallbackFailure(items);\n errorMessage = this._options.messages.tooManyItemsError.replace(/\\{netItems\\}/g, proposedNetFilesUploadedOrQueued).replace(/\\{itemLimit\\}/g, itemLimit);\n this._batchError(errorMessage);\n }\n },\n _onValidateCallbackFailure: function(items, index, params, endpoint) {\n var nextIndex = index + 1;\n this._fileOrBlobRejected(items[index].id, items[index].file.name);\n this._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);\n },\n _onValidateCallbackSuccess: function(items, index, params, endpoint) {\n var self = this, nextIndex = index + 1, validationDescriptor = this._getValidationDescriptor(items[index]);\n this._validateFileOrBlobData(items[index], validationDescriptor).then(function() {\n self._upload(items[index].id, params, endpoint);\n self._maybeProcessNextItemAfterOnValidateCallback(true, items, nextIndex, params, endpoint);\n }, function() {\n self._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint);\n });\n },\n _prepareItemsForUpload: function(items, params, endpoint) {\n if (items.length === 0) {\n this._itemError(\"noFilesError\");\n return;\n }\n var validationDescriptors = this._getValidationDescriptors(items), buttonId = this._getButtonId(items[0].file), button = this._getButton(buttonId);\n this._handleCheckedCallback({\n name: \"onValidateBatch\",\n callback: qq.bind(this._options.callbacks.onValidateBatch, this, validationDescriptors, button),\n onSuccess: qq.bind(this._onValidateBatchCallbackSuccess, this, validationDescriptors, items, params, endpoint, button),\n onFailure: qq.bind(this._onValidateBatchCallbackFailure, this, items),\n identifier: \"batch validation\"\n });\n },\n _preventLeaveInProgress: function() {\n var self = this;\n this._disposeSupport.attach(window, \"beforeunload\", function(e) {\n if (self.getInProgress()) {\n e = e || window.event;\n e.returnValue = self._options.messages.onLeave;\n return self._options.messages.onLeave;\n }\n });\n },\n _refreshSessionData: function() {\n var self = this, options = this._options.session;\n if (qq.Session && this._options.session.endpoint != null) {\n if (!this._session) {\n qq.extend(options, {\n cors: this._options.cors\n });\n options.log = qq.bind(this.log, this);\n options.addFileRecord = qq.bind(this._addCannedFile, this);\n this._session = new qq.Session(options);\n }\n setTimeout(function() {\n self._session.refresh().then(function(response, xhrOrXdr) {\n self._sessionRequestComplete();\n self._options.callbacks.onSessionRequestComplete(response, true, xhrOrXdr);\n }, function(response, xhrOrXdr) {\n self._options.callbacks.onSessionRequestComplete(response, false, xhrOrXdr);\n });\n }, 0);\n }\n },\n _sessionRequestComplete: function() {},\n _setSize: function(id, newSize) {\n this._uploadData.updateSize(id, newSize);\n this._totalProgress && this._totalProgress.onNewSize(id);\n },\n _shouldAutoRetry: function(id) {\n var uploadData = this._uploadData.retrieve({\n id: id\n });\n if (!this._preventRetries[id] && this._options.retry.enableAuto && uploadData.status !== qq.status.PAUSED) {\n if (this._autoRetries[id] === undefined) {\n this._autoRetries[id] = 0;\n }\n if (this._autoRetries[id] < this._options.retry.maxAutoAttempts) {\n this._autoRetries[id] += 1;\n return true;\n }\n }\n return false;\n },\n _storeForLater: function(id) {\n this._storedIds.push(id);\n },\n _trackButton: function(id) {\n var buttonId;\n if (qq.supportedFeatures.ajaxUploading) {\n buttonId = this._handler.getFile(id).qqButtonId;\n } else {\n buttonId = this._getButtonId(this._handler.getInput(id));\n }\n if (buttonId) {\n this._buttonIdsForFileIds[id] = buttonId;\n }\n },\n _updateFormSupportAndParams: function(formElementOrId) {\n this._options.form.element = formElementOrId;\n this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this));\n if (this._formSupport && this._formSupport.attachedToForm) {\n this._paramsStore.addReadOnly(null, this._formSupport.getFormInputsAsObject);\n this._options.autoUpload = this._formSupport.newAutoUpload;\n if (this._formSupport.newEndpoint) {\n this.setEndpoint(this._formSupport.newEndpoint);\n }\n }\n },\n _upload: function(id, params, endpoint) {\n var name = this.getName(id);\n if (params) {\n this.setParams(params, id);\n }\n if (endpoint) {\n this.setEndpoint(endpoint, id);\n }\n this._handleCheckedCallback({\n name: \"onSubmit\",\n callback: qq.bind(this._options.callbacks.onSubmit, this, id, name),\n onSuccess: qq.bind(this._onSubmitCallbackSuccess, this, id, name),\n onFailure: qq.bind(this._fileOrBlobRejected, this, id, name),\n identifier: id\n });\n },\n _uploadFile: function(id) {\n if (!this._handler.upload(id)) {\n this._uploadData.setStatus(id, qq.status.QUEUED);\n }\n },\n _uploadStoredFiles: function() {\n var idToUpload, stillSubmitting, self = this;\n while (this._storedIds.length) {\n idToUpload = this._storedIds.shift();\n this._uploadFile(idToUpload);\n }\n stillSubmitting = this.getUploads({\n status: qq.status.SUBMITTING\n }).length;\n if (stillSubmitting) {\n qq.log(\"Still waiting for \" + stillSubmitting + \" files to clear submit queue. Will re-parse stored IDs array shortly.\");\n setTimeout(function() {\n self._uploadStoredFiles();\n }, 1e3);\n }\n },\n _validateFileOrBlobData: function(fileWrapper, validationDescriptor) {\n var self = this, file = function() {\n if (fileWrapper.file instanceof qq.BlobProxy) {\n return fileWrapper.file.referenceBlob;\n }\n return fileWrapper.file;\n }(), name = validationDescriptor.name, size = validationDescriptor.size, buttonId = this._getButtonId(fileWrapper.file), validationBase = this._getValidationBase(buttonId), validityChecker = new qq.Promise();\n validityChecker.then(function() {}, function() {\n self._fileOrBlobRejected(fileWrapper.id, name);\n });\n if (qq.isFileOrInput(file) && !this._isAllowedExtension(validationBase.allowedExtensions, name)) {\n this._itemError(\"typeError\", name, file);\n return validityChecker.failure();\n }\n if (!this._options.validation.allowEmpty && size === 0) {\n this._itemError(\"emptyError\", name, file);\n return validityChecker.failure();\n }\n if (size > 0 && validationBase.sizeLimit && size > validationBase.sizeLimit) {\n this._itemError(\"sizeError\", name, file);\n return validityChecker.failure();\n }\n if (size > 0 && size < validationBase.minSizeLimit) {\n this._itemError(\"minSizeError\", name, file);\n return validityChecker.failure();\n }\n if (qq.ImageValidation && qq.supportedFeatures.imagePreviews && qq.isFile(file)) {\n new qq.ImageValidation(file, qq.bind(self.log, self)).validate(validationBase.image).then(validityChecker.success, function(errorCode) {\n self._itemError(errorCode + \"ImageError\", name, file);\n validityChecker.failure();\n });\n } else {\n validityChecker.success();\n }\n return validityChecker;\n },\n _wrapCallbacks: function() {\n var self, safeCallback, prop;\n self = this;\n safeCallback = function(name, callback, args) {\n var errorMsg;\n try {\n return callback.apply(self, args);\n } catch (exception) {\n errorMsg = exception.message || exception.toString();\n self.log(\"Caught exception in '\" + name + \"' callback - \" + errorMsg, \"error\");\n }\n };\n for (prop in this._options.callbacks) {\n (function() {\n var callbackName, callbackFunc;\n callbackName = prop;\n callbackFunc = self._options.callbacks[callbackName];\n self._options.callbacks[callbackName] = function() {\n return safeCallback(callbackName, callbackFunc, arguments);\n };\n })();\n }\n }\n };\n })();\n (function() {\n \"use strict\";\n qq.FineUploaderBasic = function(o) {\n var self = this;\n this._options = {\n debug: false,\n button: null,\n multiple: true,\n maxConnections: 3,\n disableCancelForFormUploads: false,\n autoUpload: true,\n warnBeforeUnload: true,\n request: {\n customHeaders: {},\n endpoint: \"/server/upload\",\n filenameParam: \"qqfilename\",\n forceMultipart: true,\n inputName: \"qqfile\",\n method: \"POST\",\n omitDefaultParams: false,\n params: {},\n paramsInBody: true,\n requireSuccessJson: true,\n totalFileSizeName: \"qqtotalfilesize\",\n uuidName: \"qquuid\"\n },\n validation: {\n allowedExtensions: [],\n sizeLimit: 0,\n minSizeLimit: 0,\n itemLimit: 0,\n stopOnFirstInvalidFile: true,\n acceptFiles: null,\n image: {\n maxHeight: 0,\n maxWidth: 0,\n minHeight: 0,\n minWidth: 0\n },\n allowEmpty: false\n },\n callbacks: {\n onSubmit: function(id, name) {},\n onSubmitted: function(id, name) {},\n onComplete: function(id, name, responseJSON, maybeXhr) {},\n onAllComplete: function(successful, failed) {},\n onCancel: function(id, name) {},\n onUpload: function(id, name) {},\n onUploadChunk: function(id, name, chunkData) {},\n onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr) {},\n onResume: function(id, fileName, chunkData, customResumeData) {},\n onProgress: function(id, name, loaded, total) {},\n onTotalProgress: function(loaded, total) {},\n onError: function(id, name, reason, maybeXhrOrXdr) {},\n onAutoRetry: function(id, name, attemptNumber) {},\n onManualRetry: function(id, name) {},\n onValidateBatch: function(fileOrBlobData) {},\n onValidate: function(fileOrBlobData) {},\n onSubmitDelete: function(id) {},\n onDelete: function(id) {},\n onDeleteComplete: function(id, xhrOrXdr, isError) {},\n onPasteReceived: function(blob) {},\n onStatusChange: function(id, oldStatus, newStatus) {},\n onSessionRequestComplete: function(response, success, xhrOrXdr) {}\n },\n messages: {\n typeError: \"{file} has an invalid extension. Valid extension(s): {extensions}.\",\n sizeError: \"{file} is too large, maximum file size is {sizeLimit}.\",\n minSizeError: \"{file} is too small, minimum file size is {minSizeLimit}.\",\n emptyError: \"{file} is empty, please select files again without it.\",\n noFilesError: \"No files to upload.\",\n tooManyItemsError: \"Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.\",\n maxHeightImageError: \"Image is too tall.\",\n maxWidthImageError: \"Image is too wide.\",\n minHeightImageError: \"Image is not tall enough.\",\n minWidthImageError: \"Image is not wide enough.\",\n retryFailTooManyItems: \"Retry failed - you have reached your file limit.\",\n onLeave: \"The files are being uploaded, if you leave now the upload will be canceled.\",\n unsupportedBrowserIos8Safari: \"Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues.\"\n },\n retry: {\n enableAuto: false,\n maxAutoAttempts: 3,\n autoAttemptDelay: 5,\n preventRetryResponseProperty: \"preventRetry\"\n },\n classes: {\n buttonHover: \"qq-upload-button-hover\",\n buttonFocus: \"qq-upload-button-focus\"\n },\n chunking: {\n enabled: false,\n concurrent: {\n enabled: false\n },\n mandatory: false,\n paramNames: {\n partIndex: \"qqpartindex\",\n partByteOffset: \"qqpartbyteoffset\",\n chunkSize: \"qqchunksize\",\n totalFileSize: \"qqtotalfilesize\",\n totalParts: \"qqtotalparts\"\n },\n partSize: function(id) {\n return 2e6;\n },\n success: {\n endpoint: null,\n headers: function(id) {\n return null;\n },\n jsonPayload: false,\n method: \"POST\",\n params: function(id) {\n return null;\n },\n resetOnStatus: []\n }\n },\n resume: {\n enabled: false,\n recordsExpireIn: 7,\n paramNames: {\n resuming: \"qqresume\"\n },\n customKeys: function(fileId) {\n return [];\n }\n },\n formatFileName: function(fileOrBlobName) {\n return fileOrBlobName;\n },\n text: {\n defaultResponseError: \"Upload failure reason unknown\",\n fileInputTitle: \"file input\",\n sizeSymbols: [ \"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\" ]\n },\n deleteFile: {\n enabled: false,\n method: \"DELETE\",\n endpoint: \"/server/upload\",\n customHeaders: {},\n params: {}\n },\n cors: {\n expected: false,\n sendCredentials: false,\n allowXdr: false\n },\n blobs: {\n defaultName: \"misc_data\"\n },\n paste: {\n targetElement: null,\n defaultName: \"pasted_image\"\n },\n camera: {\n ios: false,\n button: null\n },\n extraButtons: [],\n session: {\n endpoint: null,\n params: {},\n customHeaders: {},\n refreshOnReset: true\n },\n form: {\n element: \"qq-form\",\n autoUpload: false,\n interceptSubmit: true\n },\n scaling: {\n customResizer: null,\n sendOriginal: true,\n orient: true,\n defaultType: null,\n defaultQuality: 80,\n failureText: \"Failed to scale\",\n includeExif: false,\n sizes: []\n },\n workarounds: {\n iosEmptyVideos: true,\n ios8SafariUploads: true,\n ios8BrowserCrash: false\n }\n };\n qq.extend(this._options, o, true);\n this._buttons = [];\n this._extraButtonSpecs = {};\n this._buttonIdsForFileIds = [];\n this._wrapCallbacks();\n this._disposeSupport = new qq.DisposeSupport();\n this._storedIds = [];\n this._autoRetries = [];\n this._retryTimeouts = [];\n this._preventRetries = [];\n this._thumbnailUrls = [];\n this._netUploadedOrQueued = 0;\n this._netUploaded = 0;\n this._uploadData = this._createUploadDataTracker();\n this._initFormSupportAndParams();\n this._customHeadersStore = this._createStore(this._options.request.customHeaders);\n this._deleteFileCustomHeadersStore = this._createStore(this._options.deleteFile.customHeaders);\n this._deleteFileParamsStore = this._createStore(this._options.deleteFile.params);\n this._endpointStore = this._createStore(this._options.request.endpoint);\n this._deleteFileEndpointStore = this._createStore(this._options.deleteFile.endpoint);\n this._handler = this._createUploadHandler();\n this._deleteHandler = qq.DeleteFileAjaxRequester && this._createDeleteHandler();\n if (this._options.button) {\n this._defaultButtonId = this._createUploadButton({\n element: this._options.button,\n title: this._options.text.fileInputTitle\n }).getButtonId();\n }\n this._generateExtraButtonSpecs();\n this._handleCameraAccess();\n if (this._options.paste.targetElement) {\n if (qq.PasteSupport) {\n this._pasteHandler = this._createPasteHandler();\n } else {\n this.log(\"Paste support module not found\", \"error\");\n }\n }\n this._options.warnBeforeUnload && this._preventLeaveInProgress();\n this._imageGenerator = qq.ImageGenerator && new qq.ImageGenerator(qq.bind(this.log, this));\n this._refreshSessionData();\n this._succeededSinceLastAllComplete = [];\n this._failedSinceLastAllComplete = [];\n this._scaler = qq.Scaler && new qq.Scaler(this._options.scaling, qq.bind(this.log, this)) || {};\n if (this._scaler.enabled) {\n this._customNewFileHandler = qq.bind(this._scaler.handleNewFile, this._scaler);\n }\n if (qq.TotalProgress && qq.supportedFeatures.progressBar) {\n this._totalProgress = new qq.TotalProgress(qq.bind(this._onTotalProgress, this), function(id) {\n var entry = self._uploadData.retrieve({\n id: id\n });\n return entry && entry.size || 0;\n });\n }\n this._currentItemLimit = this._options.validation.itemLimit;\n this._customResumeDataStore = this._createStore();\n };\n qq.FineUploaderBasic.prototype = qq.basePublicApi;\n qq.extend(qq.FineUploaderBasic.prototype, qq.basePrivateApi);\n })();\n qq.AjaxRequester = function(o) {\n \"use strict\";\n var log, shouldParamsBeInQueryString, queue = [], requestData = {}, options = {\n acceptHeader: null,\n validMethods: [ \"PATCH\", \"POST\", \"PUT\" ],\n method: \"POST\",\n contentType: \"application/x-www-form-urlencoded\",\n maxConnections: 3,\n customHeaders: {},\n endpointStore: {},\n paramsStore: {},\n mandatedParams: {},\n allowXRequestedWithAndCacheControl: true,\n successfulResponseCodes: {\n DELETE: [ 200, 202, 204 ],\n PATCH: [ 200, 201, 202, 203, 204 ],\n POST: [ 200, 201, 202, 203, 204 ],\n PUT: [ 200, 201, 202, 203, 204 ],\n GET: [ 200 ]\n },\n cors: {\n expected: false,\n sendCredentials: false\n },\n log: function(str, level) {},\n onSend: function(id) {},\n onComplete: function(id, xhrOrXdr, isError) {},\n onProgress: null\n };\n qq.extend(options, o);\n log = options.log;\n if (qq.indexOf(options.validMethods, options.method) < 0) {\n throw new Error(\"'\" + options.method + \"' is not a supported method for this type of request!\");\n }\n function isSimpleMethod() {\n return qq.indexOf([ \"GET\", \"POST\", \"HEAD\" ], options.method) >= 0;\n }\n function containsNonSimpleHeaders(headers) {\n var containsNonSimple = false;\n qq.each(containsNonSimple, function(idx, header) {\n if (qq.indexOf([ \"Accept\", \"Accept-Language\", \"Content-Language\", \"Content-Type\" ], header) < 0) {\n containsNonSimple = true;\n return false;\n }\n });\n return containsNonSimple;\n }\n function isXdr(xhr) {\n return options.cors.expected && xhr.withCredentials === undefined;\n }\n function getCorsAjaxTransport() {\n var xhrOrXdr;\n if (window.XMLHttpRequest || window.ActiveXObject) {\n xhrOrXdr = qq.createXhrInstance();\n if (xhrOrXdr.withCredentials === undefined) {\n xhrOrXdr = new XDomainRequest();\n xhrOrXdr.onload = function() {};\n xhrOrXdr.onerror = function() {};\n xhrOrXdr.ontimeout = function() {};\n xhrOrXdr.onprogress = function() {};\n }\n }\n return xhrOrXdr;\n }\n function getXhrOrXdr(id, suppliedXhr) {\n var xhrOrXdr = requestData[id] && requestData[id].xhr;\n if (!xhrOrXdr) {\n if (suppliedXhr) {\n xhrOrXdr = suppliedXhr;\n } else {\n if (options.cors.expected) {\n xhrOrXdr = getCorsAjaxTransport();\n } else {\n xhrOrXdr = qq.createXhrInstance();\n }\n }\n requestData[id].xhr = xhrOrXdr;\n }\n return xhrOrXdr;\n }\n function dequeue(id) {\n var i = qq.indexOf(queue, id), max = options.maxConnections, nextId;\n delete requestData[id];\n queue.splice(i, 1);\n if (queue.length >= max && i < max) {\n nextId = queue[max - 1];\n sendRequest(nextId);\n }\n }\n function onComplete(id, xdrError) {\n var xhr = getXhrOrXdr(id), method = options.method, isError = xdrError === true;\n dequeue(id);\n if (isError) {\n log(method + \" request for \" + id + \" has failed\", \"error\");\n } else if (!isXdr(xhr) && !isResponseSuccessful(xhr.status)) {\n isError = true;\n log(method + \" request for \" + id + \" has failed - response code \" + xhr.status, \"error\");\n }\n options.onComplete(id, xhr, isError);\n }\n function getParams(id) {\n var onDemandParams = requestData[id].additionalParams, mandatedParams = options.mandatedParams, params;\n if (options.paramsStore.get) {\n params = options.paramsStore.get(id);\n }\n if (onDemandParams) {\n qq.each(onDemandParams, function(name, val) {\n params = params || {};\n params[name] = val;\n });\n }\n if (mandatedParams) {\n qq.each(mandatedParams, function(name, val) {\n params = params || {};\n params[name] = val;\n });\n }\n return params;\n }\n function sendRequest(id, optXhr) {\n var xhr = getXhrOrXdr(id, optXhr), method = options.method, params = getParams(id), payload = requestData[id].payload, url;\n options.onSend(id);\n url = createUrl(id, params, requestData[id].additionalQueryParams);\n if (isXdr(xhr)) {\n xhr.onload = getXdrLoadHandler(id);\n xhr.onerror = getXdrErrorHandler(id);\n } else {\n xhr.onreadystatechange = getXhrReadyStateChangeHandler(id);\n }\n registerForUploadProgress(id);\n xhr.open(method, url, true);\n if (options.cors.expected && options.cors.sendCredentials && !isXdr(xhr)) {\n xhr.withCredentials = true;\n }\n setHeaders(id);\n log(\"Sending \" + method + \" request for \" + id);\n if (payload) {\n xhr.send(payload);\n } else if (shouldParamsBeInQueryString || !params) {\n xhr.send();\n } else if (params && options.contentType && options.contentType.toLowerCase().indexOf(\"application/x-www-form-urlencoded\") >= 0) {\n xhr.send(qq.obj2url(params, \"\"));\n } else if (params && options.contentType && options.contentType.toLowerCase().indexOf(\"application/json\") >= 0) {\n xhr.send(JSON.stringify(params));\n } else {\n xhr.send(params);\n }\n return xhr;\n }\n function createUrl(id, params, additionalQueryParams) {\n var endpoint = options.endpointStore.get(id), addToPath = requestData[id].addToPath;\n if (addToPath != undefined) {\n endpoint += \"/\" + addToPath;\n }\n if (shouldParamsBeInQueryString && params) {\n endpoint = qq.obj2url(params, endpoint);\n }\n if (additionalQueryParams) {\n endpoint = qq.obj2url(additionalQueryParams, endpoint);\n }\n return endpoint;\n }\n function getXhrReadyStateChangeHandler(id) {\n return function() {\n if (getXhrOrXdr(id).readyState === 4) {\n onComplete(id);\n }\n };\n }\n function registerForUploadProgress(id) {\n var onProgress = options.onProgress;\n if (onProgress) {\n getXhrOrXdr(id).upload.onprogress = function(e) {\n if (e.lengthComputable) {\n onProgress(id, e.loaded, e.total);\n }\n };\n }\n }\n function getXdrLoadHandler(id) {\n return function() {\n onComplete(id);\n };\n }\n function getXdrErrorHandler(id) {\n return function() {\n onComplete(id, true);\n };\n }\n function setHeaders(id) {\n var xhr = getXhrOrXdr(id), customHeaders = options.customHeaders, onDemandHeaders = requestData[id].additionalHeaders || {}, method = options.method, allHeaders = {};\n if (!isXdr(xhr)) {\n options.acceptHeader && xhr.setRequestHeader(\"Accept\", options.acceptHeader);\n if (options.allowXRequestedWithAndCacheControl) {\n if (!options.cors.expected || (!isSimpleMethod() || containsNonSimpleHeaders(customHeaders))) {\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n }\n }\n if (options.contentType && (method === \"POST\" || method === \"PUT\")) {\n xhr.setRequestHeader(\"Content-Type\", options.contentType);\n }\n qq.extend(allHeaders, qq.isFunction(customHeaders) ? customHeaders(id) : customHeaders);\n qq.extend(allHeaders, onDemandHeaders);\n qq.each(allHeaders, function(name, val) {\n xhr.setRequestHeader(name, val);\n });\n }\n }\n function isResponseSuccessful(responseCode) {\n return qq.indexOf(options.successfulResponseCodes[options.method], responseCode) >= 0;\n }\n function prepareToSend(id, optXhr, addToPath, additionalParams, additionalQueryParams, additionalHeaders, payload) {\n requestData[id] = {\n addToPath: addToPath,\n additionalParams: additionalParams,\n additionalQueryParams: additionalQueryParams,\n additionalHeaders: additionalHeaders,\n payload: payload\n };\n var len = queue.push(id);\n if (len <= options.maxConnections) {\n return sendRequest(id, optXhr);\n }\n }\n shouldParamsBeInQueryString = options.method === \"GET\" || options.method === \"DELETE\";\n qq.extend(this, {\n initTransport: function(id) {\n var path, params, headers, payload, cacheBuster, additionalQueryParams;\n return {\n withPath: function(appendToPath) {\n path = appendToPath;\n return this;\n },\n withParams: function(additionalParams) {\n params = additionalParams;\n return this;\n },\n withQueryParams: function(_additionalQueryParams_) {\n additionalQueryParams = _additionalQueryParams_;\n return this;\n },\n withHeaders: function(additionalHeaders) {\n headers = additionalHeaders;\n return this;\n },\n withPayload: function(thePayload) {\n payload = thePayload;\n return this;\n },\n withCacheBuster: function() {\n cacheBuster = true;\n return this;\n },\n send: function(optXhr) {\n if (cacheBuster && qq.indexOf([ \"GET\", \"DELETE\" ], options.method) >= 0) {\n params.qqtimestamp = new Date().getTime();\n }\n return prepareToSend(id, optXhr, path, params, additionalQueryParams, headers, payload);\n }\n };\n },\n canceled: function(id) {\n dequeue(id);\n }\n });\n };\n qq.UploadHandler = function(spec) {\n \"use strict\";\n var proxy = spec.proxy, fileState = {}, onCancel = proxy.onCancel, getName = proxy.getName;\n qq.extend(this, {\n add: function(id, fileItem) {\n fileState[id] = fileItem;\n fileState[id].temp = {};\n },\n cancel: function(id) {\n var self = this, cancelFinalizationEffort = new qq.Promise(), onCancelRetVal = onCancel(id, getName(id), cancelFinalizationEffort);\n onCancelRetVal.then(function() {\n if (self.isValid(id)) {\n fileState[id].canceled = true;\n self.expunge(id);\n }\n cancelFinalizationEffort.success();\n });\n },\n expunge: function(id) {\n delete fileState[id];\n },\n getThirdPartyFileId: function(id) {\n return fileState[id].key;\n },\n isValid: function(id) {\n return fileState[id] !== undefined;\n },\n reset: function() {\n fileState = {};\n },\n _getFileState: function(id) {\n return fileState[id];\n },\n _setThirdPartyFileId: function(id, thirdPartyFileId) {\n fileState[id].key = thirdPartyFileId;\n },\n _wasCanceled: function(id) {\n return !!fileState[id].canceled;\n }\n });\n };\n qq.UploadHandlerController = function(o, namespace) {\n \"use strict\";\n var controller = this, chunkingPossible = false, concurrentChunkingPossible = false, chunking, preventRetryResponse, log, handler, options = {\n paramsStore: {},\n maxConnections: 3,\n chunking: {\n enabled: false,\n multiple: {\n enabled: false\n }\n },\n log: function(str, level) {},\n onProgress: function(id, fileName, loaded, total) {},\n onComplete: function(id, fileName, response, xhr) {},\n onCancel: function(id, fileName) {},\n onUploadPrep: function(id) {},\n onUpload: function(id, fileName) {},\n onUploadChunk: function(id, fileName, chunkData) {},\n onUploadChunkSuccess: function(id, chunkData, response, xhr) {},\n onAutoRetry: function(id, fileName, response, xhr) {},\n onResume: function(id, fileName, chunkData, customResumeData) {},\n onUuidChanged: function(id, newUuid) {},\n getName: function(id) {},\n setSize: function(id, newSize) {},\n isQueued: function(id) {},\n getIdsInProxyGroup: function(id) {},\n getIdsInBatch: function(id) {},\n isInProgress: function(id) {}\n }, chunked = {\n done: function(id, chunkIdx, response, xhr) {\n var chunkData = handler._getChunkData(id, chunkIdx);\n handler._getFileState(id).attemptingResume = false;\n delete handler._getFileState(id).temp.chunkProgress[chunkIdx];\n handler._getFileState(id).loaded += chunkData.size;\n options.onUploadChunkSuccess(id, handler._getChunkDataForCallback(chunkData), response, xhr);\n },\n finalize: function(id) {\n var size = options.getSize(id), name = options.getName(id);\n log(\"All chunks have been uploaded for \" + id + \" - finalizing....\");\n handler.finalizeChunks(id).then(function(response, xhr) {\n log(\"Finalize successful for \" + id);\n var normaizedResponse = upload.normalizeResponse(response, true);\n options.onProgress(id, name, size, size);\n handler._maybeDeletePersistedChunkData(id);\n upload.cleanup(id, normaizedResponse, xhr);\n }, function(response, xhr) {\n var normalizedResponse = upload.normalizeResponse(response, false);\n log(\"Problem finalizing chunks for file ID \" + id + \" - \" + normalizedResponse.error, \"error\");\n if (normalizedResponse.reset || xhr && options.chunking.success.resetOnStatus.indexOf(xhr.status) >= 0) {\n chunked.reset(id);\n }\n if (!options.onAutoRetry(id, name, normalizedResponse, xhr)) {\n upload.cleanup(id, normalizedResponse, xhr);\n }\n });\n },\n handleFailure: function(chunkIdx, id, response, xhr) {\n var name = options.getName(id);\n log(\"Chunked upload request failed for \" + id + \", chunk \" + chunkIdx);\n handler.clearCachedChunk(id, chunkIdx);\n var responseToReport = upload.normalizeResponse(response, false), inProgressIdx;\n if (responseToReport.reset) {\n chunked.reset(id);\n } else {\n var inProgressChunksArray = handler._getFileState(id).chunking.inProgress;\n inProgressIdx = inProgressChunksArray ? qq.indexOf(inProgressChunksArray, chunkIdx) : -1;\n if (inProgressIdx >= 0) {\n handler._getFileState(id).chunking.inProgress.splice(inProgressIdx, 1);\n handler._getFileState(id).chunking.remaining.unshift(chunkIdx);\n }\n }\n if (!handler._getFileState(id).temp.ignoreFailure) {\n if (concurrentChunkingPossible) {\n handler._getFileState(id).temp.ignoreFailure = true;\n log(qq.format(\"Going to attempt to abort these chunks: {}. These are currently in-progress: {}.\", JSON.stringify(Object.keys(handler._getXhrs(id))), JSON.stringify(handler._getFileState(id).chunking.inProgress)));\n qq.each(handler._getXhrs(id), function(ckid, ckXhr) {\n log(qq.format(\"Attempting to abort file {}.{}. XHR readyState {}. \", id, ckid, ckXhr.readyState));\n ckXhr.abort();\n ckXhr._cancelled = true;\n });\n handler.moveInProgressToRemaining(id);\n connectionManager.free(id, true);\n }\n if (!options.onAutoRetry(id, name, responseToReport, xhr)) {\n upload.cleanup(id, responseToReport, xhr);\n }\n }\n },\n hasMoreParts: function(id) {\n return !!handler._getFileState(id).chunking.remaining.length;\n },\n nextPart: function(id) {\n var nextIdx = handler._getFileState(id).chunking.remaining.shift();\n if (nextIdx >= handler._getTotalChunks(id)) {\n nextIdx = null;\n }\n return nextIdx;\n },\n reset: function(id) {\n log(\"Server or callback has ordered chunking effort to be restarted on next attempt for item ID \" + id, \"error\");\n handler._maybeDeletePersistedChunkData(id);\n handler.reevaluateChunking(id);\n handler._getFileState(id).loaded = 0;\n handler._getFileState(id).attemptingResume = false;\n },\n sendNext: function(id) {\n var size = options.getSize(id), name = options.getName(id), chunkIdx = chunked.nextPart(id), chunkData = handler._getChunkData(id, chunkIdx), fileState = handler._getFileState(id), resuming = fileState.attemptingResume, inProgressChunks = fileState.chunking.inProgress || [];\n if (fileState.loaded == null) {\n fileState.loaded = 0;\n }\n if (resuming && options.onResume(id, name, chunkData, fileState.customResumeData) === false) {\n chunked.reset(id);\n chunkIdx = chunked.nextPart(id);\n chunkData = handler._getChunkData(id, chunkIdx);\n resuming = false;\n }\n if (chunkIdx == null && inProgressChunks.length === 0) {\n chunked.finalize(id);\n } else {\n inProgressChunks.push(chunkIdx);\n handler._getFileState(id).chunking.inProgress = inProgressChunks;\n if (concurrentChunkingPossible) {\n connectionManager.open(id, chunkIdx);\n }\n if (concurrentChunkingPossible && connectionManager.available() && handler._getFileState(id).chunking.remaining.length) {\n chunked.sendNext(id);\n }\n if (chunkData.blob.size === 0) {\n log(qq.format(\"Chunk {} for file {} will not be uploaded, zero sized chunk.\", chunkIdx, id), \"error\");\n chunked.handleFailure(chunkIdx, id, \"File is no longer available\", null);\n }\n var onUploadChunkPromise = options.onUploadChunk(id, name, handler._getChunkDataForCallback(chunkData));\n onUploadChunkPromise.then(function(requestOverrides) {\n if (!options.isInProgress(id)) {\n log(qq.format(\"Not sending chunked upload request for item {}.{} - no longer in progress.\", id, chunkIdx));\n } else {\n log(qq.format(\"Sending chunked upload request for item {}.{}, bytes {}-{} of {}.\", id, chunkIdx, chunkData.start + 1, chunkData.end, size));\n var uploadChunkData = {\n chunkIdx: chunkIdx,\n id: id,\n overrides: requestOverrides,\n resuming: resuming\n };\n handler.uploadChunk(uploadChunkData).then(function success(response, xhr) {\n log(\"Chunked upload request succeeded for \" + id + \", chunk \" + chunkIdx);\n handler.clearCachedChunk(id, chunkIdx);\n var inProgressChunks = handler._getFileState(id).chunking.inProgress || [], responseToReport = upload.normalizeResponse(response, true), inProgressChunkIdx = qq.indexOf(inProgressChunks, chunkIdx);\n log(qq.format(\"Chunk {} for file {} uploaded successfully.\", chunkIdx, id));\n chunked.done(id, chunkIdx, responseToReport, xhr);\n if (inProgressChunkIdx >= 0) {\n inProgressChunks.splice(inProgressChunkIdx, 1);\n }\n handler._maybePersistChunkedState(id);\n if (!chunked.hasMoreParts(id) && inProgressChunks.length === 0) {\n chunked.finalize(id);\n } else if (chunked.hasMoreParts(id)) {\n chunked.sendNext(id);\n } else {\n log(qq.format(\"File ID {} has no more chunks to send and these chunk indexes are still marked as in-progress: {}\", id, JSON.stringify(inProgressChunks)));\n }\n }, function failure(response, xhr) {\n chunked.handleFailure(chunkIdx, id, response, xhr);\n }).done(function() {\n handler.clearXhr(id, chunkIdx);\n });\n }\n }, function(error) {\n chunked.handleFailure(chunkIdx, id, error, null);\n });\n }\n }\n }, connectionManager = {\n _open: [],\n _openChunks: {},\n _waiting: [],\n available: function() {\n var max = options.maxConnections, openChunkEntriesCount = 0, openChunksCount = 0;\n qq.each(connectionManager._openChunks, function(fileId, openChunkIndexes) {\n openChunkEntriesCount++;\n openChunksCount += openChunkIndexes.length;\n });\n return max - (connectionManager._open.length - openChunkEntriesCount + openChunksCount);\n },\n free: function(id, dontAllowNext) {\n var allowNext = !dontAllowNext, waitingIndex = qq.indexOf(connectionManager._waiting, id), connectionsIndex = qq.indexOf(connectionManager._open, id), nextId;\n delete connectionManager._openChunks[id];\n if (upload.getProxyOrBlob(id) instanceof qq.BlobProxy) {\n log(\"Generated blob upload has ended for \" + id + \", disposing generated blob.\");\n delete handler._getFileState(id).file;\n }\n if (waitingIndex >= 0) {\n connectionManager._waiting.splice(waitingIndex, 1);\n } else if (allowNext && connectionsIndex >= 0) {\n connectionManager._open.splice(connectionsIndex, 1);\n nextId = connectionManager._waiting.shift();\n if (nextId >= 0) {\n connectionManager._open.push(nextId);\n upload.start(nextId);\n }\n }\n },\n getWaitingOrConnected: function() {\n var waitingOrConnected = [];\n qq.each(connectionManager._openChunks, function(fileId, chunks) {\n if (chunks && chunks.length) {\n waitingOrConnected.push(parseInt(fileId));\n }\n });\n qq.each(connectionManager._open, function(idx, fileId) {\n if (!connectionManager._openChunks[fileId]) {\n waitingOrConnected.push(parseInt(fileId));\n }\n });\n waitingOrConnected = waitingOrConnected.concat(connectionManager._waiting);\n return waitingOrConnected;\n },\n isUsingConnection: function(id) {\n return qq.indexOf(connectionManager._open, id) >= 0;\n },\n open: function(id, chunkIdx) {\n if (chunkIdx == null) {\n connectionManager._waiting.push(id);\n }\n if (connectionManager.available()) {\n if (chunkIdx == null) {\n connectionManager._waiting.pop();\n connectionManager._open.push(id);\n } else {\n (function() {\n var openChunksEntry = connectionManager._openChunks[id] || [];\n openChunksEntry.push(chunkIdx);\n connectionManager._openChunks[id] = openChunksEntry;\n })();\n }\n return true;\n }\n return false;\n },\n reset: function() {\n connectionManager._waiting = [];\n connectionManager._open = [];\n }\n }, simple = {\n send: function(id, name) {\n var fileState = handler._getFileState(id);\n if (!fileState) {\n log(\"Ignoring send request as this upload may have been cancelled, File ID \" + id, \"warn\");\n return;\n }\n fileState.loaded = 0;\n log(\"Sending simple upload request for \" + id);\n handler.uploadFile(id).then(function(response, optXhr) {\n log(\"Simple upload request succeeded for \" + id);\n var responseToReport = upload.normalizeResponse(response, true), size = options.getSize(id);\n options.onProgress(id, name, size, size);\n upload.maybeNewUuid(id, responseToReport);\n upload.cleanup(id, responseToReport, optXhr);\n }, function(response, optXhr) {\n log(\"Simple upload request failed for \" + id);\n var responseToReport = upload.normalizeResponse(response, false);\n if (!options.onAutoRetry(id, name, responseToReport, optXhr)) {\n upload.cleanup(id, responseToReport, optXhr);\n }\n });\n }\n }, upload = {\n cancel: function(id) {\n log(\"Cancelling \" + id);\n options.paramsStore.remove(id);\n connectionManager.free(id);\n },\n cleanup: function(id, response, optXhr) {\n var name = options.getName(id);\n options.onComplete(id, name, response, optXhr);\n if (handler._getFileState(id)) {\n handler._clearXhrs && handler._clearXhrs(id);\n }\n connectionManager.free(id);\n },\n getProxyOrBlob: function(id) {\n return handler.getProxy && handler.getProxy(id) || handler.getFile && handler.getFile(id);\n },\n initHandler: function() {\n var handlerType = namespace ? qq[namespace] : qq.traditional, handlerModuleSubtype = qq.supportedFeatures.ajaxUploading ? \"Xhr\" : \"Form\";\n handler = new handlerType[handlerModuleSubtype + \"UploadHandler\"](options, {\n getCustomResumeData: options.getCustomResumeData,\n getDataByUuid: options.getDataByUuid,\n getName: options.getName,\n getSize: options.getSize,\n getUuid: options.getUuid,\n log: log,\n onCancel: options.onCancel,\n onProgress: options.onProgress,\n onUuidChanged: options.onUuidChanged,\n onFinalizing: function(id) {\n options.setStatus(id, qq.status.UPLOAD_FINALIZING);\n }\n });\n if (handler._removeExpiredChunkingRecords) {\n handler._removeExpiredChunkingRecords();\n }\n },\n isDeferredEligibleForUpload: function(id) {\n return options.isQueued(id);\n },\n maybeDefer: function(id, blob) {\n if (blob && !handler.getFile(id) && blob instanceof qq.BlobProxy) {\n options.onUploadPrep(id);\n log(\"Attempting to generate a blob on-demand for \" + id);\n blob.create().then(function(generatedBlob) {\n log(\"Generated an on-demand blob for \" + id);\n handler.updateBlob(id, generatedBlob);\n options.setSize(id, generatedBlob.size);\n handler.reevaluateChunking(id);\n upload.maybeSendDeferredFiles(id);\n }, function(errorMessage) {\n var errorResponse = {};\n if (errorMessage) {\n errorResponse.error = errorMessage;\n }\n log(qq.format(\"Failed to generate blob for ID {}. Error message: {}.\", id, errorMessage), \"error\");\n options.onComplete(id, options.getName(id), qq.extend(errorResponse, preventRetryResponse), null);\n upload.maybeSendDeferredFiles(id);\n connectionManager.free(id);\n });\n } else {\n return upload.maybeSendDeferredFiles(id);\n }\n return false;\n },\n maybeSendDeferredFiles: function(id) {\n var idsInGroup = options.getIdsInProxyGroup(id), uploadedThisId = false;\n if (idsInGroup && idsInGroup.length) {\n log(\"Maybe ready to upload proxy group file \" + id);\n qq.each(idsInGroup, function(idx, idInGroup) {\n if (upload.isDeferredEligibleForUpload(idInGroup) && !!handler.getFile(idInGroup)) {\n uploadedThisId = idInGroup === id;\n upload.now(idInGroup);\n } else if (upload.isDeferredEligibleForUpload(idInGroup)) {\n return false;\n }\n });\n } else {\n uploadedThisId = true;\n upload.now(id);\n }\n return uploadedThisId;\n },\n maybeNewUuid: function(id, response) {\n if (response.newUuid !== undefined) {\n options.onUuidChanged(id, response.newUuid);\n }\n },\n normalizeResponse: function(originalResponse, successful) {\n var response = originalResponse;\n if (!qq.isObject(originalResponse)) {\n response = {};\n if (qq.isString(originalResponse) && !successful) {\n response.error = originalResponse;\n }\n }\n response.success = successful;\n return response;\n },\n now: function(id) {\n var name = options.getName(id);\n if (!controller.isValid(id)) {\n throw new qq.Error(id + \" is not a valid file ID to upload!\");\n }\n options.onUpload(id, name).then(function(response) {\n if (response && response.pause) {\n options.setStatus(id, qq.status.PAUSED);\n handler.pause(id);\n connectionManager.free(id);\n } else {\n if (chunkingPossible && handler._shouldChunkThisFile(id)) {\n chunked.sendNext(id);\n } else {\n simple.send(id, name);\n }\n }\n }, function(error) {\n error = error || {};\n log(id + \" upload start aborted due to rejected onUpload Promise - details: \" + error, \"error\");\n if (!options.onAutoRetry(id, name, error.responseJSON || {})) {\n var response = upload.normalizeResponse(error.responseJSON, false);\n upload.cleanup(id, response);\n }\n });\n },\n start: function(id) {\n var blobToUpload = upload.getProxyOrBlob(id);\n if (blobToUpload) {\n return upload.maybeDefer(id, blobToUpload);\n } else {\n upload.now(id);\n return true;\n }\n }\n };\n qq.extend(this, {\n add: function(id, file) {\n handler.add.apply(this, arguments);\n },\n upload: function(id) {\n if (connectionManager.open(id)) {\n return upload.start(id);\n }\n return false;\n },\n retry: function(id) {\n if (concurrentChunkingPossible) {\n handler._getFileState(id).temp.ignoreFailure = false;\n }\n if (connectionManager.isUsingConnection(id)) {\n return upload.start(id);\n } else {\n return controller.upload(id);\n }\n },\n cancel: function(id) {\n var cancelRetVal = handler.cancel(id);\n if (qq.isGenericPromise(cancelRetVal)) {\n cancelRetVal.then(function() {\n upload.cancel(id);\n });\n } else if (cancelRetVal !== false) {\n upload.cancel(id);\n }\n },\n cancelAll: function() {\n var waitingOrConnected = connectionManager.getWaitingOrConnected(), i;\n if (waitingOrConnected.length) {\n for (i = waitingOrConnected.length - 1; i >= 0; i--) {\n controller.cancel(waitingOrConnected[i]);\n }\n }\n connectionManager.reset();\n },\n getFile: function(id) {\n if (handler.getProxy && handler.getProxy(id)) {\n return handler.getProxy(id).referenceBlob;\n }\n return handler.getFile && handler.getFile(id);\n },\n isProxied: function(id) {\n return !!(handler.getProxy && handler.getProxy(id));\n },\n getInput: function(id) {\n if (handler.getInput) {\n return handler.getInput(id);\n }\n },\n reset: function() {\n log(\"Resetting upload handler\");\n controller.cancelAll();\n connectionManager.reset();\n handler.reset();\n },\n expunge: function(id) {\n if (controller.isValid(id)) {\n return handler.expunge(id);\n }\n },\n isValid: function(id) {\n return handler.isValid(id);\n },\n hasResumeRecord: function(id) {\n var key = handler.isValid(id) && handler._getLocalStorageId && handler._getLocalStorageId(id);\n if (key) {\n return !!localStorage.getItem(key);\n }\n return false;\n },\n getResumableFilesData: function() {\n if (handler.getResumableFilesData) {\n return handler.getResumableFilesData();\n }\n return [];\n },\n getThirdPartyFileId: function(id) {\n if (controller.isValid(id)) {\n return handler.getThirdPartyFileId(id);\n }\n },\n pause: function(id) {\n if (controller.isResumable(id) && handler.pause && controller.isValid(id) && handler.pause(id)) {\n connectionManager.free(id);\n handler.moveInProgressToRemaining(id);\n return true;\n }\n return false;\n },\n isAttemptingResume: function(id) {\n return !!handler.isAttemptingResume && handler.isAttemptingResume(id);\n },\n isResumable: function(id) {\n return !!handler.isResumable && handler.isResumable(id);\n }\n });\n qq.extend(options, o);\n log = options.log;\n chunkingPossible = options.chunking.enabled && qq.supportedFeatures.chunking;\n concurrentChunkingPossible = chunkingPossible && options.chunking.concurrent.enabled;\n preventRetryResponse = function() {\n var response = {};\n response[options.preventRetryParam] = true;\n return response;\n }();\n upload.initHandler();\n };\n qq.WindowReceiveMessage = function(o) {\n \"use strict\";\n var options = {\n log: function(message, level) {}\n }, callbackWrapperDetachers = {};\n qq.extend(options, o);\n qq.extend(this, {\n receiveMessage: function(id, callback) {\n var onMessageCallbackWrapper = function(event) {\n callback(event.data);\n };\n if (window.postMessage) {\n callbackWrapperDetachers[id] = qq(window).attach(\"message\", onMessageCallbackWrapper);\n } else {\n log(\"iframe message passing not supported in this browser!\", \"error\");\n }\n },\n stopReceivingMessages: function(id) {\n if (window.postMessage) {\n var detacher = callbackWrapperDetachers[id];\n if (detacher) {\n detacher();\n }\n }\n }\n });\n };\n qq.FormUploadHandler = function(spec) {\n \"use strict\";\n var options = spec.options, handler = this, proxy = spec.proxy, formHandlerInstanceId = qq.getUniqueId(), onloadCallbacks = {}, detachLoadEvents = {}, postMessageCallbackTimers = {}, isCors = options.isCors, inputName = options.inputName, getUuid = proxy.getUuid, log = proxy.log, corsMessageReceiver = new qq.WindowReceiveMessage({\n log: log\n });\n function expungeFile(id) {\n delete detachLoadEvents[id];\n if (isCors) {\n clearTimeout(postMessageCallbackTimers[id]);\n delete postMessageCallbackTimers[id];\n corsMessageReceiver.stopReceivingMessages(id);\n }\n var iframe = document.getElementById(handler._getIframeName(id));\n if (iframe) {\n iframe.setAttribute(\"src\", \"javascript:false;\");\n qq(iframe).remove();\n }\n }\n function getFileIdForIframeName(iframeName) {\n return iframeName.split(\"_\")[0];\n }\n function initIframeForUpload(name) {\n var iframe = qq.toElement(\"<iframe src='javascript:false;' name='\" + name + \"' />\");\n iframe.setAttribute(\"id\", name);\n iframe.style.display = \"none\";\n document.body.appendChild(iframe);\n return iframe;\n }\n function registerPostMessageCallback(iframe, callback) {\n var iframeName = iframe.id, fileId = getFileIdForIframeName(iframeName), uuid = getUuid(fileId);\n onloadCallbacks[uuid] = callback;\n detachLoadEvents[fileId] = qq(iframe).attach(\"load\", function() {\n if (handler.getInput(fileId)) {\n log(\"Received iframe load event for CORS upload request (iframe name \" + iframeName + \")\");\n postMessageCallbackTimers[iframeName] = setTimeout(function() {\n var errorMessage = \"No valid message received from loaded iframe for iframe name \" + iframeName;\n log(errorMessage, \"error\");\n callback({\n error: errorMessage\n });\n }, 1e3);\n }\n });\n corsMessageReceiver.receiveMessage(iframeName, function(message) {\n log(\"Received the following window message: '\" + message + \"'\");\n var fileId = getFileIdForIframeName(iframeName), response = handler._parseJsonResponse(message), uuid = response.uuid, onloadCallback;\n if (uuid && onloadCallbacks[uuid]) {\n log(\"Handling response for iframe name \" + iframeName);\n clearTimeout(postMessageCallbackTimers[iframeName]);\n delete postMessageCallbackTimers[iframeName];\n handler._detachLoadEvent(iframeName);\n onloadCallback = onloadCallbacks[uuid];\n delete onloadCallbacks[uuid];\n corsMessageReceiver.stopReceivingMessages(iframeName);\n onloadCallback(response);\n } else if (!uuid) {\n log(\"'\" + message + \"' does not contain a UUID - ignoring.\");\n }\n });\n }\n qq.extend(this, new qq.UploadHandler(spec));\n qq.override(this, function(super_) {\n return {\n add: function(id, fileInput) {\n super_.add(id, {\n input: fileInput\n });\n fileInput.setAttribute(\"name\", inputName);\n if (fileInput.parentNode) {\n qq(fileInput).remove();\n }\n },\n expunge: function(id) {\n expungeFile(id);\n super_.expunge(id);\n },\n isValid: function(id) {\n return super_.isValid(id) && handler._getFileState(id).input !== undefined;\n }\n };\n });\n qq.extend(this, {\n getInput: function(id) {\n return handler._getFileState(id).input;\n },\n _attachLoadEvent: function(iframe, callback) {\n var responseDescriptor;\n if (isCors) {\n registerPostMessageCallback(iframe, callback);\n } else {\n detachLoadEvents[iframe.id] = qq(iframe).attach(\"load\", function() {\n log(\"Received response for \" + iframe.id);\n if (!iframe.parentNode) {\n return;\n }\n try {\n if (iframe.contentDocument && iframe.contentDocument.body && iframe.contentDocument.body.innerHTML == \"false\") {\n return;\n }\n } catch (error) {\n log(\"Error when attempting to access iframe during handling of upload response (\" + error.message + \")\", \"error\");\n responseDescriptor = {\n success: false\n };\n }\n callback(responseDescriptor);\n });\n }\n },\n _createIframe: function(id) {\n var iframeName = handler._getIframeName(id);\n return initIframeForUpload(iframeName);\n },\n _detachLoadEvent: function(id) {\n if (detachLoadEvents[id] !== undefined) {\n detachLoadEvents[id]();\n delete detachLoadEvents[id];\n }\n },\n _getIframeName: function(fileId) {\n return fileId + \"_\" + formHandlerInstanceId;\n },\n _initFormForUpload: function(spec) {\n var method = spec.method, endpoint = spec.endpoint, params = spec.params, paramsInBody = spec.paramsInBody, targetName = spec.targetName, form = qq.toElement(\"<form method='\" + method + \"' enctype='multipart/form-data'></form>\"), url = endpoint;\n if (paramsInBody) {\n qq.obj2Inputs(params, form);\n } else {\n url = qq.obj2url(params, endpoint);\n }\n form.setAttribute(\"action\", url);\n form.setAttribute(\"target\", targetName);\n form.style.display = \"none\";\n document.body.appendChild(form);\n return form;\n },\n _parseJsonResponse: function(innerHtmlOrMessage) {\n var response = {};\n try {\n response = qq.parseJson(innerHtmlOrMessage);\n } catch (error) {\n log(\"Error when attempting to parse iframe upload response (\" + error.message + \")\", \"error\");\n }\n return response;\n }\n });\n };\n qq.XhrUploadHandler = function(spec) {\n \"use strict\";\n var handler = this, namespace = spec.options.namespace, proxy = spec.proxy, chunking = spec.options.chunking, getChunkSize = function(id) {\n var fileState = handler._getFileState(id);\n if (fileState.chunkSize) {\n return fileState.chunkSize;\n } else {\n var chunkSize = chunking.partSize;\n if (qq.isFunction(chunkSize)) {\n chunkSize = chunkSize(id, getSize(id));\n }\n fileState.chunkSize = chunkSize;\n return chunkSize;\n }\n }, resume = spec.options.resume, chunkFiles = chunking && spec.options.chunking.enabled && qq.supportedFeatures.chunking, resumeEnabled = resume && spec.options.resume.enabled && chunkFiles && qq.supportedFeatures.resume, getName = proxy.getName, getSize = proxy.getSize, getUuid = proxy.getUuid, getEndpoint = proxy.getEndpoint, getDataByUuid = proxy.getDataByUuid, onUuidChanged = proxy.onUuidChanged, onProgress = proxy.onProgress, log = proxy.log, getCustomResumeData = proxy.getCustomResumeData;\n function abort(id) {\n qq.each(handler._getXhrs(id), function(xhrId, xhr) {\n var ajaxRequester = handler._getAjaxRequester(id, xhrId);\n xhr.onreadystatechange = null;\n xhr.upload.onprogress = null;\n xhr.abort();\n ajaxRequester && ajaxRequester.canceled && ajaxRequester.canceled(id);\n });\n }\n qq.extend(this, new qq.UploadHandler(spec));\n qq.override(this, function(super_) {\n return {\n add: function(id, blobOrProxy) {\n if (qq.isFile(blobOrProxy) || qq.isBlob(blobOrProxy)) {\n super_.add(id, {\n file: blobOrProxy\n });\n } else if (blobOrProxy instanceof qq.BlobProxy) {\n super_.add(id, {\n proxy: blobOrProxy\n });\n } else {\n throw new Error(\"Passed obj is not a File, Blob, or proxy\");\n }\n handler._initTempState(id);\n resumeEnabled && handler._maybePrepareForResume(id);\n },\n expunge: function(id) {\n abort(id);\n handler._maybeDeletePersistedChunkData(id);\n handler._clearXhrs(id);\n super_.expunge(id);\n }\n };\n });\n qq.extend(this, {\n clearCachedChunk: function(id, chunkIdx) {\n var fileState = handler._getFileState(id);\n if (fileState) {\n delete fileState.temp.cachedChunks[chunkIdx];\n }\n },\n clearXhr: function(id, chunkIdx) {\n var tempState = handler._getFileState(id).temp;\n if (tempState.xhrs) {\n delete tempState.xhrs[chunkIdx];\n }\n if (tempState.ajaxRequesters) {\n delete tempState.ajaxRequesters[chunkIdx];\n }\n },\n finalizeChunks: function(id, responseParser) {\n var lastChunkIdx = handler._getTotalChunks(id) - 1, xhr = handler._getXhr(id, lastChunkIdx);\n if (responseParser) {\n return new qq.Promise().success(responseParser(xhr), xhr);\n }\n return new qq.Promise().success({}, xhr);\n },\n getFile: function(id) {\n return handler.isValid(id) && handler._getFileState(id).file;\n },\n getProxy: function(id) {\n return handler.isValid(id) && handler._getFileState(id).proxy;\n },\n getResumableFilesData: function() {\n var resumableFilesData = [];\n handler._iterateResumeRecords(function(key, uploadData) {\n handler.moveInProgressToRemaining(null, uploadData.chunking.inProgress, uploadData.chunking.remaining);\n var data = {\n name: uploadData.name,\n remaining: uploadData.chunking.remaining,\n size: uploadData.size,\n uuid: uploadData.uuid\n };\n if (uploadData.key) {\n data.key = uploadData.key;\n }\n if (uploadData.customResumeData) {\n data.customResumeData = uploadData.customResumeData;\n }\n resumableFilesData.push(data);\n });\n return resumableFilesData;\n },\n isAttemptingResume: function(id) {\n return handler._getFileState(id).attemptingResume;\n },\n isResumable: function(id) {\n return !!chunking && handler.isValid(id) && !handler._getFileState(id).notResumable;\n },\n moveInProgressToRemaining: function(id, optInProgress, optRemaining) {\n var fileState = handler._getFileState(id) || {}, chunkingState = fileState.chunking || {}, inProgress = optInProgress || chunkingState.inProgress, remaining = optRemaining || chunkingState.remaining;\n if (inProgress) {\n log(qq.format(\"Moving these chunks from in-progress {}, to remaining.\", JSON.stringify(inProgress)));\n inProgress.reverse();\n qq.each(inProgress, function(idx, chunkIdx) {\n remaining.unshift(chunkIdx);\n });\n inProgress.length = 0;\n }\n },\n pause: function(id) {\n if (handler.isValid(id)) {\n log(qq.format(\"Aborting XHR upload for {} '{}' due to pause instruction.\", id, getName(id)));\n handler._getFileState(id).paused = true;\n abort(id);\n return true;\n }\n },\n reevaluateChunking: function(id) {\n if (chunking && handler.isValid(id)) {\n var state = handler._getFileState(id), totalChunks, i;\n delete state.chunking;\n state.chunking = {};\n totalChunks = handler._getTotalChunks(id);\n if (totalChunks > 1 || chunking.mandatory) {\n state.chunking.enabled = true;\n state.chunking.parts = totalChunks;\n state.chunking.remaining = [];\n for (i = 0; i < totalChunks; i++) {\n state.chunking.remaining.push(i);\n }\n handler._initTempState(id);\n } else {\n state.chunking.enabled = false;\n }\n }\n },\n updateBlob: function(id, newBlob) {\n if (handler.isValid(id)) {\n handler._getFileState(id).file = newBlob;\n }\n },\n _clearXhrs: function(id) {\n var tempState = handler._getFileState(id).temp;\n qq.each(tempState.ajaxRequesters, function(chunkId) {\n delete tempState.ajaxRequesters[chunkId];\n });\n qq.each(tempState.xhrs, function(chunkId) {\n delete tempState.xhrs[chunkId];\n });\n },\n _createXhr: function(id, optChunkIdx) {\n return handler._registerXhr(id, optChunkIdx, qq.createXhrInstance());\n },\n _getAjaxRequester: function(id, optChunkIdx) {\n var chunkIdx = optChunkIdx == null ? -1 : optChunkIdx;\n return handler._getFileState(id).temp.ajaxRequesters[chunkIdx];\n },\n _getChunkData: function(id, chunkIndex) {\n var chunkSize = getChunkSize(id), fileSize = getSize(id), fileOrBlob = handler.getFile(id), startBytes = chunkSize * chunkIndex, endBytes = startBytes + chunkSize >= fileSize ? fileSize : startBytes + chunkSize, totalChunks = handler._getTotalChunks(id), cachedChunks = this._getFileState(id).temp.cachedChunks, blob = cachedChunks[chunkIndex] || qq.sliceBlob(fileOrBlob, startBytes, endBytes);\n cachedChunks[chunkIndex] = blob;\n return {\n part: chunkIndex,\n start: startBytes,\n end: endBytes,\n count: totalChunks,\n blob: blob,\n size: endBytes - startBytes\n };\n },\n _getChunkDataForCallback: function(chunkData) {\n return {\n partIndex: chunkData.part,\n startByte: chunkData.start + 1,\n endByte: chunkData.end,\n totalParts: chunkData.count\n };\n },\n _getLocalStorageId: function(id) {\n var formatVersion = \"5.0\", name = getName(id), size = getSize(id), chunkSize = getChunkSize(id), endpoint = getEndpoint(id), customKeys = resume.customKeys(id), localStorageId = qq.format(\"qq{}resume{}-{}-{}-{}-{}\", namespace, formatVersion, name, size, chunkSize, endpoint);\n customKeys.forEach(function(key) {\n localStorageId += \"-\" + key;\n });\n return localStorageId;\n },\n _getMimeType: function(id) {\n return handler.getFile(id).type;\n },\n _getPersistableData: function(id) {\n return handler._getFileState(id).chunking;\n },\n _getTotalChunks: function(id) {\n if (chunking) {\n var fileSize = getSize(id), chunkSize = getChunkSize(id);\n return Math.ceil(fileSize / chunkSize);\n }\n },\n _getXhr: function(id, optChunkIdx) {\n var chunkIdx = optChunkIdx == null ? -1 : optChunkIdx;\n return handler._getFileState(id).temp.xhrs[chunkIdx];\n },\n _getXhrs: function(id) {\n return handler._getFileState(id).temp.xhrs;\n },\n _iterateResumeRecords: function(callback) {\n if (resumeEnabled) {\n qq.each(localStorage, function(key, item) {\n if (key.indexOf(qq.format(\"qq{}resume\", namespace)) === 0) {\n var uploadData = JSON.parse(item);\n callback(key, uploadData);\n }\n });\n }\n },\n _initTempState: function(id) {\n handler._getFileState(id).temp = {\n ajaxRequesters: {},\n chunkProgress: {},\n xhrs: {},\n cachedChunks: {}\n };\n },\n _markNotResumable: function(id) {\n handler._getFileState(id).notResumable = true;\n },\n _maybeDeletePersistedChunkData: function(id) {\n var localStorageId;\n if (resumeEnabled && handler.isResumable(id)) {\n localStorageId = handler._getLocalStorageId(id);\n if (localStorageId && localStorage.getItem(localStorageId)) {\n localStorage.removeItem(localStorageId);\n return true;\n }\n }\n return false;\n },\n _maybePrepareForResume: function(id) {\n var state = handler._getFileState(id), localStorageId, persistedData;\n if (resumeEnabled && state.key === undefined) {\n localStorageId = handler._getLocalStorageId(id);\n persistedData = localStorage.getItem(localStorageId);\n if (persistedData) {\n persistedData = JSON.parse(persistedData);\n if (getDataByUuid(persistedData.uuid)) {\n handler._markNotResumable(id);\n } else {\n log(qq.format(\"Identified file with ID {} and name of {} as resumable.\", id, getName(id)));\n onUuidChanged(id, persistedData.uuid);\n state.key = persistedData.key;\n state.chunking = persistedData.chunking;\n state.loaded = persistedData.loaded;\n state.customResumeData = persistedData.customResumeData;\n state.attemptingResume = true;\n handler.moveInProgressToRemaining(id);\n }\n }\n }\n },\n _maybePersistChunkedState: function(id) {\n var state = handler._getFileState(id), localStorageId, persistedData;\n if (resumeEnabled && handler.isResumable(id)) {\n var customResumeData = getCustomResumeData(id);\n localStorageId = handler._getLocalStorageId(id);\n persistedData = {\n name: getName(id),\n size: getSize(id),\n uuid: getUuid(id),\n key: state.key,\n chunking: state.chunking,\n loaded: state.loaded,\n lastUpdated: Date.now()\n };\n if (customResumeData) {\n persistedData.customResumeData = customResumeData;\n }\n try {\n localStorage.setItem(localStorageId, JSON.stringify(persistedData));\n } catch (error) {\n log(qq.format(\"Unable to save resume data for '{}' due to error: '{}'.\", id, error.toString()), \"warn\");\n }\n }\n },\n _registerProgressHandler: function(id, chunkIdx, chunkSize) {\n var xhr = handler._getXhr(id, chunkIdx), name = getName(id), progressCalculator = {\n simple: function(loaded, total) {\n var fileSize = getSize(id);\n if (loaded === total) {\n onProgress(id, name, fileSize, fileSize);\n } else {\n onProgress(id, name, loaded >= fileSize ? fileSize - 1 : loaded, fileSize);\n }\n },\n chunked: function(loaded, total) {\n var chunkProgress = handler._getFileState(id).temp.chunkProgress, totalSuccessfullyLoadedForFile = handler._getFileState(id).loaded, loadedForRequest = loaded, totalForRequest = total, totalFileSize = getSize(id), estActualChunkLoaded = loadedForRequest - (totalForRequest - chunkSize), totalLoadedForFile = totalSuccessfullyLoadedForFile;\n chunkProgress[chunkIdx] = estActualChunkLoaded;\n qq.each(chunkProgress, function(chunkIdx, chunkLoaded) {\n totalLoadedForFile += chunkLoaded;\n });\n onProgress(id, name, totalLoadedForFile, totalFileSize);\n }\n };\n xhr.upload.onprogress = function(e) {\n if (e.lengthComputable) {\n var type = chunkSize == null ? \"simple\" : \"chunked\";\n progressCalculator[type](e.loaded, e.total);\n }\n };\n },\n _registerXhr: function(id, optChunkIdx, xhr, optAjaxRequester) {\n var xhrsId = optChunkIdx == null ? -1 : optChunkIdx, tempState = handler._getFileState(id).temp;\n tempState.xhrs = tempState.xhrs || {};\n tempState.ajaxRequesters = tempState.ajaxRequesters || {};\n tempState.xhrs[xhrsId] = xhr;\n if (optAjaxRequester) {\n tempState.ajaxRequesters[xhrsId] = optAjaxRequester;\n }\n return xhr;\n },\n _removeExpiredChunkingRecords: function() {\n var expirationDays = resume.recordsExpireIn;\n handler._iterateResumeRecords(function(key, uploadData) {\n var expirationDate = new Date(uploadData.lastUpdated);\n expirationDate.setDate(expirationDate.getDate() + expirationDays);\n if (expirationDate.getTime() <= Date.now()) {\n log(\"Removing expired resume record with key \" + key);\n localStorage.removeItem(key);\n }\n });\n },\n _shouldChunkThisFile: function(id) {\n var state = handler._getFileState(id);\n if (state) {\n if (!state.chunking) {\n handler.reevaluateChunking(id);\n }\n return state.chunking.enabled;\n }\n }\n });\n };\n qq.DeleteFileAjaxRequester = function(o) {\n \"use strict\";\n var requester, options = {\n method: \"DELETE\",\n uuidParamName: \"qquuid\",\n endpointStore: {},\n maxConnections: 3,\n customHeaders: function(id) {\n return {};\n },\n paramsStore: {},\n cors: {\n expected: false,\n sendCredentials: false\n },\n log: function(str, level) {},\n onDelete: function(id) {},\n onDeleteComplete: function(id, xhrOrXdr, isError) {}\n };\n qq.extend(options, o);\n function getMandatedParams() {\n if (options.method.toUpperCase() === \"POST\") {\n return {\n _method: \"DELETE\"\n };\n }\n return {};\n }\n requester = qq.extend(this, new qq.AjaxRequester({\n acceptHeader: \"application/json\",\n validMethods: [ \"POST\", \"DELETE\" ],\n method: options.method,\n endpointStore: options.endpointStore,\n paramsStore: options.paramsStore,\n mandatedParams: getMandatedParams(),\n maxConnections: options.maxConnections,\n customHeaders: function(id) {\n return options.customHeaders.get(id);\n },\n log: options.log,\n onSend: options.onDelete,\n onComplete: options.onDeleteComplete,\n cors: options.cors\n }));\n qq.extend(this, {\n sendDelete: function(id, uuid, additionalMandatedParams) {\n var additionalOptions = additionalMandatedParams || {};\n options.log(\"Submitting delete file request for \" + id);\n if (options.method === \"DELETE\") {\n requester.initTransport(id).withPath(uuid).withParams(additionalOptions).send();\n } else {\n additionalOptions[options.uuidParamName] = uuid;\n requester.initTransport(id).withParams(additionalOptions).send();\n }\n }\n });\n };\n (function() {\n function detectSubsampling(img) {\n var iw = img.naturalWidth, ih = img.naturalHeight, canvas = document.createElement(\"canvas\"), ctx;\n if (iw * ih > 1024 * 1024) {\n canvas.width = canvas.height = 1;\n ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, -iw + 1, 0);\n return ctx.getImageData(0, 0, 1, 1).data[3] === 0;\n } else {\n return false;\n }\n }\n function detectVerticalSquash(img, iw, ih) {\n var canvas = document.createElement(\"canvas\"), sy = 0, ey = ih, py = ih, ctx, data, alpha, ratio;\n canvas.width = 1;\n canvas.height = ih;\n ctx = canvas.getContext(\"2d\");\n ctx.drawImage(img, 0, 0);\n data = ctx.getImageData(0, 0, 1, ih).data;\n while (py > sy) {\n alpha = data[(py - 1) * 4 + 3];\n if (alpha === 0) {\n ey = py;\n } else {\n sy = py;\n }\n py = ey + sy >> 1;\n }\n ratio = py / ih;\n return ratio === 0 ? 1 : ratio;\n }\n function renderImageToDataURL(img, blob, options, doSquash) {\n var canvas = document.createElement(\"canvas\"), mime = options.mime || \"image/jpeg\", promise = new qq.Promise();\n renderImageToCanvas(img, blob, canvas, options, doSquash).then(function() {\n promise.success(canvas.toDataURL(mime, options.quality || .8));\n });\n return promise;\n }\n function maybeCalculateDownsampledDimensions(spec) {\n var maxPixels = 5241e3;\n if (!qq.ios()) {\n throw new qq.Error(\"Downsampled dimensions can only be reliably calculated for iOS!\");\n }\n if (spec.origHeight * spec.origWidth > maxPixels) {\n return {\n newHeight: Math.round(Math.sqrt(maxPixels * (spec.origHeight / spec.origWidth))),\n newWidth: Math.round(Math.sqrt(maxPixels * (spec.origWidth / spec.origHeight)))\n };\n }\n }\n function renderImageToCanvas(img, blob, canvas, options, doSquash) {\n var iw = img.naturalWidth, ih = img.naturalHeight, width = options.width, height = options.height, ctx = canvas.getContext(\"2d\"), promise = new qq.Promise(), modifiedDimensions;\n ctx.save();\n if (options.resize) {\n return renderImageToCanvasWithCustomResizer({\n blob: blob,\n canvas: canvas,\n image: img,\n imageHeight: ih,\n imageWidth: iw,\n orientation: options.orientation,\n resize: options.resize,\n targetHeight: height,\n targetWidth: width\n });\n }\n if (!qq.supportedFeatures.unlimitedScaledImageSize) {\n modifiedDimensions = maybeCalculateDownsampledDimensions({\n origWidth: width,\n origHeight: height\n });\n if (modifiedDimensions) {\n qq.log(qq.format(\"Had to reduce dimensions due to device limitations from {}w / {}h to {}w / {}h\", width, height, modifiedDimensions.newWidth, modifiedDimensions.newHeight), \"warn\");\n width = modifiedDimensions.newWidth;\n height = modifiedDimensions.newHeight;\n }\n }\n transformCoordinate(canvas, width, height, options.orientation);\n if (qq.ios()) {\n (function() {\n if (detectSubsampling(img)) {\n iw /= 2;\n ih /= 2;\n }\n var d = 1024, tmpCanvas = document.createElement(\"canvas\"), vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1, dw = Math.ceil(d * width / iw), dh = Math.ceil(d * height / ih / vertSquashRatio), sy = 0, dy = 0, tmpCtx, sx, dx;\n tmpCanvas.width = tmpCanvas.height = d;\n tmpCtx = tmpCanvas.getContext(\"2d\");\n while (sy < ih) {\n sx = 0;\n dx = 0;\n while (sx < iw) {\n tmpCtx.clearRect(0, 0, d, d);\n tmpCtx.drawImage(img, -sx, -sy);\n ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh);\n sx += d;\n dx += dw;\n }\n sy += d;\n dy += dh;\n }\n ctx.restore();\n tmpCanvas = tmpCtx = null;\n })();\n } else {\n ctx.drawImage(img, 0, 0, width, height);\n }\n canvas.qqImageRendered && canvas.qqImageRendered();\n promise.success();\n return promise;\n }\n function renderImageToCanvasWithCustomResizer(resizeInfo) {\n var blob = resizeInfo.blob, image = resizeInfo.image, imageHeight = resizeInfo.imageHeight, imageWidth = resizeInfo.imageWidth, orientation = resizeInfo.orientation, promise = new qq.Promise(), resize = resizeInfo.resize, sourceCanvas = document.createElement(\"canvas\"), sourceCanvasContext = sourceCanvas.getContext(\"2d\"), targetCanvas = resizeInfo.canvas, targetHeight = resizeInfo.targetHeight, targetWidth = resizeInfo.targetWidth;\n transformCoordinate(sourceCanvas, imageWidth, imageHeight, orientation);\n targetCanvas.height = targetHeight;\n targetCanvas.width = targetWidth;\n sourceCanvasContext.drawImage(image, 0, 0);\n resize({\n blob: blob,\n height: targetHeight,\n image: image,\n sourceCanvas: sourceCanvas,\n targetCanvas: targetCanvas,\n width: targetWidth\n }).then(function success() {\n targetCanvas.qqImageRendered && targetCanvas.qqImageRendered();\n promise.success();\n }, promise.failure);\n return promise;\n }\n function transformCoordinate(canvas, width, height, orientation) {\n switch (orientation) {\n case 5:\n case 6:\n case 7:\n case 8:\n canvas.width = height;\n canvas.height = width;\n break;\n\n default:\n canvas.width = width;\n canvas.height = height;\n }\n var ctx = canvas.getContext(\"2d\");\n switch (orientation) {\n case 2:\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n break;\n\n case 3:\n ctx.translate(width, height);\n ctx.rotate(Math.PI);\n break;\n\n case 4:\n ctx.translate(0, height);\n ctx.scale(1, -1);\n break;\n\n case 5:\n ctx.rotate(.5 * Math.PI);\n ctx.scale(1, -1);\n break;\n\n case 6:\n ctx.rotate(.5 * Math.PI);\n ctx.translate(0, -height);\n break;\n\n case 7:\n ctx.rotate(.5 * Math.PI);\n ctx.translate(width, -height);\n ctx.scale(-1, 1);\n break;\n\n case 8:\n ctx.rotate(-.5 * Math.PI);\n ctx.translate(-width, 0);\n break;\n\n default:\n break;\n }\n }\n function MegaPixImage(srcImage, errorCallback) {\n var self = this;\n if (window.Blob && srcImage instanceof Blob) {\n (function() {\n var img = new Image(), URL = window.URL && window.URL.createObjectURL ? window.URL : window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : null;\n if (!URL) {\n throw Error(\"No createObjectURL function found to create blob url\");\n }\n img.src = URL.createObjectURL(srcImage);\n self.blob = srcImage;\n srcImage = img;\n })();\n }\n if (!srcImage.naturalWidth && !srcImage.naturalHeight) {\n srcImage.onload = function() {\n var listeners = self.imageLoadListeners;\n if (listeners) {\n self.imageLoadListeners = null;\n setTimeout(function() {\n for (var i = 0, len = listeners.length; i < len; i++) {\n listeners[i]();\n }\n }, 0);\n }\n };\n srcImage.onerror = errorCallback;\n this.imageLoadListeners = [];\n }\n this.srcImage = srcImage;\n }\n MegaPixImage.prototype.render = function(target, options) {\n options = options || {};\n var self = this, imgWidth = this.srcImage.naturalWidth, imgHeight = this.srcImage.naturalHeight, width = options.width, height = options.height, maxWidth = options.maxWidth, maxHeight = options.maxHeight, doSquash = !this.blob || this.blob.type === \"image/jpeg\", tagName = target.tagName.toLowerCase(), opt;\n if (this.imageLoadListeners) {\n this.imageLoadListeners.push(function() {\n self.render(target, options);\n });\n return;\n }\n if (width && !height) {\n height = imgHeight * width / imgWidth << 0;\n } else if (height && !width) {\n width = imgWidth * height / imgHeight << 0;\n } else {\n width = imgWidth;\n height = imgHeight;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n height = imgHeight * width / imgWidth << 0;\n }\n if (maxHeight && height > maxHeight) {\n height = maxHeight;\n width = imgWidth * height / imgHeight << 0;\n }\n opt = {\n width: width,\n height: height\n }, qq.each(options, function(optionsKey, optionsValue) {\n opt[optionsKey] = optionsValue;\n });\n if (tagName === \"img\") {\n (function() {\n var oldTargetSrc = target.src;\n renderImageToDataURL(self.srcImage, self.blob, opt, doSquash).then(function(dataUri) {\n target.src = dataUri;\n oldTargetSrc === target.src && target.onload();\n });\n })();\n } else if (tagName === \"canvas\") {\n renderImageToCanvas(this.srcImage, this.blob, target, opt, doSquash);\n }\n if (typeof this.onrender === \"function\") {\n this.onrender(target);\n }\n };\n qq.MegaPixImage = MegaPixImage;\n })();\n qq.ImageGenerator = function(log) {\n \"use strict\";\n function isImg(el) {\n return el.tagName.toLowerCase() === \"img\";\n }\n function isCanvas(el) {\n return el.tagName.toLowerCase() === \"canvas\";\n }\n function isImgCorsSupported() {\n return new Image().crossOrigin !== undefined;\n }\n function isCanvasSupported() {\n var canvas = document.createElement(\"canvas\");\n return canvas.getContext && canvas.getContext(\"2d\");\n }\n function determineMimeOfFileName(nameWithPath) {\n var pathSegments = nameWithPath.split(\"/\"), name = pathSegments[pathSegments.length - 1].split(\"?\")[0], extension = qq.getExtension(name);\n extension = extension && extension.toLowerCase();\n switch (extension) {\n case \"jpeg\":\n case \"jpg\":\n return \"image/jpeg\";\n\n case \"png\":\n return \"image/png\";\n\n case \"bmp\":\n return \"image/bmp\";\n\n case \"gif\":\n return \"image/gif\";\n\n case \"tiff\":\n case \"tif\":\n return \"image/tiff\";\n }\n }\n function isCrossOrigin(url) {\n var targetAnchor = document.createElement(\"a\"), targetProtocol, targetHostname, targetPort;\n targetAnchor.href = url;\n targetProtocol = targetAnchor.protocol;\n targetPort = targetAnchor.port;\n targetHostname = targetAnchor.hostname;\n if (targetProtocol.toLowerCase() !== window.location.protocol.toLowerCase()) {\n return true;\n }\n if (targetHostname.toLowerCase() !== window.location.hostname.toLowerCase()) {\n return true;\n }\n if (targetPort !== window.location.port && !qq.ie()) {\n return true;\n }\n return false;\n }\n function registerImgLoadListeners(img, promise) {\n img.onload = function() {\n img.onload = null;\n img.onerror = null;\n promise.success(img);\n };\n img.onerror = function() {\n img.onload = null;\n img.onerror = null;\n log(\"Problem drawing thumbnail!\", \"error\");\n promise.failure(img, \"Problem drawing thumbnail!\");\n };\n }\n function registerCanvasDrawImageListener(canvas, promise) {\n canvas.qqImageRendered = function() {\n promise.success(canvas);\n };\n }\n function registerThumbnailRenderedListener(imgOrCanvas, promise) {\n var registered = isImg(imgOrCanvas) || isCanvas(imgOrCanvas);\n if (isImg(imgOrCanvas)) {\n registerImgLoadListeners(imgOrCanvas, promise);\n } else if (isCanvas(imgOrCanvas)) {\n registerCanvasDrawImageListener(imgOrCanvas, promise);\n } else {\n promise.failure(imgOrCanvas);\n log(qq.format(\"Element container of type {} is not supported!\", imgOrCanvas.tagName), \"error\");\n }\n return registered;\n }\n function draw(fileOrBlob, container, options) {\n var drawPreview = new qq.Promise(), identifier = new qq.Identify(fileOrBlob, log), maxSize = options.maxSize, orient = options.orient == null ? true : options.orient, megapixErrorHandler = function() {\n container.onerror = null;\n container.onload = null;\n log(\"Could not render preview, file may be too large!\", \"error\");\n drawPreview.failure(container, \"Browser cannot render image!\");\n };\n identifier.isPreviewable().then(function(mime) {\n var dummyExif = {\n parse: function() {\n return new qq.Promise().success();\n }\n }, exif = orient ? new qq.Exif(fileOrBlob, log) : dummyExif, mpImg = new qq.MegaPixImage(fileOrBlob, megapixErrorHandler);\n if (registerThumbnailRenderedListener(container, drawPreview)) {\n exif.parse().then(function(exif) {\n var orientation = exif && exif.Orientation;\n mpImg.render(container, {\n maxWidth: maxSize,\n maxHeight: maxSize,\n orientation: orientation,\n mime: mime,\n resize: options.customResizeFunction\n });\n }, function(failureMsg) {\n log(qq.format(\"EXIF data could not be parsed ({}). Assuming orientation = 1.\", failureMsg));\n mpImg.render(container, {\n maxWidth: maxSize,\n maxHeight: maxSize,\n mime: mime,\n resize: options.customResizeFunction\n });\n });\n }\n }, function() {\n log(\"Not previewable\");\n drawPreview.failure(container, \"Not previewable\");\n });\n return drawPreview;\n }\n function drawOnCanvasOrImgFromUrl(url, canvasOrImg, draw, maxSize, customResizeFunction) {\n var tempImg = new Image(), tempImgRender = new qq.Promise();\n registerThumbnailRenderedListener(tempImg, tempImgRender);\n if (isCrossOrigin(url)) {\n tempImg.crossOrigin = \"anonymous\";\n }\n tempImg.src = url;\n tempImgRender.then(function rendered() {\n registerThumbnailRenderedListener(canvasOrImg, draw);\n var mpImg = new qq.MegaPixImage(tempImg);\n mpImg.render(canvasOrImg, {\n maxWidth: maxSize,\n maxHeight: maxSize,\n mime: determineMimeOfFileName(url),\n resize: customResizeFunction\n });\n }, draw.failure);\n }\n function drawOnImgFromUrlWithCssScaling(url, img, draw, maxSize) {\n registerThumbnailRenderedListener(img, draw);\n qq(img).css({\n maxWidth: maxSize + \"px\",\n maxHeight: maxSize + \"px\"\n });\n img.src = url;\n }\n function drawFromUrl(url, container, options) {\n var draw = new qq.Promise(), scale = options.scale, maxSize = scale ? options.maxSize : null;\n if (scale && isImg(container)) {\n if (isCanvasSupported()) {\n if (isCrossOrigin(url) && !isImgCorsSupported()) {\n drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);\n } else {\n drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);\n }\n } else {\n drawOnImgFromUrlWithCssScaling(url, container, draw, maxSize);\n }\n } else if (isCanvas(container)) {\n drawOnCanvasOrImgFromUrl(url, container, draw, maxSize);\n } else if (registerThumbnailRenderedListener(container, draw)) {\n container.src = url;\n }\n return draw;\n }\n qq.extend(this, {\n generate: function(fileBlobOrUrl, container, options) {\n if (qq.isString(fileBlobOrUrl)) {\n log(\"Attempting to update thumbnail based on server response.\");\n return drawFromUrl(fileBlobOrUrl, container, options || {});\n } else {\n log(\"Attempting to draw client-side image preview.\");\n return draw(fileBlobOrUrl, container, options || {});\n }\n }\n });\n this._testing = {};\n this._testing.isImg = isImg;\n this._testing.isCanvas = isCanvas;\n this._testing.isCrossOrigin = isCrossOrigin;\n this._testing.determineMimeOfFileName = determineMimeOfFileName;\n };\n qq.Exif = function(fileOrBlob, log) {\n \"use strict\";\n var TAG_IDS = [ 274 ], TAG_INFO = {\n 274: {\n name: \"Orientation\",\n bytes: 2\n }\n };\n function parseLittleEndian(hex) {\n var result = 0, pow = 0;\n while (hex.length > 0) {\n result += parseInt(hex.substring(0, 2), 16) * Math.pow(2, pow);\n hex = hex.substring(2, hex.length);\n pow += 8;\n }\n return result;\n }\n function seekToApp1(offset, promise) {\n var theOffset = offset, thePromise = promise;\n if (theOffset === undefined) {\n theOffset = 2;\n thePromise = new qq.Promise();\n }\n qq.readBlobToHex(fileOrBlob, theOffset, 4).then(function(hex) {\n var match = /^ffe([0-9])/.exec(hex), segmentLength;\n if (match) {\n if (match[1] !== \"1\") {\n segmentLength = parseInt(hex.slice(4, 8), 16);\n seekToApp1(theOffset + segmentLength + 2, thePromise);\n } else {\n thePromise.success(theOffset);\n }\n } else {\n thePromise.failure(\"No EXIF header to be found!\");\n }\n });\n return thePromise;\n }\n function getApp1Offset() {\n var promise = new qq.Promise();\n qq.readBlobToHex(fileOrBlob, 0, 6).then(function(hex) {\n if (hex.indexOf(\"ffd8\") !== 0) {\n promise.failure(\"Not a valid JPEG!\");\n } else {\n seekToApp1().then(function(offset) {\n promise.success(offset);\n }, function(error) {\n promise.failure(error);\n });\n }\n });\n return promise;\n }\n function isLittleEndian(app1Start) {\n var promise = new qq.Promise();\n qq.readBlobToHex(fileOrBlob, app1Start + 10, 2).then(function(hex) {\n promise.success(hex === \"4949\");\n });\n return promise;\n }\n function getDirEntryCount(app1Start, littleEndian) {\n var promise = new qq.Promise();\n qq.readBlobToHex(fileOrBlob, app1Start + 18, 2).then(function(hex) {\n if (littleEndian) {\n return promise.success(parseLittleEndian(hex));\n } else {\n promise.success(parseInt(hex, 16));\n }\n });\n return promise;\n }\n function getIfd(app1Start, dirEntries) {\n var offset = app1Start + 20, bytes = dirEntries * 12;\n return qq.readBlobToHex(fileOrBlob, offset, bytes);\n }\n function getDirEntries(ifdHex) {\n var entries = [], offset = 0;\n while (offset + 24 <= ifdHex.length) {\n entries.push(ifdHex.slice(offset, offset + 24));\n offset += 24;\n }\n return entries;\n }\n function getTagValues(littleEndian, dirEntries) {\n var TAG_VAL_OFFSET = 16, tagsToFind = qq.extend([], TAG_IDS), vals = {};\n qq.each(dirEntries, function(idx, entry) {\n var idHex = entry.slice(0, 4), id = littleEndian ? parseLittleEndian(idHex) : parseInt(idHex, 16), tagsToFindIdx = tagsToFind.indexOf(id), tagValHex, tagName, tagValLength;\n if (tagsToFindIdx >= 0) {\n tagName = TAG_INFO[id].name;\n tagValLength = TAG_INFO[id].bytes;\n tagValHex = entry.slice(TAG_VAL_OFFSET, TAG_VAL_OFFSET + tagValLength * 2);\n vals[tagName] = littleEndian ? parseLittleEndian(tagValHex) : parseInt(tagValHex, 16);\n tagsToFind.splice(tagsToFindIdx, 1);\n }\n if (tagsToFind.length === 0) {\n return false;\n }\n });\n return vals;\n }\n qq.extend(this, {\n parse: function() {\n var parser = new qq.Promise(), onParseFailure = function(message) {\n log(qq.format(\"EXIF header parse failed: '{}' \", message));\n parser.failure(message);\n };\n getApp1Offset().then(function(app1Offset) {\n log(qq.format(\"Moving forward with EXIF header parsing for '{}'\", fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name));\n isLittleEndian(app1Offset).then(function(littleEndian) {\n log(qq.format(\"EXIF Byte order is {} endian\", littleEndian ? \"little\" : \"big\"));\n getDirEntryCount(app1Offset, littleEndian).then(function(dirEntryCount) {\n log(qq.format(\"Found {} APP1 directory entries\", dirEntryCount));\n getIfd(app1Offset, dirEntryCount).then(function(ifdHex) {\n var dirEntries = getDirEntries(ifdHex), tagValues = getTagValues(littleEndian, dirEntries);\n log(\"Successfully parsed some EXIF tags\");\n parser.success(tagValues);\n }, onParseFailure);\n }, onParseFailure);\n }, onParseFailure);\n }, onParseFailure);\n return parser;\n }\n });\n this._testing = {};\n this._testing.parseLittleEndian = parseLittleEndian;\n };\n qq.Identify = function(fileOrBlob, log) {\n \"use strict\";\n function isIdentifiable(magicBytes, questionableBytes) {\n var identifiable = false, magicBytesEntries = [].concat(magicBytes);\n qq.each(magicBytesEntries, function(idx, magicBytesArrayEntry) {\n if (questionableBytes.indexOf(magicBytesArrayEntry) === 0) {\n identifiable = true;\n return false;\n }\n });\n return identifiable;\n }\n qq.extend(this, {\n isPreviewable: function() {\n var self = this, identifier = new qq.Promise(), previewable = false, name = fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name;\n log(qq.format(\"Attempting to determine if {} can be rendered in this browser\", name));\n log(\"First pass: check type attribute of blob object.\");\n if (this.isPreviewableSync()) {\n log(\"Second pass: check for magic bytes in file header.\");\n qq.readBlobToHex(fileOrBlob, 0, 4).then(function(hex) {\n qq.each(self.PREVIEWABLE_MIME_TYPES, function(mime, bytes) {\n if (isIdentifiable(bytes, hex)) {\n if (mime !== \"image/tiff\" || qq.supportedFeatures.tiffPreviews) {\n previewable = true;\n identifier.success(mime);\n }\n return false;\n }\n });\n log(qq.format(\"'{}' is {} able to be rendered in this browser\", name, previewable ? \"\" : \"NOT\"));\n if (!previewable) {\n identifier.failure();\n }\n }, function() {\n log(\"Error reading file w/ name '\" + name + \"'. Not able to be rendered in this browser.\");\n identifier.failure();\n });\n } else {\n identifier.failure();\n }\n return identifier;\n },\n isPreviewableSync: function() {\n var fileMime = fileOrBlob.type, isRecognizedImage = qq.indexOf(Object.keys(this.PREVIEWABLE_MIME_TYPES), fileMime) >= 0, previewable = false, name = fileOrBlob.name === undefined ? \"blob\" : fileOrBlob.name;\n if (isRecognizedImage) {\n if (fileMime === \"image/tiff\") {\n previewable = qq.supportedFeatures.tiffPreviews;\n } else {\n previewable = true;\n }\n }\n !previewable && log(name + \" is not previewable in this browser per the blob's type attr\");\n return previewable;\n }\n });\n };\n qq.Identify.prototype.PREVIEWABLE_MIME_TYPES = {\n \"image/jpeg\": \"ffd8ff\",\n \"image/gif\": \"474946\",\n \"image/png\": \"89504e\",\n \"image/bmp\": \"424d\",\n \"image/tiff\": [ \"49492a00\", \"4d4d002a\" ]\n };\n qq.ImageValidation = function(blob, log) {\n \"use strict\";\n function hasNonZeroLimits(limits) {\n var atLeastOne = false;\n qq.each(limits, function(limit, value) {\n if (value > 0) {\n atLeastOne = true;\n return false;\n }\n });\n return atLeastOne;\n }\n function getWidthHeight() {\n var sizeDetermination = new qq.Promise();\n new qq.Identify(blob, log).isPreviewable().then(function() {\n var image = new Image(), url = window.URL && window.URL.createObjectURL ? window.URL : window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : null;\n if (url) {\n image.onerror = function() {\n log(\"Cannot determine dimensions for image. May be too large.\", \"error\");\n sizeDetermination.failure();\n };\n image.onload = function() {\n sizeDetermination.success({\n width: this.width,\n height: this.height\n });\n };\n image.src = url.createObjectURL(blob);\n } else {\n log(\"No createObjectURL function available to generate image URL!\", \"error\");\n sizeDetermination.failure();\n }\n }, sizeDetermination.failure);\n return sizeDetermination;\n }\n function getFailingLimit(limits, dimensions) {\n var failingLimit;\n qq.each(limits, function(limitName, limitValue) {\n if (limitValue > 0) {\n var limitMatcher = /(max|min)(Width|Height)/.exec(limitName), dimensionPropName = limitMatcher[2].charAt(0).toLowerCase() + limitMatcher[2].slice(1), actualValue = dimensions[dimensionPropName];\n switch (limitMatcher[1]) {\n case \"min\":\n if (actualValue < limitValue) {\n failingLimit = limitName;\n return false;\n }\n break;\n\n case \"max\":\n if (actualValue > limitValue) {\n failingLimit = limitName;\n return false;\n }\n break;\n }\n }\n });\n return failingLimit;\n }\n this.validate = function(limits) {\n var validationEffort = new qq.Promise();\n log(\"Attempting to validate image.\");\n if (hasNonZeroLimits(limits)) {\n getWidthHeight().then(function(dimensions) {\n var failingLimit = getFailingLimit(limits, dimensions);\n if (failingLimit) {\n validationEffort.failure(failingLimit);\n } else {\n validationEffort.success();\n }\n }, validationEffort.success);\n } else {\n validationEffort.success();\n }\n return validationEffort;\n };\n };\n qq.Session = function(spec) {\n \"use strict\";\n var options = {\n endpoint: null,\n params: {},\n customHeaders: {},\n cors: {},\n addFileRecord: function(sessionData) {},\n log: function(message, level) {}\n };\n qq.extend(options, spec, true);\n function isJsonResponseValid(response) {\n if (qq.isArray(response)) {\n return true;\n }\n options.log(\"Session response is not an array.\", \"error\");\n }\n function handleFileItems(fileItems, success, xhrOrXdr, promise) {\n var someItemsIgnored = false;\n success = success && isJsonResponseValid(fileItems);\n if (success) {\n qq.each(fileItems, function(idx, fileItem) {\n if (fileItem.uuid == null) {\n someItemsIgnored = true;\n options.log(qq.format(\"Session response item {} did not include a valid UUID - ignoring.\", idx), \"error\");\n } else if (fileItem.name == null) {\n someItemsIgnored = true;\n options.log(qq.format(\"Session response item {} did not include a valid name - ignoring.\", idx), \"error\");\n } else {\n try {\n options.addFileRecord(fileItem);\n return true;\n } catch (err) {\n someItemsIgnored = true;\n options.log(err.message, \"error\");\n }\n }\n return false;\n });\n }\n promise[success && !someItemsIgnored ? \"success\" : \"failure\"](fileItems, xhrOrXdr);\n }\n this.refresh = function() {\n var refreshEffort = new qq.Promise(), refreshCompleteCallback = function(response, success, xhrOrXdr) {\n handleFileItems(response, success, xhrOrXdr, refreshEffort);\n }, requesterOptions = qq.extend({}, options), requester = new qq.SessionAjaxRequester(qq.extend(requesterOptions, {\n onComplete: refreshCompleteCallback\n }));\n requester.queryServer();\n return refreshEffort;\n };\n };\n qq.SessionAjaxRequester = function(spec) {\n \"use strict\";\n var requester, options = {\n endpoint: null,\n customHeaders: {},\n params: {},\n cors: {\n expected: false,\n sendCredentials: false\n },\n onComplete: function(response, success, xhrOrXdr) {},\n log: function(str, level) {}\n };\n qq.extend(options, spec);\n function onComplete(id, xhrOrXdr, isError) {\n var response = null;\n if (xhrOrXdr.responseText != null) {\n try {\n response = qq.parseJson(xhrOrXdr.responseText);\n } catch (err) {\n options.log(\"Problem parsing session response: \" + err.message, \"error\");\n isError = true;\n }\n }\n options.onComplete(response, !isError, xhrOrXdr);\n }\n requester = qq.extend(this, new qq.AjaxRequester({\n acceptHeader: \"application/json\",\n validMethods: [ \"GET\" ],\n method: \"GET\",\n endpointStore: {\n get: function() {\n return options.endpoint;\n }\n },\n customHeaders: options.customHeaders,\n log: options.log,\n onComplete: onComplete,\n cors: options.cors\n }));\n qq.extend(this, {\n queryServer: function() {\n var params = qq.extend({}, options.params);\n options.log(\"Session query request.\");\n requester.initTransport(\"sessionRefresh\").withParams(params).withCacheBuster().send();\n }\n });\n };\n qq.Scaler = function(spec, log) {\n \"use strict\";\n var self = this, customResizeFunction = spec.customResizer, includeOriginal = spec.sendOriginal, orient = spec.orient, defaultType = spec.defaultType, defaultQuality = spec.defaultQuality / 100, failedToScaleText = spec.failureText, includeExif = spec.includeExif, sizes = this._getSortedSizes(spec.sizes);\n qq.extend(this, {\n enabled: qq.supportedFeatures.scaling && sizes.length > 0,\n getFileRecords: function(originalFileUuid, originalFileName, originalBlobOrBlobData) {\n var self = this, records = [], originalBlob = originalBlobOrBlobData.blob ? originalBlobOrBlobData.blob : originalBlobOrBlobData, identifier = new qq.Identify(originalBlob, log);\n if (identifier.isPreviewableSync()) {\n qq.each(sizes, function(idx, sizeRecord) {\n var outputType = self._determineOutputType({\n defaultType: defaultType,\n requestedType: sizeRecord.type,\n refType: originalBlob.type\n });\n records.push({\n uuid: qq.getUniqueId(),\n name: self._getName(originalFileName, {\n name: sizeRecord.name,\n type: outputType,\n refType: originalBlob.type\n }),\n blob: new qq.BlobProxy(originalBlob, qq.bind(self._generateScaledImage, self, {\n customResizeFunction: customResizeFunction,\n maxSize: sizeRecord.maxSize,\n orient: orient,\n type: outputType,\n quality: defaultQuality,\n failedText: failedToScaleText,\n includeExif: includeExif,\n log: log\n }))\n });\n });\n records.push({\n uuid: originalFileUuid,\n name: originalFileName,\n size: originalBlob.size,\n blob: includeOriginal ? originalBlob : null\n });\n } else {\n records.push({\n uuid: originalFileUuid,\n name: originalFileName,\n size: originalBlob.size,\n blob: originalBlob\n });\n }\n return records;\n },\n handleNewFile: function(file, name, uuid, size, fileList, batchId, uuidParamName, api) {\n var self = this, buttonId = file.qqButtonId || file.blob && file.blob.qqButtonId, scaledIds = [], originalId = null, addFileToHandler = api.addFileToHandler, uploadData = api.uploadData, paramsStore = api.paramsStore, proxyGroupId = qq.getUniqueId();\n qq.each(self.getFileRecords(uuid, name, file), function(idx, record) {\n var blobSize = record.size, id;\n if (record.blob instanceof qq.BlobProxy) {\n blobSize = -1;\n }\n id = uploadData.addFile({\n uuid: record.uuid,\n name: record.name,\n size: blobSize,\n batchId: batchId,\n proxyGroupId: proxyGroupId\n });\n if (record.blob instanceof qq.BlobProxy) {\n scaledIds.push(id);\n } else {\n originalId = id;\n }\n if (record.blob) {\n addFileToHandler(id, record.blob);\n fileList.push({\n id: id,\n file: record.blob\n });\n } else {\n uploadData.setStatus(id, qq.status.REJECTED);\n }\n });\n if (originalId !== null) {\n qq.each(scaledIds, function(idx, scaledId) {\n var params = {\n qqparentuuid: uploadData.retrieve({\n id: originalId\n }).uuid,\n qqparentsize: uploadData.retrieve({\n id: originalId\n }).size\n };\n params[uuidParamName] = uploadData.retrieve({\n id: scaledId\n }).uuid;\n uploadData.setParentId(scaledId, originalId);\n paramsStore.addReadOnly(scaledId, params);\n });\n if (scaledIds.length) {\n (function() {\n var param = {};\n param[uuidParamName] = uploadData.retrieve({\n id: originalId\n }).uuid;\n paramsStore.addReadOnly(originalId, param);\n })();\n }\n }\n }\n });\n };\n qq.extend(qq.Scaler.prototype, {\n scaleImage: function(id, specs, api) {\n \"use strict\";\n if (!qq.supportedFeatures.scaling) {\n throw new qq.Error(\"Scaling is not supported in this browser!\");\n }\n var scalingEffort = new qq.Promise(), log = api.log, file = api.getFile(id), uploadData = api.uploadData.retrieve({\n id: id\n }), name = uploadData && uploadData.name, uuid = uploadData && uploadData.uuid, scalingOptions = {\n customResizer: specs.customResizer,\n sendOriginal: false,\n orient: specs.orient,\n defaultType: specs.type || null,\n defaultQuality: specs.quality,\n failedToScaleText: \"Unable to scale\",\n sizes: [ {\n name: \"\",\n maxSize: specs.maxSize\n } ]\n }, scaler = new qq.Scaler(scalingOptions, log);\n if (!qq.Scaler || !qq.supportedFeatures.imagePreviews || !file) {\n scalingEffort.failure();\n log(\"Could not generate requested scaled image for \" + id + \". \" + \"Scaling is either not possible in this browser, or the file could not be located.\", \"error\");\n } else {\n qq.bind(function() {\n var record = scaler.getFileRecords(uuid, name, file)[0];\n if (record && record.blob instanceof qq.BlobProxy) {\n record.blob.create().then(scalingEffort.success, scalingEffort.failure);\n } else {\n log(id + \" is not a scalable image!\", \"error\");\n scalingEffort.failure();\n }\n }, this)();\n }\n return scalingEffort;\n },\n _determineOutputType: function(spec) {\n \"use strict\";\n var requestedType = spec.requestedType, defaultType = spec.defaultType, referenceType = spec.refType;\n if (!defaultType && !requestedType) {\n if (referenceType !== \"image/jpeg\") {\n return \"image/png\";\n }\n return referenceType;\n }\n if (!requestedType) {\n return defaultType;\n }\n if (qq.indexOf(Object.keys(qq.Identify.prototype.PREVIEWABLE_MIME_TYPES), requestedType) >= 0) {\n if (requestedType === \"image/tiff\") {\n return qq.supportedFeatures.tiffPreviews ? requestedType : defaultType;\n }\n return requestedType;\n }\n return defaultType;\n },\n _getName: function(originalName, scaledVersionProperties) {\n \"use strict\";\n var startOfExt = originalName.lastIndexOf(\".\"), versionType = scaledVersionProperties.type || \"image/png\", referenceType = scaledVersionProperties.refType, scaledName = \"\", scaledExt = qq.getExtension(originalName), nameAppendage = \"\";\n if (scaledVersionProperties.name && scaledVersionProperties.name.trim().length) {\n nameAppendage = \" (\" + scaledVersionProperties.name + \")\";\n }\n if (startOfExt >= 0) {\n scaledName = originalName.substr(0, startOfExt);\n if (referenceType !== versionType) {\n scaledExt = versionType.split(\"/\")[1];\n }\n scaledName += nameAppendage + \".\" + scaledExt;\n } else {\n scaledName = originalName + nameAppendage;\n }\n return scaledName;\n },\n _getSortedSizes: function(sizes) {\n \"use strict\";\n sizes = qq.extend([], sizes);\n return sizes.sort(function(a, b) {\n if (a.maxSize > b.maxSize) {\n return 1;\n }\n if (a.maxSize < b.maxSize) {\n return -1;\n }\n return 0;\n });\n },\n _generateScaledImage: function(spec, sourceFile) {\n \"use strict\";\n var self = this, customResizeFunction = spec.customResizeFunction, log = spec.log, maxSize = spec.maxSize, orient = spec.orient, type = spec.type, quality = spec.quality, failedText = spec.failedText, includeExif = spec.includeExif && sourceFile.type === \"image/jpeg\" && type === \"image/jpeg\", scalingEffort = new qq.Promise(), imageGenerator = new qq.ImageGenerator(log), canvas = document.createElement(\"canvas\");\n log(\"Attempting to generate scaled version for \" + sourceFile.name);\n imageGenerator.generate(sourceFile, canvas, {\n maxSize: maxSize,\n orient: orient,\n customResizeFunction: customResizeFunction\n }).then(function() {\n var scaledImageDataUri = canvas.toDataURL(type, quality), signalSuccess = function() {\n log(\"Success generating scaled version for \" + sourceFile.name);\n var blob = qq.dataUriToBlob(scaledImageDataUri);\n scalingEffort.success(blob);\n };\n if (includeExif) {\n self._insertExifHeader(sourceFile, scaledImageDataUri, log).then(function(scaledImageDataUriWithExif) {\n scaledImageDataUri = scaledImageDataUriWithExif;\n signalSuccess();\n }, function() {\n log(\"Problem inserting EXIF header into scaled image. Using scaled image w/out EXIF data.\", \"error\");\n signalSuccess();\n });\n } else {\n signalSuccess();\n }\n }, function() {\n log(\"Failed attempt to generate scaled version for \" + sourceFile.name, \"error\");\n scalingEffort.failure(failedText);\n });\n return scalingEffort;\n },\n _insertExifHeader: function(originalImage, scaledImageDataUri, log) {\n \"use strict\";\n var reader = new FileReader(), insertionEffort = new qq.Promise(), originalImageDataUri = \"\";\n reader.onload = function() {\n originalImageDataUri = reader.result;\n insertionEffort.success(qq.ExifRestorer.restore(originalImageDataUri, scaledImageDataUri));\n };\n reader.onerror = function() {\n log(\"Problem reading \" + originalImage.name + \" during attempt to transfer EXIF data to scaled version.\", \"error\");\n insertionEffort.failure();\n };\n reader.readAsDataURL(originalImage);\n return insertionEffort;\n },\n _dataUriToBlob: function(dataUri) {\n \"use strict\";\n var byteString, mimeString, arrayBuffer, intArray;\n if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n byteString = atob(dataUri.split(\",\")[1]);\n } else {\n byteString = decodeURI(dataUri.split(\",\")[1]);\n }\n mimeString = dataUri.split(\",\")[0].split(\":\")[1].split(\";\")[0];\n arrayBuffer = new ArrayBuffer(byteString.length);\n intArray = new Uint8Array(arrayBuffer);\n qq.each(byteString, function(idx, character) {\n intArray[idx] = character.charCodeAt(0);\n });\n return this._createBlob(arrayBuffer, mimeString);\n },\n _createBlob: function(data, mime) {\n \"use strict\";\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder();\n if (blobBuilder) {\n blobBuilder.append(data);\n return blobBuilder.getBlob(mime);\n } else {\n return new Blob([ data ], {\n type: mime\n });\n }\n }\n });\n qq.ExifRestorer = function() {\n var ExifRestorer = {};\n ExifRestorer.KEY_STR = \"ABCDEFGHIJKLMNOP\" + \"QRSTUVWXYZabcdef\" + \"ghijklmnopqrstuv\" + \"wxyz0123456789+/\" + \"=\";\n ExifRestorer.encode64 = function(input) {\n var output = \"\", chr1, chr2, chr3 = \"\", enc1, enc2, enc3, enc4 = \"\", i = 0;\n do {\n chr1 = input[i++];\n chr2 = input[i++];\n chr3 = input[i++];\n enc1 = chr1 >> 2;\n enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n enc4 = chr3 & 63;\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n } while (i < input.length);\n return output;\n };\n ExifRestorer.restore = function(origFileBase64, resizedFileBase64) {\n var expectedBase64Header = \"data:image/jpeg;base64,\";\n if (!origFileBase64.match(expectedBase64Header)) {\n return resizedFileBase64;\n }\n var rawImage = this.decode64(origFileBase64.replace(expectedBase64Header, \"\"));\n var segments = this.slice2Segments(rawImage);\n var image = this.exifManipulation(resizedFileBase64, segments);\n return expectedBase64Header + this.encode64(image);\n };\n ExifRestorer.exifManipulation = function(resizedFileBase64, segments) {\n var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray), aBuffer = new Uint8Array(newImageArray);\n return aBuffer;\n };\n ExifRestorer.getExifArray = function(segments) {\n var seg;\n for (var x = 0; x < segments.length; x++) {\n seg = segments[x];\n if (seg[0] == 255 & seg[1] == 225) {\n return seg;\n }\n }\n return [];\n };\n ExifRestorer.insertExif = function(resizedFileBase64, exifArray) {\n var imageData = resizedFileBase64.replace(\"data:image/jpeg;base64,\", \"\"), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;\n array = array.concat(exifArray);\n array = array.concat(ato);\n return array;\n };\n ExifRestorer.slice2Segments = function(rawImageArray) {\n var head = 0, segments = [];\n while (1) {\n if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 218) {\n break;\n }\n if (rawImageArray[head] == 255 & rawImageArray[head + 1] == 216) {\n head += 2;\n } else {\n var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3], endPoint = head + length + 2, seg = rawImageArray.slice(head, endPoint);\n segments.push(seg);\n head = endPoint;\n }\n if (head > rawImageArray.length) {\n break;\n }\n }\n return segments;\n };\n ExifRestorer.decode64 = function(input) {\n var output = \"\", chr1, chr2, chr3 = \"\", enc1, enc2, enc3, enc4 = \"\", i = 0, buf = [];\n var base64test = /[^A-Za-z0-9\\+\\/\\=]/g;\n if (base64test.exec(input)) {\n throw new Error(\"There were invalid base64 characters in the input text. \" + \"Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\");\n }\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n do {\n enc1 = this.KEY_STR.indexOf(input.charAt(i++));\n enc2 = this.KEY_STR.indexOf(input.charAt(i++));\n enc3 = this.KEY_STR.indexOf(input.charAt(i++));\n enc4 = this.KEY_STR.indexOf(input.charAt(i++));\n chr1 = enc1 << 2 | enc2 >> 4;\n chr2 = (enc2 & 15) << 4 | enc3 >> 2;\n chr3 = (enc3 & 3) << 6 | enc4;\n buf.push(chr1);\n if (enc3 != 64) {\n buf.push(chr2);\n }\n if (enc4 != 64) {\n buf.push(chr3);\n }\n chr1 = chr2 = chr3 = \"\";\n enc1 = enc2 = enc3 = enc4 = \"\";\n } while (i < input.length);\n return buf;\n };\n return ExifRestorer;\n }();\n qq.TotalProgress = function(callback, getSize) {\n \"use strict\";\n var perFileProgress = {}, totalLoaded = 0, totalSize = 0, lastLoadedSent = -1, lastTotalSent = -1, callbackProxy = function(loaded, total) {\n if (loaded !== lastLoadedSent || total !== lastTotalSent) {\n callback(loaded, total);\n }\n lastLoadedSent = loaded;\n lastTotalSent = total;\n }, noRetryableFiles = function(failed, retryable) {\n var none = true;\n qq.each(failed, function(idx, failedId) {\n if (qq.indexOf(retryable, failedId) >= 0) {\n none = false;\n return false;\n }\n });\n return none;\n }, onCancel = function(id) {\n updateTotalProgress(id, -1, -1);\n delete perFileProgress[id];\n }, onAllComplete = function(successful, failed, retryable) {\n if (failed.length === 0 || noRetryableFiles(failed, retryable)) {\n callbackProxy(totalSize, totalSize);\n this.reset();\n }\n }, onNew = function(id) {\n var size = getSize(id);\n if (size > 0) {\n updateTotalProgress(id, 0, size);\n perFileProgress[id] = {\n loaded: 0,\n total: size\n };\n }\n }, updateTotalProgress = function(id, newLoaded, newTotal) {\n var oldLoaded = perFileProgress[id] ? perFileProgress[id].loaded : 0, oldTotal = perFileProgress[id] ? perFileProgress[id].total : 0;\n if (newLoaded === -1 && newTotal === -1) {\n totalLoaded -= oldLoaded;\n totalSize -= oldTotal;\n } else {\n if (newLoaded) {\n totalLoaded += newLoaded - oldLoaded;\n }\n if (newTotal) {\n totalSize += newTotal - oldTotal;\n }\n }\n callbackProxy(totalLoaded, totalSize);\n };\n qq.extend(this, {\n onAllComplete: onAllComplete,\n onStatusChange: function(id, oldStatus, newStatus) {\n if (newStatus === qq.status.CANCELED || newStatus === qq.status.REJECTED) {\n onCancel(id);\n } else if (newStatus === qq.status.SUBMITTING) {\n onNew(id);\n }\n },\n onIndividualProgress: function(id, loaded, total) {\n updateTotalProgress(id, loaded, total);\n perFileProgress[id] = {\n loaded: loaded,\n total: total\n };\n },\n onNewSize: function(id) {\n onNew(id);\n },\n reset: function() {\n perFileProgress = {};\n totalLoaded = 0;\n totalSize = 0;\n }\n });\n };\n qq.PasteSupport = function(o) {\n \"use strict\";\n var options, detachPasteHandler;\n options = {\n targetElement: null,\n callbacks: {\n log: function(message, level) {},\n pasteReceived: function(blob) {}\n }\n };\n function isImage(item) {\n return item.type && item.type.indexOf(\"image/\") === 0;\n }\n function registerPasteHandler() {\n detachPasteHandler = qq(options.targetElement).attach(\"paste\", function(event) {\n var clipboardData = event.clipboardData;\n if (clipboardData) {\n qq.each(clipboardData.items, function(idx, item) {\n if (isImage(item)) {\n var blob = item.getAsFile();\n options.callbacks.pasteReceived(blob);\n }\n });\n }\n });\n }\n function unregisterPasteHandler() {\n if (detachPasteHandler) {\n detachPasteHandler();\n }\n }\n qq.extend(options, o);\n registerPasteHandler();\n qq.extend(this, {\n reset: function() {\n unregisterPasteHandler();\n }\n });\n };\n qq.FormSupport = function(options, startUpload, log) {\n \"use strict\";\n var self = this, interceptSubmit = options.interceptSubmit, formEl = options.element, autoUpload = options.autoUpload;\n qq.extend(this, {\n newEndpoint: null,\n newAutoUpload: autoUpload,\n attachedToForm: false,\n getFormInputsAsObject: function() {\n if (formEl == null) {\n return null;\n }\n return self._form2Obj(formEl);\n }\n });\n function determineNewEndpoint(formEl) {\n if (formEl.getAttribute(\"action\")) {\n self.newEndpoint = formEl.getAttribute(\"action\");\n }\n }\n function validateForm(formEl, nativeSubmit) {\n if (formEl.checkValidity && !formEl.checkValidity()) {\n log(\"Form did not pass validation checks - will not upload.\", \"error\");\n nativeSubmit();\n } else {\n return true;\n }\n }\n function maybeUploadOnSubmit(formEl) {\n var nativeSubmit = formEl.submit;\n qq(formEl).attach(\"submit\", function(event) {\n event = event || window.event;\n if (event.preventDefault) {\n event.preventDefault();\n } else {\n event.returnValue = false;\n }\n validateForm(formEl, nativeSubmit) && startUpload();\n });\n formEl.submit = function() {\n validateForm(formEl, nativeSubmit) && startUpload();\n };\n }\n function determineFormEl(formEl) {\n if (formEl) {\n if (qq.isString(formEl)) {\n formEl = document.getElementById(formEl);\n }\n if (formEl) {\n log(\"Attaching to form element.\");\n determineNewEndpoint(formEl);\n interceptSubmit && maybeUploadOnSubmit(formEl);\n }\n }\n return formEl;\n }\n formEl = determineFormEl(formEl);\n this.attachedToForm = !!formEl;\n };\n qq.extend(qq.FormSupport.prototype, {\n _form2Obj: function(form) {\n \"use strict\";\n var obj = {}, notIrrelevantType = function(type) {\n var irrelevantTypes = [ \"button\", \"image\", \"reset\", \"submit\" ];\n return qq.indexOf(irrelevantTypes, type.toLowerCase()) < 0;\n }, radioOrCheckbox = function(type) {\n return qq.indexOf([ \"checkbox\", \"radio\" ], type.toLowerCase()) >= 0;\n }, ignoreValue = function(el) {\n if (radioOrCheckbox(el.type) && !el.checked) {\n return true;\n }\n return el.disabled && el.type.toLowerCase() !== \"hidden\";\n }, selectValue = function(select) {\n var value = null;\n qq.each(qq(select).children(), function(idx, child) {\n if (child.tagName.toLowerCase() === \"option\" && child.selected) {\n value = child.value;\n return false;\n }\n });\n return value;\n };\n qq.each(form.elements, function(idx, el) {\n if ((qq.isInput(el, true) || el.tagName.toLowerCase() === \"textarea\") && notIrrelevantType(el.type) && !ignoreValue(el)) {\n obj[el.name] = el.value;\n } else if (el.tagName.toLowerCase() === \"select\" && !ignoreValue(el)) {\n var value = selectValue(el);\n if (value !== null) {\n obj[el.name] = value;\n }\n }\n });\n return obj;\n }\n });\n qq.traditional = qq.traditional || {};\n qq.traditional.FormUploadHandler = function(options, proxy) {\n \"use strict\";\n var handler = this, getName = proxy.getName, getUuid = proxy.getUuid, log = proxy.log;\n function getIframeContentJson(id, iframe) {\n var response, doc, innerHtml;\n try {\n doc = iframe.contentDocument || iframe.contentWindow.document;\n innerHtml = doc.body.innerHTML;\n log(\"converting iframe's innerHTML to JSON\");\n log(\"innerHTML = \" + innerHtml);\n if (innerHtml && innerHtml.match(/^<pre/i)) {\n innerHtml = doc.body.firstChild.firstChild.nodeValue;\n }\n response = handler._parseJsonResponse(innerHtml);\n } catch (error) {\n log(\"Error when attempting to parse form upload response (\" + error.message + \")\", \"error\");\n response = {\n success: false\n };\n }\n return response;\n }\n function createForm(id, iframe) {\n var params = options.paramsStore.get(id), method = options.method.toLowerCase() === \"get\" ? \"GET\" : \"POST\", endpoint = options.endpointStore.get(id), name = getName(id);\n params[options.uuidName] = getUuid(id);\n params[options.filenameParam] = name;\n return handler._initFormForUpload({\n method: method,\n endpoint: endpoint,\n params: params,\n paramsInBody: options.paramsInBody,\n targetName: iframe.name\n });\n }\n this.uploadFile = function(id) {\n var input = handler.getInput(id), iframe = handler._createIframe(id), promise = new qq.Promise(), form;\n form = createForm(id, iframe);\n form.appendChild(input);\n handler._attachLoadEvent(iframe, function(responseFromMessage) {\n log(\"iframe loaded\");\n var response = responseFromMessage ? responseFromMessage : getIframeContentJson(id, iframe);\n handler._detachLoadEvent(id);\n if (!options.cors.expected) {\n qq(iframe).remove();\n }\n if (response.success) {\n promise.success(response);\n } else {\n promise.failure(response);\n }\n });\n log(\"Sending upload request for \" + id);\n form.submit();\n qq(form).remove();\n return promise;\n };\n qq.extend(this, new qq.FormUploadHandler({\n options: {\n isCors: options.cors.expected,\n inputName: options.inputName\n },\n proxy: {\n onCancel: options.onCancel,\n getName: getName,\n getUuid: getUuid,\n log: log\n }\n }));\n };\n qq.traditional = qq.traditional || {};\n qq.traditional.XhrUploadHandler = function(spec, proxy) {\n \"use strict\";\n var handler = this, getName = proxy.getName, getSize = proxy.getSize, getUuid = proxy.getUuid, log = proxy.log, multipart = spec.forceMultipart || spec.paramsInBody, addChunkingSpecificParams = function(id, params, chunkData) {\n var size = getSize(id), name = getName(id);\n if (!spec.omitDefaultParams) {\n params[spec.chunking.paramNames.partIndex] = chunkData.part;\n params[spec.chunking.paramNames.partByteOffset] = chunkData.start;\n params[spec.chunking.paramNames.chunkSize] = chunkData.size;\n params[spec.chunking.paramNames.totalParts] = chunkData.count;\n params[spec.totalFileSizeName] = size;\n }\n if (multipart && !spec.omitDefaultParams) {\n params[spec.filenameParam] = name;\n }\n }, allChunksDoneRequester = new qq.traditional.AllChunksDoneAjaxRequester({\n cors: spec.cors,\n endpoint: spec.chunking.success.endpoint,\n headers: spec.chunking.success.headers,\n jsonPayload: spec.chunking.success.jsonPayload,\n log: log,\n method: spec.chunking.success.method,\n params: spec.chunking.success.params\n }), createReadyStateChangedHandler = function(id, xhr) {\n var promise = new qq.Promise();\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n var result = onUploadOrChunkComplete(id, xhr);\n if (result.success) {\n promise.success(result.response, xhr);\n } else {\n promise.failure(result.response, xhr);\n }\n }\n };\n return promise;\n }, getChunksCompleteParams = function(id) {\n var params = spec.paramsStore.get(id), name = getName(id), size = getSize(id);\n params[spec.uuidName] = getUuid(id);\n params[spec.filenameParam] = name;\n params[spec.totalFileSizeName] = size;\n params[spec.chunking.paramNames.totalParts] = handler._getTotalChunks(id);\n return params;\n }, isErrorUploadResponse = function(xhr, response) {\n return qq.indexOf([ 200, 201, 202, 203, 204 ], xhr.status) < 0 || spec.requireSuccessJson && !response.success || response.reset;\n }, onUploadOrChunkComplete = function(id, xhr) {\n var response;\n log(\"xhr - server response received for \" + id);\n log(\"responseText = \" + xhr.responseText);\n response = parseResponse(true, xhr);\n return {\n success: !isErrorUploadResponse(xhr, response),\n response: response\n };\n }, parseResponse = function(upload, xhr) {\n var response = {};\n try {\n log(qq.format(\"Received response status {} with body: {}\", xhr.status, xhr.responseText));\n response = qq.parseJson(xhr.responseText);\n } catch (error) {\n upload && spec.requireSuccessJson && log(\"Error when attempting to parse xhr response text (\" + error.message + \")\", \"error\");\n }\n return response;\n }, sendChunksCompleteRequest = function(id) {\n var promise = new qq.Promise();\n allChunksDoneRequester.complete(id, handler._createXhr(id), getChunksCompleteParams(id), spec.customHeaders.get(id)).then(function(xhr) {\n promise.success(parseResponse(false, xhr), xhr);\n }, function(xhr) {\n promise.failure(parseResponse(false, xhr), xhr);\n });\n return promise;\n }, setParamsAndGetEntityToSend = function(entityToSendParams) {\n var fileOrBlob = entityToSendParams.fileOrBlob;\n var id = entityToSendParams.id;\n var xhr = entityToSendParams.xhr;\n var xhrOverrides = entityToSendParams.xhrOverrides || {};\n var customParams = entityToSendParams.customParams || {};\n var defaultParams = entityToSendParams.params || {};\n var xhrOverrideParams = xhrOverrides.params || {};\n var params;\n var formData = multipart ? new FormData() : null, method = xhrOverrides.method || spec.method, endpoint = xhrOverrides.endpoint || spec.endpointStore.get(id), name = getName(id), size = getSize(id);\n if (spec.omitDefaultParams) {\n params = qq.extend({}, customParams);\n qq.extend(params, xhrOverrideParams);\n } else {\n params = qq.extend({}, customParams);\n qq.extend(params, xhrOverrideParams);\n qq.extend(params, defaultParams);\n params[spec.uuidName] = getUuid(id);\n params[spec.filenameParam] = name;\n if (multipart) {\n params[spec.totalFileSizeName] = size;\n } else if (!spec.paramsInBody) {\n params[spec.inputName] = name;\n }\n }\n if (!spec.paramsInBody) {\n endpoint = qq.obj2url(params, endpoint);\n }\n xhr.open(method, endpoint, true);\n if (spec.cors.expected && spec.cors.sendCredentials) {\n xhr.withCredentials = true;\n }\n if (multipart) {\n if (spec.paramsInBody) {\n qq.obj2FormData(params, formData);\n }\n formData.append(spec.inputName, fileOrBlob);\n return formData;\n }\n return fileOrBlob;\n }, setUploadHeaders = function(headersOptions) {\n var headerOverrides = headersOptions.headerOverrides;\n var id = headersOptions.id;\n var xhr = headersOptions.xhr;\n if (headerOverrides) {\n qq.each(headerOverrides, function(headerName, headerValue) {\n xhr.setRequestHeader(headerName, headerValue);\n });\n } else {\n var extraHeaders = spec.customHeaders.get(id), fileOrBlob = handler.getFile(id);\n xhr.setRequestHeader(\"Accept\", \"application/json\");\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n if (!multipart) {\n xhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\n xhr.setRequestHeader(\"X-Mime-Type\", fileOrBlob.type);\n }\n qq.each(extraHeaders, function(name, val) {\n xhr.setRequestHeader(name, val);\n });\n }\n };\n qq.extend(this, {\n uploadChunk: function(uploadChunkParams) {\n var id = uploadChunkParams.id;\n var chunkIdx = uploadChunkParams.chunkIdx;\n var overrides = uploadChunkParams.overrides || {};\n var resuming = uploadChunkParams.resuming;\n var chunkData = handler._getChunkData(id, chunkIdx), xhr = handler._createXhr(id, chunkIdx), promise, toSend, customParams, params = {};\n promise = createReadyStateChangedHandler(id, xhr);\n handler._registerProgressHandler(id, chunkIdx, chunkData.size);\n customParams = spec.paramsStore.get(id);\n addChunkingSpecificParams(id, params, chunkData);\n if (resuming) {\n params[spec.resume.paramNames.resuming] = true;\n }\n toSend = setParamsAndGetEntityToSend({\n fileOrBlob: chunkData.blob,\n id: id,\n customParams: customParams,\n params: params,\n xhr: xhr,\n xhrOverrides: overrides\n });\n setUploadHeaders({\n headerOverrides: overrides.headers,\n id: id,\n xhr: xhr\n });\n xhr.send(toSend);\n return promise;\n },\n uploadFile: function(id) {\n var fileOrBlob = handler.getFile(id), promise, xhr, customParams, toSend;\n xhr = handler._createXhr(id);\n handler._registerProgressHandler(id);\n promise = createReadyStateChangedHandler(id, xhr);\n customParams = spec.paramsStore.get(id);\n toSend = setParamsAndGetEntityToSend({\n fileOrBlob: fileOrBlob,\n id: id,\n customParams: customParams,\n xhr: xhr\n });\n setUploadHeaders({\n id: id,\n xhr: xhr\n });\n xhr.send(toSend);\n return promise;\n }\n });\n qq.extend(this, new qq.XhrUploadHandler({\n options: qq.extend({\n namespace: \"traditional\"\n }, spec),\n proxy: qq.extend({\n getEndpoint: spec.endpointStore.get\n }, proxy)\n }));\n qq.override(this, function(super_) {\n return {\n finalizeChunks: function(id) {\n proxy.onFinalizing(id);\n if (spec.chunking.success.endpoint) {\n return sendChunksCompleteRequest(id);\n } else {\n return super_.finalizeChunks(id, qq.bind(parseResponse, this, true));\n }\n }\n };\n });\n };\n qq.traditional.AllChunksDoneAjaxRequester = function(o) {\n \"use strict\";\n var requester, options = {\n cors: {\n allowXdr: false,\n expected: false,\n sendCredentials: false\n },\n endpoint: null,\n log: function(str, level) {},\n method: \"POST\"\n }, promises = {}, endpointHandler = {\n get: function(id) {\n if (qq.isFunction(options.endpoint)) {\n return options.endpoint(id);\n }\n return options.endpoint;\n }\n };\n qq.extend(options, o);\n requester = qq.extend(this, new qq.AjaxRequester({\n acceptHeader: \"application/json\",\n contentType: options.jsonPayload ? \"application/json\" : \"application/x-www-form-urlencoded\",\n validMethods: [ options.method ],\n method: options.method,\n endpointStore: endpointHandler,\n allowXRequestedWithAndCacheControl: false,\n cors: options.cors,\n log: options.log,\n onComplete: function(id, xhr, isError) {\n var promise = promises[id];\n delete promises[id];\n if (isError) {\n promise.failure(xhr);\n } else {\n promise.success(xhr);\n }\n }\n }));\n qq.extend(this, {\n complete: function(id, xhr, params, headers) {\n var promise = new qq.Promise();\n options.log(\"Submitting All Chunks Done request for \" + id);\n promises[id] = promise;\n requester.initTransport(id).withParams(options.params(id) || params).withHeaders(options.headers(id) || headers).send(xhr);\n return promise;\n }\n });\n };\n qq.DragAndDrop = function(o) {\n \"use strict\";\n var options, HIDE_ZONES_EVENT_NAME = \"qq-hidezones\", HIDE_BEFORE_ENTER_ATTR = \"qq-hide-dropzone\", uploadDropZones = [], droppedFiles = [], disposeSupport = new qq.DisposeSupport();\n options = {\n dropZoneElements: [],\n allowMultipleItems: true,\n classes: {\n dropActive: null\n },\n callbacks: new qq.DragAndDrop.callbacks()\n };\n qq.extend(options, o, true);\n function uploadDroppedFiles(files, uploadDropZone) {\n var filesAsArray = Array.prototype.slice.call(files);\n options.callbacks.dropLog(\"Grabbed \" + files.length + \" dropped files.\");\n uploadDropZone.dropDisabled(false);\n options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement());\n }\n function traverseFileTree(entry) {\n var parseEntryPromise = new qq.Promise();\n if (entry.isFile) {\n entry.file(function(file) {\n file.qqPath = extractDirectoryPath(entry);\n droppedFiles.push(file);\n parseEntryPromise.success();\n }, function(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n });\n } else if (entry.isDirectory) {\n getFilesInDirectory(entry).then(function allEntriesRead(entries) {\n var entriesLeft = entries.length;\n qq.each(entries, function(idx, entry) {\n traverseFileTree(entry).done(function() {\n entriesLeft -= 1;\n if (entriesLeft === 0) {\n parseEntryPromise.success();\n }\n });\n });\n if (!entries.length) {\n parseEntryPromise.success();\n }\n }, function readFailure(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n });\n }\n return parseEntryPromise;\n }\n function extractDirectoryPath(entry) {\n var name = entry.name, fullPath = entry.fullPath, indexOfNameInFullPath = fullPath.lastIndexOf(name);\n fullPath = fullPath.substr(0, indexOfNameInFullPath);\n if (fullPath.charAt(0) === \"/\") {\n fullPath = fullPath.substr(1);\n }\n return fullPath;\n }\n function getFilesInDirectory(entry, reader, accumEntries, existingPromise) {\n var promise = existingPromise || new qq.Promise(), dirReader = reader || entry.createReader();\n dirReader.readEntries(function readSuccess(entries) {\n var newEntries = accumEntries ? accumEntries.concat(entries) : entries;\n if (entries.length) {\n setTimeout(function() {\n getFilesInDirectory(entry, dirReader, newEntries, promise);\n }, 0);\n } else {\n promise.success(newEntries);\n }\n }, promise.failure);\n return promise;\n }\n function handleDataTransfer(dataTransfer, uploadDropZone) {\n var pendingFolderPromises = [], handleDataTransferPromise = new qq.Promise();\n options.callbacks.processingDroppedFiles();\n uploadDropZone.dropDisabled(true);\n if (dataTransfer.files.length > 1 && !options.allowMultipleItems) {\n options.callbacks.processingDroppedFilesComplete([]);\n options.callbacks.dropError(\"tooManyFilesError\", \"\");\n uploadDropZone.dropDisabled(false);\n handleDataTransferPromise.failure();\n } else {\n droppedFiles = [];\n if (qq.isFolderDropSupported(dataTransfer)) {\n qq.each(dataTransfer.items, function(idx, item) {\n var entry = item.webkitGetAsEntry();\n if (entry) {\n if (entry.isFile) {\n droppedFiles.push(item.getAsFile());\n } else {\n pendingFolderPromises.push(traverseFileTree(entry).done(function() {\n pendingFolderPromises.pop();\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }));\n }\n }\n });\n } else {\n droppedFiles = dataTransfer.files;\n }\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }\n return handleDataTransferPromise;\n }\n function setupDropzone(dropArea) {\n var dropZone = new qq.UploadDropZone({\n HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME,\n element: dropArea,\n onEnter: function(e) {\n qq(dropArea).addClass(options.classes.dropActive);\n e.stopPropagation();\n },\n onLeaveNotDescendants: function(e) {\n qq(dropArea).removeClass(options.classes.dropActive);\n },\n onDrop: function(e) {\n handleDataTransfer(e.dataTransfer, dropZone).then(function() {\n uploadDroppedFiles(droppedFiles, dropZone);\n }, function() {\n options.callbacks.dropLog(\"Drop event DataTransfer parsing failed. No files will be uploaded.\", \"error\");\n });\n }\n });\n disposeSupport.addDisposer(function() {\n dropZone.dispose();\n });\n qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide();\n uploadDropZones.push(dropZone);\n return dropZone;\n }\n function isFileDrag(dragEvent) {\n var fileDrag;\n qq.each(dragEvent.dataTransfer.types, function(key, val) {\n if (val === \"Files\") {\n fileDrag = true;\n return false;\n }\n });\n return fileDrag;\n }\n function leavingDocumentOut(e) {\n if (qq.safari()) {\n return e.x < 0 || e.y < 0;\n }\n return e.x === 0 && e.y === 0;\n }\n function setupDragDrop() {\n var dropZones = options.dropZoneElements, maybeHideDropZones = function() {\n setTimeout(function() {\n qq.each(dropZones, function(idx, dropZone) {\n qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();\n qq(dropZone).removeClass(options.classes.dropActive);\n });\n }, 10);\n };\n qq.each(dropZones, function(idx, dropZone) {\n var uploadDropZone = setupDropzone(dropZone);\n if (dropZones.length && qq.supportedFeatures.fileDrop) {\n disposeSupport.attach(document, \"dragenter\", function(e) {\n if (!uploadDropZone.dropDisabled() && isFileDrag(e)) {\n qq.each(dropZones, function(idx, dropZone) {\n if (dropZone instanceof HTMLElement && qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR)) {\n qq(dropZone).css({\n display: \"block\"\n });\n }\n });\n }\n });\n }\n });\n disposeSupport.attach(document, \"dragleave\", function(e) {\n if (leavingDocumentOut(e)) {\n maybeHideDropZones();\n }\n });\n disposeSupport.attach(qq(document).children()[0], \"mouseenter\", function(e) {\n maybeHideDropZones();\n });\n disposeSupport.attach(document, \"drop\", function(e) {\n if (isFileDrag(e)) {\n e.preventDefault();\n maybeHideDropZones();\n }\n });\n disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, maybeHideDropZones);\n }\n setupDragDrop();\n qq.extend(this, {\n setupExtraDropzone: function(element) {\n options.dropZoneElements.push(element);\n setupDropzone(element);\n },\n removeDropzone: function(element) {\n var i, dzs = options.dropZoneElements;\n for (i in dzs) {\n if (dzs[i] === element) {\n return dzs.splice(i, 1);\n }\n }\n },\n dispose: function() {\n disposeSupport.dispose();\n qq.each(uploadDropZones, function(idx, dropZone) {\n dropZone.dispose();\n });\n }\n });\n this._testing = {};\n this._testing.extractDirectoryPath = extractDirectoryPath;\n };\n qq.DragAndDrop.callbacks = function() {\n \"use strict\";\n return {\n processingDroppedFiles: function() {},\n processingDroppedFilesComplete: function(files, targetEl) {},\n dropError: function(code, errorSpecifics) {\n qq.log(\"Drag & drop error code '\" + code + \" with these specifics: '\" + errorSpecifics + \"'\", \"error\");\n },\n dropLog: function(message, level) {\n qq.log(message, level);\n }\n };\n };\n qq.UploadDropZone = function(o) {\n \"use strict\";\n var disposeSupport = new qq.DisposeSupport(), options, element, preventDrop, dropOutsideDisabled;\n options = {\n element: null,\n onEnter: function(e) {},\n onLeave: function(e) {},\n onLeaveNotDescendants: function(e) {},\n onDrop: function(e) {}\n };\n qq.extend(options, o);\n element = options.element;\n function dragoverShouldBeCanceled() {\n return qq.safari() || qq.firefox() && qq.windows();\n }\n function disableDropOutside(e) {\n if (!dropOutsideDisabled) {\n if (dragoverShouldBeCanceled) {\n disposeSupport.attach(document, \"dragover\", function(e) {\n e.preventDefault();\n });\n } else {\n disposeSupport.attach(document, \"dragover\", function(e) {\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"none\";\n e.preventDefault();\n }\n });\n }\n dropOutsideDisabled = true;\n }\n }\n function isValidFileDrag(e) {\n if (!qq.supportedFeatures.fileDrop) {\n return false;\n }\n var effectTest, dt = e.dataTransfer, isSafari = qq.safari();\n effectTest = qq.ie() && qq.supportedFeatures.fileDrop ? true : dt.effectAllowed !== \"none\";\n return dt && effectTest && (dt.files && dt.files.length || !isSafari && dt.types.contains && dt.types.contains(\"Files\") || dt.types.includes && dt.types.includes(\"Files\"));\n }\n function isOrSetDropDisabled(isDisabled) {\n if (isDisabled !== undefined) {\n preventDrop = isDisabled;\n }\n return preventDrop;\n }\n function triggerHidezonesEvent() {\n var hideZonesEvent;\n function triggerUsingOldApi() {\n hideZonesEvent = document.createEvent(\"Event\");\n hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true);\n }\n if (window.CustomEvent) {\n try {\n hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME);\n } catch (err) {\n triggerUsingOldApi();\n }\n } else {\n triggerUsingOldApi();\n }\n document.dispatchEvent(hideZonesEvent);\n }\n function attachEvents() {\n disposeSupport.attach(element, \"dragover\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n var effect = qq.ie() && qq.supportedFeatures.fileDrop ? null : e.dataTransfer.effectAllowed;\n if (effect === \"move\" || effect === \"linkMove\") {\n e.dataTransfer.dropEffect = \"move\";\n } else {\n e.dataTransfer.dropEffect = \"copy\";\n }\n e.stopPropagation();\n e.preventDefault();\n });\n disposeSupport.attach(element, \"dragenter\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n options.onEnter(e);\n }\n });\n disposeSupport.attach(element, \"dragleave\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n options.onLeave(e);\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n if (qq(this).contains(relatedTarget)) {\n return;\n }\n options.onLeaveNotDescendants(e);\n });\n disposeSupport.attach(element, \"drop\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n options.onDrop(e);\n triggerHidezonesEvent();\n }\n });\n }\n disableDropOutside();\n attachEvents();\n qq.extend(this, {\n dropDisabled: function(isDisabled) {\n return isOrSetDropDisabled(isDisabled);\n },\n dispose: function() {\n disposeSupport.dispose();\n },\n getElement: function() {\n return element;\n }\n });\n this._testing = {};\n this._testing.isValidFileDrag = isValidFileDrag;\n };\n (function() {\n \"use strict\";\n qq.uiPublicApi = {\n addInitialFiles: function(cannedFileList) {\n this._parent.prototype.addInitialFiles.apply(this, arguments);\n this._templating.addCacheToDom();\n },\n clearStoredFiles: function() {\n this._parent.prototype.clearStoredFiles.apply(this, arguments);\n this._templating.clearFiles();\n },\n addExtraDropzone: function(element) {\n this._dnd && this._dnd.setupExtraDropzone(element);\n },\n removeExtraDropzone: function(element) {\n if (this._dnd) {\n return this._dnd.removeDropzone(element);\n }\n },\n getItemByFileId: function(id) {\n if (!this._templating.isHiddenForever(id)) {\n return this._templating.getFileContainer(id);\n }\n },\n reset: function() {\n this._parent.prototype.reset.apply(this, arguments);\n this._templating.reset();\n if (!this._options.button && this._templating.getButton()) {\n this._defaultButtonId = this._createUploadButton({\n element: this._templating.getButton(),\n title: this._options.text.fileInputTitle\n }).getButtonId();\n }\n if (this._dnd) {\n this._dnd.dispose();\n this._dnd = this._setupDragAndDrop();\n }\n this._totalFilesInBatch = 0;\n this._filesInBatchAddedToUi = 0;\n this._setupClickAndEditEventHandlers();\n },\n setName: function(id, newName) {\n var formattedFilename = this._options.formatFileName(newName);\n this._parent.prototype.setName.apply(this, arguments);\n this._templating.updateFilename(id, formattedFilename);\n },\n pauseUpload: function(id) {\n var paused = this._parent.prototype.pauseUpload.apply(this, arguments);\n paused && this._templating.uploadPaused(id);\n return paused;\n },\n continueUpload: function(id) {\n var continued = this._parent.prototype.continueUpload.apply(this, arguments);\n continued && this._templating.uploadContinued(id);\n return continued;\n },\n getId: function(fileContainerOrChildEl) {\n return this._templating.getFileId(fileContainerOrChildEl);\n },\n getDropTarget: function(fileId) {\n var file = this.getFile(fileId);\n return file.qqDropTarget;\n }\n };\n qq.uiPrivateApi = {\n _getButton: function(buttonId) {\n var button = this._parent.prototype._getButton.apply(this, arguments);\n if (!button) {\n if (buttonId === this._defaultButtonId) {\n button = this._templating.getButton();\n }\n }\n return button;\n },\n _removeFileItem: function(fileId) {\n this._templating.removeFile(fileId);\n },\n _setupClickAndEditEventHandlers: function() {\n this._fileButtonsClickHandler = qq.FileButtonsClickHandler && this._bindFileButtonsClickEvent();\n this._focusinEventSupported = !qq.firefox();\n if (this._isEditFilenameEnabled()) {\n this._filenameClickHandler = this._bindFilenameClickEvent();\n this._filenameInputFocusInHandler = this._bindFilenameInputFocusInEvent();\n this._filenameInputFocusHandler = this._bindFilenameInputFocusEvent();\n }\n },\n _setupDragAndDrop: function() {\n var self = this, dropZoneElements = this._options.dragAndDrop.extraDropzones, templating = this._templating, defaultDropZone = templating.getDropZone();\n defaultDropZone && dropZoneElements.push(defaultDropZone);\n return new qq.DragAndDrop({\n dropZoneElements: dropZoneElements,\n allowMultipleItems: this._options.multiple,\n classes: {\n dropActive: this._options.classes.dropActive\n },\n callbacks: {\n processingDroppedFiles: function() {\n templating.showDropProcessing();\n },\n processingDroppedFilesComplete: function(files, targetEl) {\n templating.hideDropProcessing();\n qq.each(files, function(idx, file) {\n file.qqDropTarget = targetEl;\n });\n if (files.length) {\n self.addFiles(files, null, null);\n }\n },\n dropError: function(code, errorData) {\n self._itemError(code, errorData);\n },\n dropLog: function(message, level) {\n self.log(message, level);\n }\n }\n });\n },\n _bindFileButtonsClickEvent: function() {\n var self = this;\n return new qq.FileButtonsClickHandler({\n templating: this._templating,\n log: function(message, lvl) {\n self.log(message, lvl);\n },\n onDeleteFile: function(fileId) {\n self.deleteFile(fileId);\n },\n onCancel: function(fileId) {\n self.cancel(fileId);\n },\n onRetry: function(fileId) {\n self.retry(fileId);\n },\n onPause: function(fileId) {\n self.pauseUpload(fileId);\n },\n onContinue: function(fileId) {\n self.continueUpload(fileId);\n },\n onGetName: function(fileId) {\n return self.getName(fileId);\n }\n });\n },\n _isEditFilenameEnabled: function() {\n return this._templating.isEditFilenamePossible() && !this._options.autoUpload && qq.FilenameClickHandler && qq.FilenameInputFocusHandler && qq.FilenameInputFocusHandler;\n },\n _filenameEditHandler: function() {\n var self = this, templating = this._templating;\n return {\n templating: templating,\n log: function(message, lvl) {\n self.log(message, lvl);\n },\n onGetUploadStatus: function(fileId) {\n return self.getUploads({\n id: fileId\n }).status;\n },\n onGetName: function(fileId) {\n return self.getName(fileId);\n },\n onSetName: function(id, newName) {\n self.setName(id, newName);\n },\n onEditingStatusChange: function(id, isEditing) {\n var qqInput = qq(templating.getEditInput(id)), qqFileContainer = qq(templating.getFileContainer(id));\n if (isEditing) {\n qqInput.addClass(\"qq-editing\");\n templating.hideFilename(id);\n templating.hideEditIcon(id);\n } else {\n qqInput.removeClass(\"qq-editing\");\n templating.showFilename(id);\n templating.showEditIcon(id);\n }\n qqFileContainer.addClass(\"qq-temp\").removeClass(\"qq-temp\");\n }\n };\n },\n _onUploadStatusChange: function(id, oldStatus, newStatus) {\n this._parent.prototype._onUploadStatusChange.apply(this, arguments);\n if (this._isEditFilenameEnabled()) {\n if (this._templating.getFileContainer(id) && newStatus !== qq.status.SUBMITTED) {\n this._templating.markFilenameEditable(id);\n this._templating.hideEditIcon(id);\n }\n }\n if (oldStatus === qq.status.UPLOAD_RETRYING && newStatus === qq.status.UPLOADING) {\n this._templating.hideRetry(id);\n this._templating.setStatusText(id);\n qq(this._templating.getFileContainer(id)).removeClass(this._classes.retrying);\n } else if (newStatus === qq.status.UPLOAD_FAILED) {\n this._templating.hidePause(id);\n }\n },\n _bindFilenameInputFocusInEvent: function() {\n var spec = qq.extend({}, this._filenameEditHandler());\n return new qq.FilenameInputFocusInHandler(spec);\n },\n _bindFilenameInputFocusEvent: function() {\n var spec = qq.extend({}, this._filenameEditHandler());\n return new qq.FilenameInputFocusHandler(spec);\n },\n _bindFilenameClickEvent: function() {\n var spec = qq.extend({}, this._filenameEditHandler());\n return new qq.FilenameClickHandler(spec);\n },\n _storeForLater: function(id) {\n this._parent.prototype._storeForLater.apply(this, arguments);\n this._templating.hideSpinner(id);\n },\n _onAllComplete: function(successful, failed) {\n this._parent.prototype._onAllComplete.apply(this, arguments);\n this._templating.resetTotalProgress();\n },\n _onSubmit: function(id, name) {\n var file = this.getFile(id);\n if (file && file.qqPath && this._options.dragAndDrop.reportDirectoryPaths) {\n this._paramsStore.addReadOnly(id, {\n qqpath: file.qqPath\n });\n }\n this._parent.prototype._onSubmit.apply(this, arguments);\n this._addToList(id, name);\n },\n _onSubmitted: function(id) {\n if (this._isEditFilenameEnabled()) {\n this._templating.markFilenameEditable(id);\n this._templating.showEditIcon(id);\n if (!this._focusinEventSupported) {\n this._filenameInputFocusHandler.addHandler(this._templating.getEditInput(id));\n }\n }\n },\n _onProgress: function(id, name, loaded, total) {\n this._parent.prototype._onProgress.apply(this, arguments);\n this._templating.updateProgress(id, loaded, total);\n if (total === 0 || Math.round(loaded / total * 100) === 100) {\n this._templating.hideCancel(id);\n this._templating.hidePause(id);\n this._templating.hideProgress(id);\n this._templating.setStatusText(id, this._options.text.waitingForResponse);\n this._displayFileSize(id);\n } else {\n this._displayFileSize(id, loaded, total);\n }\n },\n _onTotalProgress: function(loaded, total) {\n this._parent.prototype._onTotalProgress.apply(this, arguments);\n this._templating.updateTotalProgress(loaded, total);\n },\n _onComplete: function(id, name, result, xhr) {\n var parentRetVal = this._parent.prototype._onComplete.apply(this, arguments), templating = this._templating, fileContainer = templating.getFileContainer(id), self = this;\n function completeUpload(result) {\n if (!fileContainer) {\n return;\n }\n templating.setStatusText(id);\n qq(fileContainer).removeClass(self._classes.retrying);\n templating.hideProgress(id);\n if (self.getUploads({\n id: id\n }).status !== qq.status.UPLOAD_FAILED) {\n templating.hideCancel(id);\n }\n templating.hideSpinner(id);\n if (result.success) {\n self._markFileAsSuccessful(id);\n } else {\n qq(fileContainer).addClass(self._classes.fail);\n templating.showCancel(id);\n if (templating.isRetryPossible() && !self._preventRetries[id]) {\n qq(fileContainer).addClass(self._classes.retryable);\n templating.showRetry(id);\n }\n self._controlFailureTextDisplay(id, result);\n }\n }\n if (parentRetVal instanceof qq.Promise) {\n parentRetVal.done(function(newResult) {\n completeUpload(newResult);\n });\n } else {\n completeUpload(result);\n }\n return parentRetVal;\n },\n _markFileAsSuccessful: function(id) {\n var templating = this._templating;\n if (this._isDeletePossible()) {\n templating.showDeleteButton(id);\n }\n qq(templating.getFileContainer(id)).addClass(this._classes.success);\n this._maybeUpdateThumbnail(id);\n },\n _onUploadPrep: function(id) {\n this._parent.prototype._onUploadPrep.apply(this, arguments);\n this._templating.showSpinner(id);\n },\n _onUpload: function(id, name) {\n var parentRetVal = this._parent.prototype._onUpload.apply(this, arguments);\n this._templating.showSpinner(id);\n return parentRetVal;\n },\n _onUploadChunk: function(id, chunkData) {\n this._parent.prototype._onUploadChunk.apply(this, arguments);\n if (chunkData.partIndex > 0 && this._handler.isResumable(id)) {\n this._templating.allowPause(id);\n }\n },\n _onCancel: function(id, name) {\n this._parent.prototype._onCancel.apply(this, arguments);\n this._removeFileItem(id);\n if (this._getNotFinished() === 0) {\n this._templating.resetTotalProgress();\n }\n },\n _onBeforeAutoRetry: function(id) {\n var retryNumForDisplay, maxAuto, retryNote;\n this._parent.prototype._onBeforeAutoRetry.apply(this, arguments);\n this._showCancelLink(id);\n if (this._options.retry.showAutoRetryNote) {\n retryNumForDisplay = this._autoRetries[id];\n maxAuto = this._options.retry.maxAutoAttempts;\n retryNote = this._options.retry.autoRetryNote.replace(/\\{retryNum\\}/g, retryNumForDisplay);\n retryNote = retryNote.replace(/\\{maxAuto\\}/g, maxAuto);\n this._templating.setStatusText(id, retryNote);\n qq(this._templating.getFileContainer(id)).addClass(this._classes.retrying);\n }\n },\n _onBeforeManualRetry: function(id) {\n if (this._parent.prototype._onBeforeManualRetry.apply(this, arguments)) {\n this._templating.resetProgress(id);\n qq(this._templating.getFileContainer(id)).removeClass(this._classes.fail);\n this._templating.setStatusText(id);\n this._templating.showSpinner(id);\n this._showCancelLink(id);\n return true;\n } else {\n qq(this._templating.getFileContainer(id)).addClass(this._classes.retryable);\n this._templating.showRetry(id);\n return false;\n }\n },\n _onSubmitDelete: function(id) {\n var onSuccessCallback = qq.bind(this._onSubmitDeleteSuccess, this);\n this._parent.prototype._onSubmitDelete.call(this, id, onSuccessCallback);\n },\n _onSubmitDeleteSuccess: function(id, uuid, additionalMandatedParams) {\n if (this._options.deleteFile.forceConfirm) {\n this._showDeleteConfirm.apply(this, arguments);\n } else {\n this._sendDeleteRequest.apply(this, arguments);\n }\n },\n _onDeleteComplete: function(id, xhr, isError) {\n this._parent.prototype._onDeleteComplete.apply(this, arguments);\n this._templating.hideSpinner(id);\n if (isError) {\n this._templating.setStatusText(id, this._options.deleteFile.deletingFailedText);\n this._templating.showDeleteButton(id);\n } else {\n this._removeFileItem(id);\n }\n },\n _sendDeleteRequest: function(id, uuid, additionalMandatedParams) {\n this._templating.hideDeleteButton(id);\n this._templating.showSpinner(id);\n this._templating.setStatusText(id, this._options.deleteFile.deletingStatusText);\n this._deleteHandler.sendDelete.apply(this, arguments);\n },\n _showDeleteConfirm: function(id, uuid, mandatedParams) {\n var fileName = this.getName(id), confirmMessage = this._options.deleteFile.confirmMessage.replace(/\\{filename\\}/g, fileName), uuid = this.getUuid(id), deleteRequestArgs = arguments, self = this, retVal;\n retVal = this._options.showConfirm(confirmMessage);\n if (qq.isGenericPromise(retVal)) {\n retVal.then(function() {\n self._sendDeleteRequest.apply(self, deleteRequestArgs);\n });\n } else if (retVal !== false) {\n self._sendDeleteRequest.apply(self, deleteRequestArgs);\n }\n },\n _addToList: function(id, name, canned) {\n var prependData, prependIndex = 0, dontDisplay = this._handler.isProxied(id) && this._options.scaling.hideScaled, record;\n if (this._options.display.prependFiles) {\n if (this._totalFilesInBatch > 1 && this._filesInBatchAddedToUi > 0) {\n prependIndex = this._filesInBatchAddedToUi - 1;\n }\n prependData = {\n index: prependIndex\n };\n }\n if (!canned) {\n if (this._options.disableCancelForFormUploads && !qq.supportedFeatures.ajaxUploading) {\n this._templating.disableCancel();\n }\n if (!this._options.multiple) {\n record = this.getUploads({\n id: id\n });\n this._handledProxyGroup = this._handledProxyGroup || record.proxyGroupId;\n if (record.proxyGroupId !== this._handledProxyGroup || !record.proxyGroupId) {\n this._handler.cancelAll();\n this._clearList();\n this._handledProxyGroup = null;\n }\n }\n }\n if (canned) {\n this._templating.addFileToCache(id, this._options.formatFileName(name), prependData, dontDisplay);\n this._templating.updateThumbnail(id, this._thumbnailUrls[id], true, this._options.thumbnails.customResizer);\n } else {\n this._templating.addFile(id, this._options.formatFileName(name), prependData, dontDisplay);\n this._templating.generatePreview(id, this.getFile(id), this._options.thumbnails.customResizer);\n }\n this._filesInBatchAddedToUi += 1;\n if (canned || this._options.display.fileSizeOnSubmit && qq.supportedFeatures.ajaxUploading) {\n this._displayFileSize(id);\n }\n },\n _clearList: function() {\n this._templating.clearFiles();\n this.clearStoredFiles();\n },\n _displayFileSize: function(id, loadedSize, totalSize) {\n var size = this.getSize(id), sizeForDisplay = this._formatSize(size);\n if (size >= 0) {\n if (loadedSize !== undefined && totalSize !== undefined) {\n sizeForDisplay = this._formatProgress(loadedSize, totalSize);\n }\n this._templating.updateSize(id, sizeForDisplay);\n }\n },\n _formatProgress: function(uploadedSize, totalSize) {\n var message = this._options.text.formatProgress;\n function r(name, replacement) {\n message = message.replace(name, replacement);\n }\n r(\"{percent}\", Math.round(uploadedSize / totalSize * 100));\n r(\"{total_size}\", this._formatSize(totalSize));\n return message;\n },\n _controlFailureTextDisplay: function(id, response) {\n var mode, responseProperty, failureReason;\n mode = this._options.failedUploadTextDisplay.mode;\n responseProperty = this._options.failedUploadTextDisplay.responseProperty;\n if (mode === \"custom\") {\n failureReason = response[responseProperty];\n if (!failureReason) {\n failureReason = this._options.text.failUpload;\n }\n this._templating.setStatusText(id, failureReason);\n if (this._options.failedUploadTextDisplay.enableTooltip) {\n this._showTooltip(id, failureReason);\n }\n } else if (mode === \"default\") {\n this._templating.setStatusText(id, this._options.text.failUpload);\n } else if (mode !== \"none\") {\n this.log(\"failedUploadTextDisplay.mode value of '\" + mode + \"' is not valid\", \"warn\");\n }\n },\n _showTooltip: function(id, text) {\n this._templating.getFileContainer(id).title = text;\n },\n _showCancelLink: function(id) {\n if (!this._options.disableCancelForFormUploads || qq.supportedFeatures.ajaxUploading) {\n this._templating.showCancel(id);\n }\n },\n _itemError: function(code, name, item) {\n var message = this._parent.prototype._itemError.apply(this, arguments);\n this._options.showMessage(message);\n },\n _batchError: function(message) {\n this._parent.prototype._batchError.apply(this, arguments);\n this._options.showMessage(message);\n },\n _setupPastePrompt: function() {\n var self = this;\n this._options.callbacks.onPasteReceived = function() {\n var message = self._options.paste.namePromptMessage, defaultVal = self._options.paste.defaultName;\n return self._options.showPrompt(message, defaultVal);\n };\n },\n _fileOrBlobRejected: function(id, name) {\n this._totalFilesInBatch -= 1;\n this._parent.prototype._fileOrBlobRejected.apply(this, arguments);\n },\n _prepareItemsForUpload: function(items, params, endpoint) {\n this._totalFilesInBatch = items.length;\n this._filesInBatchAddedToUi = 0;\n this._parent.prototype._prepareItemsForUpload.apply(this, arguments);\n },\n _maybeUpdateThumbnail: function(fileId) {\n var thumbnailUrl = this._thumbnailUrls[fileId], fileStatus = this.getUploads({\n id: fileId\n }).status;\n if (fileStatus !== qq.status.DELETED && (thumbnailUrl || this._options.thumbnails.placeholders.waitUntilResponse || !qq.supportedFeatures.imagePreviews)) {\n this._templating.updateThumbnail(fileId, thumbnailUrl, this._options.thumbnails.customResizer);\n }\n },\n _addCannedFile: function(sessionData) {\n var id = this._parent.prototype._addCannedFile.apply(this, arguments);\n this._addToList(id, this.getName(id), true);\n this._templating.hideSpinner(id);\n this._templating.hideCancel(id);\n this._markFileAsSuccessful(id);\n return id;\n },\n _setSize: function(id, newSize) {\n this._parent.prototype._setSize.apply(this, arguments);\n this._templating.updateSize(id, this._formatSize(newSize));\n },\n _sessionRequestComplete: function() {\n this._templating.addCacheToDom();\n this._parent.prototype._sessionRequestComplete.apply(this, arguments);\n }\n };\n })();\n qq.FineUploader = function(o, namespace) {\n \"use strict\";\n var self = this;\n this._parent = namespace ? qq[namespace].FineUploaderBasic : qq.FineUploaderBasic;\n this._parent.apply(this, arguments);\n qq.extend(this._options, {\n element: null,\n button: null,\n listElement: null,\n dragAndDrop: {\n extraDropzones: [],\n reportDirectoryPaths: false\n },\n text: {\n formatProgress: \"{percent}% of {total_size}\",\n failUpload: \"Upload failed\",\n waitingForResponse: \"Processing...\",\n paused: \"Paused\"\n },\n template: \"qq-template\",\n classes: {\n retrying: \"qq-upload-retrying\",\n retryable: \"qq-upload-retryable\",\n success: \"qq-upload-success\",\n fail: \"qq-upload-fail\",\n editable: \"qq-editable\",\n hide: \"qq-hide\",\n dropActive: \"qq-upload-drop-area-active\"\n },\n failedUploadTextDisplay: {\n mode: \"default\",\n responseProperty: \"error\",\n enableTooltip: true\n },\n messages: {\n tooManyFilesError: \"You may only drop one file\",\n unsupportedBrowser: \"Unrecoverable error - this browser does not permit file uploading of any kind.\"\n },\n retry: {\n showAutoRetryNote: true,\n autoRetryNote: \"Retrying {retryNum}/{maxAuto}...\"\n },\n deleteFile: {\n forceConfirm: false,\n confirmMessage: \"Are you sure you want to delete {filename}?\",\n deletingStatusText: \"Deleting...\",\n deletingFailedText: \"Delete failed\"\n },\n display: {\n fileSizeOnSubmit: false,\n prependFiles: false\n },\n paste: {\n promptForName: false,\n namePromptMessage: \"Please name this image\"\n },\n thumbnails: {\n customResizer: null,\n maxCount: 0,\n placeholders: {\n waitUntilResponse: false,\n notAvailablePath: null,\n waitingPath: null\n },\n timeBetweenThumbs: 750\n },\n scaling: {\n hideScaled: false\n },\n showMessage: function(message) {\n if (self._templating.hasDialog(\"alert\")) {\n return self._templating.showDialog(\"alert\", message);\n } else {\n setTimeout(function() {\n window.alert(message);\n }, 0);\n }\n },\n showConfirm: function(message) {\n if (self._templating.hasDialog(\"confirm\")) {\n return self._templating.showDialog(\"confirm\", message);\n } else {\n return window.confirm(message);\n }\n },\n showPrompt: function(message, defaultValue) {\n if (self._templating.hasDialog(\"prompt\")) {\n return self._templating.showDialog(\"prompt\", message, defaultValue);\n } else {\n return window.prompt(message, defaultValue);\n }\n }\n }, true);\n qq.extend(this._options, o, true);\n this._templating = new qq.Templating({\n log: qq.bind(this.log, this),\n templateIdOrEl: this._options.template,\n containerEl: this._options.element,\n fileContainerEl: this._options.listElement,\n button: this._options.button,\n imageGenerator: this._imageGenerator,\n classes: {\n hide: this._options.classes.hide,\n editable: this._options.classes.editable\n },\n limits: {\n maxThumbs: this._options.thumbnails.maxCount,\n timeBetweenThumbs: this._options.thumbnails.timeBetweenThumbs\n },\n placeholders: {\n waitUntilUpdate: this._options.thumbnails.placeholders.waitUntilResponse,\n thumbnailNotAvailable: this._options.thumbnails.placeholders.notAvailablePath,\n waitingForThumbnail: this._options.thumbnails.placeholders.waitingPath\n },\n text: this._options.text\n });\n if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) {\n this._templating.renderFailure(this._options.messages.unsupportedBrowserIos8Safari);\n } else if (!qq.supportedFeatures.uploading || this._options.cors.expected && !qq.supportedFeatures.uploadCors) {\n this._templating.renderFailure(this._options.messages.unsupportedBrowser);\n } else {\n this._wrapCallbacks();\n this._templating.render();\n this._classes = this._options.classes;\n if (!this._options.button && this._templating.getButton()) {\n this._defaultButtonId = this._createUploadButton({\n element: this._templating.getButton(),\n title: this._options.text.fileInputTitle\n }).getButtonId();\n }\n this._setupClickAndEditEventHandlers();\n if (qq.DragAndDrop && qq.supportedFeatures.fileDrop) {\n this._dnd = this._setupDragAndDrop();\n }\n if (this._options.paste.targetElement && this._options.paste.promptForName) {\n if (qq.PasteSupport) {\n this._setupPastePrompt();\n } else {\n this.log(\"Paste support module not found.\", \"error\");\n }\n }\n this._totalFilesInBatch = 0;\n this._filesInBatchAddedToUi = 0;\n }\n };\n qq.extend(qq.FineUploader.prototype, qq.basePublicApi);\n qq.extend(qq.FineUploader.prototype, qq.basePrivateApi);\n qq.extend(qq.FineUploader.prototype, qq.uiPublicApi);\n qq.extend(qq.FineUploader.prototype, qq.uiPrivateApi);\n qq.Templating = function(spec) {\n \"use strict\";\n var FILE_ID_ATTR = \"qq-file-id\", FILE_CLASS_PREFIX = \"qq-file-id-\", THUMBNAIL_MAX_SIZE_ATTR = \"qq-max-size\", THUMBNAIL_SERVER_SCALE_ATTR = \"qq-server-scale\", HIDE_DROPZONE_ATTR = \"qq-hide-dropzone\", DROPZPONE_TEXT_ATTR = \"qq-drop-area-text\", IN_PROGRESS_CLASS = \"qq-in-progress\", HIDDEN_FOREVER_CLASS = \"qq-hidden-forever\", fileBatch = {\n content: document.createDocumentFragment(),\n map: {}\n }, isCancelDisabled = false, generatedThumbnails = 0, thumbnailQueueMonitorRunning = false, thumbGenerationQueue = [], thumbnailMaxSize = -1, options = {\n log: null,\n limits: {\n maxThumbs: 0,\n timeBetweenThumbs: 750\n },\n templateIdOrEl: \"qq-template\",\n containerEl: null,\n fileContainerEl: null,\n button: null,\n imageGenerator: null,\n classes: {\n hide: \"qq-hide\",\n editable: \"qq-editable\"\n },\n placeholders: {\n waitUntilUpdate: false,\n thumbnailNotAvailable: null,\n waitingForThumbnail: null\n },\n text: {\n paused: \"Paused\"\n }\n }, selectorClasses = {\n button: \"qq-upload-button-selector\",\n alertDialog: \"qq-alert-dialog-selector\",\n dialogCancelButton: \"qq-cancel-button-selector\",\n confirmDialog: \"qq-confirm-dialog-selector\",\n dialogMessage: \"qq-dialog-message-selector\",\n dialogOkButton: \"qq-ok-button-selector\",\n promptDialog: \"qq-prompt-dialog-selector\",\n uploader: \"qq-uploader-selector\",\n drop: \"qq-upload-drop-area-selector\",\n list: \"qq-upload-list-selector\",\n progressBarContainer: \"qq-progress-bar-container-selector\",\n progressBar: \"qq-progress-bar-selector\",\n totalProgressBarContainer: \"qq-total-progress-bar-container-selector\",\n totalProgressBar: \"qq-total-progress-bar-selector\",\n file: \"qq-upload-file-selector\",\n spinner: \"qq-upload-spinner-selector\",\n size: \"qq-upload-size-selector\",\n cancel: \"qq-upload-cancel-selector\",\n pause: \"qq-upload-pause-selector\",\n continueButton: \"qq-upload-continue-selector\",\n deleteButton: \"qq-upload-delete-selector\",\n retry: \"qq-upload-retry-selector\",\n statusText: \"qq-upload-status-text-selector\",\n editFilenameInput: \"qq-edit-filename-selector\",\n editNameIcon: \"qq-edit-filename-icon-selector\",\n dropText: \"qq-upload-drop-area-text-selector\",\n dropProcessing: \"qq-drop-processing-selector\",\n dropProcessingSpinner: \"qq-drop-processing-spinner-selector\",\n thumbnail: \"qq-thumbnail-selector\"\n }, previewGeneration = {}, cachedThumbnailNotAvailableImg = new qq.Promise(), cachedWaitingForThumbnailImg = new qq.Promise(), log, isEditElementsExist, isRetryElementExist, templateDom, container, fileList, showThumbnails, serverScale, cacheThumbnailPlaceholders = function() {\n var notAvailableUrl = options.placeholders.thumbnailNotAvailable, waitingUrl = options.placeholders.waitingForThumbnail, spec = {\n maxSize: thumbnailMaxSize,\n scale: serverScale\n };\n if (showThumbnails) {\n if (notAvailableUrl) {\n options.imageGenerator.generate(notAvailableUrl, new Image(), spec).then(function(updatedImg) {\n cachedThumbnailNotAvailableImg.success(updatedImg);\n }, function() {\n cachedThumbnailNotAvailableImg.failure();\n log(\"Problem loading 'not available' placeholder image at \" + notAvailableUrl, \"error\");\n });\n } else {\n cachedThumbnailNotAvailableImg.failure();\n }\n if (waitingUrl) {\n options.imageGenerator.generate(waitingUrl, new Image(), spec).then(function(updatedImg) {\n cachedWaitingForThumbnailImg.success(updatedImg);\n }, function() {\n cachedWaitingForThumbnailImg.failure();\n log(\"Problem loading 'waiting for thumbnail' placeholder image at \" + waitingUrl, \"error\");\n });\n } else {\n cachedWaitingForThumbnailImg.failure();\n }\n }\n }, displayWaitingImg = function(thumbnail) {\n var waitingImgPlacement = new qq.Promise();\n cachedWaitingForThumbnailImg.then(function(img) {\n maybeScalePlaceholderViaCss(img, thumbnail);\n if (!thumbnail.src) {\n thumbnail.src = img.src;\n thumbnail.onload = function() {\n thumbnail.onload = null;\n show(thumbnail);\n waitingImgPlacement.success();\n };\n } else {\n waitingImgPlacement.success();\n }\n }, function() {\n hide(thumbnail);\n waitingImgPlacement.success();\n });\n return waitingImgPlacement;\n }, generateNewPreview = function(id, blob, spec) {\n var thumbnail = getThumbnail(id);\n log(\"Generating new thumbnail for \" + id);\n blob.qqThumbnailId = id;\n return options.imageGenerator.generate(blob, thumbnail, spec).then(function() {\n generatedThumbnails++;\n show(thumbnail);\n previewGeneration[id].success();\n }, function() {\n previewGeneration[id].failure();\n if (!options.placeholders.waitUntilUpdate) {\n maybeSetDisplayNotAvailableImg(id, thumbnail);\n }\n });\n }, generateNextQueuedPreview = function() {\n if (thumbGenerationQueue.length) {\n thumbnailQueueMonitorRunning = true;\n var queuedThumbRequest = thumbGenerationQueue.shift();\n if (queuedThumbRequest.update) {\n processUpdateQueuedPreviewRequest(queuedThumbRequest);\n } else {\n processNewQueuedPreviewRequest(queuedThumbRequest);\n }\n } else {\n thumbnailQueueMonitorRunning = false;\n }\n }, getCancel = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.cancel);\n }, getContinue = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.continueButton);\n }, getDialog = function(type) {\n return getTemplateEl(container, selectorClasses[type + \"Dialog\"]);\n }, getDelete = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.deleteButton);\n }, getDropProcessing = function() {\n return getTemplateEl(container, selectorClasses.dropProcessing);\n }, getEditIcon = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.editNameIcon);\n }, getFile = function(id) {\n return fileBatch.map[id] || qq(fileList).getFirstByClass(FILE_CLASS_PREFIX + id);\n }, getFilename = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.file);\n }, getPause = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.pause);\n }, getProgress = function(id) {\n if (id == null) {\n return getTemplateEl(container, selectorClasses.totalProgressBarContainer) || getTemplateEl(container, selectorClasses.totalProgressBar);\n }\n return getTemplateEl(getFile(id), selectorClasses.progressBarContainer) || getTemplateEl(getFile(id), selectorClasses.progressBar);\n }, getRetry = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.retry);\n }, getSize = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.size);\n }, getSpinner = function(id) {\n return getTemplateEl(getFile(id), selectorClasses.spinner);\n }, getTemplateEl = function(context, cssClass) {\n return context && qq(context).getFirstByClass(cssClass);\n }, getThumbnail = function(id) {\n return showThumbnails && getTemplateEl(getFile(id), selectorClasses.thumbnail);\n }, hide = function(el) {\n el && qq(el).addClass(options.classes.hide);\n }, maybeScalePlaceholderViaCss = function(placeholder, thumbnail) {\n var maxWidth = placeholder.style.maxWidth, maxHeight = placeholder.style.maxHeight;\n if (maxHeight && maxWidth && !thumbnail.style.maxWidth && !thumbnail.style.maxHeight) {\n qq(thumbnail).css({\n maxWidth: maxWidth,\n maxHeight: maxHeight\n });\n }\n }, maybeSetDisplayNotAvailableImg = function(id, thumbnail) {\n var previewing = previewGeneration[id] || new qq.Promise().failure(), notAvailableImgPlacement = new qq.Promise();\n cachedThumbnailNotAvailableImg.then(function(img) {\n previewing.then(function() {\n notAvailableImgPlacement.success();\n }, function() {\n maybeScalePlaceholderViaCss(img, thumbnail);\n thumbnail.onload = function() {\n thumbnail.onload = null;\n notAvailableImgPlacement.success();\n };\n thumbnail.src = img.src;\n show(thumbnail);\n });\n });\n return notAvailableImgPlacement;\n }, parseAndGetTemplate = function() {\n var scriptEl, scriptHtml, fileListNode, tempTemplateEl, fileListEl, defaultButton, dropArea, thumbnail, dropProcessing, dropTextEl, uploaderEl;\n log(\"Parsing template\");\n if (options.templateIdOrEl == null) {\n throw new Error(\"You MUST specify either a template element or ID!\");\n }\n if (qq.isString(options.templateIdOrEl)) {\n scriptEl = document.getElementById(options.templateIdOrEl);\n if (scriptEl === null) {\n throw new Error(qq.format(\"Cannot find template script at ID '{}'!\", options.templateIdOrEl));\n }\n scriptHtml = scriptEl.innerHTML;\n } else {\n if (options.templateIdOrEl.innerHTML === undefined) {\n throw new Error(\"You have specified an invalid value for the template option! \" + \"It must be an ID or an Element.\");\n }\n scriptHtml = options.templateIdOrEl.innerHTML;\n }\n scriptHtml = qq.trimStr(scriptHtml);\n tempTemplateEl = document.createElement(\"div\");\n tempTemplateEl.appendChild(qq.toElement(scriptHtml));\n uploaderEl = qq(tempTemplateEl).getFirstByClass(selectorClasses.uploader);\n if (options.button) {\n defaultButton = qq(tempTemplateEl).getFirstByClass(selectorClasses.button);\n if (defaultButton) {\n qq(defaultButton).remove();\n }\n }\n if (!qq.DragAndDrop || !qq.supportedFeatures.fileDrop) {\n dropProcessing = qq(tempTemplateEl).getFirstByClass(selectorClasses.dropProcessing);\n if (dropProcessing) {\n qq(dropProcessing).remove();\n }\n }\n dropArea = qq(tempTemplateEl).getFirstByClass(selectorClasses.drop);\n if (dropArea && !qq.DragAndDrop) {\n log(\"DnD module unavailable.\", \"info\");\n qq(dropArea).remove();\n }\n if (!qq.supportedFeatures.fileDrop) {\n uploaderEl.removeAttribute(DROPZPONE_TEXT_ATTR);\n if (dropArea && qq(dropArea).hasAttribute(HIDE_DROPZONE_ATTR)) {\n qq(dropArea).css({\n display: \"none\"\n });\n }\n } else if (qq(uploaderEl).hasAttribute(DROPZPONE_TEXT_ATTR) && dropArea) {\n dropTextEl = qq(dropArea).getFirstByClass(selectorClasses.dropText);\n dropTextEl && qq(dropTextEl).remove();\n }\n thumbnail = qq(tempTemplateEl).getFirstByClass(selectorClasses.thumbnail);\n if (!showThumbnails) {\n thumbnail && qq(thumbnail).remove();\n } else if (thumbnail) {\n thumbnailMaxSize = parseInt(thumbnail.getAttribute(THUMBNAIL_MAX_SIZE_ATTR));\n thumbnailMaxSize = thumbnailMaxSize > 0 ? thumbnailMaxSize : null;\n serverScale = qq(thumbnail).hasAttribute(THUMBNAIL_SERVER_SCALE_ATTR);\n }\n showThumbnails = showThumbnails && thumbnail;\n isEditElementsExist = qq(tempTemplateEl).getByClass(selectorClasses.editFilenameInput).length > 0;\n isRetryElementExist = qq(tempTemplateEl).getByClass(selectorClasses.retry).length > 0;\n fileListNode = qq(tempTemplateEl).getFirstByClass(selectorClasses.list);\n if (fileListNode == null) {\n throw new Error(\"Could not find the file list container in the template!\");\n }\n fileListEl = fileListNode.children[0].cloneNode(true);\n fileListNode.innerHTML = \"\";\n if (tempTemplateEl.getElementsByTagName(\"DIALOG\").length) {\n document.createElement(\"dialog\");\n }\n log(\"Template parsing complete\");\n return {\n template: tempTemplateEl,\n fileTemplate: fileListEl\n };\n }, prependFile = function(el, index, fileList) {\n var parentEl = fileList, beforeEl = parentEl.firstChild;\n if (index > 0) {\n beforeEl = qq(parentEl).children()[index].nextSibling;\n }\n parentEl.insertBefore(el, beforeEl);\n }, processNewQueuedPreviewRequest = function(queuedThumbRequest) {\n var id = queuedThumbRequest.id, optFileOrBlob = queuedThumbRequest.optFileOrBlob, relatedThumbnailId = optFileOrBlob && optFileOrBlob.qqThumbnailId, thumbnail = getThumbnail(id), spec = {\n customResizeFunction: queuedThumbRequest.customResizeFunction,\n maxSize: thumbnailMaxSize,\n orient: true,\n scale: true\n };\n if (qq.supportedFeatures.imagePreviews) {\n if (thumbnail) {\n if (options.limits.maxThumbs && options.limits.maxThumbs <= generatedThumbnails) {\n maybeSetDisplayNotAvailableImg(id, thumbnail);\n generateNextQueuedPreview();\n } else {\n displayWaitingImg(thumbnail).done(function() {\n previewGeneration[id] = new qq.Promise();\n previewGeneration[id].done(function() {\n setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n });\n if (relatedThumbnailId != null) {\n useCachedPreview(id, relatedThumbnailId);\n } else {\n generateNewPreview(id, optFileOrBlob, spec);\n }\n });\n }\n } else {\n generateNextQueuedPreview();\n }\n } else if (thumbnail) {\n displayWaitingImg(thumbnail);\n generateNextQueuedPreview();\n }\n }, processUpdateQueuedPreviewRequest = function(queuedThumbRequest) {\n var id = queuedThumbRequest.id, thumbnailUrl = queuedThumbRequest.thumbnailUrl, showWaitingImg = queuedThumbRequest.showWaitingImg, thumbnail = getThumbnail(id), spec = {\n customResizeFunction: queuedThumbRequest.customResizeFunction,\n scale: serverScale,\n maxSize: thumbnailMaxSize\n };\n if (thumbnail) {\n if (thumbnailUrl) {\n if (options.limits.maxThumbs && options.limits.maxThumbs <= generatedThumbnails) {\n maybeSetDisplayNotAvailableImg(id, thumbnail);\n generateNextQueuedPreview();\n } else {\n if (showWaitingImg) {\n displayWaitingImg(thumbnail);\n }\n return options.imageGenerator.generate(thumbnailUrl, thumbnail, spec).then(function() {\n show(thumbnail);\n generatedThumbnails++;\n setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n }, function() {\n maybeSetDisplayNotAvailableImg(id, thumbnail);\n setTimeout(generateNextQueuedPreview, options.limits.timeBetweenThumbs);\n });\n }\n } else {\n maybeSetDisplayNotAvailableImg(id, thumbnail);\n generateNextQueuedPreview();\n }\n }\n }, setProgressBarWidth = function(id, percent) {\n var bar = getProgress(id), progressBarSelector = id == null ? selectorClasses.totalProgressBar : selectorClasses.progressBar;\n if (bar && !qq(bar).hasClass(progressBarSelector)) {\n bar = qq(bar).getFirstByClass(progressBarSelector);\n }\n if (bar) {\n qq(bar).css({\n width: percent + \"%\"\n });\n bar.setAttribute(\"aria-valuenow\", percent);\n }\n }, show = function(el) {\n el && qq(el).removeClass(options.classes.hide);\n }, useCachedPreview = function(targetThumbnailId, cachedThumbnailId) {\n var targetThumbnail = getThumbnail(targetThumbnailId), cachedThumbnail = getThumbnail(cachedThumbnailId);\n log(qq.format(\"ID {} is the same file as ID {}. Will use generated thumbnail from ID {} instead.\", targetThumbnailId, cachedThumbnailId, cachedThumbnailId));\n previewGeneration[cachedThumbnailId].then(function() {\n generatedThumbnails++;\n previewGeneration[targetThumbnailId].success();\n log(qq.format(\"Now using previously generated thumbnail created for ID {} on ID {}.\", cachedThumbnailId, targetThumbnailId));\n targetThumbnail.src = cachedThumbnail.src;\n show(targetThumbnail);\n }, function() {\n previewGeneration[targetThumbnailId].failure();\n if (!options.placeholders.waitUntilUpdate) {\n maybeSetDisplayNotAvailableImg(targetThumbnailId, targetThumbnail);\n }\n });\n };\n qq.extend(options, spec);\n log = options.log;\n if (!qq.supportedFeatures.imagePreviews) {\n options.limits.timeBetweenThumbs = 0;\n options.limits.maxThumbs = 0;\n }\n container = options.containerEl;\n showThumbnails = options.imageGenerator !== undefined;\n templateDom = parseAndGetTemplate();\n cacheThumbnailPlaceholders();\n qq.extend(this, {\n render: function() {\n log(\"Rendering template in DOM.\");\n generatedThumbnails = 0;\n container.appendChild(templateDom.template.cloneNode(true));\n hide(getDropProcessing());\n this.hideTotalProgress();\n fileList = options.fileContainerEl || getTemplateEl(container, selectorClasses.list);\n log(\"Template rendering complete\");\n },\n renderFailure: function(message) {\n var cantRenderEl = qq.toElement(message);\n container.innerHTML = \"\";\n container.appendChild(cantRenderEl);\n },\n reset: function() {\n container.innerHTML = \"\";\n this.render();\n },\n clearFiles: function() {\n fileList.innerHTML = \"\";\n },\n disableCancel: function() {\n isCancelDisabled = true;\n },\n addFile: function(id, name, prependInfo, hideForever, batch) {\n var fileEl = templateDom.fileTemplate.cloneNode(true), fileNameEl = getTemplateEl(fileEl, selectorClasses.file), uploaderEl = getTemplateEl(container, selectorClasses.uploader), fileContainer = batch ? fileBatch.content : fileList, thumb;\n if (batch) {\n fileBatch.map[id] = fileEl;\n }\n qq(fileEl).addClass(FILE_CLASS_PREFIX + id);\n uploaderEl.removeAttribute(DROPZPONE_TEXT_ATTR);\n if (fileNameEl) {\n qq(fileNameEl).setText(name);\n fileNameEl.setAttribute(\"title\", name);\n }\n fileEl.setAttribute(FILE_ID_ATTR, id);\n if (prependInfo) {\n prependFile(fileEl, prependInfo.index, fileContainer);\n } else {\n fileContainer.appendChild(fileEl);\n }\n if (hideForever) {\n fileEl.style.display = \"none\";\n qq(fileEl).addClass(HIDDEN_FOREVER_CLASS);\n } else {\n hide(getProgress(id));\n hide(getSize(id));\n hide(getDelete(id));\n hide(getRetry(id));\n hide(getPause(id));\n hide(getContinue(id));\n if (isCancelDisabled) {\n this.hideCancel(id);\n }\n thumb = getThumbnail(id);\n if (thumb && !thumb.src) {\n cachedWaitingForThumbnailImg.then(function(waitingImg) {\n thumb.src = waitingImg.src;\n if (waitingImg.style.maxHeight && waitingImg.style.maxWidth) {\n qq(thumb).css({\n maxHeight: waitingImg.style.maxHeight,\n maxWidth: waitingImg.style.maxWidth\n });\n }\n show(thumb);\n });\n }\n }\n },\n addFileToCache: function(id, name, prependInfo, hideForever) {\n this.addFile(id, name, prependInfo, hideForever, true);\n },\n addCacheToDom: function() {\n fileList.appendChild(fileBatch.content);\n fileBatch.content = document.createDocumentFragment();\n fileBatch.map = {};\n },\n removeFile: function(id) {\n qq(getFile(id)).remove();\n },\n getFileId: function(el) {\n var currentNode = el;\n if (currentNode) {\n while (currentNode.getAttribute(FILE_ID_ATTR) == null) {\n currentNode = currentNode.parentNode;\n }\n return parseInt(currentNode.getAttribute(FILE_ID_ATTR));\n }\n },\n getFileList: function() {\n return fileList;\n },\n markFilenameEditable: function(id) {\n var filename = getFilename(id);\n filename && qq(filename).addClass(options.classes.editable);\n },\n updateFilename: function(id, name) {\n var filenameEl = getFilename(id);\n if (filenameEl) {\n qq(filenameEl).setText(name);\n filenameEl.setAttribute(\"title\", name);\n }\n },\n hideFilename: function(id) {\n hide(getFilename(id));\n },\n showFilename: function(id) {\n show(getFilename(id));\n },\n isFileName: function(el) {\n return qq(el).hasClass(selectorClasses.file);\n },\n getButton: function() {\n return options.button || getTemplateEl(container, selectorClasses.button);\n },\n hideDropProcessing: function() {\n hide(getDropProcessing());\n },\n showDropProcessing: function() {\n show(getDropProcessing());\n },\n getDropZone: function() {\n return getTemplateEl(container, selectorClasses.drop);\n },\n isEditFilenamePossible: function() {\n return isEditElementsExist;\n },\n hideRetry: function(id) {\n hide(getRetry(id));\n },\n isRetryPossible: function() {\n return isRetryElementExist;\n },\n showRetry: function(id) {\n show(getRetry(id));\n },\n getFileContainer: function(id) {\n return getFile(id);\n },\n showEditIcon: function(id) {\n var icon = getEditIcon(id);\n icon && qq(icon).addClass(options.classes.editable);\n },\n isHiddenForever: function(id) {\n return qq(getFile(id)).hasClass(HIDDEN_FOREVER_CLASS);\n },\n hideEditIcon: function(id) {\n var icon = getEditIcon(id);\n icon && qq(icon).removeClass(options.classes.editable);\n },\n isEditIcon: function(el) {\n return qq(el).hasClass(selectorClasses.editNameIcon, true);\n },\n getEditInput: function(id) {\n return getTemplateEl(getFile(id), selectorClasses.editFilenameInput);\n },\n isEditInput: function(el) {\n return qq(el).hasClass(selectorClasses.editFilenameInput, true);\n },\n updateProgress: function(id, loaded, total) {\n var bar = getProgress(id), percent;\n if (bar && total > 0) {\n percent = Math.round(loaded / total * 100);\n if (percent === 100) {\n hide(bar);\n } else {\n show(bar);\n }\n setProgressBarWidth(id, percent);\n }\n },\n updateTotalProgress: function(loaded, total) {\n this.updateProgress(null, loaded, total);\n },\n hideProgress: function(id) {\n var bar = getProgress(id);\n bar && hide(bar);\n },\n hideTotalProgress: function() {\n this.hideProgress();\n },\n resetProgress: function(id) {\n setProgressBarWidth(id, 0);\n this.hideTotalProgress(id);\n },\n resetTotalProgress: function() {\n this.resetProgress();\n },\n showCancel: function(id) {\n if (!isCancelDisabled) {\n var cancel = getCancel(id);\n cancel && qq(cancel).removeClass(options.classes.hide);\n }\n },\n hideCancel: function(id) {\n hide(getCancel(id));\n },\n isCancel: function(el) {\n return qq(el).hasClass(selectorClasses.cancel, true);\n },\n allowPause: function(id) {\n show(getPause(id));\n hide(getContinue(id));\n },\n uploadPaused: function(id) {\n this.setStatusText(id, options.text.paused);\n this.allowContinueButton(id);\n hide(getSpinner(id));\n },\n hidePause: function(id) {\n hide(getPause(id));\n },\n isPause: function(el) {\n return qq(el).hasClass(selectorClasses.pause, true);\n },\n isContinueButton: function(el) {\n return qq(el).hasClass(selectorClasses.continueButton, true);\n },\n allowContinueButton: function(id) {\n show(getContinue(id));\n hide(getPause(id));\n },\n uploadContinued: function(id) {\n this.setStatusText(id, \"\");\n this.allowPause(id);\n show(getSpinner(id));\n },\n showDeleteButton: function(id) {\n show(getDelete(id));\n },\n hideDeleteButton: function(id) {\n hide(getDelete(id));\n },\n isDeleteButton: function(el) {\n return qq(el).hasClass(selectorClasses.deleteButton, true);\n },\n isRetry: function(el) {\n return qq(el).hasClass(selectorClasses.retry, true);\n },\n updateSize: function(id, text) {\n var size = getSize(id);\n if (size) {\n show(size);\n qq(size).setText(text);\n }\n },\n setStatusText: function(id, text) {\n var textEl = getTemplateEl(getFile(id), selectorClasses.statusText);\n if (textEl) {\n if (text == null) {\n qq(textEl).clearText();\n } else {\n qq(textEl).setText(text);\n }\n }\n },\n hideSpinner: function(id) {\n qq(getFile(id)).removeClass(IN_PROGRESS_CLASS);\n hide(getSpinner(id));\n },\n showSpinner: function(id) {\n qq(getFile(id)).addClass(IN_PROGRESS_CLASS);\n show(getSpinner(id));\n },\n generatePreview: function(id, optFileOrBlob, customResizeFunction) {\n if (!this.isHiddenForever(id)) {\n thumbGenerationQueue.push({\n id: id,\n customResizeFunction: customResizeFunction,\n optFileOrBlob: optFileOrBlob\n });\n !thumbnailQueueMonitorRunning && generateNextQueuedPreview();\n }\n },\n updateThumbnail: function(id, thumbnailUrl, showWaitingImg, customResizeFunction) {\n if (!this.isHiddenForever(id)) {\n thumbGenerationQueue.push({\n customResizeFunction: customResizeFunction,\n update: true,\n id: id,\n thumbnailUrl: thumbnailUrl,\n showWaitingImg: showWaitingImg\n });\n !thumbnailQueueMonitorRunning && generateNextQueuedPreview();\n }\n },\n hasDialog: function(type) {\n return qq.supportedFeatures.dialogElement && !!getDialog(type);\n },\n showDialog: function(type, message, defaultValue) {\n var dialog = getDialog(type), messageEl = getTemplateEl(dialog, selectorClasses.dialogMessage), inputEl = dialog.getElementsByTagName(\"INPUT\")[0], cancelBtn = getTemplateEl(dialog, selectorClasses.dialogCancelButton), okBtn = getTemplateEl(dialog, selectorClasses.dialogOkButton), promise = new qq.Promise(), closeHandler = function() {\n cancelBtn.removeEventListener(\"click\", cancelClickHandler);\n okBtn && okBtn.removeEventListener(\"click\", okClickHandler);\n promise.failure();\n }, cancelClickHandler = function() {\n cancelBtn.removeEventListener(\"click\", cancelClickHandler);\n dialog.close();\n }, okClickHandler = function() {\n dialog.removeEventListener(\"close\", closeHandler);\n okBtn.removeEventListener(\"click\", okClickHandler);\n dialog.close();\n promise.success(inputEl && inputEl.value);\n };\n dialog.addEventListener(\"close\", closeHandler);\n cancelBtn.addEventListener(\"click\", cancelClickHandler);\n okBtn && okBtn.addEventListener(\"click\", okClickHandler);\n if (inputEl) {\n inputEl.value = defaultValue;\n }\n messageEl.textContent = message;\n dialog.showModal();\n return promise;\n }\n });\n };\n qq.UiEventHandler = function(s, protectedApi) {\n \"use strict\";\n var disposer = new qq.DisposeSupport(), spec = {\n eventType: \"click\",\n attachTo: null,\n onHandled: function(target, event) {}\n };\n qq.extend(this, {\n addHandler: function(element) {\n addHandler(element);\n },\n dispose: function() {\n disposer.dispose();\n }\n });\n function addHandler(element) {\n disposer.attach(element, spec.eventType, function(event) {\n event = event || window.event;\n var target = event.target || event.srcElement;\n spec.onHandled(target, event);\n });\n }\n qq.extend(protectedApi, {\n getFileIdFromItem: function(item) {\n return item.qqFileId;\n },\n getDisposeSupport: function() {\n return disposer;\n }\n });\n qq.extend(spec, s);\n if (spec.attachTo) {\n addHandler(spec.attachTo);\n }\n };\n qq.FileButtonsClickHandler = function(s) {\n \"use strict\";\n var inheritedInternalApi = {}, spec = {\n templating: null,\n log: function(message, lvl) {},\n onDeleteFile: function(fileId) {},\n onCancel: function(fileId) {},\n onRetry: function(fileId) {},\n onPause: function(fileId) {},\n onContinue: function(fileId) {},\n onGetName: function(fileId) {}\n }, buttonHandlers = {\n cancel: function(id) {\n spec.onCancel(id);\n },\n retry: function(id) {\n spec.onRetry(id);\n },\n deleteButton: function(id) {\n spec.onDeleteFile(id);\n },\n pause: function(id) {\n spec.onPause(id);\n },\n continueButton: function(id) {\n spec.onContinue(id);\n }\n };\n function examineEvent(target, event) {\n qq.each(buttonHandlers, function(buttonType, handler) {\n var firstLetterCapButtonType = buttonType.charAt(0).toUpperCase() + buttonType.slice(1), fileId;\n if (spec.templating[\"is\" + firstLetterCapButtonType](target)) {\n fileId = spec.templating.getFileId(target);\n qq.preventDefault(event);\n spec.log(qq.format(\"Detected valid file button click event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n handler(fileId);\n return false;\n }\n });\n }\n qq.extend(spec, s);\n spec.eventType = \"click\";\n spec.onHandled = examineEvent;\n spec.attachTo = spec.templating.getFileList();\n qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));\n };\n qq.FilenameClickHandler = function(s) {\n \"use strict\";\n var inheritedInternalApi = {}, spec = {\n templating: null,\n log: function(message, lvl) {},\n classes: {\n file: \"qq-upload-file\",\n editNameIcon: \"qq-edit-filename-icon\"\n },\n onGetUploadStatus: function(fileId) {},\n onGetName: function(fileId) {}\n };\n qq.extend(spec, s);\n function examineEvent(target, event) {\n if (spec.templating.isFileName(target) || spec.templating.isEditIcon(target)) {\n var fileId = spec.templating.getFileId(target), status = spec.onGetUploadStatus(fileId);\n if (status === qq.status.SUBMITTED) {\n spec.log(qq.format(\"Detected valid filename click event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n qq.preventDefault(event);\n inheritedInternalApi.handleFilenameEdit(fileId, target, true);\n }\n }\n }\n spec.eventType = \"click\";\n spec.onHandled = examineEvent;\n qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));\n };\n qq.FilenameInputFocusInHandler = function(s, inheritedInternalApi) {\n \"use strict\";\n var spec = {\n templating: null,\n onGetUploadStatus: function(fileId) {},\n log: function(message, lvl) {}\n };\n if (!inheritedInternalApi) {\n inheritedInternalApi = {};\n }\n function handleInputFocus(target, event) {\n if (spec.templating.isEditInput(target)) {\n var fileId = spec.templating.getFileId(target), status = spec.onGetUploadStatus(fileId);\n if (status === qq.status.SUBMITTED) {\n spec.log(qq.format(\"Detected valid filename input focus event on file '{}', ID: {}.\", spec.onGetName(fileId), fileId));\n inheritedInternalApi.handleFilenameEdit(fileId, target);\n }\n }\n }\n spec.eventType = \"focusin\";\n spec.onHandled = handleInputFocus;\n qq.extend(spec, s);\n qq.extend(this, new qq.FilenameEditHandler(spec, inheritedInternalApi));\n };\n qq.FilenameInputFocusHandler = function(spec) {\n \"use strict\";\n spec.eventType = \"focus\";\n spec.attachTo = null;\n qq.extend(this, new qq.FilenameInputFocusInHandler(spec, {}));\n };\n qq.FilenameEditHandler = function(s, inheritedInternalApi) {\n \"use strict\";\n var spec = {\n templating: null,\n log: function(message, lvl) {},\n onGetUploadStatus: function(fileId) {},\n onGetName: function(fileId) {},\n onSetName: function(fileId, newName) {},\n onEditingStatusChange: function(fileId, isEditing) {}\n };\n function getFilenameSansExtension(fileId) {\n var filenameSansExt = spec.onGetName(fileId), extIdx = filenameSansExt.lastIndexOf(\".\");\n if (extIdx > 0) {\n filenameSansExt = filenameSansExt.substr(0, extIdx);\n }\n return filenameSansExt;\n }\n function getOriginalExtension(fileId) {\n var origName = spec.onGetName(fileId);\n return qq.getExtension(origName);\n }\n function handleNameUpdate(newFilenameInputEl, fileId) {\n var newName = newFilenameInputEl.value, origExtension;\n if (newName !== undefined && qq.trimStr(newName).length > 0) {\n origExtension = getOriginalExtension(fileId);\n if (origExtension !== undefined) {\n newName = newName + \".\" + origExtension;\n }\n spec.onSetName(fileId, newName);\n }\n spec.onEditingStatusChange(fileId, false);\n }\n function registerInputBlurHandler(inputEl, fileId) {\n inheritedInternalApi.getDisposeSupport().attach(inputEl, \"blur\", function() {\n handleNameUpdate(inputEl, fileId);\n });\n }\n function registerInputEnterKeyHandler(inputEl, fileId) {\n inheritedInternalApi.getDisposeSupport().attach(inputEl, \"keyup\", function(event) {\n var code = event.keyCode || event.which;\n if (code === 13) {\n handleNameUpdate(inputEl, fileId);\n }\n });\n }\n qq.extend(spec, s);\n spec.attachTo = spec.templating.getFileList();\n qq.extend(this, new qq.UiEventHandler(spec, inheritedInternalApi));\n qq.extend(inheritedInternalApi, {\n handleFilenameEdit: function(id, target, focusInput) {\n var newFilenameInputEl = spec.templating.getEditInput(id);\n spec.onEditingStatusChange(id, true);\n newFilenameInputEl.value = getFilenameSansExtension(id);\n if (focusInput) {\n newFilenameInputEl.focus();\n }\n registerInputBlurHandler(newFilenameInputEl, id);\n registerInputEnterKeyHandler(newFilenameInputEl, id);\n }\n });\n };\n})(window);\n//# sourceMappingURL=fine-uploader.js.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/fine-uploader/fine-uploader/fine-uploader.js\n ** module id = 1141\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","\"use strict\";\n\nmodule.exports = require(\"../fine-uploader/fine-uploader\");\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/fine-uploader/lib/traditional.js\n ** module id = 1142\n ** module chunks = 0 1 2 4 5 6 8 10 11 12 13 14\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./horizontal-field.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./horizontal-field.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/horizontal-field.vue\n ** module id = 1219\n ** module chunks = 0 2 4 5 14 30 33\n **/","<style lang=\"less\">\n.horizontal-field {\n .form-control {\n color: #555;\n }\n\n label.help-block {\n margin-bottom: 0;\n }\n}\n</style>\n\n<template>\n <div class=\"horizontal-field\" :class=\"{\n 'form-group': !is_hidden,\n 'has-error': errors.length,\n 'has-success': success,\n }\">\n <label v-if=\"!is_hidden\" :for=\"field.id\"\n :class=\"{ 'required': required && !is_bool }\"\n class=\"col-sm-3 control-label\">\n <i v-if=\"errors.length\" class=\"fa fa-times-circle-o\"></i>\n {{ is_bool ? '' : field.label }}\n <span v-if=\"!is_hidden\" v-show=\"description\" class=\"form-help\"\n v-popover=\"description\" popover-trigger=\"hover\" popover-placement=\"left\">\n </span>\n </label>\n <div class=\"col-sm-9\">\n <component :is=\"widget\"\n :field=\"field\" :value=\"value\" :model=\"model\"\n :description=\"description\" :property=\"property\"\n :placeholder=\"placeholder\" :required=\"required\"\n :readonly=\"readonly\">\n </component>\n <label :for=\"field.id\" class=\"help-block\"\n v-for=\"error in errors\" track-by=\"$index\">{{error}}</label>\n </div>\n </div>\n</template>\n\n<script>\nimport {BaseField} from 'components/form/base-field';\n\nexport default {\n name: 'horizontal-form-field',\n mixins: [BaseField]\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** horizontal-field.vue?205b2d84\n **/","<template>\n <form role=\"form\" class=\"form-horizontal\" v-el:form>\n <field v-for=\"field in fields\" :field=\"field\" track-by=\"id\"\n :schema=\"schema\" :model=\"model\"></field>\n </form>\n</template>\n\n<script>\nimport BaseForm from 'components/form/base-form';\nimport Field from 'components/form/horizontal-field.vue';\n\nexport default {\n name: 'form-horizontal',\n mixins: [BaseForm],\n components: {Field},\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** horizontal-form.vue?7f345e2c\n **/","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".horizontal-field .form-control{color:#555}.horizontal-field label.help-block{margin-bottom:0}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/form/horizontal-field.vue\"],\"names\":[],\"mappings\":\"AAAA,gCAAgC,UAAU,CAAC,mCAAmC,eAAe,CAAC\",\"file\":\"horizontal-field.vue\",\"sourcesContent\":[\".horizontal-field .form-control{color:#555}.horizontal-field label.help-block{margin-bottom:0}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/horizontal-field.vue\n ** module id = 1225\n ** module chunks = 0 2 4 5 14 30 33\n **/","module.exports = \" <div class=horizontal-field :class=\\\"{\\n 'form-group': !is_hidden,\\n 'has-error': errors.length,\\n 'has-success': success,\\n }\\\"> <label v-if=!is_hidden :for=field.id :class=\\\"{ 'required': required && !is_bool }\\\" class=\\\"col-sm-3 control-label\\\"> <i v-if=errors.length class=\\\"fa fa-times-circle-o\\\"></i> {{ is_bool ? '' : field.label }} <span v-if=!is_hidden v-show=description class=form-help v-popover=description popover-trigger=hover popover-placement=left> </span> </label> <div class=col-sm-9> <component :is=widget :field=field :value=value :model=model :description=description :property=property :placeholder=placeholder :required=required :readonly=readonly> </component> <label :for=field.id class=help-block v-for=\\\"error in errors\\\" track-by=$index>{{error}}</label> </div> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/horizontal-field.vue\n ** module id = 1227\n ** module chunks = 0 2 4 5 14 30 33\n **/","module.exports = \" <form role=form class=form-horizontal v-el:form> <field v-for=\\\"field in fields\\\" :field=field track-by=id :schema=schema :model=model></field> </form> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/form/horizontal-form.vue\n ** module id = 1228\n ** module chunks = 0 2 4 5 14 30 33\n **/","var __vue_script__, __vue_template__\n__vue_script__ = require(\"!!babel-loader!../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./horizontal-form.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./horizontal-form.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/form/horizontal-form.vue\n ** module id = 1231\n ** module chunks = 0 2 4 5 14 30 33\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js?sourceMap!../../../node_modules/vue-loader/lib/style-rewriter.js!../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./horizontal-field.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/form/horizontal-field.vue\n ** module id = 1234\n ** module chunks = 0 2 4 5 14 30 33\n **/","import {Model} from 'models/base';\nimport log from 'logger';\n\n\nexport default class CommunityResource extends Model {\n /**\n * Fetch a community resource given its identifier, either an ID or a slug.\n * @param {String} ident The community resource identifier to fetch.\n * @return {CommunityResource} The current object itself.\n */\n fetch(ident) {\n ident = ident || this.id;\n if (ident) {\n this.loading = true;\n this.$api('datasets.retrieve_community_resource', {\n community: ident\n }, this.on_fetched);\n } else {\n log.error('Unable to fetch CommunityResource: no identifier specified');\n }\n return this;\n }\n\n /**\n * Create or update the given community resource\n */\n save(on_error) {\n if (this.id) {\n this.update(this, on_error);\n } else {\n this.loading = true;\n this.$api('datasets.create_community_resource', {\n payload: this\n }, this.on_fetched, this.on_error(on_error));\n }\n }\n\n update(data, on_error) {\n this.loading = true;\n this.$api('datasets.update_community_resource', {\n community: this.id,\n payload: data\n }, this.on_fetched, this.on_error(on_error));\n }\n\n delete(on_error) {\n this.loading = true;\n this.$api('datasets.delete_community_resource', {\n community: this.id\n }, () => this.$emit('updated'), this.on_error(on_error));\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/models/communityresource.js\n **/","import {Model} from 'models/base';\nimport log from 'logger';\n\n\nexport default class Resource extends Model {\n /**\n * Fetch a resource given its dataset identifier and own identifier.\n * @param {String} datasetId The dataset identifier of the resource to fetch.\n * @param {String} resourceId The resource identifier to fetch.\n * @return {Resource} The current object itself.\n */\n fetch(datasetId, resourceId) {\n if (datasetId && resourceId) {\n this.loading = true;\n this.$api('datasets.get_resource', {dataset: datasetId, rid: resourceId}, this.on_fetched);\n } else {\n log.error('Unable to fetch Resource: no identifier(s) specified');\n }\n return this;\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/models/resource.js\n **/","import {List} from 'models/base';\n\n\nexport class Schemas extends List {\n constructor(options) {\n super(options);\n this.$options.ns = 'datasets';\n this.$options.fetch = 'schemas';\n this.sorted = 'label';\n }\n}\n\nexport var schemas = new Schemas().fetch();\nexport default schemas;\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/models/schemas.js\n **/","<style lang=\"less\">\n// Mostly a duplicate from 'less/udata/publish-actions-modal.less'\n// but kept as both components are meant to be separated in the\n// soon to happen core/admin split\n@import '~less/admin/variables';\n\n.actions-list {\n margin-bottom: 0;\n\n .list-group-item {\n @base-color: #eaeaea;\n @base-size: 60px;\n @border-size: 4px;\n height: @base-size + 2 * @border-size;\n background-color: lighten(@gray-lighter, 5%);\n margin: 0px 0px 10px;\n border-radius: 0px;\n border: @border-size solid transparent;\n padding: 0;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .action-icon {\n float: left;\n width: @base-size;\n height: @base-size;\n background-color: @blue;\n margin: 0px;\n\n span {\n color: lighten(@gray-lighter, 10%);\n line-height: 60px;\n text-align: center;\n display: block;\n }\n }\n\n .list-group-item-text {\n margin-left: @base-size + 10px;\n font-weight: normal;\n }\n\n .list-group-item-heading {\n margin-left: @base-size + 10px;\n margin-top: 9px;\n margin-bottom: 3px;\n font-weight: bold;\n }\n\n &:hover {\n background-color: @gray-lighter;\n\n .action-icon {\n background-color: lighten(@gray-lighter, 5%);\n }\n }\n }\n}\n\n.resource-upload-dropzone {\n border: 4px dashed @gray-lte;\n min-height: 150px;\n padding-top: 10px;\n padding-bottom: 10px;\n margin-bottom: 15px;\n\n .lead {\n margin-bottom: 0;\n }\n\n .drop-active & {\n border: 4px dashed @green;\n }\n\n // url field\n .col-sm-9 > div {\n margin-right: 15px;\n }\n}\n\n.resource-choose-upload {\n text-align: center;\n a {\n text-decoration: underline;\n }\n}\n\n.modal-body {\n .resource-choose-upload {\n a {\n color: white;\n }\n }\n}\n\n</style>\n\n<template>\n<div>\n <form-horizontal v-if=\"hasData && !isUpload\" class=\"resource-form file-resource-form\"\n :fields=\"fields\" :model=\"resource\" v-ref:form>\n </form-horizontal>\n <div v-for=\"file in files\" track-by=\"id\" class=\"info-box bg-aqua\">\n <span class=\"info-box-icon\">\n <span class=\"fa fa-cloud-upload\"></span>\n </span>\n <div class=\"info-box-content\">\n <span class=\"info-box-text\">{{file.name}}</span>\n <span class=\"info-box-number\">{{file.size | filesize}}</span>\n <div class=\"progress\">\n <div class=\"progress-bar\" :style=\"{width: progress+'%'}\"></div>\n </div>\n <span class=\"progress-description\">\n {{progress}}%\n </span>\n </div>\n </div>\n <div class=\"resource-choose-upload\" v-show=\"isUpload && !files.length\">\n <div class=\"resource-upload-dropzone\">\n <div class=\"row\">\n <div class=\"text-center col-xs-12\">\n <span class=\"fa fa-download fa-4x dropicon\"></span>\n </div>\n <div class=\"text-center col-xs-12 lead\">\n <p>{{ _(\"Drag a file here\") }}</p>\n </div>\n <div class=\"text-center col-xs-12\">\n <p>{{ _( \"or\") }}</p>\n </div>\n <div class=\"text-center col-xs-12\">\n <span v-el:upload-btn class=\"btn btn-outline btn-flat\">\n {{ _(\"Select a file from your computer\") }}\n </span>\n </div>\n </div>\n </div>\n <div v-if=\"!hasUploadedFile\">\n <a href @click.prevent.stop=\"manual\">\n {{ _(\"You can also link to an existing remote file or URL by clicking here.\") }}\n </a>\n </div>\n </div>\n</div>\n</template>\n\n<script>\nimport API from 'api';\nimport Dataset from 'models/dataset';\nimport Resource from 'models/resource';\nimport CommunityResource from 'models/communityresource';\nimport FormHorizontal from 'components/form/horizontal-form.vue';\nimport UploaderMixin from 'mixins/uploader';\nimport resource_types from 'models/resource_types';\nimport schemas from 'models/schemas';\n\nexport default {\n components: {FormHorizontal},\n mixins: [UploaderMixin],\n props: {\n dataset: {\n type: Object,\n default() {return new Dataset()}\n },\n resource: {\n type: Object,\n default() {\n return new Resource({\n data: {\n filetype: 'remote',\n type: 'main',\n }\n }\n )}\n },\n isUpload: {\n type: Boolean,\n default: false,\n },\n },\n created() {\n // Refresh list of schemas once fetched from the API\n schemas.$on('updated', () => {this.hasSchemas = schemas.has_data;});\n },\n data() {\n return {\n hasSchemas: schemas.has_data,\n hasChosenRemoteFile: false,\n generic_fields: [{\n id: 'title',\n label: this._('Title')\n },{\n id: 'type',\n label: this._('Type'),\n widget: 'select-input',\n values: resource_types,\n map: function(item) {\n return {value: item.id, text: item.label};\n }\n }, {\n id: 'description',\n label: this._('Description'),\n rows:3\n }],\n progress: 0,\n };\n },\n computed: {\n canDrop() {\n return this.isUpload && !this.files.length;\n },\n hasData() {\n return Boolean(this.resource.url || this.hasChosenRemoteFile);\n },\n hasUploadedFile() {\n return this.resource.filetype == 'file';\n },\n file_fields() {\n const readonly = this.resource.filetype === 'file';\n return [{\n id: 'url',\n label: this._('URL'),\n widget: 'url-field',\n readonly,\n }, {\n id: 'filesize',\n label: this._('Size'),\n readonly,\n }, {\n id: 'format',\n label: this._('Format'),\n widget: 'format-completer',\n readonly,\n }, {\n id: 'mime',\n label: this._('Mime Type'),\n widget: 'mime-completer',\n readonly,\n }, {\n id: 'checksum',\n label: this._('Checksum'),\n widget: 'checksum',\n readonly,\n }]\n },\n fields() {\n return this.generic_fields.concat(this.schema_field).concat(this.file_fields);\n },\n schema_field() {\n if (this.hasSchemas) {\n const values = [{name: '', title: ''}].concat(schemas.data);\n return [{\n id: 'schema.name',\n label: (this.resource.schema && this.resource.schema.url) ? this._('Schema (Url already set)') : this._('Schema'),\n widget: 'select-input',\n values,\n map: function(item) {\n return {value: item.name, text: item.title};\n }\n }];\n }\n\n return [];\n },\n is_community() {\n return this.resource instanceof CommunityResource;\n },\n upload_endpoint() {\n const operations = API.datasets && API.datasets.operations;\n if (!this.isUpload || !operations) return;\n let params = {};\n if (typeof this.dataset !== 'undefined') {\n params = {dataset: this.dataset.id};\n }\n if (this.resource.id) {\n if (this.is_community) {\n params.community = this.resource.id;\n } else {\n params.rid = this.resource.id;\n }\n }\n const route_new = this.resource.id ? '' : 'new_';\n const route_namespace = this.is_community ? 'community_' : 'dataset_';\n const endpoint = `upload_${route_new}${route_namespace}resource`;\n return operations[endpoint].urlify(params);\n },\n },\n events: {\n 'uploader:progress': function(id, uploaded, total) {\n this.progress = Math.round(uploaded * 100 / total);\n },\n 'uploader:complete': function(id, response) {\n if (!this.is_community) {\n this.dataset.resources.unshift(response);\n }\n // Do not override an existing typed or registered title.\n if (this.$refs.form) {\n const title = this.$refs.form.serialize().title || this.resource.title;\n if (title) {\n response.title = title;\n }\n }\n this.resource.on_fetched({obj: response});\n this.postUpload();\n },\n },\n methods: {\n manual() {\n this.hasChosenRemoteFile = true;\n this.resource.filetype = 'remote';\n this.isUpload = false;\n },\n postUpload() {\n this.resource.filetype = 'file';\n this.isUpload = false;\n },\n serialize() {\n // Required because of readonly fields and filetype.\n let result = Object.assign({}, this.resource, this.$refs.form.serialize(), this.getSchemaValue());\n\n // We remove extras to avoid overriding extras wrote by automatic processes (since it's not possible to edit extras anyway\n // on the UI). We could also merge provided extras with existing extras on the backend but it's a little bit hard with the current\n // flask-restx/wtform automatic `populate_obj()`. Maybe in the future if we generalize the new API system introduced with dataservices.\n delete result.extras\n return result\n },\n getSchemaValue() {\n // The form mixin remove all null values from non required fields but this\n // behaviour prevent removing a schema from a resource. Since we don't want\n // to touch all forms in this old codebase, I patch here the serialization\n // to add back the null schema.\n if (! this.$refs.form.$form) return {}\n\n let el = this.$refs.form.$form.querySelector(\"select[name='schema.name']\");\n if (! el) return {}\n\n return { schema: { name: el.value ? el.value : null } };\n },\n validate() {\n return this.$refs.form.validate();\n },\n on_error(response) {\n return this.$refs.form.on_error(response);\n },\n }\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** form.vue?1551ef89\n **/","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".actions-list{margin-bottom:0}.actions-list .list-group-item{height:68px;background-color:#fbfbfb;margin:0 0 10px;border-radius:0;border:4px solid transparent;padding:0}.actions-list .list-group-item:last-child{margin-bottom:0}.actions-list .list-group-item .action-icon{float:left;width:60px;height:60px;background-color:#0073b7;margin:0}.actions-list .list-group-item .action-icon span{color:#fff;line-height:60px;text-align:center;display:block}.actions-list .list-group-item .list-group-item-text{margin-left:70px;font-weight:400}.actions-list .list-group-item .list-group-item-heading{margin-left:70px;margin-top:9px;margin-bottom:3px;font-weight:700}.actions-list .list-group-item:hover{background-color:#eee}.actions-list .list-group-item:hover .action-icon{background-color:#fbfbfb}.resource-upload-dropzone{border:4px dashed #d2d6de;min-height:150px;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.resource-upload-dropzone .lead{margin-bottom:0}.drop-active .resource-upload-dropzone{border:4px dashed #00a65a}.resource-upload-dropzone .col-sm-9>div{margin-right:15px}.resource-choose-upload{text-align:center}.resource-choose-upload a{text-decoration:underline}.modal-body .resource-choose-upload a{color:#fff}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/dataset/resource/form.vue\"],\"names\":[],\"mappings\":\"AAAA,cAAc,eAAe,CAAC,+BAA+B,YAAY,yBAAyB,gBAAgB,gBAAgB,6BAA6B,SAAS,CAAC,0CAA0C,eAAe,CAAC,4CAA4C,WAAW,WAAW,YAAY,yBAAyB,QAAQ,CAAC,iDAAiD,WAAW,iBAAiB,kBAAkB,aAAa,CAAC,qDAAqD,iBAAiB,eAAkB,CAAC,wDAAwD,iBAAiB,eAAe,kBAAkB,eAAgB,CAAC,qCAAqC,qBAAqB,CAAC,kDAAkD,wBAAwB,CAAC,0BAA0B,0BAA0B,iBAAiB,iBAAiB,oBAAoB,kBAAkB,CAAC,gCAAgC,eAAe,CAAC,uCAAuC,yBAAyB,CAAC,wCAAwC,iBAAiB,CAAC,wBAAwB,iBAAiB,CAAC,0BAA0B,yBAAyB,CAAC,sCAAsC,UAAW,CAAC\",\"file\":\"form.vue\",\"sourcesContent\":[\".actions-list{margin-bottom:0}.actions-list .list-group-item{height:68px;background-color:#fbfbfb;margin:0 0 10px;border-radius:0;border:4px solid transparent;padding:0}.actions-list .list-group-item:last-child{margin-bottom:0}.actions-list .list-group-item .action-icon{float:left;width:60px;height:60px;background-color:#0073b7;margin:0}.actions-list .list-group-item .action-icon span{color:#fff;line-height:60px;text-align:center;display:block}.actions-list .list-group-item .list-group-item-text{margin-left:70px;font-weight:normal}.actions-list .list-group-item .list-group-item-heading{margin-left:70px;margin-top:9px;margin-bottom:3px;font-weight:bold}.actions-list .list-group-item:hover{background-color:#eee}.actions-list .list-group-item:hover .action-icon{background-color:#fbfbfb}.resource-upload-dropzone{border:4px dashed #d2d6de;min-height:150px;padding-top:10px;padding-bottom:10px;margin-bottom:15px}.resource-upload-dropzone .lead{margin-bottom:0}.drop-active .resource-upload-dropzone{border:4px dashed #00a65a}.resource-upload-dropzone .col-sm-9>div{margin-right:15px}.resource-choose-upload{text-align:center}.resource-choose-upload a{text-decoration:underline}.modal-body .resource-choose-upload a{color:white}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/dataset/resource/form.vue\n ** module id = 1287\n ** module chunks = 0 2 5 14\n **/","module.exports = \" <div> <form-horizontal v-if=\\\"hasData && !isUpload\\\" class=\\\"resource-form file-resource-form\\\" :fields=fields :model=resource v-ref:form> </form-horizontal> <div v-for=\\\"file in files\\\" track-by=id class=\\\"info-box bg-aqua\\\"> <span class=info-box-icon> <span class=\\\"fa fa-cloud-upload\\\"></span> </span> <div class=info-box-content> <span class=info-box-text>{{file.name}}</span> <span class=info-box-number>{{file.size | filesize}}</span> <div class=progress> <div class=progress-bar :style=\\\"{width: progress+'%'}\\\"></div> </div> <span class=progress-description> {{progress}}% </span> </div> </div> <div class=resource-choose-upload v-show=\\\"isUpload && !files.length\\\"> <div class=resource-upload-dropzone> <div class=row> <div class=\\\"text-center col-xs-12\\\"> <span class=\\\"fa fa-download fa-4x dropicon\\\"></span> </div> <div class=\\\"text-center col-xs-12 lead\\\"> <p>{{ _(\\\"Drag a file here\\\") }}</p> </div> <div class=\\\"text-center col-xs-12\\\"> <p>{{ _( \\\"or\\\") }}</p> </div> <div class=\\\"text-center col-xs-12\\\"> <span v-el:upload-btn class=\\\"btn btn-outline btn-flat\\\"> {{ _(\\\"Select a file from your computer\\\") }} </span> </div> </div> </div> <div v-if=!hasUploadedFile> <a href @click.prevent.stop=manual> {{ _(\\\"You can also link to an existing remote file or URL by clicking here.\\\") }} </a> </div> </div> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/dataset/resource/form.vue\n ** module id = 1290\n ** module chunks = 0 2 5 14\n **/","var __vue_script__, __vue_template__\nrequire(\"!!vue-style?sourceMap!css?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!less?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\")\n__vue_script__ = require(\"!!babel-loader!../../../../node_modules/vue-loader/lib/selector.js?type=script&index=0!./form.vue\")\n__vue_template__ = require(\"!!vue-html-loader!../../../../node_modules/vue-loader/lib/selector.js?type=template&index=0!./form.vue\")\nmodule.exports = __vue_script__ || {}\nif (module.exports.__esModule) module.exports = module.exports.default\nif (__vue_template__) {\n(typeof module.exports === \"function\" ? (module.exports.options || (module.exports.options = {})) : module.exports).template = __vue_template__\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./js/components/dataset/resource/form.vue\n ** module id = 1294\n ** module chunks = 0 2 5 14\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./form.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/dataset/resource/form.vue\n ** module id = 1298\n ** module chunks = 0 2 5 14\n **/","/**\n * A mixin to workaround the $refs lack of reactivity\n */\nexport default {\n ready() {\n for (const $ref of Object.keys(this.$options.watchRefs)) {\n this.watchRef($ref, this.$options.watchRefs[$ref]);\n }\n },\n methods: {\n watchRef($ref, handler) {\n const component = $ref.split('.')[0];\n\n const wait = () => { // Arrow func to keep `this`\n if (this.$refs[component] === undefined) {\n setTimeout(wait, 1);\n return;\n }\n this.$watch(`$refs.${$ref}`, handler.bind(this));\n };\n wait();\n }\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./js/mixins/watch-refs.js\n **/","<style lang=\"less\">\n.resource-modal {\n dd {\n a {\n color: white;\n text-decoration: underline;\n }\n }\n\n .dl-wide dd {\n // URLs and hashes are not breakable on words\n word-break: break-all;\n }\n}\n</style>\n\n<template>\n<div>\n<modal :title=\"resource.title\" class=\"resource-modal\" :large=\"edit\"\n :class=\"{ 'modal-danger': confirm, 'modal-primary': !confirm }\"\n v-ref:modal>\n <div class=\"modal-body\">\n <div v-show=\"!edit && !confirm\">\n {{{ resource.description | markdown }}}\n\n <dl class=\"dl-horizontal dl-wide\">\n <dt>{{ _('Type') }}</dt>\n <dd>{{ resource | resource_type_label }}</dd>\n <dt>{{ _('Location') }}</dt>\n <dd v-if=\"resource.filetype == 'file'\">\n {{ _('This resource is hosted on our servers') }}\n </dd>\n <dd v-if=\"resource.filetype == 'remote'\">\n {{ _('This resource is hosted on an external server') }}\n </dd>\n <dt>{{ _('URL') }}</dt>\n <dd><a :href=\"resource.url\">{{resource.url}}</a></dd>\n <dt v-if=\"resource.format\">{{ _('Format') }}</dt>\n <dd v-if=\"resource.format\">{{ resource.format }}</dd>\n <dt v-if=\"resource.schema?.name || resource.schema?.url\">{{ _('Schema') }}</dt>\n <dd v-if=\"resource.schema?.name\">{{ resource.schema.name }}</dd>\n <dd v-if=\"resource.schema?.url\">{{ resource.schema.url }}</dd>\n <dt v-if=\"resource.mime\">{{ _('Mime Type') }}</dt>\n <dd v-if=\"resource.mime\">{{ resource.mime }}</dd>\n <dt v-if=\"resource.filesize\">{{ _('Size') }}</dt>\n <dd v-if=\"resource.filesize\">{{ resource.filesize }}</dd>\n <dt v-if=\"resource.checksum\">{{ resource.checksum.type }}</dt>\n <dd v-if=\"resource.checksum\">{{ resource.checksum.value }}</dd>\n <dt v-if=\"resource.created_at\">{{ _('Created on') }}</dt>\n <dd v-if=\"resource.created_at\">{{ resource.created_at | dt }}</dd>\n <dt v-if=\"resource.last_modified\">{{ _('Modified on') }}</dt>\n <dd v-if=\"resource.last_modified\">{{ resource.last_modified | dt }}</dd>\n <dt v-if=\"resource.metrics && resource.metrics.downloads\">{{ _('Downloads') }}</dt>\n <dd v-if=\"resource.metrics && resource.metrics.downloads\">{{ resource.metrics.downloads }}</dd>\n <dt v-if=\"is_community\">{{ _('Publish by') }}</dt>\n <dd v-if=\"is_community\">\n <user-card v-if=\"resource.owner\" :user=\"resource.owner\"></user-card>\n <org-card v-if=\"resource.organization\" :organization=\"resource.organization\"></org-card>\n </dd>\n </dl>\n </div>\n\n <resource-form v-show=\"edit\" v-ref:form :dataset=\"dataset\" :resource=\"resource\"></resource-form>\n\n <div v-show=\"confirm\">\n <p class=\"lead text-center\">\n {{ _('You are about to delete this resource') }}\n </p>\n <p class=\"lead text-center\">\n {{ _('Are you sure ?') }}\n </p>\n </div>\n </div>\n\n <footer class=\"modal-footer text-center\">\n <!-- Main close button (visible on read-only display) -->\n <button type=\"button\" v-show=\"!edit && !confirm && !isUpload\"\n class=\"btn btn-primary btn-flat pull-left\"\n @click=\"$refs.modal.close\">\n {{ _('Close') }}\n </button>\n <!-- Same cancel button for every action-->\n <button type=\"button\" v-show=\"edit || confirm || isUpload\"\n class=\"btn btn-flat pull-left\"\n :class=\"{'btn-danger': confirm, 'btn-primary': !confirm}\"\n @click=\"cancel\">\n {{ _('Cancel') }}\n </button>\n <button type=\"button\" v-show=\"!edit && !confirm && can_edit\"\n class=\"btn btn-danger btn-flat\"\n @click=\"confirm = true\">\n {{ _('Delete') }}\n </button>\n <button type=\"button\" v-show=\"!edit && !confirm && can_edit\"\n class=\"btn btn-outline btn-flat\"\n @click=\"edit = true\">\n {{ _('Edit') }}\n </button>\n <button type=\"button\" v-show=\"confirm\"\n class=\"btn btn-warning btn-flat\"\n @click=\"delete_confirmed\">\n {{ _('Confirm') }}\n </button>\n <button type=\"button\" v-show=\"edit && hasUploadedFile && !isUpload\"\n class=\"btn btn-outline btn-flat\"\n @click=\"upload\">\n {{ _('Replace the file') }}\n </button>\n <button type=\"button\" v-show=\"edit && !isUpload\"\n class=\"btn btn-outline btn-flat\"\n @click=\"save\">\n {{ _('Save') }}\n </button>\n </footer>\n</modal>\n</div>\n</template>\n\n<script>\nimport API from 'api';\nimport Dataset from 'models/dataset';\nimport Resource from 'models/resource';\nimport CommunityResource from 'models/communityresource';\n\nimport Modal from 'components/modal.vue'\nimport ResourceForm from 'components/dataset/resource/form.vue'\nimport OrgCard from 'components/organization/card.vue'\nimport UserCard from 'components/user/card.vue'\nimport DatasetFilters from 'components/dataset/filters';\n\nimport WatchRefs from 'mixins/watch-refs';\n\nexport default {\n name: 'resource-modal',\n components: {Modal, ResourceForm, OrgCard, UserCard},\n mixins: [DatasetFilters, WatchRefs],\n data() {\n return {\n edit: false,\n confirm: false,\n dataset: this.$parent.$parent.dataset, // Because this is a nested view\n resource: {},\n next_route: null,\n isUpload: false,\n hasUploadedFile: false,\n successMsg: undefined,\n };\n },\n computed: {\n can_edit() {\n if (this.is_community) {\n return this.$root.me.can_edit(this.resource);\n } else {\n return this.$root.me.can_edit(this.dataset);\n }\n },\n is_community() {\n return this.resource instanceof CommunityResource\n },\n },\n events: {\n 'modal:closed': function() {\n if (this.next_route) {\n this.$go(this.next_route);\n }\n }\n },\n route: {\n data() {\n if (this.$route.matched.length > 1) {\n // This is a nested view\n const idx = this.$route.matched.length - 2;\n const parent = this.$route.matched[idx];\n this.next_route = {\n name: parent.handler.name,\n params: parent.params\n };\n }\n if (this.$route.name.includes('community')) {\n this.resource = new CommunityResource();\n this.resource.fetch(this.$route.params.rid);\n this.resource.$once('updated', () => {\n // Next updated will be on success\n this.updHandler = this.resource.$once('updated', this.on_success);\n });\n } else if (this.dataset.loading) {\n // Dataset from parent view is still loading\n this.updHandler = this.dataset.$once('updated', this.resource_from_dataset);\n } else {\n // Dataset from parent view is already fetched\n this.resource_from_dataset();\n }\n },\n deactivate() {\n if (this.updHandler) {\n this.updHandler.remove();\n this.updHandler = undefined;\n }\n }\n },\n methods: {\n cancel() {\n if (this.confirm) {\n this.confirm = false;\n } else if (this.edit && !this.isUpload) {\n this.edit = false;\n } else if (this.isUpload) {\n this.$refs.form.isUpload = false;\n }\n },\n upload() {\n this.$refs.form.isUpload = true;\n },\n save() {\n const $form = this.$refs.form;\n if ($form.validate()) {\n this.successMsg = this._('Your resource has been updated.')\n if (this.is_community) {\n Object.assign(this.resource, $form.serialize());\n this.resource.save($form.on_error);\n } else {\n this.dataset.save_resource($form.serialize(), $form.on_error);\n }\n return true;\n }\n },\n on_success() {\n this.$dispatch('notify', {\n autoclose: true,\n title: this._('Changes saved'),\n details: this.successMsg\n });\n this.$refs.modal.close();\n },\n delete_confirmed() {\n this.successMsg = this._('Your resource has been deleted.')\n if (this.is_community) {\n this.resource.delete();\n } else {\n this.dataset.delete_resource(this.resource.id);\n }\n },\n resource_from_dataset() {\n const rid = this.$route.params.rid;\n const data = this.dataset.resources.find(resource => resource.id === rid);\n if (data) {\n this.resource = new Resource({data});\n this.updHandler = this.dataset.$once('updated', this.on_success)\n }\n }\n },\n watchRefs: {\n 'form.isUpload': function(isUpload) {\n this.isUpload = isUpload;\n },\n 'form.hasUploadedFile': function(hasUploadedFile) {\n this.hasUploadedFile = hasUploadedFile;\n }\n },\n};\n</script>\n\n\n\n/** WEBPACK FOOTER **\n ** modal.vue?6098723b\n **/","exports = module.exports = require(\"../../../../node_modules/css-loader/lib/css-base.js\")();\n// imports\n\n\n// module\nexports.push([module.id, \".resource-modal dd a{color:#fff;text-decoration:underline}.resource-modal .dl-wide dd{word-break:break-all}\", \"\", {\"version\":3,\"sources\":[\"/./js/components/dataset/resource/modal.vue\"],\"names\":[],\"mappings\":\"AAAA,qBAAqB,WAAY,yBAAyB,CAAC,4BAA4B,oBAAoB,CAAC\",\"file\":\"modal.vue\",\"sourcesContent\":[\".resource-modal dd a{color:white;text-decoration:underline}.resource-modal .dl-wide dd{word-break:break-all}\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/dataset/resource/modal.vue\n ** module id = 1491\n ** module chunks = 2\n **/","module.exports = \" <div> <modal :title=resource.title class=resource-modal :large=edit :class=\\\"{ 'modal-danger': confirm, 'modal-primary': !confirm }\\\" v-ref:modal> <div class=modal-body> <div v-show=\\\"!edit && !confirm\\\"> {{{ resource.description | markdown }}} <dl class=\\\"dl-horizontal dl-wide\\\"> <dt>{{ _('Type') }}</dt> <dd>{{ resource | resource_type_label }}</dd> <dt>{{ _('Location') }}</dt> <dd v-if=\\\"resource.filetype == 'file'\\\"> {{ _('This resource is hosted on our servers') }} </dd> <dd v-if=\\\"resource.filetype == 'remote'\\\"> {{ _('This resource is hosted on an external server') }} </dd> <dt>{{ _('URL') }}</dt> <dd><a :href=resource.url>{{resource.url}}</a></dd> <dt v-if=resource.format>{{ _('Format') }}</dt> <dd v-if=resource.format>{{ resource.format }}</dd> <dt v-if=\\\"resource.schema?.name || resource.schema?.url\\\">{{ _('Schema') }}</dt> <dd v-if=resource.schema?.name>{{ resource.schema.name }}</dd> <dd v-if=resource.schema?.url>{{ resource.schema.url }}</dd> <dt v-if=resource.mime>{{ _('Mime Type') }}</dt> <dd v-if=resource.mime>{{ resource.mime }}</dd> <dt v-if=resource.filesize>{{ _('Size') }}</dt> <dd v-if=resource.filesize>{{ resource.filesize }}</dd> <dt v-if=resource.checksum>{{ resource.checksum.type }}</dt> <dd v-if=resource.checksum>{{ resource.checksum.value }}</dd> <dt v-if=resource.created_at>{{ _('Created on') }}</dt> <dd v-if=resource.created_at>{{ resource.created_at | dt }}</dd> <dt v-if=resource.last_modified>{{ _('Modified on') }}</dt> <dd v-if=resource.last_modified>{{ resource.last_modified | dt }}</dd> <dt v-if=\\\"resource.metrics && resource.metrics.downloads\\\">{{ _('Downloads') }}</dt> <dd v-if=\\\"resource.metrics && resource.metrics.downloads\\\">{{ resource.metrics.downloads }}</dd> <dt v-if=is_community>{{ _('Publish by') }}</dt> <dd v-if=is_community> <user-card v-if=resource.owner :user=resource.owner></user-card> <org-card v-if=resource.organization :organization=resource.organization></org-card> </dd> </dl> </div> <resource-form v-show=edit v-ref:form :dataset=dataset :resource=resource></resource-form> <div v-show=confirm> <p class=\\\"lead text-center\\\"> {{ _('You are about to delete this resource') }} </p> <p class=\\\"lead text-center\\\"> {{ _('Are you sure ?') }} </p> </div> </div> <footer class=\\\"modal-footer text-center\\\"> <button type=button v-show=\\\"!edit && !confirm && !isUpload\\\" class=\\\"btn btn-primary btn-flat pull-left\\\" @click=$refs.modal.close> {{ _('Close') }} </button> <button type=button v-show=\\\"edit || confirm || isUpload\\\" class=\\\"btn btn-flat pull-left\\\" :class=\\\"{'btn-danger': confirm, 'btn-primary': !confirm}\\\" @click=cancel> {{ _('Cancel') }} </button> <button type=button v-show=\\\"!edit && !confirm && can_edit\\\" class=\\\"btn btn-danger btn-flat\\\" @click=\\\"confirm = true\\\"> {{ _('Delete') }} </button> <button type=button v-show=\\\"!edit && !confirm && can_edit\\\" class=\\\"btn btn-outline btn-flat\\\" @click=\\\"edit = true\\\"> {{ _('Edit') }} </button> <button type=button v-show=confirm class=\\\"btn btn-warning btn-flat\\\" @click=delete_confirmed> {{ _('Confirm') }} </button> <button type=button v-show=\\\"edit && hasUploadedFile && !isUpload\\\" class=\\\"btn btn-outline btn-flat\\\" @click=upload> {{ _('Replace the file') }} </button> <button type=button v-show=\\\"edit && !isUpload\\\" class=\\\"btn btn-outline btn-flat\\\" @click=save> {{ _('Save') }} </button> </footer> </modal> </div> \";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-html-loader!./~/vue-loader/lib/selector.js?type=template&index=0!./js/components/dataset/resource/modal.vue\n ** module id = 1517\n ** module chunks = 2\n **/","// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = require(\"!../../../../node_modules/vue-style-loader/addStyles.js\")(content, {\"sourceMap\":true});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(module.hot) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\", function() {\n\t\t\tvar newContent = require(\"!!../../../../node_modules/css-loader/index.js?sourceMap!../../../../node_modules/vue-loader/lib/style-rewriter.js!../../../../node_modules/less-loader/index.js?sourceMap=source-map-less-inline!../../../../node_modules/vue-loader/lib/selector.js?type=style&index=0!./modal.vue\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/vue-style-loader?sourceMap!./~/css-loader?sourceMap!./~/vue-loader/lib/style-rewriter.js!./~/less-loader?sourceMap=source-map-less-inline!./~/vue-loader/lib/selector.js?type=style&index=0!./js/components/dataset/resource/modal.vue\n ** module id = 1642\n ** module chunks = 2\n **/"],"sourceRoot":""}
|