{"version":3,"sources":["webpack:///./src/components/UI/Loader.vue","webpack:///src/components/UI/Loader.vue","webpack:///./src/components/UI/Loader.vue?6e56","webpack:///./src/components/UI/Loader.vue?9492","webpack:///./src/components/UI/ImageCropper.vue?0696","webpack:///./src/components/UI/ImageCropper.vue","webpack:///src/components/UI/ImageCropper.vue","webpack:///./src/components/UI/ImageCropper.vue?3279","webpack:///./src/components/UI/ImageCropper.vue?c072","webpack:///./node_modules/cropperjs/dist/cropper.js"],"names":["render","_vm","this","_c","_self","staticClass","attrs","color","width","height","staticRenderFns","name","props","type","String","default","Number","component","isStatic","_e","_t","showRestoreIcon","on","$event","restoreImage","allowedFileTypes","onFileChanged","uploadButtonView","_v","_s","$t","showSlider","directives","rawName","value","zoomSlider","expression","modifiers","domProps","cropperZoomTo","_n","target","$forceUpdate","errorMessages","length","Array","isArray","_l","message","index","key","concat","isLoading","class","aspectRatioCssClass","imageContainerCssClass","style","cropperContainerStyle","aspectRatio","imageURL","components","Loader","Object","alwaysHideRestore","Boolean","note","autoCropArea","dragMode","guides","previewContainer","minContainerWidth","minContainerHeight","minWidth","minHeight","maxWidth","maxHeight","viewMode","originalImage","required","data","inValidImage","imgCropper","previewReady","isMinimalSizeAtLoad","isWrongFileType","imageCheckedTimer","newImageChosen","sourceFileType","imageErrorMessages","notValidated","computed","imageValidationRules","_this2","rules","isValid","noValidImageChosen","output","push","watch","handler","val","$emit","created","setStartImage","beforeDestroy","URL","revokeObjectURL","methods","checkValidation","isExistingImage","test","performance","now","renderCropper","imageSource","_this","previews","document","querySelectorAll","image","getElementById","src","destroy","each","elem","firstChild","removeChild","Cropper","initialAspectRatio","zoomOnWheel","zoomOnTouch","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","highlight","ready","_this3","clone","cloneNode","className","cssText","appendChild","t","setTimeout","zoomTo","CROPPER_DATA","cropper","getImageData","naturalWidth","naturalHeight","clearTimeout","crop","event","detail","imageData","previewAspectRatio","previewImage","getElementsByTagName","item","previewWidth","offsetWidth","previewHeight","imageScaledRatio","marginLeft","x","marginTop","y","arr","callback","i","call","sourceCanHaveTransparency","mimeTypeCanHaveTransparency","getCroppedCanvas","croppedCanvas","imageSmoothingEnabled","imageSmoothingQuality","canvasToUploadDataUrl","file","files","indexOf","toLowerCase","Image","createObjectURL","onload","resizedImage","resizeImage","getNewPhoto","evt","CONTAINER_DATA","getCropBoxData","img","MAX_WITH","MAX_HEIGHT","isResized","canvas","createElement","Math","round","ctx","getContext","drawImage","reset","EventBus","global","factory","module","exports","ownKeys","e","r","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","apply","_objectSpread2","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPrimitive","Symbol","toPrimitive","TypeError","_toPropertyKey","_typeof","iterator","constructor","prototype","_classCallCheck","instance","Constructor","_defineProperties","descriptor","configurable","writable","_createClass","protoProps","staticProps","obj","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","from","minLen","n","toString","slice","len","arr2","IS_BROWSER","window","WINDOW","IS_TOUCH_DEVICE","documentElement","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","NaN","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","center","background","autoCrop","movable","rotatable","scalable","zoomable","wheelZoomRatio","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","cropstart","cropmove","cropend","zoom","TEMPLATE","isNaN","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","toArray","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","REGEXP_SUFFIX","setStyle","element","styles","property","hasClass","classList","contains","addClass","add","trim","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","getData","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","split","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","transform","join","WebkitTransform","msTransform","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","x1","abs","startX","y1","startY","x2","endX","y2","endY","z1","sqrt","z2","ratio","getPointer","_ref2","endOnly","pageX","pageY","end","getPointersCenter","count","_ref3","getAdjustedSizes","_ref4","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getSourceCanvas","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","imageNaturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","_ref8$imageSmoothingQ","_ref8$maxWidth","_ref8$maxHeight","_ref8$minWidth","_ref8$minHeight","context","maxSizes","minSizes","min","max","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","map","param","floor","fromCharCode","getStringFromCharCode","dataView","start","str","getUint8","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","atob","arrayBuffer","ArrayBuffer","uint8","Uint8Array","charCodeAt","arrayBufferToDataURL","mimeType","chunks","chunkSize","subarray","btoa","resetAndGetOrientation","orientation","DataView","littleEndian","app1Start","ifdStart","byteLength","offset","exifIDCode","tiffOffset","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","parseOrientation","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","containerData","offsetHeight","rotated","canvasWidth","canvasHeight","canvasData","limited","limitCanvas","oldLeft","oldTop","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","viewBox","viewBoxImage","ownerDocument","querySelector","el","html","innerHTML","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","events","bind","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","ratioX","ratioY","getCanvasData","setCanvasData","setCropBoxData","setDragMode","dragBox","delta","preventDefault","wheeling","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","right","bottom","renderable","shiftKey","range","check","side","move","p","initialImageData","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","sized","widthChanged","heightChanged","HTMLCanvasElement","source","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","mode","croppable","AnotherCropper","tagName","Error","reloading","sizing","init","toDataURL","read","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","isIOSWebKit","navigator","userAgent","done","build","sizingImage","body","template","getElementsByClassName","unbuild"],"mappings":"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","file":"js/chunk-28480790.js?id=705bc5a638dffcf70b8e","sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"has-padding has-text-centered\"},[_c('svg',{attrs:{\"viewBox\":\"0 0 120 30\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"fill\":_vm.color,\"width\":_vm.width,\"height\":_vm.height}},[_c('circle',{attrs:{\"cx\":\"15\",\"cy\":\"15\",\"r\":\"15\"}},[_c('animate',{attrs:{\"attributeName\":\"r\",\"from\":\"15\",\"to\":\"15\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\"15;9;15\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}}),_c('animate',{attrs:{\"attributeName\":\"fill-opacity\",\"from\":\"1\",\"to\":\"1\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\"1;.5;1\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}})]),_c('circle',{attrs:{\"cx\":\"60\",\"cy\":\"15\",\"r\":\"9\",\"fill-opacity\":\"0.3\"}},[_c('animate',{attrs:{\"attributeName\":\"r\",\"from\":\"9\",\"to\":\"9\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\"9;15;9\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}}),_c('animate',{attrs:{\"attributeName\":\"fill-opacity\",\"from\":\"0.5\",\"to\":\"0.5\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\".5;1;.5\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}})]),_c('circle',{attrs:{\"cx\":\"105\",\"cy\":\"15\",\"r\":\"15\"}},[_c('animate',{attrs:{\"attributeName\":\"r\",\"from\":\"15\",\"to\":\"15\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\"15;9;15\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}}),_c('animate',{attrs:{\"attributeName\":\"fill-opacity\",\"from\":\"1\",\"to\":\"1\",\"begin\":\"0s\",\"dur\":\"0.8s\",\"values\":\"1;.5;1\",\"calcMode\":\"linear\",\"repeatCount\":\"indefinite\"}})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"has-padding has-text-centered\">\n    <svg\n      viewBox=\"0 0 120 30\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      :fill=\"color\"\n      :width=\"width\"\n      :height=\"height\"\n    >\n      <circle cx=\"15\" cy=\"15\" r=\"15\">\n        <animate\n          attributeName=\"r\"\n          from=\"15\"\n          to=\"15\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"15;9;15\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"1\"\n          to=\"1\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"1;.5;1\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n      <circle cx=\"60\" cy=\"15\" r=\"9\" fill-opacity=\"0.3\">\n        <animate\n          attributeName=\"r\"\n          from=\"9\"\n          to=\"9\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"9;15;9\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"0.5\"\n          to=\"0.5\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\".5;1;.5\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n      <circle cx=\"105\" cy=\"15\" r=\"15\">\n        <animate\n          attributeName=\"r\"\n          from=\"15\"\n          to=\"15\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"15;9;15\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n        <animate\n          attributeName=\"fill-opacity\"\n          from=\"1\"\n          to=\"1\"\n          begin=\"0s\"\n          dur=\"0.8s\"\n          values=\"1;.5;1\"\n          calcMode=\"linear\"\n          repeatCount=\"indefinite\"\n        />\n      </circle>\n    </svg>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: \"dots\",\n  props: {\n    color: {\n      type: String,\n      default: \"#000\"\n    },\n    height: {\n      type: Number,\n      default: 240\n    },\n    width: {\n      type: Number,\n      default: 60\n    }\n  }\n};\n</script>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Loader.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=2e82bc9d\"\nimport script from \"./Loader.vue?vue&type=script&lang=js\"\nexport * from \"./Loader.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=style&index=0&id=e6d08b70&prod&lang=sass&scoped=true\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"wrapper-imageCropper\"},[(!_vm.isStatic)?_c('div',{staticClass:\"cropper-controls is-flex-grow-1\"},[_vm._t(\"default\"),_c('div',{staticClass:\"upload-controls mb-5 content\"},[_c('div',{staticClass:\"is-inline-flex is-align-items-center mb-5\"},[(_vm.showRestoreIcon)?_c('a',{staticClass:\"icon mr-4\",on:{\"click\":function($event){return _vm.restoreImage()}}},[_c('font-awesome-icon',{attrs:{\"icon\":['fas', 'undo']}})],1):_vm._e(),_c('div',{staticClass:\"file is-success\"},[_c('label',{staticClass:\"file-label\"},[_c('input',{staticClass:\"file-input\",attrs:{\"type\":\"file\",\"accept\":String(_vm.allowedFileTypes),\"rel\":\"fileInput\"},on:{\"change\":_vm.onFileChanged}}),_c('span',{staticClass:\"file-cta\"},[_c('span',{staticClass:\"file-label\"},[(_vm.uploadButtonView !== 'text')?[_c('span',{staticClass:\"icon\"},[_c('font-awesome-icon',{attrs:{\"icon\":['far', 'camera']}})],1),(_vm.uploadButtonView !== 'icon')?_c('span',[_vm._v(_vm._s(_vm.$t('Form.Control.Choose')))]):_vm._e()]:_vm._e(),(_vm.uploadButtonView === 'text')?[_vm._v(\" \"+_vm._s(_vm.$t('Form.Control.ChooseImage'))+\" \")]:_vm._e()],2)])])])]),(_vm.showSlider)?_c('div',{staticClass:\"slider-field is-flex field mb-5\"},[_c('strong',{staticClass:\"icon is-size-5\"},[_vm._v(\"-\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model.number\",value:(_vm.zoomSlider),expression:\"zoomSlider\",modifiers:{\"number\":true}}],staticClass:\"slider is-medium is-circle is-fullwidth\",attrs:{\"step\":\"0.1\",\"min\":0.1,\"max\":0.8,\"type\":\"range\"},domProps:{\"value\":(_vm.zoomSlider)},on:{\"input\":_vm.cropperZoomTo,\"__r\":function($event){_vm.zoomSlider=_vm._n($event.target.value)},\"blur\":function($event){return _vm.$forceUpdate()}}}),_c('strong',{staticClass:\"icon is-size-5\"},[_vm._v(\"+\")])]):_vm._e(),(_vm.errorMessages.length)?_c('div',{staticClass:\"errorMessages has-text-danger is-size-7\"},[(!Array.isArray(_vm.errorMessages))?_c('span',{staticClass:\"help is-danger\",domProps:{\"innerHTML\":_vm._s(_vm.errorMessages)}}):_c('div',{staticClass:\"help is-danger\"},_vm._l((_vm.errorMessages),function(message,index){return _c('div',{key:`e${index}`,domProps:{\"innerHTML\":_vm._s(message)}})}),0)]):_vm._e()])],2):_vm._e(),_c('div',{staticClass:\"img-container-wrapper\"},[(_vm.isLoading)?_c('div',{staticClass:\"loader-wrapper is-flex is-align-items-center is-justify-content-center\"},[_c('Loader',{staticClass:\"custom-loader\"})],1):_vm._e(),_c('div',[_c('div',{staticClass:\"image img-container\",class:[_vm.aspectRatioCssClass, _vm.imageContainerCssClass],style:(_vm.cropperContainerStyle)},[_c('img',{staticClass:\"originalImage\",style:({aspectRatio: _vm.aspectRatio}),attrs:{\"id\":\"image\",\"src\":_vm.imageURL}})])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"wrapper-imageCropper\">\n    <div\n      v-if=\"!isStatic\"\n      class=\"cropper-controls is-flex-grow-1\"\n    >\n      <slot></slot>\n      <div class=\"upload-controls mb-5 content\">\n        <div class=\"is-inline-flex is-align-items-center mb-5\">\n          <a\n            v-if=\"showRestoreIcon\"\n            @click=\"restoreImage()\"\n            class=\"icon mr-4\"\n          >\n            <font-awesome-icon :icon=\"['fas', 'undo']\" />\n          </a>\n          <div class=\"file is-success\">\n            <label class=\"file-label\">\n              <input\n                class=\"file-input\"\n                type=\"file\"\n                :accept=\"String(allowedFileTypes)\"\n                @change=\"onFileChanged\"\n                rel=\"fileInput\"\n              />\n              <span class=\"file-cta\">\n                <span class=\"file-label\">\n                  <template v-if=\"uploadButtonView !== 'text'\">\n                    <span class=\"icon\">\n                      <font-awesome-icon :icon=\"['far', 'camera']\" />\n                    </span>\n                    <span v-if=\"uploadButtonView !== 'icon'\">{{$t('Form.Control.Choose')}}</span>\n                  </template>\n                  <template v-if=\"uploadButtonView === 'text'\">\n                    {{$t('Form.Control.ChooseImage')}}\n                  </template>\n                </span>\n              </span>\n            </label>\n          </div>\n        </div>\n\n        <!-- Zoom control -->\n        <div\n          v-if=\"showSlider\"\n          class=\"slider-field is-flex field mb-5\"\n        >\n          <strong class=\"icon is-size-5\">-</strong>\n          <input\n            v-model.number=\"zoomSlider\"\n            class=\"slider is-medium is-circle is-fullwidth\"\n            step=\"0.1\"\n            v-bind:min=\"0.1\"\n            v-bind:max=\"0.8\"\n            type=\"range\"\n            @input=\"cropperZoomTo\"\n          />\n          <strong class=\"icon is-size-5\">+</strong>\n        </div>\n        <div\n          v-if=\"errorMessages.length\"\n          class=\"errorMessages has-text-danger is-size-7\"\n        >\n          <span\n            v-if=\"!Array.isArray(errorMessages)\"\n            class=\"help is-danger\"\n            v-html=\"errorMessages\"\n          ></span>\n          <div\n            v-else\n            class=\"help is-danger\"\n          >\n            <div\n              v-for=\"(message, index) in errorMessages\"\n              :key=\"`e${index}`\"\n              v-html=\"message\"\n            ></div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"img-container-wrapper\">\n      <div\n        v-if=\"isLoading\"\n        class=\"loader-wrapper is-flex is-align-items-center is-justify-content-center\"\n      >\n        <Loader class=\"custom-loader\" />\n      </div>\n      <div>\n        <div\n          class=\"image img-container\"\n          :class=\"[aspectRatioCssClass, imageContainerCssClass]\"\n          :style=\"cropperContainerStyle\"\n        >\n          <img\n            id=\"image\"\n            class=\"originalImage\"\n            :src=\"imageURL\"\n            :style=\"{aspectRatio: aspectRatio}\"\n          >\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\nimport Cropper from 'cropperjs';\nimport 'cropperjs/dist/cropper.css';\nimport Loader from './Loader.vue'\nimport EventBus from '../../eventbus/event-bus';\nimport { canvasToUploadDataUrl, mimeTypeCanHaveTransparency } from '@/utils/imageHelper'\nexport default {\n  name: 'ImageCropper',\n\n  components: {\n    Loader,\n  },\n\n  props: {\n    allowedFileTypes: {\n      type: Array,\n      default: function() {\n        return [\n          'image/png',\n          'image/jpg',\n          'image/jpeg',\n          'image/gif',\n          'image/webp',\n        ]\n      }\n    },\n    cropperContainerStyle: {\n      type: [String, Object],\n      default: null,\n    },\n\n    alwaysHideRestore: {\n      type: Boolean,\n      default: false\n    },\n\n    isStatic: {\n      type: Boolean,\n      default: false\n    },\n\n    uploadButtonView: {\n      type: String,\n      default: 'text',\n      note: 'Options are: text | icon-text | icon'\n    },\n\n    aspectRatio: {\n      type: Number,\n      default: 4 / 3\n    },\n\n    aspectRatioCssClass: {\n      type: String,\n      default: 'is-4by3'\n    },\n\n    imageContainerCssClass: {\n      type: String,\n      default: ''\n    },\n\n    autoCropArea: {\n      type: Number,\n      default: 1\n    },\n\n    dragMode: {\n      type: String,\n      default: 'move'\n    },\n\n    guides: {\n      type: Boolean,\n      default: true\n    },\n\n    previewContainer: {\n      type: String,\n      default: ''\n    },\n\n    minContainerWidth: {\n      type: Number,\n      default: 100\n    },\n\n    minContainerHeight: {\n      type: Number,\n      default: 100\n    },\n\n    minWidth: {\n      type: Number,\n      default: 1024\n    },\n\n    minHeight: {\n      type: Number,\n      default: 1024\n    },\n\n    maxWidth: {\n      type: Number,\n      default: 1920\n    },\n    maxHeight: {\n      type: Number,\n      default: 1920\n    },\n\n    width: {\n      type: Number,\n      default: 0\n    },\n\n    height: {\n      type: Number,\n      default: 0\n    },\n\n    viewMode: {\n      type: Number,\n      default: 3\n    },\n\n    originalImage: {\n      type: String,\n      default: ''\n    },\n\n    required: {\n      type: Boolean,\n      default: true\n    }\n  },\n\n  data() {\n    return {\n      imageURL: '',\n      inValidImage: false,\n      imgCropper: null,\n      previewReady: false,\n      isMinimalSizeAtLoad: false,\n      isWrongFileType: false,\n      imageCheckedTimer: null,\n      newImageChosen: false,\n      sourceFileType: '',\n      isLoading: false,\n      imageErrorMessages: {\n        required: this.$t('Form.InputErrors.ImageIsRequired'),\n        inValidImage: this.$t('Form.InputErrors.ImageTooSmall'),\n        isWrongFileType: this.$t('Form.InputErrors.WrongType'),\n      },\n      notValidated: true,\n      zoomSlider: 0.1\n    }\n  },\n\n  computed: {\n    imageValidationRules() {\n      let rules = {\n        required: () => { return !this.required },\n        inValidImage: () => { return !this.inValidImage },\n        isWrongFileType: () => { return !this.isWrongFileType }\n      }\n      return rules\n    },\n\n    showRestoreIcon() {\n      return !this.alwaysHideRestore && this.newImageChosen && this.originalImage !== ''\n    },\n\n    showSlider() {\n      return this.previewReady && !this.isMinimalSizeAtLoad\n    },\n\n    isValid() {\n      return !this.inValidImage && !this.isWrongFileType\n    },\n\n    noValidImageChosen() {\n      return this.newImageChosen && (this.inValidImage || !this.previewReady || this.isWrongFileType)\n    },\n\n    errorMessages() {\n      let output = []\n\n      if (this.required && !this.notValidated && !this.originalImage && !this.newImageChosen) { output.push(this.imageErrorMessages.required) }\n      this.inValidImage && output.push(this.imageErrorMessages.inValidImage)\n      this.isWrongFileType && output.push(this.imageErrorMessages.isWrongFileType)\n      return output\n    }\n  },\n\n  watch: {\n    noValidImageChosen: {\n      handler: function(val) {\n        this.$emit('errorCallbackInvalid', val)\n      }\n    },\n  },\n\n  created() {\n    this.setStartImage()\n  },\n\n  beforeDestroy() {\n    this.imageURL && URL.revokeObjectURL(this.imageURL)\n  },\n\n  methods: {\n    checkValidation() {\n      this.notValidated = false\n    },\n\n    setStartImage() {\n      this.imageURL = '/images/noImage.png'\n      if (!this.originalImage) { return }\n\n      let isExistingImage = /\\.(jpe?g|png|webp)(\\?|$)/i.test(this.originalImage)\n      this.imageURL = isExistingImage ? this.originalImage + '?' + performance.now() : this.originalImage\n    },\n\n    /**\n     * Render image cropper\n     */\n    renderCropper(imageSource) {\n      let _this = this\n      const previews = this.previewContainer ? document.querySelectorAll(this.previewContainer) : []\n      const image = document.getElementById('image')\n      this.previewReady = false\n      image.src = imageSource\n\n      // First destroy cropperjs instance when exists before creating instance \n      this.imgCropper && this.imgCropper.destroy()\n\n      // Delete all childs in preview elements\n      _this.each(previews, function(elem) {\n        while (elem.firstChild) {\n          elem.removeChild(elem.firstChild)\n        }\n      })\n\n      // Create cropper instance\n      this.imgCropper = new Cropper(image, {\n        initialAspectRatio: this.aspectRatio,\n        aspectRatio: this.aspectRatio,\n        viewMode: this.viewMode,\n        dragMode: this.dragMode,\n        minContainerWidth: this.minContainerWidth,\n        minContainerHeight: this.minContainerHeight,\n        zoomOnWheel: false,\n        zoomOnTouch: false,\n        cropBoxMovable: false,\n        cropBoxResizable: false,\n        toggleDragModeOnDblclick: false,\n        autoCropArea: this.autoCropArea,\n        guides: this.guides,\n        highlight: false,\n        ready() {\n          // Occupy preview elements\n          let clone = this.cloneNode();\n          clone.className = '';\n          clone.style.cssText = (\n            'display: block;' +\n            'width: 100%;' +\n            'min-width: 0;' +\n            'min-height: 0;' +\n            'max-width: none;' +\n            'max-height: none;'\n          )\n\n          _this.each(previews, function(elem) {\n            elem.appendChild(clone.cloneNode());\n          });\n          let t = setTimeout(() => {\n            _this.zoomSlider = 0.1\n            _this.imgCropper.zoomTo(0.1)\n            let CROPPER_DATA = this.cropper.getImageData()\n            _this.isMinimalSizeAtLoad = CROPPER_DATA.naturalWidth <= _this.minWidth || CROPPER_DATA.naturalHeight <= (_this.minHeight / _this.aspectRatio)\n            _this.inValidImage = _this.minWidth > CROPPER_DATA.naturalWidth || (_this.minHeight / _this.aspectRatio) > CROPPER_DATA.naturalHeight //_this.minHeight > CROPPER_DATA.naturalHeight\n            clearTimeout(t)\n          }, 0)\n          _this.previewReady = true\n          _this.isLoading = false\n        },\n\n        crop(event) {\n          // When preview is ready update preview elemens when\n          // crop data is updated.\n          if (!_this.previewReady) {\n            return;\n          }\n\n          var data = event.detail\n          var cropper = this.cropper;\n          var imageData = cropper.getImageData();\n          var previewAspectRatio = this.aspectRatio;\n\n          _this.each(previews, function(elem) {\n            var previewImage = elem.getElementsByTagName('img').item(0);\n            var previewWidth = elem.offsetWidth;\n            var previewHeight = previewWidth / previewAspectRatio;\n            var imageScaledRatio = data.width / previewWidth;\n\n            elem.style.height = previewHeight + 'px';\n            previewImage.style.width = imageData.naturalWidth / imageScaledRatio + 'px';\n            previewImage.style.height = imageData.naturalHeight / imageScaledRatio + 'px';\n            previewImage.style.marginLeft = -data.x / imageScaledRatio + 'px';\n            previewImage.style.marginTop = -data.y / imageScaledRatio + 'px';\n          });\n        },\n      });\n    },\n\n    /**\n     * Loop method with used to indentify the preview containers\n     */\n    each(arr, callback) {\n      if (!arr.length) { return }\n\n      for (let i = 0; i < arr.length; i++) {\n        callback.call(arr, arr[i], i, arr);\n      }\n\n      return arr;\n    },\n\n    /**\n     * Check if the image that is being cropped can contain transparency.\n     * A newly chosen file uses its MIME type, an existing (CDN) image uses its file extension.\n     */\n    sourceCanHaveTransparency() {\n      if (this.sourceFileType) {\n        return mimeTypeCanHaveTransparency(this.sourceFileType)\n      }\n\n      return /\\.(png|gif|webp)(\\?|$)/i.test(this.originalImage || '')\n    },\n\n    /**\n     * Get cropped image base64 data\n     */\n    getCroppedCanvas() {\n      if (this.imgCropper === null) { return null }\n      const croppedCanvas = this.imgCropper.getCroppedCanvas({\n        width: this.width || this.maxWidth,\n        height: this.height || this.maxHeight,\n        minWidth: this.minWidth,\n        minHeight: this.minHeight,\n        maxWidth: this.maxWidth,\n        maxHeight: this.maxHeight,\n        imageSmoothingEnabled: true,\n        imageSmoothingQuality: 'high',\n      })\n\n      return canvasToUploadDataUrl(croppedCanvas, 0.92, this.sourceCanHaveTransparency())\n    },\n\n    /**\n     * Rerender image cropper with new chosen image\n     */\n    onFileChanged(event) {\n      const _this = this\n      const file = event.target.files[0]\n\n      // if there's no file selected (user cancels) return \n      if (!file) {\n        return\n      }\n\n      this.inValidImage = false\n      this.isMinimalSizeAtLoad = false\n\n      // Check if file is a image\n      this.isWrongFileType = false\n      if (this.allowedFileTypes.indexOf(event.target.files[0].type.toLowerCase()) === -1) {\n        this.isWrongFileType = true\n        return\n      }\n\n      this.isLoading = true\n      this.newImageChosen = true\n      this.sourceFileType = file.type.toLowerCase()\n      this.$emit('callbackImageChosen', true)\n\n      const image = new Image()\n\n      // Clear old blob\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      this.imageURL = URL.createObjectURL(file)\n      image.src = this.imageURL\n\n      image.onload = () => {\n        let resizedImage = _this.resizeImage(image)\n\n        if (!resizedImage) {\n          // No resize needed\n          resizedImage = image.src\n        }\n\n        let t = setTimeout(function() {\n          _this.renderCropper(resizedImage)\n          resizedImage = ''\n          clearTimeout(t)\n        }, 10)\n      }\n\n      // Clear input value to allow selecting the same file again\n      event.target.value = ''\n    },\n\n    /**\n     * Emit cropped image and close modal\n     */\n    getNewPhoto() {\n      // Clear image in memory\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      return this.getCroppedCanvas()\n    },\n\n    /**\n     * Cropper controls\n     */\n    cropperZoomTo(evt) {\n      const CONTAINER_DATA = this.imgCropper.getCropBoxData()\n\n      if (evt.target.value > 0.8) { return }\n\n      this.imgCropper.zoomTo(evt.target.value, {\n        x: CONTAINER_DATA.width / 1.5,\n        y: CONTAINER_DATA.height / 1.5,\n      })\n    },\n\n    /**\n     * Resize original image if needed\n     */\n    resizeImage(img) {\n      const MAX_WITH = this.maxWidth\n      const MAX_HEIGHT = this.maxHeight\n      let isResized = false\n      let canvas = document.createElement('canvas');\n      let width = img.width;\n      let height = img.height;\n\n      // calculate the width and height, constraining the proportions\n      if (width > height) {\n        if (width > MAX_WITH) {\n          height = Math.round(height *= MAX_WITH / width);\n          width = MAX_WITH;\n\n          isResized = true\n        }\n      } else {\n        if (height > MAX_HEIGHT) {\n          width = Math.round(width *= MAX_HEIGHT / height);\n          height = MAX_HEIGHT;\n\n          isResized = true\n        }\n      }\n\n      if (isResized) {\n        // resize the canvas and draw the image data into it\n        canvas.width = width;\n        canvas.height = height;\n        var ctx = canvas.getContext(\"2d\");\n        ctx.imageSmoothingEnabled = true;\n        ctx.imageSmoothingQuality = 'high';\n        ctx.drawImage(img, 0, 0, width, height);\n        return canvasToUploadDataUrl(canvas, 1, this.sourceCanHaveTransparency());\n      }\n\n      return false\n    },\n\n    restoreImage() {\n      this.reset()\n      EventBus.$emit('showToast', {\n        type: 'info',\n        message: 'Previous image is restored',\n      })\n    },\n\n    reset() {\n      this.newImageChosen = false\n      this.sourceFileType = ''\n      this.previewReady = false\n      this.isMinimalSizeAtLoad = false\n      this.inValidImage = false\n      this.isWrongFileType = false\n      this.zoomSlider = 0.1\n\n      const image = document.getElementById('image')\n      image.src = this.originalImage\n\n      this.$emit('callbackImageChosen', false)\n\n      // Destroy cropperjs instance\n      this.imgCropper && this.imgCropper.destroy()\n      // Destroy image blob\n      this.imageURL && URL.revokeObjectURL(this.imageURL)\n      // Set original image\n      this.imageURL = this.originalImage || '/images/noImage.png'\n\n      const previews = this.previewContainer ? document.querySelectorAll(this.previewContainer) : []\n      this.each(previews, function(elem) {\n        while (elem.firstChild) {\n          elem.removeChild(elem.firstChild)\n        }\n      })\n    }\n  },\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper-imageCropper\n  display: flex\n  flex-direction: column\n\n  .originalImage\n    object-fit: cover\n\n  @media screen and (max-width: 400px)\n    .file-icon\n      display: none\n\n    .img-container-wrapper\n      flex-shrink: 1\n      transform: scale(0.8)\n\n  .img-container-wrapper\n    position: relative\n    .loader-wrapper\n      position: absolute\n      top: 0\n      right: 0\n      bottom: 0\n      left: 0\n      z-index: 1\n\n      .custom-loader\n        position: relative\n        z-index: 1\n      &::after\n        position: absolute\n        top: 0\n        right: 0\n        bottom: 0\n        left: 0\n        content: \"\"\n        background-color: #FFFFFF\n        opacity: .6\n\n  .img-container\n    position: relative\n    display: inline-flex\n    align-items: center\n    // background: #ddd\n    overflow: hidden\n    flex-shrink: 0\n    width: 100%\n    background-color: #ebebeb\n\n    ::v-deep img\n      // display: block\n      // max-width: 100%\n      // height: auto\n      background-color: transparent !important\n\n    &.is-rounded\n      border-radius: 50%\n\n  .slider\n    width: 100%\n\n::v-deep .cropper-container\n  position: absolute\n  top: 0\n  right: 0\n  bottom: 0\n  left: 0\n</style>","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageCropper.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ImageCropper.vue?vue&type=template&id=e6d08b70&scoped=true\"\nimport script from \"./ImageCropper.vue?vue&type=script&lang=js\"\nexport * from \"./ImageCropper.vue?vue&type=script&lang=js\"\nimport style0 from \"./ImageCropper.vue?vue&type=style&index=0&id=e6d08b70&prod&lang=sass&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e6d08b70\",\n  null\n  \n)\n\nexport default component.exports","/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n})(this, (function () { 'use strict';\n\n  function ownKeys(e, r) {\n    var t = Object.keys(e);\n    if (Object.getOwnPropertySymbols) {\n      var o = Object.getOwnPropertySymbols(e);\n      r && (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })), t.push.apply(t, o);\n    }\n    return t;\n  }\n  function _objectSpread2(e) {\n    for (var r = 1; r < arguments.length; r++) {\n      var t = null != arguments[r] ? arguments[r] : {};\n      r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n        _defineProperty(e, r, t[r]);\n      }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n        Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n      });\n    }\n    return e;\n  }\n  function _toPrimitive(t, r) {\n    if (\"object\" != typeof t || !t) return t;\n    var e = t[Symbol.toPrimitive];\n    if (void 0 !== e) {\n      var i = e.call(t, r || \"default\");\n      if (\"object\" != typeof i) return i;\n      throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n    }\n    return (\"string\" === r ? String : Number)(t);\n  }\n  function _toPropertyKey(t) {\n    var i = _toPrimitive(t, \"string\");\n    return \"symbol\" == typeof i ? i : i + \"\";\n  }\n  function _typeof(o) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n      return typeof o;\n    } : function (o) {\n      return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n    }, _typeof(o);\n  }\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n    }\n  }\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n      writable: false\n    });\n    return Constructor;\n  }\n  function _defineProperty(obj, key, value) {\n    key = _toPropertyKey(key);\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n    return obj;\n  }\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n    return arr2;\n  }\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'cropper';\n\n  // Actions\n  var ACTION_ALL = 'all';\n  var ACTION_CROP = 'crop';\n  var ACTION_MOVE = 'move';\n  var ACTION_ZOOM = 'zoom';\n  var ACTION_EAST = 'e';\n  var ACTION_WEST = 'w';\n  var ACTION_SOUTH = 's';\n  var ACTION_NORTH = 'n';\n  var ACTION_NORTH_EAST = 'ne';\n  var ACTION_NORTH_WEST = 'nw';\n  var ACTION_SOUTH_EAST = 'se';\n  var ACTION_SOUTH_WEST = 'sw';\n\n  // Classes\n  var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n  var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n  var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n  // Data keys\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n  var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n  // Drag modes\n  var DRAG_MODE_CROP = 'crop';\n  var DRAG_MODE_MOVE = 'move';\n  var DRAG_MODE_NONE = 'none';\n\n  // Events\n  var EVENT_CROP = 'crop';\n  var EVENT_CROP_END = 'cropend';\n  var EVENT_CROP_MOVE = 'cropmove';\n  var EVENT_CROP_START = 'cropstart';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_READY = 'ready';\n  var EVENT_RESIZE = 'resize';\n  var EVENT_WHEEL = 'wheel';\n  var EVENT_ZOOM = 'zoom';\n\n  // Mime types\n  var MIME_TYPE_JPEG = 'image/jpeg';\n\n  // RegExps\n  var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n  var REGEXP_DATA_URL = /^data:/;\n  var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n  var REGEXP_TAG_NAME = /^img|canvas$/i;\n\n  // Misc\n  // Inspired by the default width and height of a canvas element.\n  var MIN_CONTAINER_WIDTH = 200;\n  var MIN_CONTAINER_HEIGHT = 100;\n\n  var DEFAULTS = {\n    // Define the view mode of the cropper\n    viewMode: 0,\n    // 0, 1, 2, 3\n\n    // Define the dragging mode of the cropper\n    dragMode: DRAG_MODE_CROP,\n    // 'crop', 'move' or 'none'\n\n    // Define the initial aspect ratio of the crop box\n    initialAspectRatio: NaN,\n    // Define the aspect ratio of the crop box\n    aspectRatio: NaN,\n    // An object with the previous cropping result data\n    data: null,\n    // A selector for adding extra containers to preview\n    preview: '',\n    // Re-render the cropper when resize the window\n    responsive: true,\n    // Restore the cropped area after resize the window\n    restore: true,\n    // Check if the current image is a cross-origin image\n    checkCrossOrigin: true,\n    // Check the current image's Exif Orientation information\n    checkOrientation: true,\n    // Show the black modal\n    modal: true,\n    // Show the dashed lines for guiding\n    guides: true,\n    // Show the center indicator for guiding\n    center: true,\n    // Show the white modal to highlight the crop box\n    highlight: true,\n    // Show the grid background\n    background: true,\n    // Enable to crop the image automatically when initialize\n    autoCrop: true,\n    // Define the percentage of automatic cropping area when initializes\n    autoCropArea: 0.8,\n    // Enable to move the image\n    movable: true,\n    // Enable to rotate the image\n    rotatable: true,\n    // Enable to scale the image\n    scalable: true,\n    // Enable to zoom the image\n    zoomable: true,\n    // Enable to zoom the image by dragging touch\n    zoomOnTouch: true,\n    // Enable to zoom the image by wheeling mouse\n    zoomOnWheel: true,\n    // Define zoom ratio when zoom the image by wheeling mouse\n    wheelZoomRatio: 0.1,\n    // Enable to move the crop box\n    cropBoxMovable: true,\n    // Enable to resize the crop box\n    cropBoxResizable: true,\n    // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n    toggleDragModeOnDblclick: true,\n    // Size limitation\n    minCanvasWidth: 0,\n    minCanvasHeight: 0,\n    minCropBoxWidth: 0,\n    minCropBoxHeight: 0,\n    minContainerWidth: MIN_CONTAINER_WIDTH,\n    minContainerHeight: MIN_CONTAINER_HEIGHT,\n    // Shortcuts of events\n    ready: null,\n    cropstart: null,\n    cropmove: null,\n    cropend: null,\n    crop: null,\n    zoom: null\n  };\n\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n  /**\n   * Check if the given value is not a number.\n   */\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n\n  /**\n   * Check if the given value is a positive number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n   */\n  var isPositiveNumber = function isPositiveNumber(value) {\n    return value > 0 && value < Infinity;\n  };\n\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  var slice = Array.prototype.slice;\n\n  /**\n   * Convert array-like or iterable object to an array.\n   * @param {*} value - The value to convert.\n   * @returns {Array} Returns a new array.\n   */\n  function toArray(value) {\n    return Array.from ? Array.from(value) : slice.call(value);\n  }\n\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n        toArray(data).forEach(function (value, key) {\n          callback.call(data, value, key, data);\n        });\n      } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n    return data;\n  }\n\n  /**\n   * Extend the given object.\n   * @param {*} target - The target object to extend.\n   * @param {*} args - The rest objects for merging to the target object.\n   * @returns {Object} The extended object.\n   */\n  var assign = Object.assign || function assign(target) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    if (isObject(target) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            target[key] = arg[key];\n          });\n        }\n      });\n    }\n    return target;\n  };\n  var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n  /**\n   * Normalize decimal number.\n   * Check out {@link https://0.30000000000000004.com/}\n   * @param {number} value - The value to normalize.\n   * @param {number} [times=100000000000] - The times for normalizing.\n   * @returns {number} Returns the normalized number.\n   */\n  function normalizeDecimalNumber(value) {\n    var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n    return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n  }\n  var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value = \"\".concat(value, \"px\");\n      }\n      style[property] = value;\n    });\n  }\n\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n  function hasClass(element, value) {\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n  function addClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n    var className = element.className.trim();\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n  function removeClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    }\n\n    // IE10-11 doesn't support the second parameter of `classList.toggle`\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n  function toParamCase(value) {\n    return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n  }\n\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n    return element.getAttribute(\"data-\".concat(toParamCase(name)));\n  }\n\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n    }\n  }\n\n  /**\n   * Remove data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to remove.\n   */\n  function removeData(element, name) {\n    if (isObject(element[name])) {\n      try {\n        delete element[name];\n      } catch (error) {\n        element[name] = undefined;\n      }\n    } else if (element.dataset) {\n      // #128 Safari not allows to delete dataset property\n      try {\n        delete element.dataset[name];\n      } catch (error) {\n        element.dataset[name] = undefined;\n      }\n    } else {\n      element.removeAttribute(\"data-\".concat(toParamCase(name)));\n    }\n  }\n  var REGEXP_SPACES = /\\s\\s*/;\n  var onceSupported = function () {\n    var supported = false;\n    if (IS_BROWSER) {\n      var once = false;\n      var listener = function listener() {};\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n    return supported;\n  }();\n\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n      element.removeEventListener(event, handler, options);\n    });\n  }\n\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n          listeners = _element$listeners === void 0 ? {} : _element$listeners;\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n          listener.apply(element, args);\n        };\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n      element.addEventListener(event, _handler, options);\n    });\n  }\n\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n  function dispatchEvent(element, type, data) {\n    var event;\n\n    // Event and CustomEvent on IE9-11 are global objects, not constructors\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, {\n        detail: data,\n        bubbles: true,\n        cancelable: true\n      });\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n    return element.dispatchEvent(event);\n  }\n\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n  var location = WINDOW.location;\n  var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n  /**\n   * Check if the given URL is a cross origin URL.\n   * @param {string} url - The target URL.\n   * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n   */\n  function isCrossOriginURL(url) {\n    var parts = url.match(REGEXP_ORIGINS);\n    return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n  }\n\n  /**\n   * Add timestamp to the given URL.\n   * @param {string} url - The target URL.\n   * @returns {string} The result URL.\n   */\n  function addTimestamp(url) {\n    var timestamp = \"timestamp=\".concat(new Date().getTime());\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n  }\n\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n      scaleX = _ref.scaleX,\n      scaleY = _ref.scaleY,\n      translateX = _ref.translateX,\n      translateY = _ref.translateY;\n    var values = [];\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    }\n\n    // Rotate should come first before scale to match orientation transform\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n    var maxRatio = 0;\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n        if (Math.abs(ratio) > Math.abs(maxRatio)) {\n          maxRatio = ratio;\n        }\n      });\n    });\n    return maxRatio;\n  }\n\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n      pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n        startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n\n  /**\n   * Get the max sizes in a rectangle under the given aspect ratio.\n   * @param {Object} data - The original sizes.\n   * @param {string} [type='contain'] - The adjust type.\n   * @returns {Object} The result sizes.\n   */\n  function getAdjustedSizes(_ref4) {\n    var aspectRatio = _ref4.aspectRatio,\n      height = _ref4.height,\n      width = _ref4.width;\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n    var isValidWidth = isPositiveNumber(width);\n    var isValidHeight = isPositiveNumber(height);\n    if (isValidWidth && isValidHeight) {\n      var adjustedWidth = height * aspectRatio;\n      if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n        height = width / aspectRatio;\n      } else {\n        width = height * aspectRatio;\n      }\n    } else if (isValidWidth) {\n      height = width / aspectRatio;\n    } else if (isValidHeight) {\n      width = height * aspectRatio;\n    }\n    return {\n      width: width,\n      height: height\n    };\n  }\n\n  /**\n   * Get the new sizes of a rectangle after rotated.\n   * @param {Object} data - The original sizes.\n   * @returns {Object} The result sizes.\n   */\n  function getRotatedSizes(_ref5) {\n    var width = _ref5.width,\n      height = _ref5.height,\n      degree = _ref5.degree;\n    degree = Math.abs(degree) % 180;\n    if (degree === 90) {\n      return {\n        width: height,\n        height: width\n      };\n    }\n    var arc = degree % 90 * Math.PI / 180;\n    var sinArc = Math.sin(arc);\n    var cosArc = Math.cos(arc);\n    var newWidth = width * cosArc + height * sinArc;\n    var newHeight = width * sinArc + height * cosArc;\n    return degree > 90 ? {\n      width: newHeight,\n      height: newWidth\n    } : {\n      width: newWidth,\n      height: newHeight\n    };\n  }\n\n  /**\n   * Get a canvas which drew the given image.\n   * @param {HTMLImageElement} image - The image for drawing.\n   * @param {Object} imageData - The image data.\n   * @param {Object} canvasData - The canvas data.\n   * @param {Object} options - The options.\n   * @returns {HTMLCanvasElement} The result canvas.\n   */\n  function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n    var imageAspectRatio = _ref6.aspectRatio,\n      imageNaturalWidth = _ref6.naturalWidth,\n      imageNaturalHeight = _ref6.naturalHeight,\n      _ref6$rotate = _ref6.rotate,\n      rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n      _ref6$scaleX = _ref6.scaleX,\n      scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n      _ref6$scaleY = _ref6.scaleY,\n      scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n    var aspectRatio = _ref7.aspectRatio,\n      naturalWidth = _ref7.naturalWidth,\n      naturalHeight = _ref7.naturalHeight;\n    var _ref8$fillColor = _ref8.fillColor,\n      fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n      _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n      imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n      _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n      imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n      _ref8$maxWidth = _ref8.maxWidth,\n      maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n      _ref8$maxHeight = _ref8.maxHeight,\n      maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n      _ref8$minWidth = _ref8.minWidth,\n      minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n      _ref8$minHeight = _ref8.minHeight,\n      minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n    var canvas = document.createElement('canvas');\n    var context = canvas.getContext('2d');\n    var maxSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var minSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n    var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n    // Note: should always use image's natural sizes for drawing as\n    // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n    var destMaxSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var destMinSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n    var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n    var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n    canvas.width = normalizeDecimalNumber(width);\n    canvas.height = normalizeDecimalNumber(height);\n    context.fillStyle = fillColor;\n    context.fillRect(0, 0, width, height);\n    context.save();\n    context.translate(width / 2, height / 2);\n    context.rotate(rotate * Math.PI / 180);\n    context.scale(scaleX, scaleY);\n    context.imageSmoothingEnabled = imageSmoothingEnabled;\n    context.imageSmoothingQuality = imageSmoothingQuality;\n    context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n      return Math.floor(normalizeDecimalNumber(param));\n    }))));\n    context.restore();\n    return canvas;\n  }\n  var fromCharCode = String.fromCharCode;\n\n  /**\n   * Get string from char code in data view.\n   * @param {DataView} dataView - The data view for read.\n   * @param {number} start - The start index.\n   * @param {number} length - The read length.\n   * @returns {string} The read result.\n   */\n  function getStringFromCharCode(dataView, start, length) {\n    var str = '';\n    length += start;\n    for (var i = start; i < length; i += 1) {\n      str += fromCharCode(dataView.getUint8(i));\n    }\n    return str;\n  }\n  var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n  /**\n   * Transform Data URL to array buffer.\n   * @param {string} dataURL - The Data URL to transform.\n   * @returns {ArrayBuffer} The result array buffer.\n   */\n  function dataURLToArrayBuffer(dataURL) {\n    var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n    var binary = atob(base64);\n    var arrayBuffer = new ArrayBuffer(binary.length);\n    var uint8 = new Uint8Array(arrayBuffer);\n    forEach(uint8, function (value, i) {\n      uint8[i] = binary.charCodeAt(i);\n    });\n    return arrayBuffer;\n  }\n\n  /**\n   * Transform array buffer to Data URL.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n   * @param {string} mimeType - The mime type of the Data URL.\n   * @returns {string} The result Data URL.\n   */\n  function arrayBufferToDataURL(arrayBuffer, mimeType) {\n    var chunks = [];\n\n    // Chunk Typed Array for better performance (#435)\n    var chunkSize = 8192;\n    var uint8 = new Uint8Array(arrayBuffer);\n    while (uint8.length > 0) {\n      // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n      // eslint-disable-next-line prefer-spread\n      chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n      uint8 = uint8.subarray(chunkSize);\n    }\n    return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n  }\n\n  /**\n   * Get orientation value from given array buffer.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n   * @returns {number} The read orientation value.\n   */\n  function resetAndGetOrientation(arrayBuffer) {\n    var dataView = new DataView(arrayBuffer);\n    var orientation;\n\n    // Ignores range error when the image does not have correct Exif information\n    try {\n      var littleEndian;\n      var app1Start;\n      var ifdStart;\n\n      // Only handle JPEG image (start by 0xFFD8)\n      if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n        var length = dataView.byteLength;\n        var offset = 2;\n        while (offset + 1 < length) {\n          if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n            app1Start = offset;\n            break;\n          }\n          offset += 1;\n        }\n      }\n      if (app1Start) {\n        var exifIDCode = app1Start + 4;\n        var tiffOffset = app1Start + 10;\n        if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n          var endianness = dataView.getUint16(tiffOffset);\n          littleEndian = endianness === 0x4949;\n          if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n            if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n              var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n              if (firstIFDOffset >= 0x00000008) {\n                ifdStart = tiffOffset + firstIFDOffset;\n              }\n            }\n          }\n        }\n      }\n      if (ifdStart) {\n        var _length = dataView.getUint16(ifdStart, littleEndian);\n        var _offset;\n        var i;\n        for (i = 0; i < _length; i += 1) {\n          _offset = ifdStart + i * 12 + 2;\n          if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n            // 8 is the offset of the current tag's value\n            _offset += 8;\n\n            // Get the original orientation value\n            orientation = dataView.getUint16(_offset, littleEndian);\n\n            // Override the orientation with its default value\n            dataView.setUint16(_offset, 1, littleEndian);\n            break;\n          }\n        }\n      }\n    } catch (error) {\n      orientation = 1;\n    }\n    return orientation;\n  }\n\n  /**\n   * Parse Exif Orientation value.\n   * @param {number} orientation - The orientation to parse.\n   * @returns {Object} The parsed result.\n   */\n  function parseOrientation(orientation) {\n    var rotate = 0;\n    var scaleX = 1;\n    var scaleY = 1;\n    switch (orientation) {\n      // Flip horizontal\n      case 2:\n        scaleX = -1;\n        break;\n\n      // Rotate left 180°\n      case 3:\n        rotate = -180;\n        break;\n\n      // Flip vertical\n      case 4:\n        scaleY = -1;\n        break;\n\n      // Flip vertical and rotate right 90°\n      case 5:\n        rotate = 90;\n        scaleY = -1;\n        break;\n\n      // Rotate right 90°\n      case 6:\n        rotate = 90;\n        break;\n\n      // Flip horizontal and rotate right 90°\n      case 7:\n        rotate = 90;\n        scaleX = -1;\n        break;\n\n      // Rotate left 90°\n      case 8:\n        rotate = -90;\n        break;\n    }\n    return {\n      rotate: rotate,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initCanvas();\n      this.initCropBox();\n      this.renderCanvas();\n      if (this.cropped) {\n        this.renderCropBox();\n      }\n    },\n    initContainer: function initContainer() {\n      var element = this.element,\n        options = this.options,\n        container = this.container,\n        cropper = this.cropper;\n      var minWidth = Number(options.minContainerWidth);\n      var minHeight = Number(options.minContainerHeight);\n      addClass(cropper, CLASS_HIDDEN);\n      removeClass(element, CLASS_HIDDEN);\n      var containerData = {\n        width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n        height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n      };\n      this.containerData = containerData;\n      setStyle(cropper, {\n        width: containerData.width,\n        height: containerData.height\n      });\n      addClass(element, CLASS_HIDDEN);\n      removeClass(cropper, CLASS_HIDDEN);\n    },\n    // Canvas (image wrapper)\n    initCanvas: function initCanvas() {\n      var containerData = this.containerData,\n        imageData = this.imageData;\n      var viewMode = this.options.viewMode;\n      var rotated = Math.abs(imageData.rotate) % 180 === 90;\n      var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n      var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var canvasWidth = containerData.width;\n      var canvasHeight = containerData.height;\n      if (containerData.height * aspectRatio > containerData.width) {\n        if (viewMode === 3) {\n          canvasWidth = containerData.height * aspectRatio;\n        } else {\n          canvasHeight = containerData.width / aspectRatio;\n        }\n      } else if (viewMode === 3) {\n        canvasHeight = containerData.width / aspectRatio;\n      } else {\n        canvasWidth = containerData.height * aspectRatio;\n      }\n      var canvasData = {\n        aspectRatio: aspectRatio,\n        naturalWidth: naturalWidth,\n        naturalHeight: naturalHeight,\n        width: canvasWidth,\n        height: canvasHeight\n      };\n      this.canvasData = canvasData;\n      this.limited = viewMode === 1 || viewMode === 2;\n      this.limitCanvas(true, true);\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      canvasData.left = (containerData.width - canvasData.width) / 2;\n      canvasData.top = (containerData.height - canvasData.height) / 2;\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      this.initialCanvasData = assign({}, canvasData);\n    },\n    limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var viewMode = options.viewMode;\n      var aspectRatio = canvasData.aspectRatio;\n      var cropped = this.cropped && cropBoxData;\n      if (sizeLimited) {\n        var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n        var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n        if (viewMode > 1) {\n          minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n          minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n          if (viewMode === 3) {\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        } else if (viewMode > 0) {\n          if (minCanvasWidth) {\n            minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n          } else if (minCanvasHeight) {\n            minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n          } else if (cropped) {\n            minCanvasWidth = cropBoxData.width;\n            minCanvasHeight = cropBoxData.height;\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        }\n        var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: minCanvasWidth,\n          height: minCanvasHeight\n        });\n        minCanvasWidth = _getAdjustedSizes.width;\n        minCanvasHeight = _getAdjustedSizes.height;\n        canvasData.minWidth = minCanvasWidth;\n        canvasData.minHeight = minCanvasHeight;\n        canvasData.maxWidth = Infinity;\n        canvasData.maxHeight = Infinity;\n      }\n      if (positionLimited) {\n        if (viewMode > (cropped ? 0 : 1)) {\n          var newCanvasLeft = containerData.width - canvasData.width;\n          var newCanvasTop = containerData.height - canvasData.height;\n          canvasData.minLeft = Math.min(0, newCanvasLeft);\n          canvasData.minTop = Math.min(0, newCanvasTop);\n          canvasData.maxLeft = Math.max(0, newCanvasLeft);\n          canvasData.maxTop = Math.max(0, newCanvasTop);\n          if (cropped && this.limited) {\n            canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n            canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n            canvasData.maxLeft = cropBoxData.left;\n            canvasData.maxTop = cropBoxData.top;\n            if (viewMode === 2) {\n              if (canvasData.width >= containerData.width) {\n                canvasData.minLeft = Math.min(0, newCanvasLeft);\n                canvasData.maxLeft = Math.max(0, newCanvasLeft);\n              }\n              if (canvasData.height >= containerData.height) {\n                canvasData.minTop = Math.min(0, newCanvasTop);\n                canvasData.maxTop = Math.max(0, newCanvasTop);\n              }\n            }\n          }\n        } else {\n          canvasData.minLeft = -canvasData.width;\n          canvasData.minTop = -canvasData.height;\n          canvasData.maxLeft = containerData.width;\n          canvasData.maxTop = containerData.height;\n        }\n      }\n    },\n    renderCanvas: function renderCanvas(changed, transformed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      if (transformed) {\n        var _getRotatedSizes = getRotatedSizes({\n            width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n            height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n            degree: imageData.rotate || 0\n          }),\n          naturalWidth = _getRotatedSizes.width,\n          naturalHeight = _getRotatedSizes.height;\n        var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n        var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n        canvasData.left -= (width - canvasData.width) / 2;\n        canvasData.top -= (height - canvasData.height) / 2;\n        canvasData.width = width;\n        canvasData.height = height;\n        canvasData.aspectRatio = naturalWidth / naturalHeight;\n        canvasData.naturalWidth = naturalWidth;\n        canvasData.naturalHeight = naturalHeight;\n        this.limitCanvas(true, false);\n      }\n      if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n        canvasData.left = canvasData.oldLeft;\n      }\n      if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n        canvasData.top = canvasData.oldTop;\n      }\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      this.limitCanvas(false, true);\n      canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n      canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      setStyle(this.canvas, assign({\n        width: canvasData.width,\n        height: canvasData.height\n      }, getTransforms({\n        translateX: canvasData.left,\n        translateY: canvasData.top\n      })));\n      this.renderImage(changed);\n      if (this.cropped && this.limited) {\n        this.limitCropBox(true, true);\n      }\n    },\n    renderImage: function renderImage(changed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n      var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n      assign(imageData, {\n        width: width,\n        height: height,\n        left: (canvasData.width - width) / 2,\n        top: (canvasData.height - height) / 2\n      });\n      setStyle(this.image, assign({\n        width: imageData.width,\n        height: imageData.height\n      }, getTransforms(assign({\n        translateX: imageData.left,\n        translateY: imageData.top\n      }, imageData))));\n      if (changed) {\n        this.output();\n      }\n    },\n    initCropBox: function initCropBox() {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n      var autoCropArea = Number(options.autoCropArea) || 0.8;\n      var cropBoxData = {\n        width: canvasData.width,\n        height: canvasData.height\n      };\n      if (aspectRatio) {\n        if (canvasData.height * aspectRatio > canvasData.width) {\n          cropBoxData.height = cropBoxData.width / aspectRatio;\n        } else {\n          cropBoxData.width = cropBoxData.height * aspectRatio;\n        }\n      }\n      this.cropBoxData = cropBoxData;\n      this.limitCropBox(true, true);\n\n      // Initialize auto crop area\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n      // The width/height of auto crop area must large than \"minWidth/Height\"\n      cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n      cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n      cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n      cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      this.initialCropBoxData = assign({}, cropBoxData);\n    },\n    limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData,\n        limited = this.limited;\n      var aspectRatio = options.aspectRatio;\n      if (sizeLimited) {\n        var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n        var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n        var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n        var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n        // The min/maxCropBoxWidth/Height must be less than container's width/height\n        minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n        minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n        if (aspectRatio) {\n          if (minCropBoxWidth && minCropBoxHeight) {\n            if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n              minCropBoxHeight = minCropBoxWidth / aspectRatio;\n            } else {\n              minCropBoxWidth = minCropBoxHeight * aspectRatio;\n            }\n          } else if (minCropBoxWidth) {\n            minCropBoxHeight = minCropBoxWidth / aspectRatio;\n          } else if (minCropBoxHeight) {\n            minCropBoxWidth = minCropBoxHeight * aspectRatio;\n          }\n          if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n            maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n          } else {\n            maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n          }\n        }\n\n        // The minWidth/Height must be less than maxWidth/Height\n        cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n        cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n        cropBoxData.maxWidth = maxCropBoxWidth;\n        cropBoxData.maxHeight = maxCropBoxHeight;\n      }\n      if (positionLimited) {\n        if (limited) {\n          cropBoxData.minLeft = Math.max(0, canvasData.left);\n          cropBoxData.minTop = Math.max(0, canvasData.top);\n          cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n          cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n        } else {\n          cropBoxData.minLeft = 0;\n          cropBoxData.minTop = 0;\n          cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n          cropBoxData.maxTop = containerData.height - cropBoxData.height;\n        }\n      }\n    },\n    renderCropBox: function renderCropBox() {\n      var options = this.options,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData;\n      if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n        cropBoxData.left = cropBoxData.oldLeft;\n      }\n      if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n        cropBoxData.top = cropBoxData.oldTop;\n      }\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n      this.limitCropBox(false, true);\n      cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n      cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      if (options.movable && options.cropBoxMovable) {\n        // Turn to move the canvas when the crop box is equal to the container\n        setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n      }\n      setStyle(this.cropBox, assign({\n        width: cropBoxData.width,\n        height: cropBoxData.height\n      }, getTransforms({\n        translateX: cropBoxData.left,\n        translateY: cropBoxData.top\n      })));\n      if (this.cropped && this.limited) {\n        this.limitCanvas(true, true);\n      }\n      if (!this.disabled) {\n        this.output();\n      }\n    },\n    output: function output() {\n      this.preview();\n      dispatchEvent(this.element, EVENT_CROP, this.getData());\n    }\n  };\n\n  var preview = {\n    initPreview: function initPreview() {\n      var element = this.element,\n        crossOrigin = this.crossOrigin;\n      var preview = this.options.preview;\n      var url = crossOrigin ? this.crossOriginUrl : this.url;\n      var alt = element.alt || 'The image to preview';\n      var image = document.createElement('img');\n      if (crossOrigin) {\n        image.crossOrigin = crossOrigin;\n      }\n      image.src = url;\n      image.alt = alt;\n      this.viewBox.appendChild(image);\n      this.viewBoxImage = image;\n      if (!preview) {\n        return;\n      }\n      var previews = preview;\n      if (typeof preview === 'string') {\n        previews = element.ownerDocument.querySelectorAll(preview);\n      } else if (preview.querySelector) {\n        previews = [preview];\n      }\n      this.previews = previews;\n      forEach(previews, function (el) {\n        var img = document.createElement('img');\n\n        // Save the original size for recover\n        setData(el, DATA_PREVIEW, {\n          width: el.offsetWidth,\n          height: el.offsetHeight,\n          html: el.innerHTML\n        });\n        if (crossOrigin) {\n          img.crossOrigin = crossOrigin;\n        }\n        img.src = url;\n        img.alt = alt;\n\n        /**\n         * Override img element styles\n         * Add `display:block` to avoid margin top issue\n         * Add `height:auto` to override `height` attribute on IE8\n         * (Occur only when margin-top <= -height)\n         */\n        img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n        el.innerHTML = '';\n        el.appendChild(img);\n      });\n    },\n    resetPreview: function resetPreview() {\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        setStyle(element, {\n          width: data.width,\n          height: data.height\n        });\n        element.innerHTML = data.html;\n        removeData(element, DATA_PREVIEW);\n      });\n    },\n    preview: function preview() {\n      var imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var cropBoxWidth = cropBoxData.width,\n        cropBoxHeight = cropBoxData.height;\n      var width = imageData.width,\n        height = imageData.height;\n      var left = cropBoxData.left - canvasData.left - imageData.left;\n      var top = cropBoxData.top - canvasData.top - imageData.top;\n      if (!this.cropped || this.disabled) {\n        return;\n      }\n      setStyle(this.viewBoxImage, assign({\n        width: width,\n        height: height\n      }, getTransforms(assign({\n        translateX: -left,\n        translateY: -top\n      }, imageData))));\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        var originalWidth = data.width;\n        var originalHeight = data.height;\n        var newWidth = originalWidth;\n        var newHeight = originalHeight;\n        var ratio = 1;\n        if (cropBoxWidth) {\n          ratio = originalWidth / cropBoxWidth;\n          newHeight = cropBoxHeight * ratio;\n        }\n        if (cropBoxHeight && newHeight > originalHeight) {\n          ratio = originalHeight / cropBoxHeight;\n          newWidth = cropBoxWidth * ratio;\n          newHeight = originalHeight;\n        }\n        setStyle(element, {\n          width: newWidth,\n          height: newHeight\n        });\n        setStyle(element.getElementsByTagName('img')[0], assign({\n          width: width * ratio,\n          height: height * ratio\n        }, getTransforms(assign({\n          translateX: -left * ratio,\n          translateY: -top * ratio\n        }, imageData))));\n      });\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        addListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        addListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        addListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        addListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        addListener(element, EVENT_ZOOM, options.zoom);\n      }\n      addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n      addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n      addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n      if (options.responsive) {\n        addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        removeListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        removeListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        removeListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        removeListener(element, EVENT_ZOOM, options.zoom);\n      }\n      removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n      }\n      removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n      removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n      if (options.responsive) {\n        removeListener(window, EVENT_RESIZE, this.onResize);\n      }\n    }\n  };\n\n  var handlers = {\n    resize: function resize() {\n      if (this.disabled) {\n        return;\n      }\n      var options = this.options,\n        container = this.container,\n        containerData = this.containerData;\n      var ratioX = container.offsetWidth / containerData.width;\n      var ratioY = container.offsetHeight / containerData.height;\n      var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n      // Resize when width changed or height changed\n      if (ratio !== 1) {\n        var canvasData;\n        var cropBoxData;\n        if (options.restore) {\n          canvasData = this.getCanvasData();\n          cropBoxData = this.getCropBoxData();\n        }\n        this.render();\n        if (options.restore) {\n          this.setCanvasData(forEach(canvasData, function (n, i) {\n            canvasData[i] = n * ratio;\n          }));\n          this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n            cropBoxData[i] = n * ratio;\n          }));\n        }\n      }\n    },\n    dblclick: function dblclick() {\n      if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n        return;\n      }\n      this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n    },\n    wheel: function wheel(event) {\n      var _this = this;\n      var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n      var delta = 1;\n      if (this.disabled) {\n        return;\n      }\n      event.preventDefault();\n\n      // Limit wheel speed to prevent zoom too fast (#21)\n      if (this.wheeling) {\n        return;\n      }\n      this.wheeling = true;\n      setTimeout(function () {\n        _this.wheeling = false;\n      }, 50);\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n      this.zoom(-delta * ratio, event);\n    },\n    cropStart: function cropStart(event) {\n      var buttons = event.buttons,\n        button = event.button;\n      if (this.disabled\n\n      // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n      // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n      // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n      var options = this.options,\n        pointers = this.pointers;\n      var action;\n      if (event.changedTouches) {\n        // Handle touch event\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        // Handle mouse event and pointer event\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n      if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n        action = ACTION_ZOOM;\n      } else {\n        action = getData(event.target, DATA_ACTION);\n      }\n      if (!REGEXP_ACTIONS.test(action)) {\n        return;\n      }\n      if (dispatchEvent(this.element, EVENT_CROP_START, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n\n      // This line is required for preventing page zooming in iOS browsers\n      event.preventDefault();\n      this.action = action;\n      this.cropping = false;\n      if (action === ACTION_CROP) {\n        this.cropping = true;\n        addClass(this.dragBox, CLASS_MODAL);\n      }\n    },\n    cropMove: function cropMove(event) {\n      var action = this.action;\n      if (this.disabled || !action) {\n        return;\n      }\n      var pointers = this.pointers;\n      event.preventDefault();\n      if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          // The first parameter should not be undefined (#432)\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n      this.change(event);\n    },\n    cropEnd: function cropEnd(event) {\n      if (this.disabled) {\n        return;\n      }\n      var action = this.action,\n        pointers = this.pointers;\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          delete pointers[touch.identifier];\n        });\n      } else {\n        delete pointers[event.pointerId || 0];\n      }\n      if (!action) {\n        return;\n      }\n      event.preventDefault();\n      if (!Object.keys(pointers).length) {\n        this.action = '';\n      }\n      if (this.cropping) {\n        this.cropping = false;\n        toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n      }\n      dispatchEvent(this.element, EVENT_CROP_END, {\n        originalEvent: event,\n        action: action\n      });\n    }\n  };\n\n  var change = {\n    change: function change(event) {\n      var options = this.options,\n        canvasData = this.canvasData,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData,\n        pointers = this.pointers;\n      var action = this.action;\n      var aspectRatio = options.aspectRatio;\n      var left = cropBoxData.left,\n        top = cropBoxData.top,\n        width = cropBoxData.width,\n        height = cropBoxData.height;\n      var right = left + width;\n      var bottom = top + height;\n      var minLeft = 0;\n      var minTop = 0;\n      var maxWidth = containerData.width;\n      var maxHeight = containerData.height;\n      var renderable = true;\n      var offset;\n\n      // Locking aspect ratio in \"free mode\" by holding shift key\n      if (!aspectRatio && event.shiftKey) {\n        aspectRatio = width && height ? width / height : 1;\n      }\n      if (this.limited) {\n        minLeft = cropBoxData.minLeft;\n        minTop = cropBoxData.minTop;\n        maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n        maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n      }\n      var pointer = pointers[Object.keys(pointers)[0]];\n      var range = {\n        x: pointer.endX - pointer.startX,\n        y: pointer.endY - pointer.startY\n      };\n      var check = function check(side) {\n        switch (side) {\n          case ACTION_EAST:\n            if (right + range.x > maxWidth) {\n              range.x = maxWidth - right;\n            }\n            break;\n          case ACTION_WEST:\n            if (left + range.x < minLeft) {\n              range.x = minLeft - left;\n            }\n            break;\n          case ACTION_NORTH:\n            if (top + range.y < minTop) {\n              range.y = minTop - top;\n            }\n            break;\n          case ACTION_SOUTH:\n            if (bottom + range.y > maxHeight) {\n              range.y = maxHeight - bottom;\n            }\n            break;\n        }\n      };\n      switch (action) {\n        // Move crop box\n        case ACTION_ALL:\n          left += range.x;\n          top += range.y;\n          break;\n\n        // Resize crop box\n        case ACTION_EAST:\n          if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_EAST);\n          width += range.x;\n          if (width < 0) {\n            action = ACTION_WEST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_NORTH:\n          if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_NORTH);\n          height -= range.y;\n          top += range.y;\n          if (height < 0) {\n            action = ACTION_SOUTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_WEST:\n          if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_WEST);\n          width -= range.x;\n          left += range.x;\n          if (width < 0) {\n            action = ACTION_EAST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_SOUTH:\n          if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_SOUTH);\n          height += range.y;\n          if (height < 0) {\n            action = ACTION_NORTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_NORTH_EAST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_NORTH_WEST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n            left += cropBoxData.width - width;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_WEST:\n          if (aspectRatio) {\n            if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_WEST);\n            width -= range.x;\n            left += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_EAST:\n          if (aspectRatio) {\n            if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_EAST);\n            width += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n\n        // Move canvas\n        case ACTION_MOVE:\n          this.move(range.x, range.y);\n          renderable = false;\n          break;\n\n        // Zoom canvas\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), event);\n          renderable = false;\n          break;\n\n        // Create crop box\n        case ACTION_CROP:\n          if (!range.x || !range.y) {\n            renderable = false;\n            break;\n          }\n          offset = getOffset(this.cropper);\n          left = pointer.startX - offset.left;\n          top = pointer.startY - offset.top;\n          width = cropBoxData.minWidth;\n          height = cropBoxData.minHeight;\n          if (range.x > 0) {\n            action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n          } else if (range.x < 0) {\n            left -= width;\n            action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n          }\n          if (range.y < 0) {\n            top -= height;\n          }\n\n          // Show the crop box if is hidden\n          if (!this.cropped) {\n            removeClass(this.cropBox, CLASS_HIDDEN);\n            this.cropped = true;\n            if (this.limited) {\n              this.limitCropBox(true, true);\n            }\n          }\n          break;\n      }\n      if (renderable) {\n        cropBoxData.width = width;\n        cropBoxData.height = height;\n        cropBoxData.left = left;\n        cropBoxData.top = top;\n        this.action = action;\n        this.renderCropBox();\n      }\n\n      // Override\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    }\n  };\n\n  var methods = {\n    // Show the crop box manually\n    crop: function crop() {\n      if (this.ready && !this.cropped && !this.disabled) {\n        this.cropped = true;\n        this.limitCropBox(true, true);\n        if (this.options.modal) {\n          addClass(this.dragBox, CLASS_MODAL);\n        }\n        removeClass(this.cropBox, CLASS_HIDDEN);\n        this.setCropBoxData(this.initialCropBoxData);\n      }\n      return this;\n    },\n    // Reset the image and crop box to their initial states\n    reset: function reset() {\n      if (this.ready && !this.disabled) {\n        this.imageData = assign({}, this.initialImageData);\n        this.canvasData = assign({}, this.initialCanvasData);\n        this.cropBoxData = assign({}, this.initialCropBoxData);\n        this.renderCanvas();\n        if (this.cropped) {\n          this.renderCropBox();\n        }\n      }\n      return this;\n    },\n    // Clear the crop box\n    clear: function clear() {\n      if (this.cropped && !this.disabled) {\n        assign(this.cropBoxData, {\n          left: 0,\n          top: 0,\n          width: 0,\n          height: 0\n        });\n        this.cropped = false;\n        this.renderCropBox();\n        this.limitCanvas(true, true);\n\n        // Render canvas after crop box rendered\n        this.renderCanvas();\n        removeClass(this.dragBox, CLASS_MODAL);\n        addClass(this.cropBox, CLASS_HIDDEN);\n      }\n      return this;\n    },\n    /**\n     * Replace the image's src and rebuild the cropper\n     * @param {string} url - The new URL.\n     * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n     * @returns {Cropper} this\n     */\n    replace: function replace(url) {\n      var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      if (!this.disabled && url) {\n        if (this.isImg) {\n          this.element.src = url;\n        }\n        if (hasSameSize) {\n          this.url = url;\n          this.image.src = url;\n          if (this.ready) {\n            this.viewBoxImage.src = url;\n            forEach(this.previews, function (element) {\n              element.getElementsByTagName('img')[0].src = url;\n            });\n          }\n        } else {\n          if (this.isImg) {\n            this.replaced = true;\n          }\n          this.options.data = null;\n          this.uncreate();\n          this.load(url);\n        }\n      }\n      return this;\n    },\n    // Enable (unfreeze) the cropper\n    enable: function enable() {\n      if (this.ready && this.disabled) {\n        this.disabled = false;\n        removeClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    // Disable (freeze) the cropper\n    disable: function disable() {\n      if (this.ready && !this.disabled) {\n        this.disabled = true;\n        addClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    /**\n     * Destroy the cropper and remove the instance from the image\n     * @returns {Cropper} this\n     */\n    destroy: function destroy() {\n      var element = this.element;\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n      element[NAMESPACE] = undefined;\n      if (this.isImg && this.replaced) {\n        element.src = this.originalUrl;\n      }\n      this.uncreate();\n      return this;\n    },\n    /**\n     * Move the canvas with relative offsets\n     * @param {number} offsetX - The relative offset distance on the x-axis.\n     * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n     * @returns {Cropper} this\n     */\n    move: function move(offsetX) {\n      var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n      var _this$canvasData = this.canvasData,\n        left = _this$canvasData.left,\n        top = _this$canvasData.top;\n      return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n    },\n    /**\n     * Move the canvas to an absolute point\n     * @param {number} x - The x-axis coordinate.\n     * @param {number} [y=x] - The y-axis coordinate.\n     * @returns {Cropper} this\n     */\n    moveTo: function moveTo(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var canvasData = this.canvasData;\n      var changed = false;\n      x = Number(x);\n      y = Number(y);\n      if (this.ready && !this.disabled && this.options.movable) {\n        if (isNumber(x)) {\n          canvasData.left = x;\n          changed = true;\n        }\n        if (isNumber(y)) {\n          canvasData.top = y;\n          changed = true;\n        }\n        if (changed) {\n          this.renderCanvas(true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Zoom the canvas with a relative ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoom: function zoom(ratio, _originalEvent) {\n      var canvasData = this.canvasData;\n      ratio = Number(ratio);\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n      return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n    },\n    /**\n     * Zoom the canvas to an absolute ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Object} pivot - The zoom pivot point coordinate.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var width = canvasData.width,\n        height = canvasData.height,\n        naturalWidth = canvasData.naturalWidth,\n        naturalHeight = canvasData.naturalHeight;\n      ratio = Number(ratio);\n      if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n        if (dispatchEvent(this.element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: width / naturalWidth,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n        if (_originalEvent) {\n          var pointers = this.pointers;\n          var offset = getOffset(this.cropper);\n          var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          };\n\n          // Zoom from the triggering point of the event\n          canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n        } else {\n          // Zoom from the center of the canvas\n          canvasData.left -= (newWidth - width) / 2;\n          canvasData.top -= (newHeight - height) / 2;\n        }\n        canvasData.width = newWidth;\n        canvasData.height = newHeight;\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Rotate the canvas with a relative degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotate: function rotate(degree) {\n      return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n    },\n    /**\n     * Rotate the canvas to an absolute degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotateTo: function rotateTo(degree) {\n      degree = Number(degree);\n      if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n        this.imageData.rotate = degree % 360;\n        this.renderCanvas(true, true);\n      }\n      return this;\n    },\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Cropper} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      var scaleY = this.imageData.scaleY;\n      return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n    },\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      var scaleX = this.imageData.scaleX;\n      return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n    },\n    /**\n     * Scale the image\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scale: function scale(scaleX) {\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var imageData = this.imageData;\n      var transformed = false;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n      if (this.ready && !this.disabled && this.options.scalable) {\n        if (isNumber(scaleX)) {\n          imageData.scaleX = scaleX;\n          transformed = true;\n        }\n        if (isNumber(scaleY)) {\n          imageData.scaleY = scaleY;\n          transformed = true;\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Get the cropped area position and size data (base on the original image)\n     * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n     * @returns {Object} The result cropped data.\n     */\n    getData: function getData() {\n      var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          x: cropBoxData.left - canvasData.left,\n          y: cropBoxData.top - canvasData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n        var ratio = imageData.width / imageData.naturalWidth;\n        forEach(data, function (n, i) {\n          data[i] = n / ratio;\n        });\n        if (rounded) {\n          // In case rounding off leads to extra 1px in right or bottom border\n          // we should round the top-left corner and the dimension (#343).\n          var bottom = Math.round(data.y + data.height);\n          var right = Math.round(data.x + data.width);\n          data.x = Math.round(data.x);\n          data.y = Math.round(data.y);\n          data.width = right - data.x;\n          data.height = bottom - data.y;\n        }\n      } else {\n        data = {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0\n        };\n      }\n      if (options.rotatable) {\n        data.rotate = imageData.rotate || 0;\n      }\n      if (options.scalable) {\n        data.scaleX = imageData.scaleX || 1;\n        data.scaleY = imageData.scaleY || 1;\n      }\n      return data;\n    },\n    /**\n     * Set the cropped area position and size with new data\n     * @param {Object} data - The new data.\n     * @returns {Cropper} this\n     */\n    setData: function setData(data) {\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData;\n      var cropBoxData = {};\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        var transformed = false;\n        if (options.rotatable) {\n          if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n            imageData.rotate = data.rotate;\n            transformed = true;\n          }\n        }\n        if (options.scalable) {\n          if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n            imageData.scaleX = data.scaleX;\n            transformed = true;\n          }\n          if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n            imageData.scaleY = data.scaleY;\n            transformed = true;\n          }\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n        var ratio = imageData.width / imageData.naturalWidth;\n        if (isNumber(data.x)) {\n          cropBoxData.left = data.x * ratio + canvasData.left;\n        }\n        if (isNumber(data.y)) {\n          cropBoxData.top = data.y * ratio + canvasData.top;\n        }\n        if (isNumber(data.width)) {\n          cropBoxData.width = data.width * ratio;\n        }\n        if (isNumber(data.height)) {\n          cropBoxData.height = data.height * ratio;\n        }\n        this.setCropBoxData(cropBoxData);\n      }\n      return this;\n    },\n    /**\n     * Get the container size data.\n     * @returns {Object} The result container data.\n     */\n    getContainerData: function getContainerData() {\n      return this.ready ? assign({}, this.containerData) : {};\n    },\n    /**\n     * Get the image position and size data.\n     * @returns {Object} The result image data.\n     */\n    getImageData: function getImageData() {\n      return this.sized ? assign({}, this.imageData) : {};\n    },\n    /**\n     * Get the canvas position and size data.\n     * @returns {Object} The result canvas data.\n     */\n    getCanvasData: function getCanvasData() {\n      var canvasData = this.canvasData;\n      var data = {};\n      if (this.ready) {\n        forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n          data[n] = canvasData[n];\n        });\n      }\n      return data;\n    },\n    /**\n     * Set the canvas position and size with new data.\n     * @param {Object} data - The new canvas data.\n     * @returns {Cropper} this\n     */\n    setCanvasData: function setCanvasData(data) {\n      var canvasData = this.canvasData;\n      var aspectRatio = canvasData.aspectRatio;\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          canvasData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          canvasData.top = data.top;\n        }\n        if (isNumber(data.width)) {\n          canvasData.width = data.width;\n          canvasData.height = data.width / aspectRatio;\n        } else if (isNumber(data.height)) {\n          canvasData.height = data.height;\n          canvasData.width = data.height * aspectRatio;\n        }\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Get the crop box position and size data.\n     * @returns {Object} The result crop box data.\n     */\n    getCropBoxData: function getCropBoxData() {\n      var cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          left: cropBoxData.left,\n          top: cropBoxData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n      }\n      return data || {};\n    },\n    /**\n     * Set the crop box position and size with new data.\n     * @param {Object} data - The new crop box data.\n     * @returns {Cropper} this\n     */\n    setCropBoxData: function setCropBoxData(data) {\n      var cropBoxData = this.cropBoxData;\n      var aspectRatio = this.options.aspectRatio;\n      var widthChanged;\n      var heightChanged;\n      if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          cropBoxData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          cropBoxData.top = data.top;\n        }\n        if (isNumber(data.width) && data.width !== cropBoxData.width) {\n          widthChanged = true;\n          cropBoxData.width = data.width;\n        }\n        if (isNumber(data.height) && data.height !== cropBoxData.height) {\n          heightChanged = true;\n          cropBoxData.height = data.height;\n        }\n        if (aspectRatio) {\n          if (widthChanged) {\n            cropBoxData.height = cropBoxData.width / aspectRatio;\n          } else if (heightChanged) {\n            cropBoxData.width = cropBoxData.height * aspectRatio;\n          }\n        }\n        this.renderCropBox();\n      }\n      return this;\n    },\n    /**\n     * Get a canvas drawn the cropped image.\n     * @param {Object} [options={}] - The config options.\n     * @returns {HTMLCanvasElement} - The result canvas.\n     */\n    getCroppedCanvas: function getCroppedCanvas() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      if (!this.ready || !window.HTMLCanvasElement) {\n        return null;\n      }\n      var canvasData = this.canvasData;\n      var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n      // Returns the source canvas if it is not cropped.\n      if (!this.cropped) {\n        return source;\n      }\n      var _this$getData = this.getData(options.rounded),\n        initialX = _this$getData.x,\n        initialY = _this$getData.y,\n        initialWidth = _this$getData.width,\n        initialHeight = _this$getData.height;\n      var ratio = source.width / Math.floor(canvasData.naturalWidth);\n      if (ratio !== 1) {\n        initialX *= ratio;\n        initialY *= ratio;\n        initialWidth *= ratio;\n        initialHeight *= ratio;\n      }\n      var aspectRatio = initialWidth / initialHeight;\n      var maxSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.maxWidth || Infinity,\n        height: options.maxHeight || Infinity\n      });\n      var minSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.minWidth || 0,\n        height: options.minHeight || 0\n      }, 'cover');\n      var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: options.width || (ratio !== 1 ? source.width : initialWidth),\n          height: options.height || (ratio !== 1 ? source.height : initialHeight)\n        }),\n        width = _getAdjustedSizes.width,\n        height = _getAdjustedSizes.height;\n      width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n      height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = normalizeDecimalNumber(width);\n      canvas.height = normalizeDecimalNumber(height);\n      context.fillStyle = options.fillColor || 'transparent';\n      context.fillRect(0, 0, width, height);\n      var _options$imageSmoothi = options.imageSmoothingEnabled,\n        imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n        imageSmoothingQuality = options.imageSmoothingQuality;\n      context.imageSmoothingEnabled = imageSmoothingEnabled;\n      if (imageSmoothingQuality) {\n        context.imageSmoothingQuality = imageSmoothingQuality;\n      }\n\n      // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n      var sourceWidth = source.width;\n      var sourceHeight = source.height;\n\n      // Source canvas parameters\n      var srcX = initialX;\n      var srcY = initialY;\n      var srcWidth;\n      var srcHeight;\n\n      // Destination canvas parameters\n      var dstX;\n      var dstY;\n      var dstWidth;\n      var dstHeight;\n      if (srcX <= -initialWidth || srcX > sourceWidth) {\n        srcX = 0;\n        srcWidth = 0;\n        dstX = 0;\n        dstWidth = 0;\n      } else if (srcX <= 0) {\n        dstX = -srcX;\n        srcX = 0;\n        srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n        dstWidth = srcWidth;\n      } else if (srcX <= sourceWidth) {\n        dstX = 0;\n        srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n        dstWidth = srcWidth;\n      }\n      if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n        srcY = 0;\n        srcHeight = 0;\n        dstY = 0;\n        dstHeight = 0;\n      } else if (srcY <= 0) {\n        dstY = -srcY;\n        srcY = 0;\n        srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n        dstHeight = srcHeight;\n      } else if (srcY <= sourceHeight) {\n        dstY = 0;\n        srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n        dstHeight = srcHeight;\n      }\n      var params = [srcX, srcY, srcWidth, srcHeight];\n\n      // Avoid \"IndexSizeError\"\n      if (dstWidth > 0 && dstHeight > 0) {\n        var scale = width / initialWidth;\n        params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n      }\n\n      // All the numerical parameters should be integer for `drawImage`\n      // https://github.com/fengyuanchen/cropper/issues/476\n      context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n        return Math.floor(normalizeDecimalNumber(param));\n      }))));\n      return canvas;\n    },\n    /**\n     * Change the aspect ratio of the crop box.\n     * @param {number} aspectRatio - The new aspect ratio.\n     * @returns {Cropper} this\n     */\n    setAspectRatio: function setAspectRatio(aspectRatio) {\n      var options = this.options;\n      if (!this.disabled && !isUndefined(aspectRatio)) {\n        // 0 -> NaN\n        options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n        if (this.ready) {\n          this.initCropBox();\n          if (this.cropped) {\n            this.renderCropBox();\n          }\n        }\n      }\n      return this;\n    },\n    /**\n     * Change the drag mode.\n     * @param {string} mode - The new drag mode.\n     * @returns {Cropper} this\n     */\n    setDragMode: function setDragMode(mode) {\n      var options = this.options,\n        dragBox = this.dragBox,\n        face = this.face;\n      if (this.ready && !this.disabled) {\n        var croppable = mode === DRAG_MODE_CROP;\n        var movable = options.movable && mode === DRAG_MODE_MOVE;\n        mode = croppable || movable ? mode : DRAG_MODE_NONE;\n        options.dragMode = mode;\n        setData(dragBox, DATA_ACTION, mode);\n        toggleClass(dragBox, CLASS_CROP, croppable);\n        toggleClass(dragBox, CLASS_MOVE, movable);\n        if (!options.cropBoxMovable) {\n          // Sync drag mode to crop box when it is not movable\n          setData(face, DATA_ACTION, mode);\n          toggleClass(face, CLASS_CROP, croppable);\n          toggleClass(face, CLASS_MOVE, movable);\n        }\n      }\n      return this;\n    }\n  };\n\n  var AnotherCropper = WINDOW.Cropper;\n  var Cropper = /*#__PURE__*/function () {\n    /**\n     * Create a new Cropper.\n     * @param {Element} element - The target element for cropping.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Cropper(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, Cropper);\n      if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n        throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n      }\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.cropped = false;\n      this.disabled = false;\n      this.pointers = {};\n      this.ready = false;\n      this.reloading = false;\n      this.replaced = false;\n      this.sized = false;\n      this.sizing = false;\n      this.init();\n    }\n    return _createClass(Cropper, [{\n      key: \"init\",\n      value: function init() {\n        var element = this.element;\n        var tagName = element.tagName.toLowerCase();\n        var url;\n        if (element[NAMESPACE]) {\n          return;\n        }\n        element[NAMESPACE] = this;\n        if (tagName === 'img') {\n          this.isImg = true;\n\n          // e.g.: \"img/picture.jpg\"\n          url = element.getAttribute('src') || '';\n          this.originalUrl = url;\n\n          // Stop when it's a blank image\n          if (!url) {\n            return;\n          }\n\n          // e.g.: \"https://example.com/img/picture.jpg\"\n          url = element.src;\n        } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n          url = element.toDataURL();\n        }\n        this.load(url);\n      }\n    }, {\n      key: \"load\",\n      value: function load(url) {\n        var _this = this;\n        if (!url) {\n          return;\n        }\n        this.url = url;\n        this.imageData = {};\n        var element = this.element,\n          options = this.options;\n        if (!options.rotatable && !options.scalable) {\n          options.checkOrientation = false;\n        }\n\n        // Only IE10+ supports Typed Arrays\n        if (!options.checkOrientation || !window.ArrayBuffer) {\n          this.clone();\n          return;\n        }\n\n        // Detect the mime type of the image directly if it is a Data URL\n        if (REGEXP_DATA_URL.test(url)) {\n          // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n          if (REGEXP_DATA_URL_JPEG.test(url)) {\n            this.read(dataURLToArrayBuffer(url));\n          } else {\n            // Only a JPEG image may contains Exif Orientation information,\n            // the rest types of Data URLs are not necessary to check orientation at all.\n            this.clone();\n          }\n          return;\n        }\n\n        // 1. Detect the mime type of the image by a XMLHttpRequest.\n        // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n        var xhr = new XMLHttpRequest();\n        var clone = this.clone.bind(this);\n        this.reloading = true;\n        this.xhr = xhr;\n\n        // 1. Cross origin requests are only supported for protocol schemes:\n        // http, https, data, chrome, chrome-extension.\n        // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n        // in some browsers as IE11 and Safari.\n        xhr.onabort = clone;\n        xhr.onerror = clone;\n        xhr.ontimeout = clone;\n        xhr.onprogress = function () {\n          // Abort the request directly if it not a JPEG image for better performance\n          if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n            xhr.abort();\n          }\n        };\n        xhr.onload = function () {\n          _this.read(xhr.response);\n        };\n        xhr.onloadend = function () {\n          _this.reloading = false;\n          _this.xhr = null;\n        };\n\n        // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n        if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n          url = addTimestamp(url);\n        }\n\n        // The third parameter is required for avoiding side-effect (#682)\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.withCredentials = element.crossOrigin === 'use-credentials';\n        xhr.send();\n      }\n    }, {\n      key: \"read\",\n      value: function read(arrayBuffer) {\n        var options = this.options,\n          imageData = this.imageData;\n\n        // Reset the orientation value to its default value 1\n        // as some iOS browsers will render image with its orientation\n        var orientation = resetAndGetOrientation(arrayBuffer);\n        var rotate = 0;\n        var scaleX = 1;\n        var scaleY = 1;\n        if (orientation > 1) {\n          // Generate a new URL which has the default orientation value\n          this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n          var _parseOrientation = parseOrientation(orientation);\n          rotate = _parseOrientation.rotate;\n          scaleX = _parseOrientation.scaleX;\n          scaleY = _parseOrientation.scaleY;\n        }\n        if (options.rotatable) {\n          imageData.rotate = rotate;\n        }\n        if (options.scalable) {\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n        }\n        this.clone();\n      }\n    }, {\n      key: \"clone\",\n      value: function clone() {\n        var element = this.element,\n          url = this.url;\n        var crossOrigin = element.crossOrigin;\n        var crossOriginUrl = url;\n        if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n          if (!crossOrigin) {\n            crossOrigin = 'anonymous';\n          }\n\n          // Bust cache when there is not a \"crossOrigin\" property (#519)\n          crossOriginUrl = addTimestamp(url);\n        }\n        this.crossOrigin = crossOrigin;\n        this.crossOriginUrl = crossOriginUrl;\n        var image = document.createElement('img');\n        if (crossOrigin) {\n          image.crossOrigin = crossOrigin;\n        }\n        image.src = crossOriginUrl || url;\n        image.alt = element.alt || 'The image to crop';\n        this.image = image;\n        image.onload = this.start.bind(this);\n        image.onerror = this.stop.bind(this);\n        addClass(image, CLASS_HIDE);\n        element.parentNode.insertBefore(image, element.nextSibling);\n      }\n    }, {\n      key: \"start\",\n      value: function start() {\n        var _this2 = this;\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        this.sizing = true;\n\n        // Match all browsers that use WebKit as the layout engine in iOS devices,\n        // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n        var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n        var done = function done(naturalWidth, naturalHeight) {\n          assign(_this2.imageData, {\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            aspectRatio: naturalWidth / naturalHeight\n          });\n          _this2.initialImageData = assign({}, _this2.imageData);\n          _this2.sizing = false;\n          _this2.sized = true;\n          _this2.build();\n        };\n\n        // Most modern browsers (excepts iOS WebKit)\n        if (image.naturalWidth && !isIOSWebKit) {\n          done(image.naturalWidth, image.naturalHeight);\n          return;\n        }\n        var sizingImage = document.createElement('img');\n        var body = document.body || document.documentElement;\n        this.sizingImage = sizingImage;\n        sizingImage.onload = function () {\n          done(sizingImage.width, sizingImage.height);\n          if (!isIOSWebKit) {\n            body.removeChild(sizingImage);\n          }\n        };\n        sizingImage.src = image.src;\n\n        // iOS WebKit will convert the image automatically\n        // with its orientation once append it into DOM (#279)\n        if (!isIOSWebKit) {\n          sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n          body.appendChild(sizingImage);\n        }\n      }\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        image.parentNode.removeChild(image);\n        this.image = null;\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (!this.sized || this.ready) {\n          return;\n        }\n        var element = this.element,\n          options = this.options,\n          image = this.image;\n\n        // Create cropper elements\n        var container = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n        var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n        var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n        this.container = container;\n        this.cropper = cropper;\n        this.canvas = canvas;\n        this.dragBox = dragBox;\n        this.cropBox = cropBox;\n        this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n        this.face = face;\n        canvas.appendChild(image);\n\n        // Hide the original image\n        addClass(element, CLASS_HIDDEN);\n\n        // Inserts the cropper after to the current image\n        container.insertBefore(cropper, element.nextSibling);\n\n        // Show the hidden image\n        removeClass(image, CLASS_HIDE);\n        this.initPreview();\n        this.bind();\n        options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n        options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n        options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n        addClass(cropBox, CLASS_HIDDEN);\n        if (!options.guides) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n        }\n        if (!options.center) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n        }\n        if (options.background) {\n          addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n        }\n        if (!options.highlight) {\n          addClass(face, CLASS_INVISIBLE);\n        }\n        if (options.cropBoxMovable) {\n          addClass(face, CLASS_MOVE);\n          setData(face, DATA_ACTION, ACTION_ALL);\n        }\n        if (!options.cropBoxResizable) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n        }\n        this.render();\n        this.ready = true;\n        this.setDragMode(options.dragMode);\n        if (options.autoCrop) {\n          this.crop();\n        }\n        this.setData(options.data);\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n        dispatchEvent(element, EVENT_READY);\n      }\n    }, {\n      key: \"unbuild\",\n      value: function unbuild() {\n        if (!this.ready) {\n          return;\n        }\n        this.ready = false;\n        this.unbind();\n        this.resetPreview();\n        var parentNode = this.cropper.parentNode;\n        if (parentNode) {\n          parentNode.removeChild(this.cropper);\n        }\n        removeClass(this.element, CLASS_HIDDEN);\n      }\n    }, {\n      key: \"uncreate\",\n      value: function uncreate() {\n        if (this.ready) {\n          this.unbuild();\n          this.ready = false;\n          this.cropped = false;\n        } else if (this.sizing) {\n          this.sizingImage.onload = null;\n          this.sizing = false;\n          this.sized = false;\n        } else if (this.reloading) {\n          this.xhr.onabort = null;\n          this.xhr.abort();\n        } else if (this.image) {\n          this.stop();\n        }\n      }\n\n      /**\n       * Get the no conflict cropper class.\n       * @returns {Cropper} The cropper class.\n       */\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Cropper = AnotherCropper;\n        return Cropper;\n      }\n\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n  }();\n  assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n  return Cropper;\n\n}));\n"],"sourceRoot":""}