{"version":3,"sources":["webpack:///./src/components/misc/ImageCropper.vue?b2f0","webpack:///src/components/misc/ImageCropper.vue","webpack:///./src/components/misc/ImageCropper.vue?1852","webpack:///./src/components/misc/ImageCropper.vue","webpack:///./node_modules/cropperjs/dist/cropper.js"],"names":["render","_vm","this","_h","$createElement","_c","_self","attrs","footerActions","scopedSlots","_u","key","fn","_v","_s","$l","proxy","staticStyle","ref","imageUrl","staticRenderFns","name","props","file","type","onCrop","cropperOptions","data","cropper","mounted","methods","initCropper","viewMode","crop","computed","text","icon","handler","watch","immediate","fileToBase64","component","global","factory","module","exports","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","descriptor","configurable","writable","_createClass","protoProps","staticProps","value","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","o","minLen","n","toString","call","slice","test","len","arr2","IS_BROWSER","window","document","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","concat","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","dragMode","initialAspectRatio","NaN","aspectRatio","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","zoom","TEMPLATE","isNaN","Number","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","error","isFunction","toArray","callback","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","Math","round","REGEXP_SUFFIX","setStyle","element","styles","style","property","hasClass","classList","contains","className","indexOf","addClass","elem","add","trim","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","toLowerCase","getData","dataset","getAttribute","setData","setAttribute","removeData","removeAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","get","set","addEventListener","removeEventListener","removeListener","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","Event","CustomEvent","detail","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","height","width","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getSourceCanvas","image","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","naturalWidth","imageNaturalHeight","naturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","createElement","context","getContext","maxSizes","minSizes","min","max","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","scale","drawImage","map","param","floor","fromCharCode","String","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","offsetWidth","offsetHeight","imageData","rotated","canvasWidth","canvasHeight","canvasData","limited","limitCanvas","oldLeft","oldTop","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","newCanvasLeft","newCanvasTop","minLeft","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","renderImage","limitCropBox","output","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","alt","src","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","getElementsByTagName","events","bind","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","ratioX","ratioY","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","_this","delta","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","pointerType","ctrlKey","action","changedTouches","touch","identifier","originalEvent","cropping","change","right","bottom","renderable","shiftKey","range","x","y","check","side","move","p","reset","initialImageData","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","destroy","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","rotateTo","_scaleX","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","mode","croppable","AnotherCropper","Cropper","tagName","Error","reloading","sizing","init","toDataURL","read","clone","xhr","XMLHttpRequest","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","onload","response","onloadend","open","responseType","withCredentials","send","_parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","isIOSWebKit","navigator","userAgent","done","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild"],"mappings":"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","file":"js/chunk-73dffb9b.152dabd8.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('PModal',{attrs:{\"footer-actions\":_vm.footerActions,\"slot-class\":\"p-0 flex-grow-1\"},scopedSlots:_vm._u([{key:\"title\",fn:function(){return [_vm._v(_vm._s(_vm.$l(\"platon.image_cropper_title\", \"Расмни таҳрирлаш\")))]},proxy:true}])},[_c('div',{staticStyle:{\"width\":\"100%\",\"text-align\":\"center\"}},[_c('img',{ref:\"image\",staticStyle:{\"display\":\"block\",\"max-width\":\"100%\"},attrs:{\"src\":_vm.imageUrl}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\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!./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=673bcc5a&\"\nimport script from \"./ImageCropper.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageCropper.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","/*!\n * Cropper.js v1.5.13\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2022-11-20T05:30:46.114Z\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(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n }\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n }\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\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, 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 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 = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
';\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(),\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 or 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 _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 return Cropper;\n }();\n assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n return Cropper;\n\n}));\n"],"sourceRoot":""}